Adding vp9_read_and_apply_sign function.
authorDmitry Kovalev <dkovalev@google.com>
Thu, 11 Apr 2013 22:36:43 +0000 (15:36 -0700)
committerDmitry Kovalev <dkovalev@google.com>
Thu, 11 Apr 2013 22:36:43 +0000 (15:36 -0700)
Change-Id: I9951a06dbe4514cc1cf69ff4349c4e12cb4a318c

vp9/decoder/vp9_decodframe.c
vp9/decoder/vp9_detokenize.c
vp9/decoder/vp9_treereader.h

index f017c1f..0721f2a 100644 (file)
@@ -868,10 +868,8 @@ static int get_delta_q(vp9_reader *r, int *dq) {
   const int old_value = *dq;
 
   if (vp9_read_bit(r)) {  // Update bit
-    int value = vp9_read_literal(r, 4);
-    if (vp9_read_bit(r))  // Sign bit
-      value = -value;
-    *dq = value;
+    const int value = vp9_read_literal(r, 4);
+    *dq = vp9_read_and_apply_sign(r, value);
   }
 
   // Trigger a quantizer update if the delta-q value has changed
@@ -1255,9 +1253,8 @@ static void setup_segmentation(VP9_COMMON *pc, MACROBLOCKD *xd, vp9_reader *r) {
           if (feature_enabled) {
             vp9_enable_segfeature(xd, i, j);
             data = vp9_decode_unsigned_max(r, vp9_seg_feature_data_max(j));
-            if (vp9_is_segfeature_signed(j) && vp9_read_bit(r)) {
-              data = -data;
-            }
+            if (vp9_is_segfeature_signed(j))
+              data = vp9_read_and_apply_sign(r, data);
           }
           vp9_set_segdata(xd, i, j, data);
         }
@@ -1306,19 +1303,15 @@ static void setup_loopfilter(VP9_COMMON *pc, MACROBLOCKD *xd, vp9_reader *r) {
 
       for (i = 0; i < MAX_REF_LF_DELTAS; i++) {
         if (vp9_read_bit(r)) {
-          int value = vp9_read_literal(r, 6);
-          if (vp9_read_bit(r))
-            value = -value;
-          xd->ref_lf_deltas[i] = value;
+          const int value = vp9_read_literal(r, 6);
+          xd->ref_lf_deltas[i] = vp9_read_and_apply_sign(r, value);
         }
       }
 
       for (i = 0; i < MAX_MODE_LF_DELTAS; i++) {
         if (vp9_read_bit(r)) {
-          int value = vp9_read_literal(r, 6);
-          if (vp9_read_bit(r))
-            value = -value;
-          xd->mode_lf_deltas[i] = value;
+          const int value = vp9_read_literal(r, 6);
+          xd->mode_lf_deltas[i] = vp9_read_and_apply_sign(r, value);
         }
       }
     }
index 457c739..17bd79b 100644 (file)
@@ -59,11 +59,6 @@ static const vp9_prob cat6_prob[15] = {
 
 DECLARE_ALIGNED(16, extern const uint8_t, vp9_norm[256]);
 
-static int16_t get_signed(BOOL_DECODER *br, int16_t value_to_sign) {
-  return decode_bool(br, 128) ? -value_to_sign : value_to_sign;
-}
-
-
 #define INCREMENT_COUNT(token)               \
   do {                                       \
     coef_counts[type][ref][get_coef_band(scan, txfm_size, c)] \
@@ -76,7 +71,7 @@ static int16_t get_signed(BOOL_DECODER *br, int16_t value_to_sign) {
 #if CONFIG_CODE_NONZEROCOUNT
 #define WRITE_COEF_CONTINUE(val, token)                       \
   {                                                           \
-    qcoeff_ptr[scan[c]] = get_signed(br, val);                \
+    qcoeff_ptr[scan[c]] = vp9_read_and_apply_sign(br, val);   \
     INCREMENT_COUNT(token);                                   \
     c++;                                                      \
     nzc++;                                                    \
@@ -85,7 +80,7 @@ static int16_t get_signed(BOOL_DECODER *br, int16_t value_to_sign) {
 #else
 #define WRITE_COEF_CONTINUE(val, token)                  \
   {                                                      \
-    qcoeff_ptr[scan[c]] = get_signed(br, val);           \
+    qcoeff_ptr[scan[c]] = vp9_read_and_apply_sign(br, val); \
     INCREMENT_COUNT(token);                              \
     c++;                                                 \
     continue;                                            \
index 4ec6de9..a43f5c8 100644 (file)
@@ -21,6 +21,7 @@ typedef BOOL_DECODER vp9_reader;
 #define vp9_read_literal decode_value
 #define vp9_read_bit(r) vp9_read(r, vp9_prob_half)
 #define vp9_read_prob(r) ((vp9_prob)vp9_read_literal(r, 8))
+#define vp9_read_and_apply_sign(r, value) (vp9_read_bit(r) ? -(value) : (value))
 
 // Intent of tree data structure is to make decoding trivial.
 static int treed_read(vp9_reader *const r, /* !!! must return a 0 or 1 !!! */