shithub: libvpx

Download patch

ref: 8d02833a61d2dc00ec846229d8e2deee05e4b9e9
parent: c6fd0a5dd65f0723dbabed2f17f12c87b37aab7a
author: Marco Paniconi <marpan@google.com>
date: Tue Sep 11 09:15:51 EDT 2012

Updates to vp8_scalable_patterns.c.

Updated/added a few cases of temporal patterns,
and some changes to the encoder settings.

Change-Id: Idaa75cfc4a26e5b6321f273ef9450b5c85368a4d

--- a/vp8_scalable_patterns.c
+++ b/vp8_scalable_patterns.c
@@ -114,7 +114,7 @@
     (void) fwrite(header, 1, 12, outfile);
 }
 
-static int mode_to_num_layers[9] = {2, 2, 3, 3, 3, 3, 5, 2, 3};
+static int mode_to_num_layers[12] = {1, 2, 2, 3, 3, 3, 3, 5, 2, 3, 3, 3};
 
 int main(int argc, char **argv) {
     FILE                *infile, *outfile[VPX_TS_MAX_LAYERS];
@@ -150,8 +150,8 @@
 
     if (!sscanf(argv[7], "%d", &layering_mode))
         die ("Invalid mode %s", argv[7]);
-    if (layering_mode<0 || layering_mode>8)
-        die ("Invalid mode (0..8) %s", argv[7]);
+    if (layering_mode<0 || layering_mode>11)
+        die ("Invalid mode (0..11) %s", argv[7]);
 
     if (argc != 8+mode_to_num_layers[layering_mode])
         die ("Invalid number of arguments");
@@ -186,7 +186,7 @@
     cfg.rc_dropframe_thresh = 0;
     cfg.rc_end_usage        = VPX_CBR;
     cfg.rc_resize_allowed   = 0;
-    cfg.rc_min_quantizer    = 8;
+    cfg.rc_min_quantizer    = 2;
     cfg.rc_max_quantizer    = 56;
     cfg.rc_undershoot_pct   = 100;
     cfg.rc_overshoot_pct    = 15;
@@ -200,8 +200,11 @@
     cfg.kf_mode           = VPX_KF_DISABLED;
 
     /* Disable automatic keyframe placement */
-    cfg.kf_min_dist = cfg.kf_max_dist = 1000;
+    cfg.kf_min_dist = cfg.kf_max_dist = 3000;
 
+    /* Default setting for bitrate: used in special case of 1 layer (case 0). */
+    cfg.rc_target_bitrate = cfg.ts_target_bitrate[0];
+
     /* Temporal scaling parameters: */
     /* NOTE: The 3 prediction frames cannot be used interchangeably due to
      * differences in the way they are handled throughout the code. The
@@ -210,9 +213,25 @@
      */
     switch (layering_mode)
     {
-
     case 0:
     {
+        /* 1-layer */
+       int ids[1] = {0};
+       cfg.ts_number_layers     = 1;
+       cfg.ts_periodicity       = 1;
+       cfg.ts_rate_decimator[0] = 1;
+       memcpy(cfg.ts_layer_id, ids, sizeof(ids));
+
+       flag_periodicity = cfg.ts_periodicity;
+
+       // Predict from L only.
+       layer_flags[0] = VPX_EFLAG_FORCE_KF  |
+                        VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
+                        VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF;
+       break;
+    }
+    case 1:
+    {
         /* 2-layers, 2-frame period */
         int ids[2] = {0,1};
         cfg.ts_number_layers     = 2;
@@ -240,7 +259,7 @@
         break;
     }
 
-    case 1:
+    case 2:
     {
         /* 2-layers, 3-frame period */
         int ids[3] = {0,1,1};
@@ -263,7 +282,7 @@
         break;
     }
 
-    case 2:
+    case 3:
     {
         /* 3-layers, 6-frame period */
         int ids[6] = {0,2,2,1,2,2};
@@ -289,7 +308,7 @@
         break;
     }
 
-    case 3:
+    case 4:
     {
         /* 3-layers, 4-frame period */
         int ids[4] = {0,2,1,2};
@@ -316,7 +335,7 @@
         break;
     }
 
-    case 4:
+    case 5:
     {
         /* 3-layers, 4-frame period */
         int ids[4] = {0,2,1,2};
@@ -344,7 +363,7 @@
         break;
     }
 
-    case 5:
+    case 6:
     {
         /* 3-layers, 4-frame period */
         int ids[4] = {0,2,1,2};
@@ -368,7 +387,7 @@
         break;
     }
 
-    case 6:
+    case 7:
     {
         /* NOTE: Probably of academic interest only */
 
@@ -407,7 +426,7 @@
         break;
     }
 
-    case 7:
+    case 8:
     {
         /* 2-layers */
         int ids[2] = {0,1};
@@ -439,10 +458,11 @@
         break;
     }
 
-    case 8:
-    default:
+    case 9:
     {
         /* 3-layers */
+        // Sync points for layer 1 and 2 every 8 frames.
+
         int ids[4] = {0,2,1,2};
         cfg.ts_number_layers     = 3;
         cfg.ts_periodicity       = 4;
@@ -472,8 +492,104 @@
                          VP8_EFLAG_NO_UPD_ENTROPY;
         break;
     }
+    case 10:
+    {
+        // 3-layers structure where ARF is used as predictor for all frames,
+        // and is only updated on key frame.
+        // Sync points for layer 1 and 2 every 8 frames.
+
+        int ids[4] = {0,2,1,2};
+        cfg.ts_number_layers     = 3;
+        cfg.ts_periodicity       = 4;
+        cfg.ts_rate_decimator[0] = 4;
+        cfg.ts_rate_decimator[1] = 2;
+        cfg.ts_rate_decimator[2] = 1;
+        memcpy(cfg.ts_layer_id, ids, sizeof(ids));
+
+        flag_periodicity = 8;
+
+        /* 0=L, 1=GF, 2=ARF */
+
+        // Layer 0: predict from L and ARF; update L and G.
+        layer_flags[0] =  VPX_EFLAG_FORCE_KF  |
+                          VP8_EFLAG_NO_UPD_ARF |
+                          VP8_EFLAG_NO_REF_GF;
+
+        // Layer 2: sync point: predict from L and ARF; update none.
+        layer_flags[1] = VP8_EFLAG_NO_REF_GF |
+                         VP8_EFLAG_NO_UPD_GF |
+                         VP8_EFLAG_NO_UPD_ARF |
+                         VP8_EFLAG_NO_UPD_LAST |
+                         VP8_EFLAG_NO_UPD_ENTROPY;
+
+        // Layer 1: sync point: predict from L and ARF; update G.
+        layer_flags[2] = VP8_EFLAG_NO_REF_GF |
+                         VP8_EFLAG_NO_UPD_ARF |
+                         VP8_EFLAG_NO_UPD_LAST;
+
+        // Layer 2: predict from L, G, ARF; update none.
+        layer_flags[3] = VP8_EFLAG_NO_UPD_GF |
+                         VP8_EFLAG_NO_UPD_ARF |
+                         VP8_EFLAG_NO_UPD_LAST |
+                         VP8_EFLAG_NO_UPD_ENTROPY;
+
+        // Layer 0: predict from L and ARF; update L.
+        layer_flags[4] = VP8_EFLAG_NO_UPD_GF |
+                         VP8_EFLAG_NO_UPD_ARF |
+                         VP8_EFLAG_NO_REF_GF;
+
+        // Layer 2: predict from L, G, ARF; update none.
+        layer_flags[5] = layer_flags[3];
+
+        // Layer 1: predict from L, G, ARF; update G.
+        layer_flags[6] = VP8_EFLAG_NO_UPD_ARF |
+                         VP8_EFLAG_NO_UPD_LAST;
+
+        // Layer 2: predict from L, G, ARF; update none.
+        layer_flags[7] = layer_flags[3];
+        break;
     }
+    case 11:
+    default:
+    {
+       // 3-layers structure as in case 10, but no sync/refresh points for
+       // layer 1 and 2.
 
+       int ids[4] = {0,2,1,2};
+       cfg.ts_number_layers     = 3;
+       cfg.ts_periodicity       = 4;
+       cfg.ts_rate_decimator[0] = 4;
+       cfg.ts_rate_decimator[1] = 2;
+       cfg.ts_rate_decimator[2] = 1;
+       memcpy(cfg.ts_layer_id, ids, sizeof(ids));
+
+       flag_periodicity = 8;
+
+       /* 0=L, 1=GF, 2=ARF */
+
+       // Layer 0: predict from L and ARF; update L.
+       layer_flags[0] = VP8_EFLAG_NO_UPD_GF |
+                        VP8_EFLAG_NO_UPD_ARF |
+                        VP8_EFLAG_NO_REF_GF;
+       layer_flags[4] = layer_flags[0];
+
+       // Layer 1: predict from L, G, ARF; update G.
+       layer_flags[2] = VP8_EFLAG_NO_UPD_ARF |
+                        VP8_EFLAG_NO_UPD_LAST;
+       layer_flags[6] = layer_flags[2];
+
+       // Layer 2: predict from L, G, ARF; update none.
+       layer_flags[1] = VP8_EFLAG_NO_UPD_GF |
+                        VP8_EFLAG_NO_UPD_ARF |
+                        VP8_EFLAG_NO_UPD_LAST |
+                        VP8_EFLAG_NO_UPD_ENTROPY;
+       layer_flags[3] = layer_flags[1];
+       layer_flags[5] = layer_flags[1];
+       layer_flags[7] = layer_flags[1];
+       break;
+    }
+    }
+
     /* Open input file */
     if(!(infile = fopen(argv[1], "rb")))
         die("Failed to open %s for reading", argv[1]);
@@ -494,8 +610,9 @@
 
     /* Cap CPU & first I-frame size */
     vpx_codec_control (&codec, VP8E_SET_CPUUSED,                -6);
-    vpx_codec_control (&codec, VP8E_SET_STATIC_THRESHOLD,      800);
+    vpx_codec_control (&codec, VP8E_SET_STATIC_THRESHOLD,      1);
     vpx_codec_control (&codec, VP8E_SET_NOISE_SENSITIVITY,       1);
+    vpx_codec_control(&codec, VP8E_SET_TOKEN_PARTITIONS,       1);
 
     max_intra_size_pct = (int) (((double)cfg.rc_buf_optimal_sz * 0.5)
                          * ((double) cfg.g_timebase.den / cfg.g_timebase.num)
@@ -518,7 +635,7 @@
             die_codec(&codec, "Failed to encode frame");
 
         /* Reset KF flag */
-        if (layering_mode != 6)
+        if (layering_mode != 7)
             layer_flags[0] &= ~VPX_EFLAG_FORCE_KF;
 
         got_data = 0;
@@ -538,14 +655,10 @@
             default:
                 break;
             }
-            printf (pkt->kind == VPX_CODEC_CX_FRAME_PKT
-                    && (pkt->data.frame.flags & VPX_FRAME_IS_KEY)? "K":".");
-            fflush (stdout);
         }
         frame_cnt++;
         pts += frame_duration;
     }
-    printf ("\n");
     fclose (infile);
 
     printf ("Processed %d frames.\n",frame_cnt-1);