shithub: libvpx

Download patch

ref: cdd0ed13524f18c062b82bccdae057c40d33eef7
parent: c6f13f32784330350f176f453c8a4c2a9f6b90a6
parent: 17fd972aea132a9867e20bb9e5588969b19669a3
author: John Koleszar <jkoleszar@google.com>
date: Wed Oct 17 11:15:59 EDT 2012

Merge "consolidate update_mb_segmentation_map data" into experimental

--- a/vp8/decoder/decodframe.c
+++ b/vp8/decoder/decodframe.c
@@ -1158,9 +1158,27 @@
     xd->update_mb_segmentation_map = (unsigned char)vp8_read_bit(bc);
 
     // If so what method will be used.
-    if (xd->update_mb_segmentation_map)
-      pc->temporal_update = (unsigned char)vp8_read_bit(bc);
+    if (xd->update_mb_segmentation_map) {
+      // Which macro block level features are enabled
 
+      // Read the probs used to decode the segment id for each macro
+      // block.
+      for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) {
+          xd->mb_segment_tree_probs[i] = vp8_read_bit(bc) ?
+              (vp8_prob)vp8_read_literal(bc, 8) : 255;
+      }
+
+      // Read the prediction probs needed to decode the segment id
+      pc->temporal_update = (unsigned char)vp8_read_bit(bc);
+      for (i = 0; i < PREDICTION_PROBS; i++) {
+        if (pc->temporal_update) {
+          pc->segment_pred_probs[i] = vp8_read_bit(bc) ?
+              (vp8_prob)vp8_read_literal(bc, 8) : 255;
+        } else {
+          pc->segment_pred_probs[i] = 255;
+        }
+      }
+    }
     // Is the segment data being updated
     xd->update_mb_segmentation_data = (unsigned char)vp8_read_bit(bc);
 
@@ -1222,38 +1240,6 @@
 
           set_segdata(xd, i, j, data);
 #endif
-        }
-      }
-    }
-
-    if (xd->update_mb_segmentation_map) {
-      // Which macro block level features are enabled
-      vpx_memset(xd->mb_segment_tree_probs, 255,
-                 sizeof(xd->mb_segment_tree_probs));
-      vpx_memset(pc->segment_pred_probs, 255,
-                 sizeof(pc->segment_pred_probs));
-
-      // Read the probs used to decode the segment id for each macro
-      // block.
-      for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) {
-        // If not explicitly set value is defaulted to 255 by
-        // memset above
-        if (vp8_read_bit(bc))
-          xd->mb_segment_tree_probs[i] =
-            (vp8_prob)vp8_read_literal(bc, 8);
-      }
-
-      // If predictive coding of segment map is enabled read the
-      // prediction probabilities.
-      if (pc->temporal_update) {
-        // Read the prediction probs needed to decode the segment id
-        // when predictive coding enabled
-        for (i = 0; i < PREDICTION_PROBS; i++) {
-          // If not explicitly set value is defaulted to 255 by
-          // memset above
-          if (vp8_read_bit(bc))
-            pc->segment_pred_probs[i] =
-              (vp8_prob)vp8_read_literal(bc, 8);
         }
       }
     }
--- a/vp8/encoder/bitstream.c
+++ b/vp8/encoder/bitstream.c
@@ -2440,9 +2440,33 @@
     if (xd->update_mb_segmentation_map) {
       // Select the coding strategy (temporal or spatial)
       choose_segmap_coding_method(cpi);
+      // Send the tree probabilities used to decode unpredicted
+      // macro-block segments
+      for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) {
+        int data = xd->mb_segment_tree_probs[i];
 
+        if (data != 255) {
+          vp8_write_bit(bc, 1);
+          vp8_write_literal(bc, data, 8);
+        } else {
+          vp8_write_bit(bc, 0);
+        }
+      }
+
       // Write out the chosen coding method.
       vp8_write_bit(bc, (pc->temporal_update) ? 1 : 0);
+      if (pc->temporal_update) {
+        for (i = 0; i < PREDICTION_PROBS; i++) {
+          int data = pc->segment_pred_probs[i];
+
+          if (data != 255) {
+            vp8_write_bit(bc, 1);
+            vp8_write_literal(bc, data, 8);
+          } else {
+            vp8_write_bit(bc, 0);
+          }
+        }
+      }
     }
 
     vp8_write_bit(bc, (xd->update_mb_segmentation_data) ? 1 : 0);
@@ -2536,33 +2560,6 @@
     save_segment_info(xd);
 #endif
 
-    if (xd->update_mb_segmentation_map) {
-      // Send the tree probabilities used to decode unpredicted
-      // macro-block segments
-      for (i = 0; i < MB_FEATURE_TREE_PROBS; i++) {
-        int Data = xd->mb_segment_tree_probs[i];
-
-        if (Data != 255) {
-          vp8_write_bit(bc, 1);
-          vp8_write_literal(bc, Data, 8);
-        } else
-          vp8_write_bit(bc, 0);
-      }
-
-      // If predictive coding of segment map is enabled send the
-      // prediction probabilities.
-      if (pc->temporal_update) {
-        for (i = 0; i < PREDICTION_PROBS; i++) {
-          int Data = pc->segment_pred_probs[i];
-
-          if (Data != 255) {
-            vp8_write_bit(bc, 1);
-            vp8_write_literal(bc, Data, 8);
-          } else
-            vp8_write_bit(bc, 0);
-        }
-      }
-    }
   }
 
   // Encode the common prediction model status flag probability updates for