]> granicus.if.org Git - libvpx/commitdiff
Changes to coding of dual_pred flag.
authorPaul Wilkins <paulwilkins@google.com>
Wed, 8 Feb 2012 15:52:07 +0000 (15:52 +0000)
committerPaul Wilkins <paulwilkins@google.com>
Thu, 9 Feb 2012 15:27:20 +0000 (15:27 +0000)
Further use of common prediction functions and experiments
with alternate contexts based on mode and reference frame.

For the Derf set using reference frame as basis of context
gives +0.18% Overall Psnr and +0.08 SSIM

Change-Id: Ie7eb76f329f74c9c698614f01ece31de0b6bfc9e

vp8/common/pred_common.c
vp8/encoder/bitstream.c
vp8/encoder/encodeframe.c

index affdae4ba6d326b619942e4be19d3da942d85362..810c11d2fe218a766d5740feef413d7bb19edc99 100644 (file)
@@ -39,10 +39,27 @@ unsigned char get_pred_context( VP8_COMMON *const cm,
         break;
 
     case PRED_DUAL:
-        // Second ref not INTRA indicates use of dual pred in neighbour
-        pred_context =
-            ((m - 1)->mbmi.second_ref_frame != INTRA_FRAME) +
-            ((m - cm->mode_info_stride)->mbmi.second_ref_frame != INTRA_FRAME);
+        // Context based on use of dual pred flag by neighbours
+        //pred_context =
+        //    ((m - 1)->mbmi.second_ref_frame != INTRA_FRAME) +
+        //    ((m - cm->mode_info_stride)->mbmi.second_ref_frame != INTRA_FRAME);
+
+        // Context based on mode
+        //if ( m->mbmi.mode == ZEROMV )
+        //    pred_context = 0;
+        //else if ( (m->mbmi.mode == NEARESTMV) || (m->mbmi.mode == NEARMV) )
+        //    pred_context = 1;
+        //else
+        //    pred_context = 2;
+
+        // Context based on reference frame
+        if ( m->mbmi.ref_frame == LAST_FRAME )
+            pred_context = 0;
+        else if ( m->mbmi.ref_frame == GOLDEN_FRAME )
+            pred_context = 1;
+        else
+            pred_context = 2;
+
         break;
 #endif
 
@@ -79,7 +96,9 @@ vp8_prob get_pred_prob( VP8_COMMON *const cm,
         break;
 
     case PRED_DUAL:
-        // Second ref non zero indicates use of dual pred in neighbour
+        // In keeping with convention elsewhre the probability returned is
+        // the probability of a "0" outcome which in this case means the
+        // probability of dual pred off.
         pred_probability = cm->prob_dualpred[pred_context];
         break;
 #endif
index d027b03b4289d9620abe7eb8b59681ff9d20a3da..2d4bb4badb3680b6c11836b49e7862217cb7bfd8 100644 (file)
@@ -1057,8 +1057,11 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
     int row, col;
 
     int prob_skip_false = 0;
+
 #if CONFIG_DUALPRED
+#if !CONFIG_COMPRED
     int prob_dual_pred[3];
+#endif
 #endif /* CONFIG_DUALPRED */
 
     // Values used in prediction model coding
@@ -1111,8 +1114,20 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
         {
             if (cpi->single_pred_count[i] + cpi->dual_pred_count[i])
             {
+#if CONFIG_COMPRED
+                pc->prob_dualpred[i] = cpi->single_pred_count[i] * 255 /
+                    (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
+                if (pc->prob_dualpred[i] < 1)
+                    pc->prob_dualpred[i] = 1;
+            }
+            else
+            {
+                pc->prob_dualpred[i] = 128;
+            }
+            vp8_write_literal(w, pc->prob_dualpred[i], 8);
+#else
                 prob_dual_pred[i] = cpi->single_pred_count[i] * 256 /
-                            (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
+                    (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
                 if (prob_dual_pred[i] < 1)
                     prob_dual_pred[i] = 1;
                 else if (prob_dual_pred[i] > 255)
@@ -1123,9 +1138,6 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
                 prob_dual_pred[i] = 128;
             }
             vp8_write_literal(w, prob_dual_pred[i], 8);
-
-#if CONFIG_COMPRED
-            pc->prob_dualpred[i] = prob_dual_pred[i];
 #endif
         }
     }
@@ -1457,7 +1469,9 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
     int prob_skip_false = 0;
 
 #if CONFIG_DUALPRED
+#if !CONFIG_COMPRED
     int prob_dual_pred[3];
+#endif
 #endif /* CONFIG_DUALPRED */
 
     // Values used in prediction model coding
@@ -1507,8 +1521,20 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
         {
             if (cpi->single_pred_count[i] + cpi->dual_pred_count[i])
             {
+#if CONFIG_COMPRED
+                pc->prob_dualpred[i] = cpi->single_pred_count[i] * 255 /
+                    (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
+                if (pc->prob_dualpred[i] < 1)
+                    pc->prob_dualpred[i] = 1;
+            }
+            else
+            {
+                pc->prob_dualpred[i] = 128;
+            }
+            vp8_write_literal(w, pc->prob_dualpred[i], 8);
+#else
                 prob_dual_pred[i] = cpi->single_pred_count[i] * 256 /
-                            (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
+                    (cpi->single_pred_count[i] + cpi->dual_pred_count[i]);
                 if (prob_dual_pred[i] < 1)
                     prob_dual_pred[i] = 1;
                 else if (prob_dual_pred[i] > 255)
@@ -1519,9 +1545,6 @@ static void pack_inter_mode_mvs(VP8_COMP *const cpi)
                 prob_dual_pred[i] = 128;
             }
             vp8_write_literal(w, prob_dual_pred[i], 8);
-
-#if CONFIG_COMPRED
-            pc->prob_dualpred[i] = prob_dual_pred[i];
 #endif
         }
     }
index 388d8a6bb2d64d253f0afac2883cfc72ab3921b6..b12a41aa04378387adf6c0c8a2f72a410a33979f 100644 (file)
@@ -1811,13 +1811,21 @@ int vp8cx_encode_inter_macroblock
         if (x->e_mbd.mode_info_context->mbmi.ref_frame &&
             x->e_mbd.mode_info_context->mbmi.mode != SPLITMV)
         {
-            MB_MODE_INFO *t = &x->e_mbd.mode_info_context[-cpi->common.mode_info_stride].mbmi;
+            unsigned char pred_context;
+
+#if CONFIG_COMPRED
+            pred_context = get_pred_context( cm, xd, PRED_DUAL );
+#else
+            MB_MODE_INFO *t = &x->e_mbd.mode_info_context
+                              [-cpi->common.mode_info_stride].mbmi;
             MB_MODE_INFO *l = &x->e_mbd.mode_info_context[-1].mbmi;
-            int cnt = (t->second_ref_frame != INTRA_FRAME) + (l->second_ref_frame != INTRA_FRAME);
-            if (x->e_mbd.mode_info_context->mbmi.second_ref_frame == INTRA_FRAME)
-                cpi->single_pred_count[cnt]++;
+            pred_context = (t->second_ref_frame != INTRA_FRAME) +
+                           (l->second_ref_frame != INTRA_FRAME);
+#endif
+            if (xd->mode_info_context->mbmi.second_ref_frame == INTRA_FRAME)
+                cpi->single_pred_count[pred_context]++;
             else
-                cpi->dual_pred_count[cnt]++;
+                cpi->dual_pred_count[pred_context]++;
         }
 #endif /* CONFIG_DUALPRED */