13d0407baSopenharmony_ci/* 23d0407baSopenharmony_ci * Copyright 2016 Rockchip Electronics Co. LTD 33d0407baSopenharmony_ci * 43d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 53d0407baSopenharmony_ci * you may not use this file except in compliance with the License. 63d0407baSopenharmony_ci * You may obtain a copy of the License at 73d0407baSopenharmony_ci * 83d0407baSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 93d0407baSopenharmony_ci * 103d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 113d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 123d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133d0407baSopenharmony_ci * See the License for the specific language governing permissions and 143d0407baSopenharmony_ci * limitations under the License. 153d0407baSopenharmony_ci */ 163d0407baSopenharmony_ci 173d0407baSopenharmony_ci#ifndef __MPP_RC_API_H__ 183d0407baSopenharmony_ci#define __MPP_RC_API_H__ 193d0407baSopenharmony_ci 203d0407baSopenharmony_ci#include "mpp_err.h" 213d0407baSopenharmony_ci#include "rk_venc_rc.h" 223d0407baSopenharmony_ci#include "mpp_rc_defs.h" 233d0407baSopenharmony_ci 243d0407baSopenharmony_ci/* 253d0407baSopenharmony_ci * Mpp rate control has three parts: 263d0407baSopenharmony_ci * 273d0407baSopenharmony_ci * 1. MPI user config module 283d0407baSopenharmony_ci * MppEncRcCfg structure is provided to user for overall rate control config 293d0407baSopenharmony_ci * Mpp will receive MppEncRcCfg from user, check parameter and set it to 303d0407baSopenharmony_ci * encoder. 313d0407baSopenharmony_ci * 323d0407baSopenharmony_ci * 2. Encoder rate control module 333d0407baSopenharmony_ci * Encoder will implement the rate control strategy required by users 343d0407baSopenharmony_ci * including CBR, VBR, AVBR and so on. 353d0407baSopenharmony_ci * This module only implement the target bit calculation behavior and 363d0407baSopenharmony_ci * quality restriction. And the quality level will be controlled by hal. 373d0407baSopenharmony_ci * 383d0407baSopenharmony_ci * 3. Hal rate control module 393d0407baSopenharmony_ci * Hal will implement the rate control on hardware. Hal will calculate the 403d0407baSopenharmony_ci * QP parameter for hardware according to the frame level target bit 413d0407baSopenharmony_ci * specified by the encoder. And the report the real bitrate and quality to 423d0407baSopenharmony_ci * encoder. 433d0407baSopenharmony_ci * 443d0407baSopenharmony_ci * The header defines the communication interfaces and structures used between 453d0407baSopenharmony_ci * MPI, encoder and hal. 463d0407baSopenharmony_ci */ 473d0407baSopenharmony_ci 483d0407baSopenharmony_citypedef enum RcMode_e { 493d0407baSopenharmony_ci RC_VBR, 503d0407baSopenharmony_ci RC_CBR, 513d0407baSopenharmony_ci RC_FIXQP, 523d0407baSopenharmony_ci RC_AVBR, 533d0407baSopenharmony_ci RC_CVBR, 543d0407baSopenharmony_ci RC_QVBR, 553d0407baSopenharmony_ci RC_LEARNING, 563d0407baSopenharmony_ci RC_MODE_BUTT, 573d0407baSopenharmony_ci} RcMode; 583d0407baSopenharmony_ci 593d0407baSopenharmony_citypedef enum GopMode_e { 603d0407baSopenharmony_ci NORMAL_P, 613d0407baSopenharmony_ci SMART_P, 623d0407baSopenharmony_ci} GopMode; 633d0407baSopenharmony_ci 643d0407baSopenharmony_ci/* 653d0407baSopenharmony_ci * frame rate parameters have great effect on rate control 663d0407baSopenharmony_ci * 673d0407baSopenharmony_ci * fps_in_flex 683d0407baSopenharmony_ci * 0 - fix input frame rate 693d0407baSopenharmony_ci * 1 - variable input frame rate 703d0407baSopenharmony_ci * 713d0407baSopenharmony_ci * fps_in_num 723d0407baSopenharmony_ci * input frame rate numerator, if 0 then default 30 733d0407baSopenharmony_ci * 743d0407baSopenharmony_ci * fps_in_denorm 753d0407baSopenharmony_ci * input frame rate denorminator, if 0 then default 1 763d0407baSopenharmony_ci * 773d0407baSopenharmony_ci * fps_out_flex 783d0407baSopenharmony_ci * 0 - fix output frame rate 793d0407baSopenharmony_ci * 1 - variable output frame rate 803d0407baSopenharmony_ci * 813d0407baSopenharmony_ci * fps_out_num 823d0407baSopenharmony_ci * output frame rate numerator, if 0 then default 30 833d0407baSopenharmony_ci * 843d0407baSopenharmony_ci * fps_out_denorm 853d0407baSopenharmony_ci * output frame rate denorminator, if 0 then default 1 863d0407baSopenharmony_ci */ 873d0407baSopenharmony_citypedef struct RcFpsCfg_t { 883d0407baSopenharmony_ci RK_S32 fps_in_flex; 893d0407baSopenharmony_ci RK_S32 fps_in_num; 903d0407baSopenharmony_ci RK_S32 fps_in_denorm; 913d0407baSopenharmony_ci RK_S32 fps_out_flex; 923d0407baSopenharmony_ci RK_S32 fps_out_num; 933d0407baSopenharmony_ci RK_S32 fps_out_denorm; 943d0407baSopenharmony_ci} RcFpsCfg; 953d0407baSopenharmony_ci 963d0407baSopenharmony_citypedef struct RcSuperframeCfg_t { 973d0407baSopenharmony_ci MppEncRcSuperFrameMode super_mode; 983d0407baSopenharmony_ci RK_U32 super_i_thd; 993d0407baSopenharmony_ci RK_U32 super_p_thd; 1003d0407baSopenharmony_ci MppEncRcPriority rc_priority; 1013d0407baSopenharmony_ci} RcSuperframeCfg; 1023d0407baSopenharmony_ci 1033d0407baSopenharmony_citypedef struct RcDebreathCfg_t { 1043d0407baSopenharmony_ci RK_U32 enable; 1053d0407baSopenharmony_ci RK_U32 strength; 1063d0407baSopenharmony_ci} RcDebreathCfg; 1073d0407baSopenharmony_ci 1083d0407baSopenharmony_citypedef struct RcHierQPCfg_t { 1093d0407baSopenharmony_ci RK_S32 hier_qp_en; 1103d0407baSopenharmony_ci RK_S32 hier_qp_delta[4]; 1113d0407baSopenharmony_ci RK_S32 hier_frame_num[4]; 1123d0407baSopenharmony_ci} RcHierQPCfg; 1133d0407baSopenharmony_ci 1143d0407baSopenharmony_ci/* 1153d0407baSopenharmony_ci * Control parameter from external config 1163d0407baSopenharmony_ci * 1173d0407baSopenharmony_ci * It will be updated on rc/prep/gopref config changed. 1183d0407baSopenharmony_ci */ 1193d0407baSopenharmony_citypedef struct RcCfg_s { 1203d0407baSopenharmony_ci /* encode image size */ 1213d0407baSopenharmony_ci RK_S32 width; 1223d0407baSopenharmony_ci RK_S32 height; 1233d0407baSopenharmony_ci 1243d0407baSopenharmony_ci /* Use rc_mode to find different api */ 1253d0407baSopenharmony_ci RcMode mode; 1263d0407baSopenharmony_ci 1273d0407baSopenharmony_ci RcFpsCfg fps; 1283d0407baSopenharmony_ci 1293d0407baSopenharmony_ci GopMode gop_mode; 1303d0407baSopenharmony_ci /* I frame gop len */ 1313d0407baSopenharmony_ci RK_S32 igop; 1323d0407baSopenharmony_ci /* visual gop len */ 1333d0407baSopenharmony_ci RK_S32 vgop; 1343d0407baSopenharmony_ci 1353d0407baSopenharmony_ci /* bitrate parameter */ 1363d0407baSopenharmony_ci RK_S32 bps_min; 1373d0407baSopenharmony_ci RK_S32 bps_target; 1383d0407baSopenharmony_ci RK_S32 bps_max; 1393d0407baSopenharmony_ci RK_S32 stats_time; 1403d0407baSopenharmony_ci 1413d0407baSopenharmony_ci /* max I frame bit ratio to P frame bit */ 1423d0407baSopenharmony_ci RK_S32 max_i_bit_prop; 1433d0407baSopenharmony_ci RK_S32 min_i_bit_prop; 1443d0407baSopenharmony_ci RK_S32 init_ip_ratio; 1453d0407baSopenharmony_ci /* layer bitrate proportion */ 1463d0407baSopenharmony_ci RK_S32 layer_bit_prop[4]; 1473d0407baSopenharmony_ci 1483d0407baSopenharmony_ci /* quality parameter */ 1493d0407baSopenharmony_ci RK_S32 init_quality; 1503d0407baSopenharmony_ci RK_S32 max_quality; 1513d0407baSopenharmony_ci RK_S32 min_quality; 1523d0407baSopenharmony_ci RK_S32 max_i_quality; 1533d0407baSopenharmony_ci RK_S32 min_i_quality; 1543d0407baSopenharmony_ci RK_S32 i_quality_delta; 1553d0407baSopenharmony_ci RK_S32 vi_quality_delta; 1563d0407baSopenharmony_ci /* layer quality proportion */ 1573d0407baSopenharmony_ci RK_S32 layer_quality_delta[4]; 1583d0407baSopenharmony_ci 1593d0407baSopenharmony_ci /* reencode parameter */ 1603d0407baSopenharmony_ci RK_S32 max_reencode_times; 1613d0407baSopenharmony_ci 1623d0407baSopenharmony_ci /* still / motion desision parameter */ 1633d0407baSopenharmony_ci RK_S32 min_still_prop; 1643d0407baSopenharmony_ci RK_S32 max_still_quality; 1653d0407baSopenharmony_ci 1663d0407baSopenharmony_ci /* 1673d0407baSopenharmony_ci * vbr parameter 1683d0407baSopenharmony_ci * 1693d0407baSopenharmony_ci * vbr_hi_prop - high proportion bitrate for reduce quality 1703d0407baSopenharmony_ci * vbr_lo_prop - low proportion bitrate for increase quality 1713d0407baSopenharmony_ci */ 1723d0407baSopenharmony_ci RK_S32 vbr_hi_prop; 1733d0407baSopenharmony_ci RK_S32 vbr_lo_prop; 1743d0407baSopenharmony_ci 1753d0407baSopenharmony_ci MppEncRcDropFrmMode drop_mode; 1763d0407baSopenharmony_ci RK_U32 drop_thd; 1773d0407baSopenharmony_ci RK_U32 drop_gap; 1783d0407baSopenharmony_ci 1793d0407baSopenharmony_ci RcSuperframeCfg super_cfg; 1803d0407baSopenharmony_ci RcDebreathCfg debreath_cfg; 1813d0407baSopenharmony_ci RcHierQPCfg hier_qp_cfg; 1823d0407baSopenharmony_ci} RcCfg; 1833d0407baSopenharmony_ci 1843d0407baSopenharmony_ci/* 1853d0407baSopenharmony_ci * Different rate control strategy will be implemented by different API config 1863d0407baSopenharmony_ci */ 1873d0407baSopenharmony_citypedef struct RcImplApi_t { 1883d0407baSopenharmony_ci char *name; 1893d0407baSopenharmony_ci MppCodingType type; 1903d0407baSopenharmony_ci RK_U32 ctx_size; 1913d0407baSopenharmony_ci 1923d0407baSopenharmony_ci MPP_RET (*init)(void *ctx, RcCfg *cfg); 1933d0407baSopenharmony_ci MPP_RET (*deinit)(void *ctx); 1943d0407baSopenharmony_ci 1953d0407baSopenharmony_ci MPP_RET (*check_drop)(void *ctx, EncRcTask *task); 1963d0407baSopenharmony_ci MPP_RET (*check_reenc)(void *ctx, EncRcTask *task); 1973d0407baSopenharmony_ci 1983d0407baSopenharmony_ci /* 1993d0407baSopenharmony_ci * frm_start - frame level rate control frm_start. 2003d0407baSopenharmony_ci * The EncRcTaskInfo will be output to hal for hardware to implement. 2013d0407baSopenharmony_ci * frm_end - frame level rate control frm_end. 2023d0407baSopenharmony_ci * The EncRcTaskInfo is returned for real quality and bitrate. 2033d0407baSopenharmony_ci */ 2043d0407baSopenharmony_ci MPP_RET (*frm_start)(void *ctx, EncRcTask *task); 2053d0407baSopenharmony_ci MPP_RET (*frm_end)(void *ctx, EncRcTask *task); 2063d0407baSopenharmony_ci 2073d0407baSopenharmony_ci /* 2083d0407baSopenharmony_ci * hal_start - hardware level rate control start. 2093d0407baSopenharmony_ci * The EncRcTaskInfo will be output to hal for hardware to implement. 2103d0407baSopenharmony_ci * hal_end - hardware level rate control end. 2113d0407baSopenharmony_ci * The EncRcTaskInfo is returned for real quality and bitrate. 2123d0407baSopenharmony_ci */ 2133d0407baSopenharmony_ci MPP_RET (*hal_start)(void *ctx, EncRcTask *task); 2143d0407baSopenharmony_ci MPP_RET (*hal_end)(void *ctx, EncRcTask *task); 2153d0407baSopenharmony_ci} RcImplApi; 2163d0407baSopenharmony_ci 2173d0407baSopenharmony_ci/* 2183d0407baSopenharmony_ci * structures for RC API register and query 2193d0407baSopenharmony_ci */ 2203d0407baSopenharmony_citypedef struct RcApiBrief_t { 2213d0407baSopenharmony_ci const char *name; 2223d0407baSopenharmony_ci MppCodingType type; 2233d0407baSopenharmony_ci} RcApiBrief; 2243d0407baSopenharmony_ci 2253d0407baSopenharmony_citypedef struct RcApiQueryAll_t { 2263d0407baSopenharmony_ci /* input param for query */ 2273d0407baSopenharmony_ci RcApiBrief *brief; 2283d0407baSopenharmony_ci RK_S32 max_count; 2293d0407baSopenharmony_ci 2303d0407baSopenharmony_ci /* output query count */ 2313d0407baSopenharmony_ci RK_S32 count; 2323d0407baSopenharmony_ci} RcApiQueryAll; 2333d0407baSopenharmony_ci 2343d0407baSopenharmony_citypedef struct RcApiQueryType_t { 2353d0407baSopenharmony_ci /* input param for query */ 2363d0407baSopenharmony_ci RcApiBrief *brief; 2373d0407baSopenharmony_ci RK_S32 max_count; 2383d0407baSopenharmony_ci MppCodingType type; 2393d0407baSopenharmony_ci 2403d0407baSopenharmony_ci /* output query count */ 2413d0407baSopenharmony_ci RK_S32 count; 2423d0407baSopenharmony_ci} RcApiQueryType; 2433d0407baSopenharmony_ci 2443d0407baSopenharmony_ci#ifdef __cplusplus 2453d0407baSopenharmony_ciextern "C" { 2463d0407baSopenharmony_ci#endif 2473d0407baSopenharmony_ci 2483d0407baSopenharmony_ciMPP_RET rc_api_add(const RcImplApi *api); 2493d0407baSopenharmony_ciMPP_RET rc_brief_get_all(RcApiQueryAll *query); 2503d0407baSopenharmony_ciMPP_RET rc_brief_get_by_type(RcApiQueryType *query); 2513d0407baSopenharmony_ci 2523d0407baSopenharmony_ci#ifdef __cplusplus 2533d0407baSopenharmony_ci} 2543d0407baSopenharmony_ci#endif 2553d0407baSopenharmony_ci 2563d0407baSopenharmony_ci#endif /* __MPP_RC_API_H__ */ 257