From d88cee37124a598e78e7eb17686a89a5533b9520 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Thu, 3 Sep 2015 16:08:29 -0400 Subject: Make update_map/temporal_update fields implicit for keyframes. These frame types cannot make bitstream parsing depend on previous frames, so the hypothetical combinations of e.g. keyframe=1 and update_map=0 or keyframe=1 and temporal_update=1 are non-sensical. Therefore, make it impossible to code such combinations in the vp10 bitstream header. See issue 1044. Change-Id: I3f0a83d5c7e3989541a469a909471424a285239d --- vp10/decoder/decodeframe.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'vp10/decoder/decodeframe.c') diff --git a/vp10/decoder/decodeframe.c b/vp10/decoder/decodeframe.c index 518dec017..e3c97c68c 100644 --- a/vp10/decoder/decodeframe.c +++ b/vp10/decoder/decodeframe.c @@ -1012,8 +1012,9 @@ static void read_coef_probs(FRAME_CONTEXT *fc, TX_MODE tx_mode, read_coef_probs_common(fc->coef_probs[tx_size], r); } -static void setup_segmentation(struct segmentation *seg, +static void setup_segmentation(VP10_COMMON *const cm, struct vpx_read_bit_buffer *rb) { + struct segmentation *const seg = &cm->seg; int i, j; seg->update_map = 0; @@ -1024,13 +1025,21 @@ static void setup_segmentation(struct segmentation *seg, return; // Segmentation map update - seg->update_map = vpx_rb_read_bit(rb); + if (frame_is_intra_only(cm) || cm->error_resilient_mode) { + seg->update_map = 1; + } else { + seg->update_map = vpx_rb_read_bit(rb); + } if (seg->update_map) { for (i = 0; i < SEG_TREE_PROBS; i++) seg->tree_probs[i] = vpx_rb_read_bit(rb) ? vpx_rb_read_literal(rb, 8) : MAX_PROB; - seg->temporal_update = vpx_rb_read_bit(rb); + if (frame_is_intra_only(cm) || cm->error_resilient_mode) { + seg->temporal_update = 0; + } else { + seg->temporal_update = vpx_rb_read_bit(rb); + } if (seg->temporal_update) { for (i = 0; i < PREDICTION_PROBS; i++) seg->pred_probs[i] = vpx_rb_read_bit(rb) ? vpx_rb_read_literal(rb, 8) @@ -1953,7 +1962,7 @@ static size_t read_uncompressed_header(VP10Decoder *pbi, setup_loopfilter(&cm->lf, rb); setup_quantization(cm, &pbi->mb, rb); - setup_segmentation(&cm->seg, rb); + setup_segmentation(cm, rb); setup_segmentation_dequant(cm); setup_tile_info(cm, rb); -- cgit v1.2.3