diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c index c5fc6d58d47587f85efb537eb83d67eb3c4d997c..f72fc3f1ddab985a4337a39a85d01b45c9fe60e4 100644 --- a/vp8/decoder/decodemv.c +++ b/vp8/decoder/decodemv.c @@ -622,14 +622,10 @@ static void mb_mode_mv_init(VP8D_COMP *pbi, vp8_reader *bc) { #endif MACROBLOCKD *const xd = & pbi->mb; - vpx_memset(cm->mbskip_pred_probs, 0, sizeof(cm->mbskip_pred_probs)); - if (pbi->common.mb_no_coeff_skip) { - int k; - for (k = 0; k < MBSKIP_CONTEXTS; ++k) - cm->mbskip_pred_probs[k] = (vp8_prob)vp8_read_literal(bc, 8); - } - - if (cm->frame_type != KEY_FRAME) { + if (cm->frame_type == KEY_FRAME) { + if (!cm->kf_ymode_probs_update) + cm->kf_ymode_probs_index = vp8_read_literal(bc, 3); + } else { #if CONFIG_PRED_FILTER cm->pred_filter_mode = (vp8_prob)vp8_read_literal(bc, 2); @@ -1304,9 +1300,14 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, void vpx_decode_mode_mvs_init(VP8D_COMP *pbi){ VP8_COMMON *cm = &pbi->common; - mb_mode_mv_init(pbi, pbi->mb.current_bc); - if (cm->frame_type == KEY_FRAME && !cm->kf_ymode_probs_update) - cm->kf_ymode_probs_index = vp8_read_literal(pbi->mb.current_bc, 3); + vpx_memset(cm->mbskip_pred_probs, 0, sizeof(cm->mbskip_pred_probs)); + if (pbi->common.mb_no_coeff_skip) { + int k; + for (k = 0; k < MBSKIP_CONTEXTS; ++k) + cm->mbskip_pred_probs[k] = (vp8_prob)vp8_read_literal(&pbi->bc, 8); + } + + mb_mode_mv_init(pbi, &pbi->bc); } void vpx_decode_mb_mode_mv(VP8D_COMP *pbi, MACROBLOCKD *xd, diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c index db585646a00716e688db01e0a8fc3ec933686504..d696506300fd45d3d3c78ecb8b3331993446912b 100644 --- a/vp8/encoder/bitstream.c +++ b/vp8/encoder/bitstream.c @@ -226,7 +226,7 @@ static void update_mode( static void update_mbintra_mode_probs(VP8_COMP *cpi) { VP8_COMMON *const cm = & cpi->common; - vp8_writer *const w = & cpi->bc2; + vp8_writer *const w = & cpi->bc; { vp8_prob Pnew [VP8_YMODES - 1]; @@ -880,73 +880,6 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi) { cpi->mb.partition_info = cpi->mb.pi; - // Update the probabilities used to encode reference frame data - update_ref_probs(cpi); - -#ifdef ENTROPY_STATS - active_section = 1; -#endif - - if (pc->mb_no_coeff_skip) { - int k; - - update_skip_probs(cpi); - for (k = 0; k < MBSKIP_CONTEXTS; ++k) - vp8_write_literal(w, pc->mbskip_pred_probs[k], 8); - } - -#if CONFIG_PRED_FILTER - // Write the prediction filter mode used for this frame - vp8_write_literal(w, pc->pred_filter_mode, 2); - - // Write prediction filter on/off probability if signaling at MB level - if (pc->pred_filter_mode == 2) - vp8_write_literal(w, pc->prob_pred_filter_off, 8); - - // printf("pred_filter_mode:%d prob_pred_filter_off:%d\n", - // pc->pred_filter_mode, pc->prob_pred_filter_off); -#endif -#if CONFIG_SWITCHABLE_INTERP - if (pc->mcomp_filter_type == SWITCHABLE) - update_switchable_interp_probs(cpi); -#endif - - vp8_write_literal(w, pc->prob_intra_coded, 8); - vp8_write_literal(w, pc->prob_last_coded, 8); - vp8_write_literal(w, pc->prob_gf_coded, 8); - - if (cpi->common.comp_pred_mode == HYBRID_PREDICTION) { - vp8_write(w, 1, 128); - vp8_write(w, 1, 128); - for (i = 0; i < COMP_PRED_CONTEXTS; i++) { - if (cpi->single_pred_count[i] + cpi->comp_pred_count[i]) { - pc->prob_comppred[i] = cpi->single_pred_count[i] * 255 / - (cpi->single_pred_count[i] + cpi->comp_pred_count[i]); - if (pc->prob_comppred[i] < 1) - pc->prob_comppred[i] = 1; - } else { - pc->prob_comppred[i] = 128; - } - vp8_write_literal(w, pc->prob_comppred[i], 8); - } - } else if (cpi->common.comp_pred_mode == SINGLE_PREDICTION_ONLY) { - vp8_write(w, 0, 128); - } else { /* compound prediction only */ - vp8_write(w, 1, 128); - vp8_write(w, 0, 128); - } - - update_mbintra_mode_probs(cpi); - -#if CONFIG_NEWMVENTROPY - vp8_write_nmvprobs(cpi, xd->allow_high_precision_mv); -#else - if (xd->allow_high_precision_mv) - vp8_write_mvprobs_hp(cpi); - else - vp8_write_mvprobs(cpi); -#endif - mb_row = 0; for (row = 0; row < pc->mb_rows; row += 2) { m = pc->mi + row * mis; @@ -1479,16 +1412,6 @@ static void write_kfmodes(VP8_COMP *cpi) { TOKENEXTRA *tok = cpi->tok; TOKENEXTRA *tok_end = tok + cpi->tok_count; - if (c->mb_no_coeff_skip) { - update_skip_probs(cpi); - for (i = 0; i < MBSKIP_CONTEXTS; ++i) - vp8_write_literal(bc, c->mbskip_pred_probs[i], 8); - } - - if (!c->kf_ymode_probs_update) { - vp8_write_literal(bc, c->kf_ymode_probs_index, 3); - } - mb_row = 0; for (row = 0; row < c->mb_rows; row += 2) { m = c->mi + row * mis; @@ -2867,6 +2790,81 @@ void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size) // Write out the mb_no_coeff_skip flag vp8_write_bit(bc, pc->mb_no_coeff_skip); + if (pc->mb_no_coeff_skip) { + int k; + + update_skip_probs(cpi); + for (k = 0; k < MBSKIP_CONTEXTS; ++k) + vp8_write_literal(bc, pc->mbskip_pred_probs[k], 8); + } + + if (pc->frame_type == KEY_FRAME) { + if (!pc->kf_ymode_probs_update) { + vp8_write_literal(bc, pc->kf_ymode_probs_index, 3); + } + } else { + // Update the probabilities used to encode reference frame data + update_ref_probs(cpi); + +#ifdef ENTROPY_STATS + active_section = 1; +#endif + +#if CONFIG_PRED_FILTER + // Write the prediction filter mode used for this frame + vp8_write_literal(bc, pc->pred_filter_mode, 2); + + // Write prediction filter on/off probability if signaling at MB level + if (pc->pred_filter_mode == 2) + vp8_write_literal(bc, pc->prob_pred_filter_off, 8); + +#endif +#if CONFIG_SWITCHABLE_INTERP + if (pc->mcomp_filter_type == SWITCHABLE) + update_switchable_interp_probs(cpi); +#endif + + vp8_write_literal(bc, pc->prob_intra_coded, 8); + vp8_write_literal(bc, pc->prob_last_coded, 8); + vp8_write_literal(bc, pc->prob_gf_coded, 8); + + { + const int comp_pred_mode = cpi->common.comp_pred_mode; + const int use_compound_pred = (comp_pred_mode != SINGLE_PREDICTION_ONLY); + const int use_hybrid_pred = (comp_pred_mode == HYBRID_PREDICTION); + + vp8_write(bc, use_compound_pred, 128); + if (use_compound_pred) { + vp8_write(bc, use_hybrid_pred, 128); + if (use_hybrid_pred) { + for (i = 0; i < COMP_PRED_CONTEXTS; i++) { + if (cpi->single_pred_count[i] + cpi->comp_pred_count[i]) { + pc->prob_comppred[i] = cpi->single_pred_count[i] * 255 / + (cpi->single_pred_count[i] + + cpi->comp_pred_count[i]); + if (pc->prob_comppred[i] < 1) + pc->prob_comppred[i] = 1; + } else { + pc->prob_comppred[i] = 128; + } + vp8_write_literal(bc, pc->prob_comppred[i], 8); + } + } + } + } + + update_mbintra_mode_probs(cpi); + +#if CONFIG_NEWMVENTROPY + vp8_write_nmvprobs(cpi, xd->allow_high_precision_mv); +#else + if (xd->allow_high_precision_mv) { + vp8_write_mvprobs_hp(cpi); + } else { + vp8_write_mvprobs(cpi); + } +#endif + } vp8_stop_encode(bc); diff --git a/vp8/encoder/encodemv.c b/vp8/encoder/encodemv.c index fdb3e4f745e7cf3b96c385226fa18ea1e5df7398..1289d89bb7dd6825c2c0bdea2cee898222a62d1e 100644 --- a/vp8/encoder/encodemv.c +++ b/vp8/encoder/encodemv.c @@ -832,7 +832,7 @@ static void write_component_probs( } void vp8_write_mvprobs(VP8_COMP *cpi) { - vp8_writer *const w = & cpi->bc2; + vp8_writer *const w = & cpi->bc; MV_CONTEXT *mvc = cpi->common.fc.mvc; int flags[2] = {0, 0}; #ifdef ENTROPY_STATS @@ -1108,7 +1108,7 @@ static void write_component_probs_hp( } void vp8_write_mvprobs_hp(VP8_COMP *cpi) { - vp8_writer *const w = & cpi->bc2; + vp8_writer *const w = & cpi->bc; MV_CONTEXT_HP *mvc = cpi->common.fc.mvc_hp; int flags[2] = {0, 0}; #ifdef ENTROPY_STATS