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