]> granicus.if.org Git - libvpx/commitdiff
vp9-svc: Add first_spatial_layer_to_encode per superframe
authorMarco Paniconi <marpan@google.com>
Fri, 31 Aug 2018 22:42:19 +0000 (15:42 -0700)
committerMarco Paniconi <marpan@google.com>
Fri, 31 Aug 2018 22:45:56 +0000 (15:45 -0700)
VP9E_SET_SVC_LAYER_ID sets the first spatial layer to
encoder per superframe, so add this parameter to svc encoder.
This is needed, for example, to properly set is_key_frame for
spatial layers when base spatial layer is skipped encoded.

Change-Id: Ifd4ac77f539197ec021e62f4c624a6cc79d64f43

vp9/encoder/vp9_ratectrl.c
vp9/encoder/vp9_svc_layercontext.h
vp9/vp9_cx_iface.c

index 70613c9eb7b4293ed6e93d7fde1ada67bf64a505..c0eafdebd1158d20ac17a23ad3f75b49733948ad 100644 (file)
@@ -2003,6 +2003,8 @@ void vp9_rc_get_svc_params(VP9_COMP *cpi) {
   int target = rc->avg_frame_bandwidth;
   int layer = LAYER_IDS_TO_IDX(svc->spatial_layer_id, svc->temporal_layer_id,
                                svc->number_temporal_layers);
+  if (svc->first_spatial_layer_to_encode)
+    svc->layer_context[svc->temporal_layer_id].is_key_frame = 0;
   // Periodic key frames is based on the super-frame counter
   // (svc.current_superframe), also only base spatial layer is key frame.
   // Key frame is set for any of the following: very first frame, frame flags
index cb2884e228f767d84cf9a1b3adf9218cd2a2232f..60fb7da752e92a00f0a3b306db3126ff4b2e4d45 100644 (file)
@@ -175,6 +175,8 @@ typedef struct SVC {
   int use_set_ref_frame_config;
 
   int temporal_layer_id_per_spatial[VPX_SS_MAX_LAYERS];
+
+  int first_spatial_layer_to_encode;
 } SVC;
 
 struct VP9_COMP;
index d7ed514c1d3fb9e4302e939b164c388f72171bb1..074415b7f72560625199a32206737ff972b95e31 100644 (file)
@@ -1449,6 +1449,7 @@ static vpx_codec_err_t ctrl_set_svc_layer_id(vpx_codec_alg_priv_t *ctx,
   int sl;
 
   svc->spatial_layer_to_encode = data->spatial_layer_id;
+  svc->first_spatial_layer_to_encode = data->spatial_layer_id;
   // TODO(jianj): Deprecated to be removed.
   svc->temporal_layer_id = data->temporal_layer_id;
   // Allow for setting temporal layer per spatial layer for superframe.