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