Add codec control for external rate control lib
authorangiebird <angiebird@google.com>
Thu, 24 Sep 2020 18:33:55 +0000 (11:33 -0700)
committerangiebird <angiebird@google.com>
Sat, 3 Oct 2020 02:31:36 +0000 (19:31 -0700)
VP9E_SET_EXTERNAL_RATE_CONTROL
One can assign an external library using the control flag,
VP9E_SET_EXTERNAL_RATE_CONTROL.
The args alongside the control flag should be of type char**.
args[0]: char* points to the path of rate control library
args[1]: char* points to the config of the rate control library.

Change-Id: Iae47362cdfafa00614bac427884bffcf6944c583

vp9/encoder/vp9_encoder.h
vp9/vp9_cx_iface.c
vpx/vp8cx.h

index 263b10c..67574ec 100644 (file)
@@ -660,6 +660,12 @@ static INLINE int get_num_unit_4x4(int size) { return (size + 3) >> 2; }
 static INLINE int get_num_unit_16x16(int size) { return (size + 15) >> 4; }
 #endif  // CONFIG_RATE_CTRL
 
+#define MAX_EXT_RATECTRL_BUF_SIZE 500
+typedef struct EXT_RATECTRL {
+  char library_path[MAX_EXT_RATECTRL_BUF_SIZE];
+  char config[MAX_EXT_RATECTRL_BUF_SIZE];
+} EXT_RATECTRL;
+
 typedef struct VP9_COMP {
   FRAME_INFO frame_info;
   QUANTS quants;
@@ -974,6 +980,7 @@ typedef struct VP9_COMP {
 
   RATE_QSTEP_MODEL rq_model[ENCODE_FRAME_TYPES];
 #endif
+  EXT_RATECTRL ext_ratectrl;
 } VP9_COMP;
 
 #if CONFIG_RATE_CTRL
index 7b828a5..588290d 100644 (file)
@@ -1732,6 +1732,24 @@ static vpx_codec_err_t ctrl_set_disable_loopfilter(vpx_codec_alg_priv_t *ctx,
   return VPX_CODEC_OK;
 }
 
+static vpx_codec_err_t ctrl_set_external_rate_control(vpx_codec_alg_priv_t *ctx,
+                                                      va_list args) {
+  EXT_RATECTRL *ext_ratectrl = &ctx->cpi->ext_ratectrl;
+  char **str_ptr = CAST(VP9E_SET_EXTERNAL_RATE_CONTROL, args);
+  const char *library_path = str_ptr[0];
+  const char *config = str_ptr[1];
+  if (strlen(library_path) >= MAX_EXT_RATECTRL_BUF_SIZE) {
+    return VPX_CODEC_ERROR;
+  }
+  if (strlen(config) >= MAX_EXT_RATECTRL_BUF_SIZE) {
+    return VPX_CODEC_ERROR;
+  }
+  snprintf(ext_ratectrl->library_path, MAX_EXT_RATECTRL_BUF_SIZE, "%s",
+           library_path);
+  snprintf(ext_ratectrl->config, MAX_EXT_RATECTRL_BUF_SIZE, "%s", config);
+  return VPX_CODEC_OK;
+}
+
 static vpx_codec_ctrl_fn_map_t encoder_ctrl_maps[] = {
   { VP8_COPY_REFERENCE, ctrl_copy_reference },
 
@@ -1784,6 +1802,7 @@ static vpx_codec_ctrl_fn_map_t encoder_ctrl_maps[] = {
   { VP9E_SET_SVC_SPATIAL_LAYER_SYNC, ctrl_set_svc_spatial_layer_sync },
   { VP9E_SET_DELTA_Q_UV, ctrl_set_delta_q_uv },
   { VP9E_SET_DISABLE_LOOPFILTER, ctrl_set_disable_loopfilter },
+  { VP9E_SET_EXTERNAL_RATE_CONTROL, ctrl_set_external_rate_control },
 
   // Getters
   { VP8E_GET_LAST_QUANTIZER, ctrl_get_quantizer },
index 59753cd..8b0b1af 100644 (file)
@@ -701,6 +701,16 @@ enum vp8e_enc_control_id {
    * Supported in codecs: VP9
    */
   VP9E_SET_DISABLE_LOOPFILTER,
+
+  /*!\brief Codec control function to enable external rate control library.
+   *
+   * args[0]: path of the rate control library
+   *
+   * args[1]: private config of the rate control library
+   *
+   * Supported in codecs: VP9
+   */
+  VP9E_SET_EXTERNAL_RATE_CONTROL,
 };
 
 /*!\brief vpx 1-D scaling mode
@@ -1056,6 +1066,10 @@ VPX_CTRL_USE_TYPE(VP9E_SET_DISABLE_OVERSHOOT_MAXQ_CBR, int)
 
 VPX_CTRL_USE_TYPE(VP9E_SET_DISABLE_LOOPFILTER, int)
 #define VPX_CTRL_VP9E_SET_DISABLE_LOOPFILTER
+
+VPX_CTRL_USE_TYPE(VP9E_SET_EXTERNAL_RATE_CONTROL, char **)
+#define VPX_CTRL_VP9E_SET_EXTERNAL_RATE_CONTROL
+
 /*!\endcond */
 /*! @} - end defgroup vp8_encoder */
 #ifdef __cplusplus