summaryrefslogtreecommitdiff
path: root/vp10/decoder/decodeframe.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2015-09-03 16:08:29 -0400
committerRonald S. Bultje <rsbultje@gmail.com>2015-09-03 21:19:45 -0400
commitd88cee37124a598e78e7eb17686a89a5533b9520 (patch)
treeac241092a46898108daa5a4ca415b3e2f30aa025 /vp10/decoder/decodeframe.c
parentecd34e6494599fb44ccc1f68a7c4ee988bc0307c (diff)
downloadlibvpx-d88cee37124a598e78e7eb17686a89a5533b9520.tar
libvpx-d88cee37124a598e78e7eb17686a89a5533b9520.tar.gz
libvpx-d88cee37124a598e78e7eb17686a89a5533b9520.tar.bz2
libvpx-d88cee37124a598e78e7eb17686a89a5533b9520.zip
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
Diffstat (limited to 'vp10/decoder/decodeframe.c')
-rw-r--r--vp10/decoder/decodeframe.c17
1 files changed, 13 insertions, 4 deletions
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);