From: angiebird Date: Thu, 24 Sep 2020 18:33:55 +0000 (-0700) Subject: Add codec control for external rate control lib X-Git-Tag: v1.10.0-rc1~59 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a04f68148f2b78c4eb1f356c12952c716f67adf0;p=libvpx Add codec control for external rate control lib 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 --- diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h index 263b10cdb..67574ec0e 100644 --- a/vp9/encoder/vp9_encoder.h +++ b/vp9/encoder/vp9_encoder.h @@ -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 diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c index 7b828a5a3..588290de0 100644 --- a/vp9/vp9_cx_iface.c +++ b/vp9/vp9_cx_iface.c @@ -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 }, diff --git a/vpx/vp8cx.h b/vpx/vp8cx.h index 59753cdfd..8b0b1af6e 100644 --- a/vpx/vp8cx.h +++ b/vpx/vp8cx.h @@ -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