summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@google.com>2013-07-18 12:47:50 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2013-07-18 12:47:50 -0700
commit9da67da04a1e150630196e5457133365bd9c8618 (patch)
tree230b1e05c33accba5602eed17b5dba34bf61d8ed
parentaa86196c93355edbb7a0df71d77f0e75d54099a2 (diff)
parent247197d57bcfb59557f0ffdd0f25871558960bd8 (diff)
downloadlibvpx-9da67da04a1e150630196e5457133365bd9c8618.tar
libvpx-9da67da04a1e150630196e5457133365bd9c8618.tar.gz
libvpx-9da67da04a1e150630196e5457133365bd9c8618.tar.bz2
libvpx-9da67da04a1e150630196e5457133365bd9c8618.zip
Merge "Fix bug where we don't choose any mode in RD selection."
-rw-r--r--vp9/encoder/vp9_rdopt.c40
1 files changed, 8 insertions, 32 deletions
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index 677683dd9..f62f2486f 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -3430,9 +3430,15 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
SEG_LVL_REF_FRAME)) {
// Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
// unless ARNR filtering is enabled in which case we want
- // an unfiltered alternative
+ // an unfiltered alternative. We allow near/nearest as well
+ // because they may result in zero-zero MVs but be cheaper.
if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) {
- if (this_mode != ZEROMV || ref_frame != ALTREF_FRAME) {
+ if ((this_mode != ZEROMV &&
+ !(this_mode == NEARMV &&
+ frame_mv[NEARMV][ALTREF_FRAME].as_int == 0) &&
+ !(this_mode == NEARESTMV &&
+ frame_mv[NEARESTMV][ALTREF_FRAME].as_int == 0)) ||
+ ref_frame != ALTREF_FRAME) {
continue;
}
}
@@ -4013,35 +4019,6 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
}
#endif
- // This code forces Altref,0,0 and skip for the frame that overlays a
- // an alrtef unless Altref is filtered. However, this is unsafe if
- // segment level coding of ref frame is enabled for this segment.
- if (!vp9_segfeature_active(&xd->seg, segment_id, SEG_LVL_REF_FRAME) &&
- cpi->is_src_frame_alt_ref &&
- (cpi->oxcf.arnr_max_frames == 0) &&
- (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame[0] != ALTREF_FRAME)
- && bsize >= BLOCK_SIZE_SB8X8) {
- mbmi->mode = ZEROMV;
- mbmi->ref_frame[0] = ALTREF_FRAME;
- mbmi->ref_frame[1] = NONE;
- mbmi->mv[0].as_int = 0;
- mbmi->uv_mode = DC_PRED;
- mbmi->mb_skip_coeff = 1;
- if (cm->txfm_mode == TX_MODE_SELECT) {
- if (bsize >= BLOCK_SIZE_SB32X32)
- mbmi->txfm_size = TX_32X32;
- else if (bsize >= BLOCK_SIZE_MB16X16)
- mbmi->txfm_size = TX_16X16;
- else
- mbmi->txfm_size = TX_8X8;
- }
-
- vpx_memset(best_txfm_diff, 0, sizeof(best_txfm_diff));
- vpx_memset(best_pred_diff, 0, sizeof(best_pred_diff));
- vpx_memset(best_filter_diff, 0, sizeof(best_filter_diff));
- goto end;
- }
-
// macroblock modes
*mbmi = best_mbmode;
x->skip |= best_skip2;
@@ -4099,7 +4076,6 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
vpx_memset(best_txfm_diff, 0, sizeof(best_txfm_diff));
}
- end:
set_scale_factors(xd, mbmi->ref_frame[0], mbmi->ref_frame[1],
scale_factor);
store_coding_context(x, ctx, best_mode_index,