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_DEFS_H__
183d0407baSopenharmony_ci#define __MPP_RC_DEFS_H__
193d0407baSopenharmony_ci
203d0407baSopenharmony_ci#include "rk_venc_ref.h"
213d0407baSopenharmony_ci
223d0407baSopenharmony_ci#define MAX_CPB_REFS                    (8)
233d0407baSopenharmony_ci
243d0407baSopenharmony_citypedef enum EncFrmType_e {
253d0407baSopenharmony_ci    INTER_P_FRAME   = 0,
263d0407baSopenharmony_ci    INTER_B_FRAME   = 1,
273d0407baSopenharmony_ci    INTRA_FRAME     = 2,
283d0407baSopenharmony_ci    INTER_VI_FRAME  = 3,
293d0407baSopenharmony_ci} EncFrmType;
303d0407baSopenharmony_ci
313d0407baSopenharmony_ci/*
323d0407baSopenharmony_ci * EncFrmStatus controls record the encoding frame status and also control
333d0407baSopenharmony_ci * work flow of encoder. It is the communicat channel between encoder implement
343d0407baSopenharmony_ci * module, rate control module and hardware module.
353d0407baSopenharmony_ci *
363d0407baSopenharmony_ci * bit  0 ~ 31 frame status
373d0407baSopenharmony_ci *      0 ~ 15 current frame status
383d0407baSopenharmony_ci *     16 ~ 31 reference frame status
393d0407baSopenharmony_ci * bit 32 ~ 63 encoding flow control
403d0407baSopenharmony_ci */
413d0407baSopenharmony_citypedef union EncFrmStatus_u {
423d0407baSopenharmony_ci    struct {
433d0407baSopenharmony_ci        /*
443d0407baSopenharmony_ci         * bit  0 ~ 31  frame status
453d0407baSopenharmony_ci         */
463d0407baSopenharmony_ci        /* status flag */
473d0407baSopenharmony_ci        RK_U32          valid           : 1;
483d0407baSopenharmony_ci        /*
493d0407baSopenharmony_ci         * 0 - write the reconstructed frame pixel to memory
503d0407baSopenharmony_ci         * 1 - do not write the reconstructed frame pixel to memory
513d0407baSopenharmony_ci         */
523d0407baSopenharmony_ci        RK_U32          non_recn        : 1;
533d0407baSopenharmony_ci
543d0407baSopenharmony_ci        /*
553d0407baSopenharmony_ci         * 0 - normal frame and normal dpb management
563d0407baSopenharmony_ci         * 1 - save recon frame as first pass extra frame. Used in two pass mode
573d0407baSopenharmony_ci         */
583d0407baSopenharmony_ci        RK_U32          save_pass1      : 1;
593d0407baSopenharmony_ci
603d0407baSopenharmony_ci        /*
613d0407baSopenharmony_ci         * 0 - use normal input source frame as input
623d0407baSopenharmony_ci         * 1 - use the previously stored first pass recon frame as input frame
633d0407baSopenharmony_ci         */
643d0407baSopenharmony_ci        RK_U32          use_pass1       : 1;
653d0407baSopenharmony_ci
663d0407baSopenharmony_ci        /* reference status flag */
673d0407baSopenharmony_ci        /*
683d0407baSopenharmony_ci         * 0 - inter frame
693d0407baSopenharmony_ci         * 1 - intra frame
703d0407baSopenharmony_ci         */
713d0407baSopenharmony_ci        RK_U32          is_intra        : 1;
723d0407baSopenharmony_ci
733d0407baSopenharmony_ci        /*
743d0407baSopenharmony_ci         * Valid when is_intra is true
753d0407baSopenharmony_ci         * 0 - normal intra frame
763d0407baSopenharmony_ci         * 1 - IDR frame
773d0407baSopenharmony_ci         */
783d0407baSopenharmony_ci        RK_U32          is_idr          : 1;
793d0407baSopenharmony_ci
803d0407baSopenharmony_ci        /*
813d0407baSopenharmony_ci         * 0 - mark as reference frame
823d0407baSopenharmony_ci         * 1 - mark as non-refernce frame
833d0407baSopenharmony_ci         */
843d0407baSopenharmony_ci        RK_U32          is_non_ref      : 1;
853d0407baSopenharmony_ci
863d0407baSopenharmony_ci        /*
873d0407baSopenharmony_ci         * Valid when is_non_ref is false
883d0407baSopenharmony_ci         * 0 - mark as short-term reference frame
893d0407baSopenharmony_ci         * 1 - mark as long-term refernce frame
903d0407baSopenharmony_ci         */
913d0407baSopenharmony_ci        RK_U32          is_lt_ref       : 1;
923d0407baSopenharmony_ci
933d0407baSopenharmony_ci        /* bit 8 - 15 */
943d0407baSopenharmony_ci        RK_U32          lt_idx          : 4;
953d0407baSopenharmony_ci        RK_U32          temporal_id     : 4;
963d0407baSopenharmony_ci
973d0407baSopenharmony_ci        /* distance between current frame and reference frame */
983d0407baSopenharmony_ci        MppEncRefMode   ref_mode        : 6;
993d0407baSopenharmony_ci        RK_S32          ref_arg         : 8;
1003d0407baSopenharmony_ci        RK_S32          ref_dist        : 2;
1013d0407baSopenharmony_ci
1023d0407baSopenharmony_ci        /*
1033d0407baSopenharmony_ci         * bit 32 ~ 63  encoder flow control flags
1043d0407baSopenharmony_ci         */
1053d0407baSopenharmony_ci        /*
1063d0407baSopenharmony_ci         * 0 - normal frame encoding
1073d0407baSopenharmony_ci         * 1 - current frame will be dropped
1083d0407baSopenharmony_ci         */
1093d0407baSopenharmony_ci        RK_U32          drop            : 1;
1103d0407baSopenharmony_ci
1113d0407baSopenharmony_ci        /*
1123d0407baSopenharmony_ci         * 0 - rate control module does not change frame type parameter
1133d0407baSopenharmony_ci         * 1 - rate control module changes frame type parameter reencode is needed
1143d0407baSopenharmony_ci         *     to reprocess the dpb process. Also this means dpb module will follow
1153d0407baSopenharmony_ci         *     the frame status parameter provided by rate control module.
1163d0407baSopenharmony_ci         */
1173d0407baSopenharmony_ci        RK_U32          re_dpb_proc     : 1;
1183d0407baSopenharmony_ci
1193d0407baSopenharmony_ci        /*
1203d0407baSopenharmony_ci         * 0 - current frame encoding is in normal flow
1213d0407baSopenharmony_ci         * 1 - current frame encoding is in reencode flow
1223d0407baSopenharmony_ci         */
1233d0407baSopenharmony_ci        RK_U32          reencode        : 1;
1243d0407baSopenharmony_ci
1253d0407baSopenharmony_ci        /*
1263d0407baSopenharmony_ci         * When true current frame size is super large then the frame should be reencoded.
1273d0407baSopenharmony_ci         */
1283d0407baSopenharmony_ci        RK_U32          super_frame     : 1;
1293d0407baSopenharmony_ci
1303d0407baSopenharmony_ci        /*
1313d0407baSopenharmony_ci         * When true currnet frame is force to encoded as software skip frame
1323d0407baSopenharmony_ci         */
1333d0407baSopenharmony_ci        RK_U32          force_pskip     : 1;
1343d0407baSopenharmony_ci        RK_U32          reserved1       : 3;
1353d0407baSopenharmony_ci
1363d0407baSopenharmony_ci        /* reencode times */
1373d0407baSopenharmony_ci        RK_U32          reencode_times  : 8;
1383d0407baSopenharmony_ci
1393d0407baSopenharmony_ci        /* sequential index for each frame */
1403d0407baSopenharmony_ci        RK_U32          seq_idx         : 16;
1413d0407baSopenharmony_ci    };
1423d0407baSopenharmony_ci    RK_U64 val;
1433d0407baSopenharmony_ci} EncFrmStatus;
1443d0407baSopenharmony_ci
1453d0407baSopenharmony_citypedef struct EncCpbStatus_t {
1463d0407baSopenharmony_ci    RK_S32              seq_idx;
1473d0407baSopenharmony_ci
1483d0407baSopenharmony_ci    EncFrmStatus        curr;
1493d0407baSopenharmony_ci    EncFrmStatus        refr;
1503d0407baSopenharmony_ci
1513d0407baSopenharmony_ci    /* initial cpb status for current frame encoding */
1523d0407baSopenharmony_ci    EncFrmStatus        init[MAX_CPB_REFS];
1533d0407baSopenharmony_ci    /* final cpb status after current frame encoding */
1543d0407baSopenharmony_ci    EncFrmStatus        final[MAX_CPB_REFS];
1553d0407baSopenharmony_ci} EncCpbStatus;
1563d0407baSopenharmony_ci
1573d0407baSopenharmony_ci#define ENC_RC_FORCE_QP                 (0x00000001)
1583d0407baSopenharmony_ci
1593d0407baSopenharmony_citypedef struct EncRcForceCfg_t {
1603d0407baSopenharmony_ci    RK_U32              force_flag;
1613d0407baSopenharmony_ci    RK_S32              force_qp;
1623d0407baSopenharmony_ci    RK_U32              reserve[6];
1633d0407baSopenharmony_ci} EncRcForceCfg;
1643d0407baSopenharmony_ci
1653d0407baSopenharmony_ci/*
1663d0407baSopenharmony_ci * communication channel between rc / hal / hardware
1673d0407baSopenharmony_ci *
1683d0407baSopenharmony_ci * rc   -> hal      bit_target / bit_max / bit_min
1693d0407baSopenharmony_ci * hal  -> hw       quality_target / quality_max / quality_min
1703d0407baSopenharmony_ci * hw   -> rc / hal bit_real / quality_real / madi / madp
1713d0407baSopenharmony_ci */
1723d0407baSopenharmony_citypedef struct EncRcCommonInfo_t {
1733d0407baSopenharmony_ci    EncFrmType      frame_type;
1743d0407baSopenharmony_ci
1753d0407baSopenharmony_ci    /* rc to hal */
1763d0407baSopenharmony_ci    RK_S32          bit_target;
1773d0407baSopenharmony_ci    RK_S32          bit_max;
1783d0407baSopenharmony_ci    RK_S32          bit_min;
1793d0407baSopenharmony_ci
1803d0407baSopenharmony_ci    RK_S32          quality_target;
1813d0407baSopenharmony_ci    RK_S32          quality_max;
1823d0407baSopenharmony_ci    RK_S32          quality_min;
1833d0407baSopenharmony_ci
1843d0407baSopenharmony_ci    /* rc from hardware */
1853d0407baSopenharmony_ci    RK_S32          bit_real;
1863d0407baSopenharmony_ci    RK_S32          quality_real;
1873d0407baSopenharmony_ci    RK_S32          madi;
1883d0407baSopenharmony_ci    RK_S32          madp;
1893d0407baSopenharmony_ci
1903d0407baSopenharmony_ci    RK_U32          iblk4_prop; // scale 256
1913d0407baSopenharmony_ci    RK_S32          reserve[15];
1923d0407baSopenharmony_ci} EncRcTaskInfo;
1933d0407baSopenharmony_ci
1943d0407baSopenharmony_citypedef struct EncRcTask_s {
1953d0407baSopenharmony_ci    EncCpbStatus    cpb;
1963d0407baSopenharmony_ci    EncFrmStatus    frm;
1973d0407baSopenharmony_ci    EncRcTaskInfo   info;
1983d0407baSopenharmony_ci    EncRcForceCfg   force;
1993d0407baSopenharmony_ci    MppFrame        frame;
2003d0407baSopenharmony_ci} EncRcTask;
2013d0407baSopenharmony_ci
2023d0407baSopenharmony_ci#endif /* __MPP_RC_DEFS_H__ */
203