diff options
Diffstat (limited to 'vp9/encoder/vp9_rdopt.c')
-rw-r--r-- | vp9/encoder/vp9_rdopt.c | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index 5fa3a3bc8..dfe39e871 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -445,8 +445,21 @@ static void model_rd_for_sb(VP9_COMP *cpi, BLOCK_SIZE bsize, if (i == 0) x->pred_sse[ref] = sse; - if (cpi->sf.use_pick_mode) { - dist_sum += (int)sse; + + // Fast approximate the modelling function. + if (cpi->oxcf.cpu_used < -4) { + int rate; + int64_t dist; + int64_t square_error = sse; + int quantizer = (pd->dequant[1] >> 3); + + if ( quantizer < 120) + rate = (square_error * (280-quantizer) )>> 8; + else + rate = 0; + dist = (square_error * quantizer) >> 8; + rate_sum += rate; + dist_sum += dist; } else { int rate; int64_t dist; @@ -3145,6 +3158,8 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, const int bws = num_8x8_blocks_wide_lookup[bsize] / 2; const int bhs = num_8x8_blocks_high_lookup[bsize] / 2; int best_skip2 = 0; + int ref_frame_mask = 0; + int mode_skip_mask = 0; x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; @@ -3178,13 +3193,12 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, frame_mv[ZEROMV][ref_frame].as_int = 0; } - cpi->ref_frame_mask = 0; for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME && cpi->sf.reference_masking; ++ref_frame) { int i; for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) { if ((x->pred_mv_sad[ref_frame] >> 2) > x->pred_mv_sad[i]) { - cpi->ref_frame_mask |= (1 << ref_frame); + ref_frame_mask |= (1 << ref_frame); break; } } @@ -3218,28 +3232,28 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, if (mode_index == (cpi->sf.mode_skip_start + 1)) { switch (vp9_mode_order[best_mode_index].ref_frame[0]) { case INTRA_FRAME: - cpi->mode_skip_mask = 0; + mode_skip_mask = 0; break; case LAST_FRAME: - cpi->mode_skip_mask = LAST_FRAME_MODE_MASK; + mode_skip_mask = LAST_FRAME_MODE_MASK; break; case GOLDEN_FRAME: - cpi->mode_skip_mask = GOLDEN_FRAME_MODE_MASK; + mode_skip_mask = GOLDEN_FRAME_MODE_MASK; break; case ALTREF_FRAME: - cpi->mode_skip_mask = ALT_REF_MODE_MASK; + mode_skip_mask = ALT_REF_MODE_MASK; break; case NONE: case MAX_REF_FRAMES: assert(0 && "Invalid Reference frame"); } } - if (cpi->mode_skip_mask & ((int64_t)1 << mode_index)) + if (mode_skip_mask & (1 << mode_index)) continue; } // Skip if the current reference frame has been masked off - if (cpi->ref_frame_mask & (1 << ref_frame) && this_mode != NEWMV) + if (ref_frame_mask & (1 << ref_frame) && this_mode != NEWMV) continue; // Test best rd so far against threshold for trying this mode. @@ -3764,6 +3778,8 @@ int64_t vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi, MACROBLOCK *x, int_mv seg_mvs[4][MAX_REF_FRAMES]; b_mode_info best_bmodes[4]; int best_skip2 = 0; + int ref_frame_mask = 0; + int mode_skip_mask = 0; x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; vpx_memset(x->zcoeff_blk[TX_4X4], 0, 4); @@ -3799,13 +3815,12 @@ int64_t vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi, MACROBLOCK *x, frame_mv[ZEROMV][ref_frame].as_int = 0; } - cpi->ref_frame_mask = 0; for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME && cpi->sf.reference_masking; ++ref_frame) { int i; for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) { if ((x->pred_mv_sad[ref_frame] >> 1) > x->pred_mv_sad[i]) { - cpi->ref_frame_mask |= (1 << ref_frame); + ref_frame_mask |= (1 << ref_frame); break; } } @@ -3838,23 +3853,23 @@ int64_t vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi, MACROBLOCK *x, if (mode_index == 3) { switch (vp9_ref_order[best_mode_index].ref_frame[0]) { case INTRA_FRAME: - cpi->mode_skip_mask = 0; + mode_skip_mask = 0; break; case LAST_FRAME: - cpi->mode_skip_mask = 0x0010; + mode_skip_mask = 0x0010; break; case GOLDEN_FRAME: - cpi->mode_skip_mask = 0x0008; + mode_skip_mask = 0x0008; break; case ALTREF_FRAME: - cpi->mode_skip_mask = 0x0000; + mode_skip_mask = 0x0000; break; case NONE: case MAX_REF_FRAMES: assert(0 && "Invalid Reference frame"); } } - if (cpi->mode_skip_mask & ((int64_t)1 << mode_index)) + if (mode_skip_mask & (1 << mode_index)) continue; } |