From 3698c1f6207d68c2b4d36b94ae1c55f9dd2ba4da Mon Sep 17 00:00:00 2001 From: Scott LaVarnway Date: Thu, 21 Apr 2011 14:38:36 -0400 Subject: [PATCH] Removed dc_diff from MB_MODE_INFO The dc_diff flag is used to skip loopfiltering. Instead of setting this flag in the decoder/encoder, we now check for this condition in the loopfilter. Change-Id: Ie2b9cdf9e0f4e8b932bbd36e0878c05bffd28931 --- vp8/common/blockd.h | 2 -- vp8/common/loopfilter.c | 23 +++++++++++---- vp8/common/postproc.c | 5 +++- vp8/decoder/decodframe.c | 7 ++--- vp8/decoder/threading.c | 25 ++++++++++------ vp8/encoder/encodeframe.c | 5 ---- vp8/encoder/pickinter.c | 1 - vp8/encoder/rdopt.c | 1 - vp8/encoder/tokenize.c | 60 +-------------------------------------- 9 files changed, 41 insertions(+), 88 deletions(-) diff --git a/vp8/common/blockd.h b/vp8/common/blockd.h index cfe9e1572..aef692744 100644 --- a/vp8/common/blockd.h +++ b/vp8/common/blockd.h @@ -169,9 +169,7 @@ typedef struct unsigned char partitioning; unsigned char mb_skip_coeff; /* does this mb has coefficients at all, 1=no coefficients, 0=need decode tokens */ - unsigned char dc_diff; unsigned char need_to_clamp_mvs; - unsigned char segment_id; /* Which set of segmentation parameters should be used for this MB */ } MB_MODE_INFO; diff --git a/vp8/common/loopfilter.c b/vp8/common/loopfilter.c index 37c5b7740..221998bc6 100644 --- a/vp8/common/loopfilter.c +++ b/vp8/common/loopfilter.c @@ -353,6 +353,9 @@ void vp8_loop_filter_frame for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) { int Segment = (alt_flt_enabled) ? mbd->mode_info_context->mbmi.segment_id : 0; + int skip_lf = (mbd->mode_info_context->mbmi.mode != B_PRED && + mbd->mode_info_context->mbmi.mode != SPLITMV && + mbd->mode_info_context->mbmi.mb_skip_coeff); filter_level = baseline_filter_level[Segment]; @@ -367,14 +370,14 @@ void vp8_loop_filter_frame if (mb_col > 0) cm->lf_mbv(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_stride, &lfi[filter_level], cm->simpler_lpf); - if (mbd->mode_info_context->mbmi.dc_diff > 0) + if (!skip_lf) cm->lf_bv(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_stride, &lfi[filter_level], cm->simpler_lpf); /* don't apply across umv border */ if (mb_row > 0) cm->lf_mbh(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_stride, &lfi[filter_level], cm->simpler_lpf); - if (mbd->mode_info_context->mbmi.dc_diff > 0) + if (!skip_lf) cm->lf_bh(y_ptr, u_ptr, v_ptr, post->y_stride, post->uv_stride, &lfi[filter_level], cm->simpler_lpf); } @@ -457,6 +460,10 @@ void vp8_loop_filter_frame_yonly for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) { int Segment = (alt_flt_enabled) ? mbd->mode_info_context->mbmi.segment_id : 0; + int skip_lf = (mbd->mode_info_context->mbmi.mode != B_PRED && + mbd->mode_info_context->mbmi.mode != SPLITMV && + mbd->mode_info_context->mbmi.mb_skip_coeff); + filter_level = baseline_filter_level[Segment]; /* Apply any context driven MB level adjustment */ @@ -467,14 +474,14 @@ void vp8_loop_filter_frame_yonly if (mb_col > 0) cm->lf_mbv(y_ptr, 0, 0, post->y_stride, 0, &lfi[filter_level], 0); - if (mbd->mode_info_context->mbmi.dc_diff > 0) + if (!skip_lf) cm->lf_bv(y_ptr, 0, 0, post->y_stride, 0, &lfi[filter_level], 0); /* don't apply across umv border */ if (mb_row > 0) cm->lf_mbh(y_ptr, 0, 0, post->y_stride, 0, &lfi[filter_level], 0); - if (mbd->mode_info_context->mbmi.dc_diff > 0) + if (!skip_lf) cm->lf_bh(y_ptr, 0, 0, post->y_stride, 0, &lfi[filter_level], 0); } @@ -565,6 +572,10 @@ void vp8_loop_filter_partial_frame for (mb_col = 0; mb_col < mb_cols; mb_col++) { int Segment = (alt_flt_enabled) ? mbd->mode_info_context->mbmi.segment_id : 0; + int skip_lf = (mbd->mode_info_context->mbmi.mode != B_PRED && + mbd->mode_info_context->mbmi.mode != SPLITMV && + mbd->mode_info_context->mbmi.mb_skip_coeff); + filter_level = baseline_filter_level[Segment]; if (filter_level) @@ -572,12 +583,12 @@ void vp8_loop_filter_partial_frame if (mb_col > 0) cm->lf_mbv(y_ptr, 0, 0, post->y_stride, 0, &lfi[filter_level], 0); - if (mbd->mode_info_context->mbmi.dc_diff > 0) + if (!skip_lf) cm->lf_bv(y_ptr, 0, 0, post->y_stride, 0, &lfi[filter_level], 0); cm->lf_mbh(y_ptr, 0, 0, post->y_stride, 0, &lfi[filter_level], 0); - if (mbd->mode_info_context->mbmi.dc_diff > 0) + if (!skip_lf) cm->lf_bh(y_ptr, 0, 0, post->y_stride, 0, &lfi[filter_level], 0); } diff --git a/vp8/common/postproc.c b/vp8/common/postproc.c index 5bfc7d6fb..660880b52 100644 --- a/vp8/common/postproc.c +++ b/vp8/common/postproc.c @@ -804,11 +804,14 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t for (j = 0; j < mb_cols; j++) { char zz[4]; + int dc_diff = !(mi[mb_index].mbmi.mode != B_PRED && + mi[mb_index].mbmi.mode != SPLITMV && + mi[mb_index].mbmi.mb_skip_coeff)); if (oci->frame_type == KEY_FRAME) sprintf(zz, "a"); else - sprintf(zz, "%c", mi[mb_index].mbmi.dc_diff + '0'); + sprintf(zz, "%c", dc_diff + '0'); vp8_blit_text(zz, y_ptr, post->y_stride); mb_index ++; diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c index c1faaf10a..e9655fb31 100644 --- a/vp8/decoder/decodframe.c +++ b/vp8/decoder/decodframe.c @@ -195,11 +195,10 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd) clamp_mvs(xd); } - xd->mode_info_context->mbmi.dc_diff = 1; - - if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbmi.mode != SPLITMV && eobtotal == 0) + eobtotal |= (xd->mode_info_context->mbmi.mode == B_PRED || + xd->mode_info_context->mbmi.mode == SPLITMV); + if (!eobtotal) { - xd->mode_info_context->mbmi.dc_diff = 0; skip_recon_mb(pbi, xd); return; } diff --git a/vp8/decoder/threading.c b/vp8/decoder/threading.c index 57af07925..c92de001a 100644 --- a/vp8/decoder/threading.c +++ b/vp8/decoder/threading.c @@ -108,12 +108,10 @@ static void decode_macroblock(VP8D_COMP *pbi, MACROBLOCKD *xd, int mb_row, int m clamp_mvs(xd); } - xd->mode_info_context->mbmi.dc_diff = 1; - - if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbmi.mode != SPLITMV && eobtotal == 0) + eobtotal |= (xd->mode_info_context->mbmi.mode == B_PRED || + xd->mode_info_context->mbmi.mode == SPLITMV); + if (!eobtotal) { - xd->mode_info_context->mbmi.dc_diff = 0; - /*mt_skip_recon_mb(pbi, xd, mb_row, mb_col);*/ if (xd->frame_type == KEY_FRAME || xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) { @@ -322,6 +320,7 @@ static THREAD_FUNCTION thread_decoding_proc(void *p_data) if (pbi->common.filter_level) { + int skip_lf; if( mb_row != pc->mb_rows-1 ) { /* Save decoded MB last row data for next-row decoding */ @@ -349,6 +348,10 @@ static THREAD_FUNCTION thread_decoding_proc(void *p_data) /* update loopfilter info */ Segment = (alt_flt_enabled) ? xd->mode_info_context->mbmi.segment_id : 0; + skip_lf = (xd->mode_info_context->mbmi.mode != B_PRED && + xd->mode_info_context->mbmi.mode != SPLITMV && + xd->mode_info_context->mbmi.mb_skip_coeff); + filter_level = pbi->mt_baseline_filter_level[Segment]; /* Distance of Mb to the various image edges. * These are specified to 8th pel as they are always compared to values that are in 1/8th pel units @@ -362,14 +365,14 @@ static THREAD_FUNCTION thread_decoding_proc(void *p_data) if (mb_col > 0) pc->lf_mbv(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); - if (xd->mode_info_context->mbmi.dc_diff > 0) + if (!skip_lf) pc->lf_bv(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); /* don't apply across umv border */ if (mb_row > 0) pc->lf_mbh(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); - if (xd->mode_info_context->mbmi.dc_diff > 0) + if (!skip_lf) pc->lf_bh(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); } } @@ -810,6 +813,7 @@ void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd) if (pbi->common.filter_level) { + int skip_lf; /* Save decoded MB last row data for next-row decoding */ if(mb_row != pc->mb_rows-1) { @@ -837,6 +841,9 @@ void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd) /* update loopfilter info */ Segment = (alt_flt_enabled) ? xd->mode_info_context->mbmi.segment_id : 0; + skip_lf = (xd->mode_info_context->mbmi.mode != B_PRED && + xd->mode_info_context->mbmi.mode != SPLITMV && + xd->mode_info_context->mbmi.mb_skip_coeff); filter_level = pbi->mt_baseline_filter_level[Segment]; /* Distance of Mb to the various image edges. * These are specified to 8th pel as they are always compared to values that are in 1/8th pel units @@ -850,14 +857,14 @@ void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd) if (mb_col > 0) pc->lf_mbv(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); - if (xd->mode_info_context->mbmi.dc_diff > 0) + if (!skip_lf) pc->lf_bv(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); /* don't apply across umv border */ if (mb_row > 0) pc->lf_mbh(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); - if (xd->mode_info_context->mbmi.dc_diff > 0) + if (!skip_lf) pc->lf_bh(xd->dst.y_buffer, xd->dst.u_buffer, xd->dst.v_buffer, recon_y_stride, recon_uv_stride, &lfi[filter_level], pc->simpler_lpf); } } diff --git a/vp8/encoder/encodeframe.c b/vp8/encoder/encodeframe.c index 1ae332515..f48a1fcec 100644 --- a/vp8/encoder/encodeframe.c +++ b/vp8/encoder/encodeframe.c @@ -1400,11 +1400,6 @@ int vp8cx_encode_inter_macroblock { if (cpi->common.mb_no_coeff_skip) { - if (xd->mode_info_context->mbmi.mode != B_PRED && xd->mode_info_context->mbmi.mode != SPLITMV) - xd->mode_info_context->mbmi.dc_diff = 0; - else - xd->mode_info_context->mbmi.dc_diff = 1; - xd->mode_info_context->mbmi.mb_skip_coeff = 1; cpi->skip_true_count ++; vp8_fix_contexts(xd); diff --git a/vp8/encoder/pickinter.c b/vp8/encoder/pickinter.c index c56593e0b..765ff26f6 100644 --- a/vp8/encoder/pickinter.c +++ b/vp8/encoder/pickinter.c @@ -938,7 +938,6 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int re best_mbmode.uv_mode = 0; best_mbmode.mb_skip_coeff = (cpi->common.mb_no_coeff_skip) ? 1 : 0; best_mbmode.partitioning = 0; - best_mbmode.dc_diff = 0; vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO)); vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); diff --git a/vp8/encoder/rdopt.c b/vp8/encoder/rdopt.c index 6c4879be2..1f329d754 100644 --- a/vp8/encoder/rdopt.c +++ b/vp8/encoder/rdopt.c @@ -2461,7 +2461,6 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int best_mbmode.uv_mode = 0; best_mbmode.mb_skip_coeff = (cpi->common.mb_no_coeff_skip) ? 1 : 0; best_mbmode.partitioning = 0; - best_mbmode.dc_diff = 0; vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO)); vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); diff --git a/vp8/encoder/tokenize.c b/vp8/encoder/tokenize.c index ccf0c7f34..1c5923813 100644 --- a/vp8/encoder/tokenize.c +++ b/vp8/encoder/tokenize.c @@ -224,18 +224,9 @@ void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) int plane_type; int b; - TOKENEXTRA *start = *t; - TOKENEXTRA *tp = *t; - - x->mode_info_context->mbmi.dc_diff = 1; - - -#if 1 - x->mode_info_context->mbmi.mb_skip_coeff = mb_is_skippable(x); if (x->mode_info_context->mbmi.mb_skip_coeff) { - cpi->skip_true_count++; if (!cpi->common.mb_no_coeff_skip) @@ -245,17 +236,11 @@ void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) vp8_fix_contexts(x); } - if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV) - x->mode_info_context->mbmi.dc_diff = 0; - else - x->mode_info_context->mbmi.dc_diff = 1; - - return; } cpi->skip_false_count++; -#endif + #if 0 vpx_memcpy(cpi->coef_counts_backup, cpi->coef_counts, sizeof(cpi->coef_counts)); #endif @@ -282,42 +267,6 @@ void vp8_tokenize_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) A + vp8_block2above[b], L + vp8_block2left[b], cpi); -#if 0 - - if (cpi->common.mb_no_coeff_skip) - { - int skip = 1; - - while ((tp != *t) && skip) - { - skip = (skip && (tp->Token == DCT_EOB_TOKEN)); - tp ++; - } - - if (skip != x->mbmi.mb_skip_coeff) - skip += 0; - - x->mbmi.mb_skip_coeff = skip; - - if (x->mbmi.mb_skip_coeff == 1) - { - x->mbmi.dc_diff = 0; - //redo the coutnts - vpx_memcpy(cpi->coef_counts, cpi->coef_counts_backup, sizeof(cpi->coef_counts)); - - *t = start; - cpi->skip_true_count++; - //skip_true_count++; - } - else - { - - cpi->skip_false_count++; - //skip_false_count++; - } - } - -#endif } @@ -500,13 +449,6 @@ void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t) A + vp8_block2above[24], L + vp8_block2left[24], cpi); plane_type = 0; - - if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV) - x->mode_info_context->mbmi.dc_diff = 0; - else - x->mode_info_context->mbmi.dc_diff = 1; - - for (b = 0; b < 16; b++) stuff1st_order_b(x->block + b, t, plane_type, x->frame_type, A + vp8_block2above[b], -- 2.50.1