1*437bfbebSnyanmisaka /* 2*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD 3*437bfbebSnyanmisaka * 4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License"); 5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License. 6*437bfbebSnyanmisaka * You may obtain a copy of the License at 7*437bfbebSnyanmisaka * 8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0 9*437bfbebSnyanmisaka * 10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software 11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS, 12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and 14*437bfbebSnyanmisaka * limitations under the License. 15*437bfbebSnyanmisaka */ 16*437bfbebSnyanmisaka 17*437bfbebSnyanmisaka #ifndef __H264E_DPB_H__ 18*437bfbebSnyanmisaka #define __H264E_DPB_H__ 19*437bfbebSnyanmisaka 20*437bfbebSnyanmisaka #include "h264e_syntax.h" 21*437bfbebSnyanmisaka #include "h264e_sps.h" 22*437bfbebSnyanmisaka #include "mpp_enc_ref.h" 23*437bfbebSnyanmisaka 24*437bfbebSnyanmisaka /* 25*437bfbebSnyanmisaka * H.264 encoder dpb structure info 26*437bfbebSnyanmisaka * 27*437bfbebSnyanmisaka * +----------+ DPB +-> build list +-> REF_LIST 28*437bfbebSnyanmisaka * | + + 29*437bfbebSnyanmisaka * v v v 30*437bfbebSnyanmisaka * FRM_BUF_GRP DPB_FRM +------+------> get_reorder 31*437bfbebSnyanmisaka * + + | 32*437bfbebSnyanmisaka * | v | 33*437bfbebSnyanmisaka * +--------> FRM_BUF +------> get_mmco 34*437bfbebSnyanmisaka * 35*437bfbebSnyanmisaka * H264eDpb is overall structure contain the whole dpb info. 36*437bfbebSnyanmisaka * It is composed H264eDpbFrm and H264eDpbList. 37*437bfbebSnyanmisaka * 38*437bfbebSnyanmisaka */ 39*437bfbebSnyanmisaka 40*437bfbebSnyanmisaka #define MAX_GOP_SIZE 8 41*437bfbebSnyanmisaka #define MAX_GOP_FMT_CNT (MAX_GOP_SIZE+1) 42*437bfbebSnyanmisaka #define MAX_GOP_FMT_SIZE 5 43*437bfbebSnyanmisaka #define MAX_GOP_FMT_BUF_STUFF 16 44*437bfbebSnyanmisaka #define MAX_GOP_FMT_BUF_SIZE (MAX_GOP_FMT_CNT * MAX_GOP_FMT_SIZE + MAX_GOP_FMT_BUF_STUFF) 45*437bfbebSnyanmisaka 46*437bfbebSnyanmisaka #define H264E_ST_GOP_FLAG (0x00000001) 47*437bfbebSnyanmisaka #define H264E_ST_GOP_WITH_LT_REF (0x00000002) 48*437bfbebSnyanmisaka #define H264E_LT_GOP_FLAG (0x00000010) 49*437bfbebSnyanmisaka 50*437bfbebSnyanmisaka #define REF_BY_RECN(idx) (0x00000001 << idx) 51*437bfbebSnyanmisaka #define REF_BY_REFR(idx) (0x00000001 << idx) 52*437bfbebSnyanmisaka 53*437bfbebSnyanmisaka typedef struct H264eDpbFrm_t { 54*437bfbebSnyanmisaka RK_S32 slot_idx; 55*437bfbebSnyanmisaka // frame index in frames 56*437bfbebSnyanmisaka RK_S32 seq_idx; 57*437bfbebSnyanmisaka 58*437bfbebSnyanmisaka union { 59*437bfbebSnyanmisaka RK_U32 on_used; 60*437bfbebSnyanmisaka struct { 61*437bfbebSnyanmisaka RK_U32 dpb_used : 8; 62*437bfbebSnyanmisaka RK_U32 hal_used : 8; 63*437bfbebSnyanmisaka }; 64*437bfbebSnyanmisaka }; 65*437bfbebSnyanmisaka 66*437bfbebSnyanmisaka /* frame status */ 67*437bfbebSnyanmisaka EncFrmStatus status; 68*437bfbebSnyanmisaka RK_S32 prev_ref_idx; 69*437bfbebSnyanmisaka RK_S32 as_pskip_ref; 70*437bfbebSnyanmisaka 71*437bfbebSnyanmisaka /* frame number from H264eSlice */ 72*437bfbebSnyanmisaka RK_S32 frame_num; 73*437bfbebSnyanmisaka RK_S32 lt_idx; 74*437bfbebSnyanmisaka /* poc from H264eSlice */ 75*437bfbebSnyanmisaka RK_S32 poc; 76*437bfbebSnyanmisaka /* pts from input MppFrame */ 77*437bfbebSnyanmisaka RK_S64 pts; 78*437bfbebSnyanmisaka } H264eDpbFrm; 79*437bfbebSnyanmisaka 80*437bfbebSnyanmisaka /* runtime status record */ 81*437bfbebSnyanmisaka typedef struct H264eDpbRt_t { 82*437bfbebSnyanmisaka RK_S32 last_seq_idx; 83*437bfbebSnyanmisaka RK_S32 last_is_ref; 84*437bfbebSnyanmisaka RK_S32 last_frm_num; 85*437bfbebSnyanmisaka RK_S32 last_poc_lsb; 86*437bfbebSnyanmisaka RK_S32 last_poc_msb; 87*437bfbebSnyanmisaka } H264eDpbRt; 88*437bfbebSnyanmisaka 89*437bfbebSnyanmisaka /* 90*437bfbebSnyanmisaka * dpb frame arrangement 91*437bfbebSnyanmisaka * 92*437bfbebSnyanmisaka * If dpb size is 3 then dpb frame will be total 4 frames. 93*437bfbebSnyanmisaka * Then the frame 3 is always current frame and frame 0~2 is reference frame 94*437bfbebSnyanmisaka * in the gop structure. 95*437bfbebSnyanmisaka * 96*437bfbebSnyanmisaka * When one frame is encoded all it info will be moved to its gop position for 97*437bfbebSnyanmisaka * next frame encoding. 98*437bfbebSnyanmisaka */ 99*437bfbebSnyanmisaka typedef struct H264eDpb_t { 100*437bfbebSnyanmisaka H264eReorderInfo *reorder; 101*437bfbebSnyanmisaka H264eMarkingInfo *marking; 102*437bfbebSnyanmisaka 103*437bfbebSnyanmisaka MppEncCpbInfo info; 104*437bfbebSnyanmisaka RK_S32 next_max_lt_idx; 105*437bfbebSnyanmisaka RK_S32 curr_max_lt_idx; 106*437bfbebSnyanmisaka RK_S32 st_size; 107*437bfbebSnyanmisaka RK_S32 lt_size; 108*437bfbebSnyanmisaka RK_S32 used_size; 109*437bfbebSnyanmisaka 110*437bfbebSnyanmisaka RK_S32 dpb_size; 111*437bfbebSnyanmisaka RK_S32 total_cnt; 112*437bfbebSnyanmisaka 113*437bfbebSnyanmisaka /* status on dpb rebuild is needed */ 114*437bfbebSnyanmisaka RK_S32 max_frm_num; 115*437bfbebSnyanmisaka RK_S32 max_poc_lsb; 116*437bfbebSnyanmisaka RK_S32 poc_type; 117*437bfbebSnyanmisaka 118*437bfbebSnyanmisaka RK_S32 last_frm_num; 119*437bfbebSnyanmisaka RK_S32 last_poc_lsb; 120*437bfbebSnyanmisaka RK_S32 last_poc_msb; 121*437bfbebSnyanmisaka 122*437bfbebSnyanmisaka H264eDpbFrm *curr; 123*437bfbebSnyanmisaka H264eDpbFrm *refr; 124*437bfbebSnyanmisaka H264eDpbFrm *list[H264E_MAX_REFS_CNT]; 125*437bfbebSnyanmisaka H264eDpbFrm *stref[H264E_MAX_REFS_CNT]; 126*437bfbebSnyanmisaka H264eDpbFrm *ltref[H264E_MAX_REFS_CNT]; 127*437bfbebSnyanmisaka H264eDpbFrm *map[H264E_MAX_REFS_CNT + 1]; 128*437bfbebSnyanmisaka 129*437bfbebSnyanmisaka // frame storage 130*437bfbebSnyanmisaka H264eDpbRt rt; 131*437bfbebSnyanmisaka H264eDpbRt rt_bak; 132*437bfbebSnyanmisaka H264eDpbFrm frames[H264E_MAX_REFS_CNT + 1]; 133*437bfbebSnyanmisaka H264eDpbFrm frm_bak[H264E_MAX_REFS_CNT + 1]; 134*437bfbebSnyanmisaka } H264eDpb; 135*437bfbebSnyanmisaka 136*437bfbebSnyanmisaka #ifdef __cplusplus 137*437bfbebSnyanmisaka extern "C" { 138*437bfbebSnyanmisaka #endif 139*437bfbebSnyanmisaka 140*437bfbebSnyanmisaka MPP_RET h264e_dpb_init(H264eDpb *dpb, H264eReorderInfo *reorder, H264eMarkingInfo *marking); 141*437bfbebSnyanmisaka MPP_RET h264e_dpb_deinit(H264eDpb *dpb); 142*437bfbebSnyanmisaka 143*437bfbebSnyanmisaka MPP_RET h264e_dpb_setup(H264eDpb *dpb, MppEncCfgSet* cfg, H264eSps *sps); 144*437bfbebSnyanmisaka 145*437bfbebSnyanmisaka /* 146*437bfbebSnyanmisaka * Setup current frame config using flags 147*437bfbebSnyanmisaka * This config function will be called before each frame is encoded: 148*437bfbebSnyanmisaka * 149*437bfbebSnyanmisaka * idr - current frame is force to IDR or not 150*437bfbebSnyanmisaka * lt_ref - current frame is marked as longterm reference 151*437bfbebSnyanmisaka */ 152*437bfbebSnyanmisaka MPP_RET h264e_dpb_proc(H264eDpb *dpb, EncCpbStatus *cpb); 153*437bfbebSnyanmisaka 154*437bfbebSnyanmisaka /* 155*437bfbebSnyanmisaka * hal usage flag mark / unmark function 156*437bfbebSnyanmisaka */ 157*437bfbebSnyanmisaka MPP_RET h264e_dpb_hal_start(H264eDpb *dpb, RK_S32 slot_idx); 158*437bfbebSnyanmisaka MPP_RET h264e_dpb_hal_end(H264eDpb *dpb, RK_S32 slot_idx); 159*437bfbebSnyanmisaka 160*437bfbebSnyanmisaka void h264e_dpb_check(H264eDpb *dpb, EncCpbStatus *cpb); 161*437bfbebSnyanmisaka 162*437bfbebSnyanmisaka #define h264e_dpb_dump_frms(dpb) h264e_dpb_dump_frm(dpb, __FUNCTION__, __LINE__) 163*437bfbebSnyanmisaka 164*437bfbebSnyanmisaka void h264e_dpb_dump_frm(H264eDpb *dpb, const char *caller, RK_S32 line); 165*437bfbebSnyanmisaka 166*437bfbebSnyanmisaka #ifdef __cplusplus 167*437bfbebSnyanmisaka } 168*437bfbebSnyanmisaka #endif 169*437bfbebSnyanmisaka 170*437bfbebSnyanmisaka #endif /* __H264E_DPB_H__ */ 171