mirror of
				https://github.com/nyanmisaka/mpp.git
				synced 2025-10-27 02:50:21 +08:00 
			
		
		
		
	 37397d6376
			
		
	
	37397d6376
	
	
	
		
			
			Change-Id: I3cfd444b2d26d5bb2ce2a806efc1a74f4cce05b2 Signed-off-by: sayon.chen <sayon.chen@rock-chips.com>
		
			
				
	
	
		
			257 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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__ */
 |