Use boolcoder API instead of inlining
This patch changes the token packing to call the bool encoder API rather than inlining it into the token packing function, and similarly removes a special get_signed case from the detokenizer. This allows easier experimentation with changing the bool coder as a whole. Change-Id: I52c3625bbe4960b68cfb873b0e39ade0c82f9e91
This commit is contained in:
@@ -60,26 +60,7 @@ static const vp9_prob cat6_prob[15] = {
|
|||||||
DECLARE_ALIGNED(16, extern const uint8_t, vp9_norm[256]);
|
DECLARE_ALIGNED(16, extern const uint8_t, vp9_norm[256]);
|
||||||
|
|
||||||
static int get_signed(BOOL_DECODER *br, int value_to_sign) {
|
static int get_signed(BOOL_DECODER *br, int value_to_sign) {
|
||||||
const int split = (br->range + 1) >> 1;
|
return decode_bool(br, 128) ? -value_to_sign : value_to_sign;
|
||||||
const VP9_BD_VALUE bigsplit = (VP9_BD_VALUE)split << (VP9_BD_VALUE_SIZE - 8);
|
|
||||||
int v;
|
|
||||||
|
|
||||||
if (br->count < 0)
|
|
||||||
vp9_bool_decoder_fill(br);
|
|
||||||
|
|
||||||
if (br->value < bigsplit) {
|
|
||||||
br->range = split;
|
|
||||||
v = value_to_sign;
|
|
||||||
} else {
|
|
||||||
br->range = br->range - split;
|
|
||||||
br->value = br->value - bigsplit;
|
|
||||||
v = -value_to_sign;
|
|
||||||
}
|
|
||||||
br->range += br->range;
|
|
||||||
br->value += br->value;
|
|
||||||
--br->count;
|
|
||||||
|
|
||||||
return v;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define INCREMENT_COUNT(token) \
|
#define INCREMENT_COUNT(token) \
|
||||||
|
@@ -364,11 +364,6 @@ static void vp9_cond_prob_update(vp9_writer *bc, vp9_prob *oldp, vp9_prob upd,
|
|||||||
static void pack_mb_tokens(vp9_writer* const bc,
|
static void pack_mb_tokens(vp9_writer* const bc,
|
||||||
TOKENEXTRA **tp,
|
TOKENEXTRA **tp,
|
||||||
const TOKENEXTRA *const stop) {
|
const TOKENEXTRA *const stop) {
|
||||||
unsigned int split;
|
|
||||||
unsigned int shift;
|
|
||||||
int count = bc->count;
|
|
||||||
unsigned int range = bc->range;
|
|
||||||
unsigned int lowvalue = bc->lowvalue;
|
|
||||||
TOKENEXTRA *p = *tp;
|
TOKENEXTRA *p = *tp;
|
||||||
|
|
||||||
while (p < stop) {
|
while (p < stop) {
|
||||||
@@ -394,42 +389,8 @@ static void pack_mb_tokens(vp9_writer* const bc,
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
const int bb = (v >> --n) & 1;
|
const int bb = (v >> --n) & 1;
|
||||||
split = 1 + (((range - 1) * pp[i >> 1]) >> 8);
|
encode_bool(bc, bb, pp[i >> 1]);
|
||||||
i = vp9_coef_tree[i + bb];
|
i = vp9_coef_tree[i + bb];
|
||||||
|
|
||||||
if (bb) {
|
|
||||||
lowvalue += split;
|
|
||||||
range = range - split;
|
|
||||||
} else {
|
|
||||||
range = split;
|
|
||||||
}
|
|
||||||
|
|
||||||
shift = vp9_norm[range];
|
|
||||||
range <<= shift;
|
|
||||||
count += shift;
|
|
||||||
|
|
||||||
if (count >= 0) {
|
|
||||||
int offset = shift - count;
|
|
||||||
|
|
||||||
if ((lowvalue << (offset - 1)) & 0x80000000) {
|
|
||||||
int x = bc->pos - 1;
|
|
||||||
|
|
||||||
while (x >= 0 && bc->buffer[x] == 0xff) {
|
|
||||||
bc->buffer[x] = (unsigned char)0;
|
|
||||||
x--;
|
|
||||||
}
|
|
||||||
|
|
||||||
bc->buffer[x] += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bc->buffer[bc->pos++] = (lowvalue >> (24 - offset));
|
|
||||||
lowvalue <<= offset;
|
|
||||||
shift = count;
|
|
||||||
lowvalue &= 0xffffff;
|
|
||||||
count -= 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
lowvalue <<= shift;
|
|
||||||
} while (n);
|
} while (n);
|
||||||
|
|
||||||
|
|
||||||
@@ -444,87 +405,16 @@ static void pack_mb_tokens(vp9_writer* const bc,
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
const int bb = (v >> --n) & 1;
|
const int bb = (v >> --n) & 1;
|
||||||
split = 1 + (((range - 1) * pp[i >> 1]) >> 8);
|
encode_bool(bc, bb, pp[i >> 1]);
|
||||||
i = b->tree[i + bb];
|
i = b->tree[i + bb];
|
||||||
|
|
||||||
if (bb) {
|
|
||||||
lowvalue += split;
|
|
||||||
range = range - split;
|
|
||||||
} else {
|
|
||||||
range = split;
|
|
||||||
}
|
|
||||||
|
|
||||||
shift = vp9_norm[range];
|
|
||||||
range <<= shift;
|
|
||||||
count += shift;
|
|
||||||
|
|
||||||
if (count >= 0) {
|
|
||||||
int offset = shift - count;
|
|
||||||
|
|
||||||
if ((lowvalue << (offset - 1)) & 0x80000000) {
|
|
||||||
int x = bc->pos - 1;
|
|
||||||
|
|
||||||
while (x >= 0 && bc->buffer[x] == 0xff) {
|
|
||||||
bc->buffer[x] = (unsigned char)0;
|
|
||||||
x--;
|
|
||||||
}
|
|
||||||
|
|
||||||
bc->buffer[x] += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bc->buffer[bc->pos++] = (lowvalue >> (24 - offset));
|
|
||||||
lowvalue <<= offset;
|
|
||||||
shift = count;
|
|
||||||
lowvalue &= 0xffffff;
|
|
||||||
count -= 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
lowvalue <<= shift;
|
|
||||||
} while (n);
|
} while (n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
encode_bool(bc, e & 1, 128);
|
||||||
{
|
|
||||||
|
|
||||||
split = (range + 1) >> 1;
|
|
||||||
|
|
||||||
if (e & 1) {
|
|
||||||
lowvalue += split;
|
|
||||||
range = range - split;
|
|
||||||
} else {
|
|
||||||
range = split;
|
|
||||||
}
|
|
||||||
|
|
||||||
range <<= 1;
|
|
||||||
|
|
||||||
if ((lowvalue & 0x80000000)) {
|
|
||||||
int x = bc->pos - 1;
|
|
||||||
|
|
||||||
while (x >= 0 && bc->buffer[x] == 0xff) {
|
|
||||||
bc->buffer[x] = (unsigned char)0;
|
|
||||||
x--;
|
|
||||||
}
|
|
||||||
|
|
||||||
bc->buffer[x] += 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
lowvalue <<= 1;
|
|
||||||
|
|
||||||
if (!++count) {
|
|
||||||
count = -8;
|
|
||||||
bc->buffer[bc->pos++] = (lowvalue >> 24);
|
|
||||||
lowvalue &= 0xffffff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
++p;
|
++p;
|
||||||
}
|
}
|
||||||
|
|
||||||
bc->count = count;
|
|
||||||
bc->lowvalue = lowvalue;
|
|
||||||
bc->range = range;
|
|
||||||
*tp = p;
|
*tp = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user