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