Add callback functions for external_rate_control
Change-Id: I20a1179a2131d2cd069dae9076aa2c18b80784f3
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
|
||||
#include "./vpx_config.h"
|
||||
#include "vpx/internal/vpx_codec_internal.h"
|
||||
#include "vpx/vpx_ext_ratectrl.h"
|
||||
#include "vpx/vp8cx.h"
|
||||
#if CONFIG_INTERNAL_STATS
|
||||
#include "vpx_dsp/ssim.h"
|
||||
@@ -660,10 +661,10 @@ 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];
|
||||
int ready;
|
||||
vpx_rc_model_t model;
|
||||
vpx_rc_funcs_t funcs;
|
||||
} EXT_RATECTRL;
|
||||
|
||||
typedef struct VP9_COMP {
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
#include "./vpx_config.h"
|
||||
#include "vpx/vpx_encoder.h"
|
||||
#include "vpx/vpx_ext_ratectrl.h"
|
||||
#include "vpx_dsp/psnr.h"
|
||||
#include "vpx_ports/vpx_once.h"
|
||||
#include "vpx_ports/static_assert.h"
|
||||
@@ -1734,19 +1735,7 @@ static vpx_codec_err_t ctrl_set_disable_loopfilter(vpx_codec_alg_priv_t *ctx,
|
||||
|
||||
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);
|
||||
ctx->cpi->ext_ratectrl.funcs = *CAST(VP9E_SET_EXTERNAL_RATE_CONTROL, args);
|
||||
return VPX_CODEC_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
*/
|
||||
#include "./vp8.h"
|
||||
#include "./vpx_encoder.h"
|
||||
#include "./vpx_ext_ratectrl.h"
|
||||
|
||||
/*!\file
|
||||
* \brief Provides definitions for using VP8 or VP9 encoder algorithm within the
|
||||
@@ -1067,7 +1068,7 @@ 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 **)
|
||||
VPX_CTRL_USE_TYPE(VP9E_SET_EXTERNAL_RATE_CONTROL, vpx_rc_funcs_t *)
|
||||
#define VPX_CTRL_VP9E_SET_EXTERNAL_RATE_CONTROL
|
||||
|
||||
/*!\endcond */
|
||||
|
||||
@@ -39,3 +39,4 @@ API_SRCS-yes += vpx_codec.mk
|
||||
API_SRCS-yes += vpx_frame_buffer.h
|
||||
API_SRCS-yes += vpx_image.h
|
||||
API_SRCS-yes += vpx_integer.h
|
||||
API_SRCS-yes += vpx_ext_ratectrl.h
|
||||
|
||||
124
vpx/vpx_ext_ratectrl.h
Normal file
124
vpx/vpx_ext_ratectrl.h
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* Copyright (c) 2020 The WebM project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
#ifndef VPX_VPX_VPX_EXT_RATECTRL_H_
|
||||
#define VPX_VPX_VPX_EXT_RATECTRL_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "./vpx_integer.h"
|
||||
|
||||
typedef void *vpx_rc_model_t;
|
||||
|
||||
typedef struct vpx_rc_encodeframe_decision {
|
||||
int q_index;
|
||||
} vpx_rc_encodeframe_decision_t;
|
||||
|
||||
typedef struct vpx_rc_encodeframe_info {
|
||||
int frame_type;
|
||||
int show_index;
|
||||
int coding_index;
|
||||
} vpx_rc_encodeframe_info_t;
|
||||
|
||||
typedef struct vpx_rc_encodeframe_result {
|
||||
int64_t sse;
|
||||
int64_t bit_count;
|
||||
int64_t pixel_count;
|
||||
} vpx_rc_encodeframe_result_t;
|
||||
|
||||
typedef struct vpx_rc_firstpass_stats {
|
||||
double (*frame_stats)[26];
|
||||
int num_frames;
|
||||
} vpx_rc_firstpass_stats_t;
|
||||
|
||||
typedef struct vpx_rc_config {
|
||||
int frame_width;
|
||||
int frame_height;
|
||||
int show_frame_count;
|
||||
int target_bitrate_kbps;
|
||||
} vpx_rc_config_t;
|
||||
|
||||
/*!\brief Create an external rate control model callback prototype
|
||||
*
|
||||
* This callback is invoked by the encoder to create an external rate control
|
||||
* model.
|
||||
*
|
||||
* \param[in] priv Callback's private data
|
||||
* \param[in] ratectrl_config Pointer to vpx_rc_config_t
|
||||
* \param[out] rate_ctrl_model_pt Pointer to vpx_rc_model_t
|
||||
*/
|
||||
typedef int (*vpx_rc_create_model_cb_fn_t)(
|
||||
void *priv, const vpx_rc_config_t *ratectrl_config,
|
||||
vpx_rc_model_t *rate_ctrl_model_pt);
|
||||
|
||||
/*!\brief Send first pass stats to the external rate control model callback
|
||||
* prototype
|
||||
*
|
||||
* This callback is invoked by the encoder to send first pass stats to the
|
||||
* external rate control model.
|
||||
*
|
||||
* \param[in] rate_ctrl_model rate control model
|
||||
* \param[in] first_pass_stats first pass stats
|
||||
*/
|
||||
typedef int (*vpx_rc_send_firstpass_stats_cb_fn_t)(
|
||||
vpx_rc_model_t rate_ctrl_model,
|
||||
const vpx_rc_firstpass_stats_t *first_pass_stats);
|
||||
|
||||
/*!\brief Receive encode frame decision callback prototype
|
||||
*
|
||||
* This callback is invoked by the encoder to receive encode frame decision from
|
||||
* the external rate control model.
|
||||
*
|
||||
* \param[in] rate_ctrl_model rate control model
|
||||
* \param[in] encode_frame_info information of the coding frame
|
||||
* \param[out] frame_decision encode decision of the coding frame
|
||||
*/
|
||||
typedef int (*vpx_rc_get_encodeframe_decision_cb_fn_t)(
|
||||
vpx_rc_model_t rate_ctrl_model,
|
||||
const vpx_rc_encodeframe_info_t *encode_frame_info,
|
||||
vpx_rc_encodeframe_decision_t *frame_decision);
|
||||
|
||||
/*!\brief Update encode frame result callback prototype
|
||||
*
|
||||
* This callback is invoked by the encoder to update encode frame result to the
|
||||
* external rate control model.
|
||||
*
|
||||
* \param[in] rate_ctrl_model rate control model
|
||||
* \param[out] encode_frame_result encode result of the coding frame
|
||||
*/
|
||||
typedef int (*vpx_rc_update_encodeframe_result_cb_fn_t)(
|
||||
vpx_rc_model_t rate_ctrl_model,
|
||||
vpx_rc_encodeframe_result_t *encode_frame_result);
|
||||
|
||||
/*!\brief Delete the external rate control model callback prototype
|
||||
*
|
||||
* This callback is invoked by the encoder to delete the external rate control
|
||||
* model.
|
||||
*
|
||||
* \param[in] rate_ctrl_model rate control model
|
||||
*/
|
||||
typedef int (*vpx_rc_delete_model_cb_fn_t)(vpx_rc_model_t rate_ctrl_model);
|
||||
|
||||
typedef struct vpx_rc_funcs {
|
||||
vpx_rc_create_model_cb_fn_t create_model;
|
||||
vpx_rc_send_firstpass_stats_cb_fn_t send_firstpass_stats;
|
||||
vpx_rc_get_encodeframe_decision_cb_fn_t get_encodeframe_decision;
|
||||
vpx_rc_update_encodeframe_result_cb_fn_t update_encodeframe_result;
|
||||
vpx_rc_delete_model_cb_fn_t delete_model;
|
||||
void *priv;
|
||||
} vpx_rc_funcs_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
#endif // VPX_VPX_VPX_EXT_RATECTRL_H_
|
||||
Reference in New Issue
Block a user