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