]> granicus.if.org Git - libvpx/commitdiff
vp9 svc: Enable different speed setting for each spatial layer.
authorjackychen <jackychen@google.com>
Wed, 13 Jul 2016 22:58:11 +0000 (15:58 -0700)
committerJackyChen <jackychen@google.com>
Mon, 25 Jul 2016 22:11:43 +0000 (15:11 -0700)
This change only affects 1 pass cbr svc mode.

Change-Id: If0da87bb200f7e7762755340c40c8157cc7a16ca

test/datarate_test.cc
vp9/encoder/vp9_svc_layercontext.c
vp9/encoder/vp9_svc_layercontext.h
vp9/vp9_cx_iface.c
vpx/src/svc_encodeframe.c
vpx/vpx_encoder.h

index 0b188b5d756e1bcfa954eb0a9829b7913e5ee4fe..9fd4578ac15c5060cbb79bdcde3d86347ca4b2cc 100644 (file)
@@ -795,7 +795,9 @@ TEST_P(DatarateTestVP9Large, DenoiserOffOn) {
 class DatarateOnePassCbrSvc : public ::libvpx_test::EncoderTest,
     public ::libvpx_test::CodecTestWith2Params<libvpx_test::TestMode, int> {
  public:
-  DatarateOnePassCbrSvc() : EncoderTest(GET_PARAM(0)) {}
+  DatarateOnePassCbrSvc() : EncoderTest(GET_PARAM(0)) {
+    memset(&svc_params_, 0, sizeof(svc_params_));
+  }
   virtual ~DatarateOnePassCbrSvc() {}
  protected:
   virtual void SetUp() {
@@ -824,6 +826,10 @@ class DatarateOnePassCbrSvc : public ::libvpx_test::EncoderTest,
         svc_params_.max_quantizers[i] = 63;
         svc_params_.min_quantizers[i] = 0;
       }
+      svc_params_.speed_per_layer[0] = 5;
+      for (i = 1; i < VPX_SS_MAX_LAYERS; ++i) {
+        svc_params_.speed_per_layer[i] = 7;
+      }
       encoder->Control(VP9E_SET_SVC, 1);
       encoder->Control(VP9E_SET_SVC_PARAMETERS, &svc_params_);
       encoder->Control(VP8E_SET_CPUUSED, speed_setting_);
index 824146fe7a53d3838e95e9100b6396b166e33f3d..a9a06a423ad55d1ad1e04407658379154ba020d0 100644 (file)
@@ -135,7 +135,7 @@ void vp9_init_layer_context(VP9_COMP *const cpi) {
         CHECK_MEM_ERROR(cm, lc->consec_zero_mv,
                         vpx_malloc(consec_zero_mv_size));
         memset(lc->consec_zero_mv, 0, consec_zero_mv_size);
-       }
+      }
     }
   }
 
@@ -293,6 +293,11 @@ void vp9_restore_layer_context(VP9_COMP *const cpi) {
   cpi->twopass = lc->twopass;
   cpi->oxcf.target_bandwidth = lc->target_bandwidth;
   cpi->alt_ref_source = lc->alt_ref_source;
+  // Check if it is one_pass_cbr_svc mode and lc->speed > 0 (real-time mode
+  // does not use speed = 0).
+  if (is_one_pass_cbr_svc(cpi) && lc->speed > 0) {
+    cpi->oxcf.speed = lc->speed;
+  }
   // Reset the frames_since_key and frames_to_key counters to their values
   // before the layer restore. Keep these defined for the stream (not layer).
   if (cpi->svc.number_temporal_layers > 1 ||
index 39094fe02313f0ed2d2b61e1a1eaf586bed7af95..0fdeb06caeff5883767d4ef3a0887c2d813594b1 100644 (file)
@@ -46,6 +46,7 @@ typedef struct {
   signed char *map;
   uint8_t *last_coded_q_map;
   uint8_t *consec_zero_mv;
+  uint8_t speed;
 } LAYER_CONTEXT;
 
 typedef struct {
index f4e989fb5effda35dffa63e4c3fcaea503a0a593..8b7a9b9f40716695952b8589712e262e2e80f4b2 100644 (file)
@@ -1437,6 +1437,7 @@ static vpx_codec_err_t ctrl_set_svc_parameters(vpx_codec_alg_priv_t *ctx,
       lc->min_q = params->min_quantizers[layer];
       lc->scaling_factor_num = params->scaling_factor_num[sl];
       lc->scaling_factor_den = params->scaling_factor_den[sl];
+      lc->speed = params->speed_per_layer[sl];
     }
   }
 
index 427f30f369544a968db17f3738dd9dd94b93d1b1..5aa0b8ddb84122e5a3be2c2230de4ccb21ec86b2 100644 (file)
@@ -410,7 +410,9 @@ vpx_codec_err_t vpx_svc_init(SvcContext *svc_ctx, vpx_codec_ctx_t *codec_ctx,
   for (sl = 0; sl < VPX_SS_MAX_LAYERS; ++sl) {
     si->svc_params.scaling_factor_num[sl] = DEFAULT_SCALE_FACTORS_NUM[sl];
     si->svc_params.scaling_factor_den[sl] = DEFAULT_SCALE_FACTORS_DEN[sl];
+    si->svc_params.speed_per_layer[sl] = svc_ctx->speed;
   }
+
   for (tl = 0; tl < svc_ctx->temporal_layers; ++tl) {
     for (sl = 0; sl < svc_ctx->spatial_layers; ++sl) {
       i = sl * svc_ctx->temporal_layers + tl;
index 12869043b915800a0d9e9bf7ed44cfe4a50ce2c6..28fcd5f99918711c944621bc460fd6ba6999c142 100644 (file)
@@ -715,6 +715,7 @@ typedef struct vpx_svc_parameters {
   int min_quantizers[VPX_MAX_LAYERS];     /**< Min Q for each layer */
   int scaling_factor_num[VPX_MAX_LAYERS]; /**< Scaling factor-numerator */
   int scaling_factor_den[VPX_MAX_LAYERS]; /**< Scaling factor-denominator */
+  int speed_per_layer[VPX_MAX_LAYERS];    /**< Speed setting for each sl */
   int temporal_layering_mode;             /**< Temporal layering mode */
 } vpx_svc_extra_cfg_t;