xref: /rockchip-linux_mpp/mpp/codec/enc/h264/h264e_dpb.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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