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