From: Jingning Han Date: Thu, 13 Feb 2014 19:41:08 +0000 (-0800) Subject: Initialize internal buffer pointers in rtc mode X-Git-Tag: v1.4.0~2344^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cc10ee0adda3304e8e73a4372aa901fe6953f938;p=libvpx Initialize internal buffer pointers in rtc mode In rtc coding mode, the encoder is running non-RD mode decision. It does not need dual buffer swap as was the case in the RD mode. This commit initializes the internal buffer pointers outside the block coding loop for rtc mode. Change-Id: Ie076705c60d6b7919217e3f1dfd49e7db5064ac2 --- diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 4f45762e5..d7cc5dbb0 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -1049,28 +1049,9 @@ static void update_state_rt(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx, VP9_COMMON *const cm = &cpi->common; MACROBLOCK *const x = &cpi->mb; MACROBLOCKD *const xd = &x->e_mbd; - struct macroblock_plane *const p = x->plane; - struct macroblockd_plane *const pd = xd->plane; MB_MODE_INFO *const mbmi = &xd->mi_8x8[0]->mbmi; const int mb_mode_index = ctx->best_mode_index; - int max_plane; - - max_plane = is_inter_block(mbmi) ? MAX_MB_PLANE : 1; - for (i = 0; i < max_plane; ++i) { - p[i].coeff = ctx->coeff_pbuf[i][1]; - p[i].qcoeff = ctx->qcoeff_pbuf[i][1]; - pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1]; - p[i].eobs = ctx->eobs_pbuf[i][1]; - } - - for (i = max_plane; i < MAX_MB_PLANE; ++i) { - p[i].coeff = ctx->coeff_pbuf[i][2]; - p[i].qcoeff = ctx->qcoeff_pbuf[i][2]; - pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][2]; - p[i].eobs = ctx->eobs_pbuf[i][2]; - } - x->skip = ctx->skip; if (frame_is_intra_only(cm)) { @@ -1149,7 +1130,6 @@ static void encode_sb_rt(VP9_COMP *cpi, const TileInfo *const tile, ctx = partition_plane_context(cpi->above_seg_context, cpi->left_seg_context, mi_row, mi_col, bsize); subsize = mi_8x8[0]->mbmi.sb_type; - } else { ctx = 0; subsize = BLOCK_4X4; @@ -2419,6 +2399,22 @@ static void encode_frame_internal(VP9_COMP *cpi) { set_prev_mi(cm); + if (cpi->sf.use_pick_mode) { + // Initialize internal buffer pointers for rtc coding, where non-RD + // mode decision is used and hence no buffer pointer swap needed. + int i; + struct macroblock_plane *const p = x->plane; + struct macroblockd_plane *const pd = xd->plane; + PICK_MODE_CONTEXT *ctx = &cpi->mb.sb64_context; + + for (i = 0; i < MAX_MB_PLANE; ++i) { + p[i].coeff = ctx->coeff_pbuf[i][0]; + p[i].qcoeff = ctx->qcoeff_pbuf[i][0]; + pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][0]; + p[i].eobs = ctx->eobs_pbuf[i][0]; + } + } + { struct vpx_usec_timer emr_timer; vpx_usec_timer_start(&emr_timer); diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c index cef7e0403..2b947663c 100644 --- a/vp9/encoder/vp9_onyx_if.c +++ b/vp9/encoder/vp9_onyx_if.c @@ -1558,6 +1558,7 @@ static void alloc_mode_context(VP9_COMMON *cm, int num_4x4_blk, int num_pix = num_4x4_blk << 4; int i, k; ctx->num_4x4_blk = num_4x4_blk; + CHECK_MEM_ERROR(cm, ctx->zcoeff_blk, vpx_calloc(num_4x4_blk, sizeof(uint8_t))); for (i = 0; i < MAX_MB_PLANE; ++i) { @@ -1601,7 +1602,6 @@ static void init_pick_mode_context(VP9_COMP *cpi) { VP9_COMMON *const cm = &cpi->common; MACROBLOCK *const x = &cpi->mb; - for (i = 0; i < BLOCK_SIZES; ++i) { const int num_4x4_w = num_4x4_blocks_wide_lookup[i]; const int num_4x4_h = num_4x4_blocks_high_lookup[i];