From ec1e91847cd7d50e9c125f778bc9eba8ce6cdb32 Mon Sep 17 00:00:00 2001 From: Pieter Kapsenberg Date: Thu, 28 May 2015 17:09:52 -0700 Subject: [PATCH] Implied skip is 0 for intra blocks Skip flag is removed from the bitstream for all blocks coded in intra mode. Very minor coding gain in derf and stdhd sets (0.048 and 0.1) Change-Id: I79f03300f16d6fa84ce54405cafecab8a021cd7d --- configure | 1 + vp9/decoder/vp9_decodemv.c | 21 +++++++++++++++++++-- vp9/encoder/vp9_bitstream.c | 25 ++++++++++++++++++++----- vp9/encoder/vp9_encodeframe.c | 4 ++++ vp9/encoder/vp9_tokenize.c | 6 ++++++ 5 files changed, 50 insertions(+), 7 deletions(-) diff --git a/configure b/configure index 0f0659f95..3d62e93ec 100755 --- a/configure +++ b/configure @@ -300,6 +300,7 @@ EXPERIMENT_LIST=" new_inter bitstream_fixes newmvref + misc_entropy " CONFIG_LIST=" external_build diff --git a/vp9/decoder/vp9_decodemv.c b/vp9/decoder/vp9_decodemv.c index 7394d86b8..81dd4e3ad 100644 --- a/vp9/decoder/vp9_decodemv.c +++ b/vp9/decoder/vp9_decodemv.c @@ -196,11 +196,19 @@ static int read_inter_segment_id(VP9_COMMON *const cm, MACROBLOCKD *const xd, set_segment_id(cm, bsize, mi_row, mi_col, segment_id); return segment_id; } - +#if CONFIG_MISC_ENTROPY static int read_skip(VP9_COMMON *cm, const MACROBLOCKD *xd, - int segment_id, vp9_reader *r) { + int segment_id, int is_inter, vp9_reader *r) { +#else + static int read_skip(VP9_COMMON *cm, const MACROBLOCKD *xd, + int segment_id, vp9_reader *r) { +#endif if (vp9_segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP)) { return 1; +#if CONFIG_MISC_ENTROPY + } else if (!is_inter) { + return 0; +#endif } else { const int ctx = vp9_get_skip_context(xd); const int skip = vp9_read(r, cm->fc.skip_probs[ctx]); @@ -260,7 +268,11 @@ static void read_intra_frame_mode_info(VP9_COMMON *const cm, #endif // CONFIG_INTRABC mbmi->segment_id = read_intra_segment_id(cm, xd, mi_row, mi_col, r); +#if CONFIG_MISC_ENTROPY + mbmi->skip = 0; +#else mbmi->skip = read_skip(cm, xd, mbmi->segment_id, r); +#endif #if CONFIG_PALETTE if (bsize >= BLOCK_8X8 && cm->allow_palette_mode) { int palette_ctx = 0; @@ -1344,11 +1356,16 @@ static void read_inter_frame_mode_info(VP9_COMMON *const cm, #if CONFIG_SUPERTX if (!supertx_enabled) { #endif +#if !CONFIG_MISC_ENTROPY mbmi->skip = read_skip(cm, xd, mbmi->segment_id, r); +#endif #if CONFIG_COPY_MODE if (mbmi->copy_mode == NOREF) #endif inter_block = read_is_inter_block(cm, xd, mbmi->segment_id, r); +#if CONFIG_MISC_ENTROPY + mbmi->skip = read_skip(cm, xd, mbmi->segment_id, inter_block, r); +#endif #if CONFIG_PALETTE mbmi->palette_enabled[0] = 0; diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c index 47199cdb6..50cbaa000 100644 --- a/vp9/encoder/vp9_bitstream.c +++ b/vp9/encoder/vp9_bitstream.c @@ -190,11 +190,20 @@ static void write_selected_tx_size(const VP9_COMMON *cm, } } } - +#if CONFIG_MISC_ENTROPY static int write_skip(const VP9_COMMON *cm, const MACROBLOCKD *xd, - int segment_id, const MODE_INFO *mi, vp9_writer *w) { + int segment_id, const MODE_INFO *mi, int is_inter, + vp9_writer *w) { +#else + static int write_skip(const VP9_COMMON *cm, const MACROBLOCKD *xd, + int segment_id, const MODE_INFO *mi, vp9_writer *w) { +#endif if (vp9_segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP)) { return 1; +#if CONFIG_MISC_ENTROPY + } else if (!is_inter && cm->frame_type == INTER_FRAME) { + return 0; +#endif } else { const int skip = mi->mbmi.skip; vp9_write(w, skip, vp9_get_skip_prob(cm, xd)); @@ -454,14 +463,16 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, const MODE_INFO *mi, write_segment_id(w, seg, segment_id); } } - #if CONFIG_SUPERTX if (supertx_enabled) skip = mbmi->skip; else skip = write_skip(cm, xd, segment_id, mi, w); #else +#if !CONFIG_MISC_ENTROPY skip = write_skip(cm, xd, segment_id, mi, w); +#endif + #endif // CONFIG_SUPERTX #if CONFIG_SUPERTX @@ -476,6 +487,10 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, const MODE_INFO *mi, } #endif +#if CONFIG_MISC_ENTROPY + skip = write_skip(cm, xd, segment_id, mi, is_inter, w); +#endif + #if CONFIG_PALETTE if (!is_inter && bsize >= BLOCK_8X8 && cm->allow_palette_mode) { int n, i, j, k, rows, cols, palette_ctx, color_ctx; @@ -862,9 +877,9 @@ static void write_mb_modes_kf(const VP9_COMMON *cm, if (seg->update_map) write_segment_id(w, seg, mbmi->segment_id); - +#if !CONFIG_MISC_ENTROPY write_skip(cm, xd, mbmi->segment_id, mi, w); - +#endif #if CONFIG_PALETTE if (bsize >= BLOCK_8X8 && cm->allow_palette_mode) { int n, m1, m2, i, j, k, rows, cols, palette_ctx, color_ctx; diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index ad5f45b9f..4d1903aef 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -5185,7 +5185,11 @@ static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, int output_enabled, #endif // CONFIG_INTRABC ) { int plane; +#if CONFIG_MISC_ENTROPY + mbmi->skip = 0; +#else mbmi->skip = 1; +#endif for (plane = 0; plane < MAX_MB_PLANE; ++plane) vp9_encode_intra_block_plane(x, MAX(bsize, BLOCK_8X8), plane); if (output_enabled) diff --git a/vp9/encoder/vp9_tokenize.c b/vp9/encoder/vp9_tokenize.c index 1a1690285..79de4e16d 100644 --- a/vp9/encoder/vp9_tokenize.c +++ b/vp9/encoder/vp9_tokenize.c @@ -530,6 +530,9 @@ void vp9_tokenize_sb(VP9_COMP *cpi, TOKENEXTRA **t, int dry_run, struct tokenize_b_args arg = {cpi, xd, t}; if (mbmi->skip) { if (!dry_run) +#if CONFIG_MISC_ENTROPY + if (is_inter_block(mbmi)) +#endif cm->counts.skip[ctx][1] += skip_inc; reset_skip_context(xd, bsize); if (dry_run) @@ -538,6 +541,9 @@ void vp9_tokenize_sb(VP9_COMP *cpi, TOKENEXTRA **t, int dry_run, } if (!dry_run) { +#if CONFIG_MISC_ENTROPY + if (is_inter_block(mbmi)) +#endif cm->counts.skip[ctx][0] += skip_inc; #if CONFIG_TX_SKIP if (mbmi->tx_skip[0] && FOR_SCREEN_CONTENT) -- 2.40.0