ref: a5d930e46429dc5648309d2fc0ec7b1acf0f1267
parent: eeb5ef0a240cb7c69d5e92cdd9879032fb4bc5a7
author: Ronald S. Bultje <[email protected]>
date: Tue Sep 8 10:24:30 EDT 2015
vp10: don't reset contextual skip flag if block has no coefficients. The implicitly changed value would be used for contextualizing future skip flags of neighbour blocks (bottom/right), which is certainly not what was intended. The original code stems from vp8, and was useful in cases where coding of the skip flag was disabled. In vp9, the skip flag is always coded. The result of this change is that for bitstream parsing purposes, decoding of the skip flag becomes independent of decoding of block coefficients. See issue 1014. Change-Id: I8629e6abe76f7c1d649f28cd6fe22a675ce4a15d
--- a/vp10/common/blockd.h
+++ b/vp10/common/blockd.h
@@ -70,6 +70,9 @@
PREDICTION_MODE mode;
TX_SIZE tx_size;
int8_t skip;
+#if CONFIG_MISC_FIXES
+ int8_t has_no_coeffs;
+#endif
int8_t segment_id;
int8_t seg_id_predicted; // valid only when temporal_update is enabled
--- a/vp10/common/loopfilter.c
+++ b/vp10/common/loopfilter.c
@@ -754,8 +754,13 @@
// If the block has no coefficients and is not intra we skip applying
// the loop filter on block edges.
+#if CONFIG_MISC_FIXES
+ if ((mbmi->skip || mbmi->has_no_coeffs) && is_inter_block(mbmi))
+ return;
+#else
if (mbmi->skip && is_inter_block(mbmi))
return;
+#endif
// Here we are adding a mask for the transform size. The transform
// size mask is set to be correct for a 64x64 prediction block size. We
@@ -812,8 +817,13 @@
*above_y |= above_prediction_mask[block_size] << shift_y;
*left_y |= left_prediction_mask[block_size] << shift_y;
+#if CONFIG_MISC_FIXES
+ if ((mbmi->skip || mbmi->has_no_coeffs) && is_inter_block(mbmi))
+ return;
+#else
if (mbmi->skip && is_inter_block(mbmi))
return;
+#endif
*above_y |= (size_mask[block_size] &
above_64x64_txform_mask[tx_size_y]) << shift_y;
--- a/vp10/decoder/decodeframe.c
+++ b/vp10/decoder/decodeframe.c
@@ -858,7 +858,11 @@
}
if (!less8x8 && eobtotal == 0)
+#if CONFIG_MISC_FIXES
+ mbmi->has_no_coeffs = 1; // skip loopfilter
+#else
mbmi->skip = 1; // skip loopfilter
+#endif
}
}