/*
|
* 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 __H264E_DPB_H__
|
#define __H264E_DPB_H__
|
|
#include "h264e_syntax.h"
|
#include "h264e_sps.h"
|
#include "mpp_enc_ref.h"
|
|
/*
|
* H.264 encoder dpb structure info
|
*
|
* +----------+ DPB +-> build list +-> REF_LIST
|
* | + +
|
* v v v
|
* FRM_BUF_GRP DPB_FRM +------+------> get_reorder
|
* + + |
|
* | v |
|
* +--------> FRM_BUF +------> get_mmco
|
*
|
* H264eDpb is overall structure contain the whole dpb info.
|
* It is composed H264eDpbFrm and H264eDpbList.
|
*
|
*/
|
|
#define MAX_GOP_SIZE 8
|
#define MAX_GOP_FMT_CNT (MAX_GOP_SIZE+1)
|
#define MAX_GOP_FMT_SIZE 5
|
#define MAX_GOP_FMT_BUF_STUFF 16
|
#define MAX_GOP_FMT_BUF_SIZE (MAX_GOP_FMT_CNT * MAX_GOP_FMT_SIZE + MAX_GOP_FMT_BUF_STUFF)
|
|
#define H264E_ST_GOP_FLAG (0x00000001)
|
#define H264E_ST_GOP_WITH_LT_REF (0x00000002)
|
#define H264E_LT_GOP_FLAG (0x00000010)
|
|
#define REF_BY_RECN(idx) (0x00000001 << idx)
|
#define REF_BY_REFR(idx) (0x00000001 << idx)
|
|
typedef struct H264eDpbFrm_t {
|
RK_S32 slot_idx;
|
// frame index in frames
|
RK_S32 seq_idx;
|
|
union {
|
RK_U32 on_used;
|
struct {
|
RK_U32 dpb_used : 8;
|
RK_U32 hal_used : 8;
|
};
|
};
|
|
/* frame status */
|
EncFrmStatus status;
|
|
/* frame number from H264eSlice */
|
RK_S32 frame_num;
|
RK_S32 lt_idx;
|
/* poc from H264eSlice */
|
RK_S32 poc;
|
/* pts from input MppFrame */
|
RK_S64 pts;
|
} H264eDpbFrm;
|
|
/* runtime status record */
|
typedef struct H264eDpbRt_t {
|
RK_S32 last_seq_idx;
|
RK_S32 last_is_ref;
|
RK_S32 last_frm_num;
|
RK_S32 last_poc_lsb;
|
RK_S32 last_poc_msb;
|
} H264eDpbRt;
|
|
/*
|
* 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 H264eDpb_t {
|
H264eReorderInfo *reorder;
|
H264eMarkingInfo *marking;
|
|
MppEncCpbInfo info;
|
RK_S32 next_max_lt_idx;
|
RK_S32 curr_max_lt_idx;
|
RK_S32 st_size;
|
RK_S32 lt_size;
|
RK_S32 used_size;
|
|
RK_S32 dpb_size;
|
RK_S32 total_cnt;
|
|
/* status on dpb rebuild is needed */
|
RK_S32 max_frm_num;
|
RK_S32 max_poc_lsb;
|
RK_S32 poc_type;
|
|
RK_S32 last_frm_num;
|
RK_S32 last_poc_lsb;
|
RK_S32 last_poc_msb;
|
|
H264eDpbFrm *curr;
|
H264eDpbFrm *refr;
|
H264eDpbFrm *list[H264E_MAX_REFS_CNT];
|
H264eDpbFrm *stref[H264E_MAX_REFS_CNT];
|
H264eDpbFrm *ltref[H264E_MAX_REFS_CNT];
|
H264eDpbFrm *map[H264E_MAX_REFS_CNT + 1];
|
|
// frame storage
|
H264eDpbRt rt;
|
H264eDpbRt rt_bak;
|
H264eDpbFrm frames[H264E_MAX_REFS_CNT + 1];
|
H264eDpbFrm frm_bak[H264E_MAX_REFS_CNT + 1];
|
} H264eDpb;
|
|
#ifdef __cplusplus
|
extern "C" {
|
#endif
|
|
MPP_RET h264e_dpb_init(H264eDpb *dpb, H264eReorderInfo *reorder, H264eMarkingInfo *marking);
|
MPP_RET h264e_dpb_deinit(H264eDpb *dpb);
|
|
MPP_RET h264e_dpb_setup(H264eDpb *dpb, MppEncCfgSet* cfg, H264eSps *sps);
|
|
/*
|
* Setup current frame config using flags
|
* This config function will be called before each frame is encoded:
|
*
|
* idr - current frame is force to IDR or not
|
* lt_ref - current frame is marked as longterm reference
|
*/
|
MPP_RET h264e_dpb_proc(H264eDpb *dpb, EncCpbStatus *cpb);
|
|
/*
|
* hal usage flag mark / unmark function
|
*/
|
MPP_RET h264e_dpb_hal_start(H264eDpb *dpb, RK_S32 slot_idx);
|
MPP_RET h264e_dpb_hal_end(H264eDpb *dpb, RK_S32 slot_idx);
|
|
void h264e_dpb_check(H264eDpb *dpb, EncCpbStatus *cpb);
|
|
#define h264e_dpb_dump_frms(dpb) h264e_dpb_dump_frm(dpb, __FUNCTION__, __LINE__)
|
|
void h264e_dpb_dump_frm(H264eDpb *dpb, const char *caller, RK_S32 line);
|
|
#ifdef __cplusplus
|
}
|
#endif
|
|
#endif /* __H264E_DPB_H__ */
|