/* | |
* 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. | |
*/ | |
/* | |
* 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; | |
RK_U32 refresh_len; | |
} 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; | |
extern "C" { | |
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); | |
} | |