static int MBAnalyzeBestIntra4Mode(VP8EncIterator* const it, int best_alpha) { uint8_t modes[16]; const int max_mode = (it->enc_->method_ >= 3) ? MAX_INTRA4_MODE : NUM_BMODES; int i4_alpha = 0; VP8IteratorStartI4(it); do { int mode; int best_mode_alpha = -1; const uint8_t* const src = it->yuv_in_ + Y_OFF + VP8Scan[it->i4_]; VP8MakeIntra4Preds(it); for (mode = 0; mode < max_mode; ++mode) { const int alpha = VP8CollectHistogram(src, it->yuv_p_ + VP8I4ModeOffsets[mode], 0, 1); if (alpha > best_mode_alpha) { best_mode_alpha = alpha; modes[it->i4_] = mode; } } i4_alpha += best_mode_alpha; // Note: we reuse the original samples for predictors } while (VP8IteratorRotateI4(it, it->yuv_in_ + Y_OFF)); if (i4_alpha > best_alpha) { VP8SetIntra4Mode(it, modes); best_alpha = ClipAlpha(i4_alpha); } return best_alpha; }
static int MBAnalyzeBestIntra4Mode(VP8EncIterator* const it, int best_alpha) { uint8_t modes[16]; const int max_mode = (it->enc_->method_ >= FAST_ANALYSIS_METHOD) ? MAX_INTRA4_MODE : NUM_BMODES; int i4_alpha; VP8Histogram total_histo = { { 0 } }; int cur_histo = 0; VP8IteratorStartI4(it); do { int mode; int best_mode_alpha = DEFAULT_ALPHA; VP8Histogram histos[2]; const uint8_t* const src = it->yuv_in_ + Y_OFF + VP8Scan[it->i4_]; VP8MakeIntra4Preds(it); for (mode = 0; mode < max_mode; ++mode) { int alpha; memset(&histos[cur_histo], 0, sizeof(histos[cur_histo])); VP8CollectHistogram(src, it->yuv_p_ + VP8I4ModeOffsets[mode], 0, 1, &histos[cur_histo]); alpha = GetAlpha(&histos[cur_histo]); if (IS_BETTER_ALPHA(alpha, best_mode_alpha)) { best_mode_alpha = alpha; modes[it->i4_] = mode; cur_histo ^= 1; // keep track of best histo so far. } } // accumulate best histogram MergeHistograms(&histos[cur_histo ^ 1], &total_histo); // Note: we reuse the original samples for predictors } while (VP8IteratorRotateI4(it, it->yuv_in_ + Y_OFF)); i4_alpha = GetAlpha(&total_histo); if (IS_BETTER_ALPHA(i4_alpha, best_alpha)) { VP8SetIntra4Mode(it, modes); best_alpha = i4_alpha; } return best_alpha; }