/* * Copyright 2015 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __H265E_DPB_H__ #define __H265E_DPB_H__ #include "mpp_buffer.h" #include "h265e_slice.h" #include "h265_syntax.h" #include "mpp_enc_cfg.h" /* * H.265 encoder dpb structure info * * +----------+ DPB +-> build list +-> REF_LIST * | + + * v v v * FRM_BUF_GRP DPB_FRM +------+------> RPS * + + * | v * +--------> FRM_BUF * * H265eDpb is overall structure contain the whole dpb info. * It is composed H265eDpbFrm and H265eRpsList. * */ #define H265E_MAX_BUF_CNT 8 #define H265_MAX_GOP 64 ///< max. value of hierarchical GOP size #define H265_MAX_GOP_CNT (H265_MAX_GOP + 1) #define RPSLIST_MAX (H265_MAX_GOP * 3) typedef struct H265eDpb_t H265eDpb; typedef struct H265eReferencePictureSet_e H265eReferencePictureSet; typedef struct H265eRefPicListModification_e H265eRefPicListModification; typedef struct H265eSlice_e H265eSlice; typedef struct H265eDpb_t H265eDpb; /* * Split reference frame configure to two parts * The first part is slice depended info like poc / frame_num, and frame * type and flags. * The other part is gop structure depended info like gop index, ref_status * and ref_frm_index. This part is inited from dpb gop hierarchy info. */ typedef struct H265eDpbFrm_t { H265eDpb *dpb; RK_S32 slot_idx; RK_S32 seq_idx; RK_S32 gop_idx; RK_S32 gop_cnt; EncFrmStatus status; RK_U32 on_used; RK_U32 inited; RK_U32 is_long_term; RK_U32 used_by_cur; RK_U32 check_lt_msb; RK_S32 poc; H265eSlice *slice; RK_S64 pts; RK_S64 dts; RK_U32 is_key_frame; } H265eDpbFrm; typedef struct H265eRpsList_e { RK_S32 lt_num; RK_S32 st_num; RK_S32 poc_cur_list; RK_S32 poc[RPSLIST_MAX]; RK_U32 used_by_cur[MAX_REFS]; H265eRefPicListModification *m_RefPicListModification; } H265eRpsList; /* * dpb frame arrangement * * If dpb size is 3 then dpb frame will be total 4 frames. * Then the frame 3 is always current frame and frame 0~2 is reference frame * in the gop structure. * * When one frame is encoded all it info will be moved to its gop position for * next frame encoding. */ typedef struct H265eDpb_t { RK_S32 seq_idx; RK_S32 gop_idx; // status and count for one gop structure RK_S32 last_idr; RK_S32 poc_cra; RK_U32 refresh_pending; RK_S32 max_ref_l0; RK_S32 max_ref_l1; H265eRpsList RpsList; H265eDpbFrm *curr; H265eDpbFrm frame_list[MAX_REFS + 1]; } H265eDpb; #ifdef __cplusplus extern "C" { #endif void h265e_set_ref_list(H265eRpsList *RpsList, H265eReferencePictureSet *m_pRps); MPP_RET h265e_dpb_init(H265eDpb **dpb); MPP_RET h265e_dpb_deinit(H265eDpb *dpb); MPP_RET h265e_dpb_setup_buf_size(H265eDpb *dpb, RK_U32 size[], RK_U32 count); MPP_RET h265e_dpb_get_curr(H265eDpb *dpb); void h265e_dpb_build_list(H265eDpb *dpb, EncCpbStatus *cpb); void h265e_dpb_proc_cpb(H265eDpb *dpb, EncCpbStatus *cpb); #define h265e_dpb_dump_frms(dpb) h265e_dpb_dump_frm(dpb, __FUNCTION__) void h265e_dpb_dump_frm(H265eDpb *dpb, const char *caller); #ifdef __cplusplus } #endif #endif /* __H265E_DPB_H__ */