shithub: libvpx

Download patch

ref: 536a90970b7b7d0bf4a029ae1a61774088dc795a
parent: 9511b948ef5ee7f318f15f3744497640bdbcc69e
parent: d88cee37124a598e78e7eb17686a89a5533b9520
author: Ronald S. Bultje <[email protected]>
date: Fri Sep 4 19:53:24 EDT 2015

Merge "Make update_map/temporal_update fields implicit for keyframes."

--- a/vp10/decoder/decodeframe.c
+++ b/vp10/decoder/decodeframe.c
@@ -1012,8 +1012,9 @@
       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 @@
     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 @@
 
   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);
--- a/vp10/decoder/decodemv.c
+++ b/vp10/decoder/decodemv.c
@@ -116,18 +116,6 @@
       cm->current_frame_seg_map[mi_offset + y * cm->mi_cols + x] = segment_id;
 }
 
-static void copy_segment_id(const VP10_COMMON *cm,
-                           const uint8_t *last_segment_ids,
-                           uint8_t *current_segment_ids,
-                           int mi_offset, int x_mis, int y_mis) {
-  int x, y;
-
-  for (y = 0; y < y_mis; y++)
-    for (x = 0; x < x_mis; x++)
-      current_segment_ids[mi_offset + y * cm->mi_cols + x] =  last_segment_ids ?
-          last_segment_ids[mi_offset + y * cm->mi_cols + x] : 0;
-}
-
 static int read_intra_segment_id(VP10_COMMON *const cm, int mi_offset,
                                  int x_mis, int y_mis,
                                  vpx_reader *r) {
@@ -137,15 +125,23 @@
   if (!seg->enabled)
     return 0;  // Default for disabled segmentation
 
-  if (!seg->update_map) {
-    copy_segment_id(cm, cm->last_frame_seg_map, cm->current_frame_seg_map,
-                    mi_offset, x_mis, y_mis);
-    return 0;
-  }
+  assert(seg->update_map && !seg->temporal_update);
 
   segment_id = read_segment_id(r, seg);
   set_segment_id(cm, mi_offset, x_mis, y_mis, segment_id);
   return segment_id;
+}
+
+static void copy_segment_id(const VP10_COMMON *cm,
+                           const uint8_t *last_segment_ids,
+                           uint8_t *current_segment_ids,
+                           int mi_offset, int x_mis, int y_mis) {
+  int x, y;
+
+  for (y = 0; y < y_mis; y++)
+    for (x = 0; x < x_mis; x++)
+      current_segment_ids[mi_offset + y * cm->mi_cols + x] =  last_segment_ids ?
+          last_segment_ids[mi_offset + y * cm->mi_cols + x] : 0;
 }
 
 static int read_inter_segment_id(VP10_COMMON *const cm, MACROBLOCKD *const xd,
--- a/vp10/encoder/bitstream.c
+++ b/vp10/encoder/bitstream.c
@@ -762,7 +762,11 @@
     return;
 
   // Segmentation map
-  vpx_wb_write_bit(wb, seg->update_map);
+  if (!frame_is_intra_only(cm) && !cm->error_resilient_mode) {
+    vpx_wb_write_bit(wb, seg->update_map);
+  } else {
+    assert(seg->update_map == 1);
+  }
   if (seg->update_map) {
     // Select the coding strategy (temporal or spatial)
     vp10_choose_segmap_coding_method(cm, xd);
@@ -776,7 +780,11 @@
     }
 
     // Write out the chosen coding method.
-    vpx_wb_write_bit(wb, seg->temporal_update);
+    if (!frame_is_intra_only(cm) && !cm->error_resilient_mode) {
+      vpx_wb_write_bit(wb, seg->temporal_update);
+    } else {
+      assert(seg->temporal_update == 0);
+    }
     if (seg->temporal_update) {
       for (i = 0; i < PREDICTION_PROBS; i++) {
         const int prob = seg->pred_probs[i];