Merge "slightly faster ParseIntraMode"

This commit is contained in:
Pascal Massimino 2013-08-09 02:17:16 -07:00 committed by Gerrit Code Review
commit f486aaa9f8

View File

@ -87,7 +87,6 @@ static const uint8_t kMVProba0[2][NUM_MV_PROBAS] = {
// Paragraph 13.5 // Paragraph 13.5
static const uint8_t static const uint8_t
CoeffsProba0[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = { CoeffsProba0[NUM_TYPES][NUM_BANDS][NUM_CTX][NUM_PROBAS] = {
// genereated using vp8_default_coef_probs() in entropy.c:129
{ { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, { { { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }, { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
{ 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 } { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }
@ -336,20 +335,20 @@ void VP8ResetProba(VP8Proba* const proba) {
#endif #endif
} }
void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec) { void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec) {
uint8_t* const top = dec->intra_t_ + 4 * dec->mb_x_; uint8_t* const top = dec->intra_t_ + 4 * dec->mb_x_;
uint8_t* const left = dec->intra_l_; uint8_t* const left = dec->intra_l_;
VP8MBData* const block = dec->mb_data_; VP8MBData* const block = dec->mb_data_;
// Hardcoded 16x16 intra-mode decision tree.
block->is_i4x4_ = !VP8GetBit(br, 145); // decide for B_PRED first block->is_i4x4_ = !VP8GetBit(br, 145); // decide for B_PRED first
if (!block->is_i4x4_) { if (!block->is_i4x4_) {
// Hardcoded 16x16 intra-mode decision tree.
const int ymode = const int ymode =
VP8GetBit(br, 156) ? (VP8GetBit(br, 128) ? TM_PRED : H_PRED) VP8GetBit(br, 156) ? (VP8GetBit(br, 128) ? TM_PRED : H_PRED)
: (VP8GetBit(br, 163) ? V_PRED : DC_PRED); : (VP8GetBit(br, 163) ? V_PRED : DC_PRED);
block->imodes_[0] = ymode; block->imodes_[0] = ymode;
memset(top, ymode, 4 * sizeof(top[0])); memset(top, ymode, 4 * sizeof(*top));
memset(left, ymode, 4 * sizeof(left[0])); memset(left, ymode, 4 * sizeof(*left));
} else { } else {
uint8_t* modes = block->imodes_; uint8_t* modes = block->imodes_;
int y; int y;
@ -360,10 +359,10 @@ void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec) {
const uint8_t* const prob = kBModesProba[top[x]][ymode]; const uint8_t* const prob = kBModesProba[top[x]][ymode];
#ifdef USE_GENERIC_TREE #ifdef USE_GENERIC_TREE
// Generic tree-parsing // Generic tree-parsing
int i = 0; int i = kYModesIntra4[VP8GetBit(br, prob[0])];
do { while (i > 0) {
i = kYModesIntra4[2 * i + VP8GetBit(br, prob[i])]; i = kYModesIntra4[2 * i + VP8GetBit(br, prob[i])];
} while (i > 0); }
ymode = -i; ymode = -i;
#else #else
// Hardcoded tree parsing // Hardcoded tree parsing
@ -378,8 +377,9 @@ void VP8ParseIntraMode(VP8BitReader* const br, VP8Decoder* const dec) {
(!VP8GetBit(br, prob[8]) ? B_HD_PRED : B_HU_PRED))); (!VP8GetBit(br, prob[8]) ? B_HD_PRED : B_HU_PRED)));
#endif // USE_GENERIC_TREE #endif // USE_GENERIC_TREE
top[x] = ymode; top[x] = ymode;
*modes++ = ymode;
} }
memcpy(modes, top, 4 * sizeof(*top));
modes += 4;
left[y] = ymode; left[y] = ymode;
} }
} }