257 lines
6.7 KiB
C
Executable File
257 lines
6.7 KiB
C
Executable File
/*
|
|
* Copyright 2016 Rockchip Electronics Co. LTD
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef __MPP_RC_API_H__
|
|
#define __MPP_RC_API_H__
|
|
|
|
#include "mpp_err.h"
|
|
#include "rk_venc_rc.h"
|
|
#include "mpp_rc_defs.h"
|
|
|
|
/*
|
|
* Mpp rate control has three parts:
|
|
*
|
|
* 1. MPI user config module
|
|
* MppEncRcCfg structure is provided to user for overall rate control config
|
|
* Mpp will receive MppEncRcCfg from user, check parameter and set it to
|
|
* encoder.
|
|
*
|
|
* 2. Encoder rate control module
|
|
* Encoder will implement the rate control strategy required by users
|
|
* including CBR, VBR, AVBR and so on.
|
|
* This module only implement the target bit calculation behavior and
|
|
* quality restriction. And the quality level will be controlled by hal.
|
|
*
|
|
* 3. Hal rate control module
|
|
* Hal will implement the rate control on hardware. Hal will calculate the
|
|
* QP parameter for hardware according to the frame level target bit
|
|
* specified by the encoder. And the report the real bitrate and quality to
|
|
* encoder.
|
|
*
|
|
* The header defines the communication interfaces and structures used between
|
|
* MPI, encoder and hal.
|
|
*/
|
|
|
|
typedef enum RcMode_e {
|
|
RC_VBR,
|
|
RC_CBR,
|
|
RC_FIXQP,
|
|
RC_AVBR,
|
|
RC_CVBR,
|
|
RC_QVBR,
|
|
RC_LEARNING,
|
|
RC_MODE_BUTT,
|
|
} RcMode;
|
|
|
|
typedef enum GopMode_e {
|
|
NORMAL_P,
|
|
SMART_P,
|
|
} GopMode;
|
|
|
|
/*
|
|
* frame rate parameters have great effect on rate control
|
|
*
|
|
* fps_in_flex
|
|
* 0 - fix input frame rate
|
|
* 1 - variable input frame rate
|
|
*
|
|
* fps_in_num
|
|
* input frame rate numerator, if 0 then default 30
|
|
*
|
|
* fps_in_denorm
|
|
* input frame rate denorminator, if 0 then default 1
|
|
*
|
|
* fps_out_flex
|
|
* 0 - fix output frame rate
|
|
* 1 - variable output frame rate
|
|
*
|
|
* fps_out_num
|
|
* output frame rate numerator, if 0 then default 30
|
|
*
|
|
* fps_out_denorm
|
|
* output frame rate denorminator, if 0 then default 1
|
|
*/
|
|
typedef struct RcFpsCfg_t {
|
|
RK_S32 fps_in_flex;
|
|
RK_S32 fps_in_num;
|
|
RK_S32 fps_in_denorm;
|
|
RK_S32 fps_out_flex;
|
|
RK_S32 fps_out_num;
|
|
RK_S32 fps_out_denorm;
|
|
} RcFpsCfg;
|
|
|
|
typedef struct RcSuperframeCfg_t {
|
|
MppEncRcSuperFrameMode super_mode;
|
|
RK_U32 super_i_thd;
|
|
RK_U32 super_p_thd;
|
|
MppEncRcPriority rc_priority;
|
|
} RcSuperframeCfg;
|
|
|
|
typedef struct RcDebreathCfg_t {
|
|
RK_U32 enable;
|
|
RK_U32 strength;
|
|
} RcDebreathCfg;
|
|
|
|
typedef struct RcHierQPCfg_t {
|
|
RK_S32 hier_qp_en;
|
|
RK_S32 hier_qp_delta[4];
|
|
RK_S32 hier_frame_num[4];
|
|
} RcHierQPCfg;
|
|
|
|
/*
|
|
* Control parameter from external config
|
|
*
|
|
* It will be updated on rc/prep/gopref config changed.
|
|
*/
|
|
typedef struct RcCfg_s {
|
|
/* encode image size */
|
|
RK_S32 width;
|
|
RK_S32 height;
|
|
|
|
/* Use rc_mode to find different api */
|
|
RcMode mode;
|
|
|
|
RcFpsCfg fps;
|
|
|
|
GopMode gop_mode;
|
|
/* I frame gop len */
|
|
RK_S32 igop;
|
|
/* visual gop len */
|
|
RK_S32 vgop;
|
|
|
|
/* bitrate parameter */
|
|
RK_S32 bps_min;
|
|
RK_S32 bps_target;
|
|
RK_S32 bps_max;
|
|
RK_S32 stats_time;
|
|
|
|
/* max I frame bit ratio to P frame bit */
|
|
RK_S32 max_i_bit_prop;
|
|
RK_S32 min_i_bit_prop;
|
|
RK_S32 init_ip_ratio;
|
|
/* layer bitrate proportion */
|
|
RK_S32 layer_bit_prop[4];
|
|
|
|
/* quality parameter */
|
|
RK_S32 init_quality;
|
|
RK_S32 max_quality;
|
|
RK_S32 min_quality;
|
|
RK_S32 max_i_quality;
|
|
RK_S32 min_i_quality;
|
|
RK_S32 i_quality_delta;
|
|
RK_S32 vi_quality_delta;
|
|
/* layer quality proportion */
|
|
RK_S32 layer_quality_delta[4];
|
|
|
|
/* reencode parameter */
|
|
RK_S32 max_reencode_times;
|
|
|
|
/* still / motion desision parameter */
|
|
RK_S32 min_still_prop;
|
|
RK_S32 max_still_quality;
|
|
|
|
/*
|
|
* vbr parameter
|
|
*
|
|
* vbr_hi_prop - high proportion bitrate for reduce quality
|
|
* vbr_lo_prop - low proportion bitrate for increase quality
|
|
*/
|
|
RK_S32 vbr_hi_prop;
|
|
RK_S32 vbr_lo_prop;
|
|
|
|
MppEncRcDropFrmMode drop_mode;
|
|
RK_U32 drop_thd;
|
|
RK_U32 drop_gap;
|
|
|
|
RcSuperframeCfg super_cfg;
|
|
RcDebreathCfg debreath_cfg;
|
|
RcHierQPCfg hier_qp_cfg;
|
|
} RcCfg;
|
|
|
|
/*
|
|
* Different rate control strategy will be implemented by different API config
|
|
*/
|
|
typedef struct RcImplApi_t {
|
|
char *name;
|
|
MppCodingType type;
|
|
RK_U32 ctx_size;
|
|
|
|
MPP_RET (*init)(void *ctx, RcCfg *cfg);
|
|
MPP_RET (*deinit)(void *ctx);
|
|
|
|
MPP_RET (*check_drop)(void *ctx, EncRcTask *task);
|
|
MPP_RET (*check_reenc)(void *ctx, EncRcTask *task);
|
|
|
|
/*
|
|
* frm_start - frame level rate control frm_start.
|
|
* The EncRcTaskInfo will be output to hal for hardware to implement.
|
|
* frm_end - frame level rate control frm_end.
|
|
* The EncRcTaskInfo is returned for real quality and bitrate.
|
|
*/
|
|
MPP_RET (*frm_start)(void *ctx, EncRcTask *task);
|
|
MPP_RET (*frm_end)(void *ctx, EncRcTask *task);
|
|
|
|
/*
|
|
* hal_start - hardware level rate control start.
|
|
* The EncRcTaskInfo will be output to hal for hardware to implement.
|
|
* hal_end - hardware level rate control end.
|
|
* The EncRcTaskInfo is returned for real quality and bitrate.
|
|
*/
|
|
MPP_RET (*hal_start)(void *ctx, EncRcTask *task);
|
|
MPP_RET (*hal_end)(void *ctx, EncRcTask *task);
|
|
} RcImplApi;
|
|
|
|
/*
|
|
* structures for RC API register and query
|
|
*/
|
|
typedef struct RcApiBrief_t {
|
|
const char *name;
|
|
MppCodingType type;
|
|
} RcApiBrief;
|
|
|
|
typedef struct RcApiQueryAll_t {
|
|
/* input param for query */
|
|
RcApiBrief *brief;
|
|
RK_S32 max_count;
|
|
|
|
/* output query count */
|
|
RK_S32 count;
|
|
} RcApiQueryAll;
|
|
|
|
typedef struct RcApiQueryType_t {
|
|
/* input param for query */
|
|
RcApiBrief *brief;
|
|
RK_S32 max_count;
|
|
MppCodingType type;
|
|
|
|
/* output query count */
|
|
RK_S32 count;
|
|
} RcApiQueryType;
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
MPP_RET rc_api_add(const RcImplApi *api);
|
|
MPP_RET rc_brief_get_all(RcApiQueryAll *query);
|
|
MPP_RET rc_brief_get_by_type(RcApiQueryType *query);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __MPP_RC_API_H__ */
|