mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-26 05:38:22 +01:00
introduce GetLargeValue() to slim-fast GetCoeffs().
GetCoeffs is (by far) the most consuming function of the decoder. No speed change (unfortunately), but the main loop is somehow clearer. Change-Id: I78f1c10cadc2c8696c041f5cbda86cab92cc6598
This commit is contained in:
parent
d5838cd598
commit
c34a3758ad
@ -458,7 +458,7 @@ int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io) {
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Residual decoding (Paragraph 13.2 / 13.3)
|
// Residual decoding (Paragraph 13.2 / 13.3)
|
||||||
|
|
||||||
static const uint8_t kBands[16 + 1] = {
|
static const int kBands[16 + 1] = {
|
||||||
0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7,
|
0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7,
|
||||||
0 // extra entry as sentinel
|
0 // extra entry as sentinel
|
||||||
};
|
};
|
||||||
@ -474,26 +474,11 @@ static const uint8_t kZigzag[16] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef const uint8_t (*ProbaArray)[NUM_CTX][NUM_PROBAS]; // for const-casting
|
typedef const uint8_t (*ProbaArray)[NUM_CTX][NUM_PROBAS]; // for const-casting
|
||||||
|
typedef const uint8_t (*ProbaCtxArray)[NUM_PROBAS];
|
||||||
|
|
||||||
// Returns the position of the last non-zero coeff plus one
|
// See section 13-2: http://tools.ietf.org/html/rfc6386#section-13.2
|
||||||
// (and 0 if there's no coeff at all)
|
static int GetLargeValue(VP8BitReader* const br, const uint8_t* const p) {
|
||||||
static int GetCoeffs(VP8BitReader* const br, ProbaArray prob,
|
int v;
|
||||||
int ctx, const quant_t dq, int n, int16_t* out) {
|
|
||||||
// n is either 0 or 1 here. kBands[n] is not necessary for extracting '*p'.
|
|
||||||
const uint8_t* p = prob[n][ctx];
|
|
||||||
if (!VP8GetBit(br, p[0])) { // first EOB is more a 'CBP' bit.
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
while (1) {
|
|
||||||
++n;
|
|
||||||
if (!VP8GetBit(br, p[1])) {
|
|
||||||
p = prob[kBands[n]][0];
|
|
||||||
} else { // non zero coeff
|
|
||||||
int v, j;
|
|
||||||
if (!VP8GetBit(br, p[2])) {
|
|
||||||
p = prob[kBands[n]][1];
|
|
||||||
v = 1;
|
|
||||||
} else {
|
|
||||||
if (!VP8GetBit(br, p[3])) {
|
if (!VP8GetBit(br, p[3])) {
|
||||||
if (!VP8GetBit(br, p[4])) {
|
if (!VP8GetBit(br, p[4])) {
|
||||||
v = 2;
|
v = 2;
|
||||||
@ -520,19 +505,39 @@ static int GetCoeffs(VP8BitReader* const br, ProbaArray prob,
|
|||||||
v += 3 + (8 << cat);
|
v += 3 + (8 << cat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p = prob[kBands[n]][2];
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the position of the last non-zero coeff plus one
|
||||||
|
// (and 0 if there's no coeff at all)
|
||||||
|
static int GetCoeffs(VP8BitReader* const br, ProbaArray prob,
|
||||||
|
int ctx, const quant_t dq, int n, int16_t* out) {
|
||||||
|
// n is either 0 or 1 here. kBands[n] is not necessary for extracting '*p'.
|
||||||
|
const uint8_t* p = prob[n][ctx];
|
||||||
|
if (!VP8GetBit(br, p[0])) { // first EOB is more a 'CBP' bit.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
for (; n < 16; ++n) {
|
||||||
|
const ProbaCtxArray p_ctx = prob[kBands[n + 1]];
|
||||||
|
if (!VP8GetBit(br, p[1])) {
|
||||||
|
p = p_ctx[0];
|
||||||
|
} else { // non zero coeff
|
||||||
|
int v;
|
||||||
|
if (!VP8GetBit(br, p[2])) {
|
||||||
|
v = 1;
|
||||||
|
p = p_ctx[1];
|
||||||
|
} else {
|
||||||
|
v = GetLargeValue(br, p);
|
||||||
|
p = p_ctx[2];
|
||||||
|
}
|
||||||
|
out[kZigzag[n]] = VP8GetSigned(br, v) * dq[n > 0];
|
||||||
|
if (n < 15 && !VP8GetBit(br, p[0])) { // EOB
|
||||||
|
return n + 1;
|
||||||
}
|
}
|
||||||
j = kZigzag[n - 1];
|
|
||||||
out[j] = VP8GetSigned(br, v) * dq[j > 0];
|
|
||||||
if (n == 16 || !VP8GetBit(br, p[0])) { // EOB
|
|
||||||
return n;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (n == 16) {
|
|
||||||
return 16;
|
return 16;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alias-safe way of converting 4bytes to 32bits.
|
// Alias-safe way of converting 4bytes to 32bits.
|
||||||
typedef union {
|
typedef union {
|
||||||
|
Loading…
Reference in New Issue
Block a user