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__ */