xref: /rockchip-linux_mpp/mpp/codec/dec/h264/h264d_global.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  *
3*437bfbebSnyanmisaka  * Copyright 2015 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka  *
5*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka  * You may obtain a copy of the License at
8*437bfbebSnyanmisaka  *
9*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka  *
11*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka  * limitations under the License.
16*437bfbebSnyanmisaka  */
17*437bfbebSnyanmisaka 
18*437bfbebSnyanmisaka #ifndef __H264D_GLOBAL_H__
19*437bfbebSnyanmisaka #define __H264D_GLOBAL_H__
20*437bfbebSnyanmisaka 
21*437bfbebSnyanmisaka #include <stdio.h>
22*437bfbebSnyanmisaka #include "h2645d_sei.h"
23*437bfbebSnyanmisaka #include "rk_type.h"
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka #include "mpp_debug.h"
26*437bfbebSnyanmisaka #include "mpp_bitread.h"
27*437bfbebSnyanmisaka #include "mpp_mem_pool.h"
28*437bfbebSnyanmisaka 
29*437bfbebSnyanmisaka #include "h264d_syntax.h"
30*437bfbebSnyanmisaka #include "h264d_api.h"
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka 
33*437bfbebSnyanmisaka #define H264D_DBG_ERROR             (0x00000001)
34*437bfbebSnyanmisaka #define H264D_DBG_ASSERT            (0x00000002)
35*437bfbebSnyanmisaka #define H264D_DBG_WARNNING          (0x00000004)
36*437bfbebSnyanmisaka #define H264D_DBG_LOG               (0x00000008)
37*437bfbebSnyanmisaka 
38*437bfbebSnyanmisaka #define H264D_DBG_INPUT             (0x00000010)   //!< input packet
39*437bfbebSnyanmisaka #define H264D_DBG_PPS_SPS           (0x00000020)
40*437bfbebSnyanmisaka #define H264D_DBG_LOOP_STATE        (0x00000040)
41*437bfbebSnyanmisaka #define H264D_DBG_PARSE_NALU        (0x00000080)
42*437bfbebSnyanmisaka 
43*437bfbebSnyanmisaka #define H264D_DBG_DPB_INFO          (0x00000100)   //!< dpb size
44*437bfbebSnyanmisaka #define H264D_DBG_DPB_MALLIC        (0x00000200)   //!< malloc
45*437bfbebSnyanmisaka 
46*437bfbebSnyanmisaka 
47*437bfbebSnyanmisaka #define H264D_DBG_DPB_REF_ERR       (0x00001000)
48*437bfbebSnyanmisaka #define H264D_DBG_SLOT_FLUSH        (0x00002000)   //!< dpb buffer slot remain
49*437bfbebSnyanmisaka #define H264D_DBG_SEI               (0x00004000)
50*437bfbebSnyanmisaka #define H264D_DBG_CALLBACK          (0x00008000)
51*437bfbebSnyanmisaka 
52*437bfbebSnyanmisaka #define H264D_DBG_WRITE_ES_EN       (0x00010000)   //!< write input ts stream
53*437bfbebSnyanmisaka #define H264D_DBG_FIELD_PAIRED      (0x00020000)
54*437bfbebSnyanmisaka #define H264D_DBG_DISCONTINUOUS     (0x00040000)
55*437bfbebSnyanmisaka 
56*437bfbebSnyanmisaka extern RK_U32 h264d_debug;
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka #define H264D_DBG(level, fmt, ...)\
59*437bfbebSnyanmisaka do {\
60*437bfbebSnyanmisaka     if (level & h264d_debug)\
61*437bfbebSnyanmisaka         { mpp_log(fmt, ## __VA_ARGS__); }\
62*437bfbebSnyanmisaka } while (0)
63*437bfbebSnyanmisaka 
64*437bfbebSnyanmisaka 
65*437bfbebSnyanmisaka #define H264D_ERR(fmt, ...)\
66*437bfbebSnyanmisaka do {\
67*437bfbebSnyanmisaka     if (H264D_DBG_ERROR & h264d_debug)\
68*437bfbebSnyanmisaka         { mpp_log(fmt, ## __VA_ARGS__); }\
69*437bfbebSnyanmisaka } while (0)
70*437bfbebSnyanmisaka 
71*437bfbebSnyanmisaka #define ASSERT(val)\
72*437bfbebSnyanmisaka do {\
73*437bfbebSnyanmisaka     if (H264D_DBG_ASSERT & h264d_debug)\
74*437bfbebSnyanmisaka         { mpp_assert(val); }\
75*437bfbebSnyanmisaka } while (0)
76*437bfbebSnyanmisaka 
77*437bfbebSnyanmisaka #define H264D_WARNNING(fmt, ...)\
78*437bfbebSnyanmisaka do {\
79*437bfbebSnyanmisaka     if (H264D_DBG_WARNNING & h264d_debug)\
80*437bfbebSnyanmisaka         { mpp_log(fmt, ## __VA_ARGS__); }\
81*437bfbebSnyanmisaka } while (0)
82*437bfbebSnyanmisaka 
83*437bfbebSnyanmisaka #define H264D_LOG(fmt, ...)\
84*437bfbebSnyanmisaka do {\
85*437bfbebSnyanmisaka     if (H264D_DBG_LOG & h264d_debug)\
86*437bfbebSnyanmisaka         { mpp_log(fmt, ## __VA_ARGS__); }\
87*437bfbebSnyanmisaka } while (0)
88*437bfbebSnyanmisaka 
89*437bfbebSnyanmisaka 
90*437bfbebSnyanmisaka //!< vaule check
91*437bfbebSnyanmisaka #define VAL_CHECK(ret, val, ...)\
92*437bfbebSnyanmisaka do{\
93*437bfbebSnyanmisaka     if (!(val)){\
94*437bfbebSnyanmisaka         ret = MPP_ERR_VALUE; \
95*437bfbebSnyanmisaka         H264D_WARNNING("value error(%d).\n", __LINE__); \
96*437bfbebSnyanmisaka         goto __FAILED; \
97*437bfbebSnyanmisaka }} while (0)
98*437bfbebSnyanmisaka //!< memory malloc check
99*437bfbebSnyanmisaka #define MEM_CHECK(ret, val, ...)\
100*437bfbebSnyanmisaka do{\
101*437bfbebSnyanmisaka     if (!(val)) {\
102*437bfbebSnyanmisaka         ret = MPP_ERR_MALLOC; \
103*437bfbebSnyanmisaka         H264D_ERR("malloc buffer error(%d).\n", __LINE__); \
104*437bfbebSnyanmisaka         goto __FAILED; \
105*437bfbebSnyanmisaka }} while (0)
106*437bfbebSnyanmisaka 
107*437bfbebSnyanmisaka 
108*437bfbebSnyanmisaka //!< input check
109*437bfbebSnyanmisaka #define INP_CHECK(ret, val, ...)\
110*437bfbebSnyanmisaka do{\
111*437bfbebSnyanmisaka if ((val)) {\
112*437bfbebSnyanmisaka         ret = MPP_ERR_INIT; \
113*437bfbebSnyanmisaka         H264D_WARNNING("input empty(%d).\n", __LINE__); \
114*437bfbebSnyanmisaka         goto __RETURN; \
115*437bfbebSnyanmisaka }} while (0)
116*437bfbebSnyanmisaka //!< function return check
117*437bfbebSnyanmisaka #define FUN_CHECK(val)\
118*437bfbebSnyanmisaka do{\
119*437bfbebSnyanmisaka if ((val) < 0) {\
120*437bfbebSnyanmisaka         H264D_WARNNING("Function error(%d).\n", __LINE__); \
121*437bfbebSnyanmisaka         goto __FAILED; \
122*437bfbebSnyanmisaka }} while (0)
123*437bfbebSnyanmisaka 
124*437bfbebSnyanmisaka 
125*437bfbebSnyanmisaka #define START_PREFIX_3BYTE        3
126*437bfbebSnyanmisaka #define MAX_NUM_DPB_LAYERS        2    //!< must >= 2
127*437bfbebSnyanmisaka #define MAX_LIST_SIZE             33   //!< for init list reorder
128*437bfbebSnyanmisaka #define MAX_DPB_SIZE              16   //!< for prepare dpb info
129*437bfbebSnyanmisaka #define MAX_REF_SIZE              32   //!< for prepare ref pic info
130*437bfbebSnyanmisaka 
131*437bfbebSnyanmisaka 
132*437bfbebSnyanmisaka #define MAX_MARK_SIZE             35   //!< for malloc buffer mark, can be changed
133*437bfbebSnyanmisaka 
134*437bfbebSnyanmisaka #define HEAD_BUF_MAX_SIZE         (1*1024*1024)
135*437bfbebSnyanmisaka #define HEAD_BUF_ADD_SIZE         (512)
136*437bfbebSnyanmisaka #define NALU_BUF_MAX_SIZE         (2*1024*1024)
137*437bfbebSnyanmisaka #define NALU_BUF_ADD_SIZE         (512)
138*437bfbebSnyanmisaka #define SODB_BUF_MAX_SIZE         (2*1024*1024)
139*437bfbebSnyanmisaka #define SODB_BUF_ADD_SIZE         (512)
140*437bfbebSnyanmisaka 
141*437bfbebSnyanmisaka //!< PPS parameters
142*437bfbebSnyanmisaka #define MAXnum_slice_groups_minus1  8
143*437bfbebSnyanmisaka typedef enum {
144*437bfbebSnyanmisaka     H264ScalingList4x4Length = 16,
145*437bfbebSnyanmisaka     H264ScalingList8x8Length = 64,
146*437bfbebSnyanmisaka } ScalingListLength;
147*437bfbebSnyanmisaka 
148*437bfbebSnyanmisaka typedef enum {
149*437bfbebSnyanmisaka     STRUCT_NULL  = 0,
150*437bfbebSnyanmisaka     TOP_FIELD    = 0x1,
151*437bfbebSnyanmisaka     BOTTOM_FIELD = 0x2,
152*437bfbebSnyanmisaka     FRAME        = 0x3,
153*437bfbebSnyanmisaka     STRUCT_MAX,
154*437bfbebSnyanmisaka } PictureStructure;           //!< New enum for field processing
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka typedef enum {
157*437bfbebSnyanmisaka     PIC_ERR_NULL  = 0,
158*437bfbebSnyanmisaka     PIC_ERR_TOP   = 0x1,
159*437bfbebSnyanmisaka     PIC_ERR_BOT   = 0x2,
160*437bfbebSnyanmisaka     PIC_ERR_FRAME = 0x3,
161*437bfbebSnyanmisaka     PIC_ERR_WHOLE = 0x3,
162*437bfbebSnyanmisaka     PIC_ERR_MAX,
163*437bfbebSnyanmisaka } PictureError;
164*437bfbebSnyanmisaka 
165*437bfbebSnyanmisaka typedef enum {
166*437bfbebSnyanmisaka     FIELD_ORDER_NULL,
167*437bfbebSnyanmisaka     FIELD_ORDER_TOP_FIRST,
168*437bfbebSnyanmisaka     FIELD_ORDER_BOT_FIRST,
169*437bfbebSnyanmisaka     FIELD_ORDER_SAME,
170*437bfbebSnyanmisaka     FIELD_ORDER_MAX
171*437bfbebSnyanmisaka } FieldOrder;
172*437bfbebSnyanmisaka 
173*437bfbebSnyanmisaka //!< Field Coding Types
174*437bfbebSnyanmisaka typedef enum {
175*437bfbebSnyanmisaka     FRAME_CODING = 0,
176*437bfbebSnyanmisaka     FIELD_CODING = 1,
177*437bfbebSnyanmisaka     ADAPTIVE_CODING = 2,
178*437bfbebSnyanmisaka     FRAME_MB_PAIR_CODING = 3
179*437bfbebSnyanmisaka } CodingType;
180*437bfbebSnyanmisaka 
181*437bfbebSnyanmisaka typedef enum {
182*437bfbebSnyanmisaka     LIST_0 = 0,
183*437bfbebSnyanmisaka     LIST_1 = 1,
184*437bfbebSnyanmisaka     BI_PRED = 2,
185*437bfbebSnyanmisaka     BI_PRED_L0 = 3,
186*437bfbebSnyanmisaka     BI_PRED_L1 = 4
187*437bfbebSnyanmisaka } ListType;
188*437bfbebSnyanmisaka 
189*437bfbebSnyanmisaka //!< NAL Unit structure
190*437bfbebSnyanmisaka typedef struct h264_nalu_t {
191*437bfbebSnyanmisaka     RK_S32         startcodeprefix_len;   //!< 4 for parameter sets and first slice in picture, 3 for everything else (suggested)
192*437bfbebSnyanmisaka     RK_U32         sodb_len;              //!< Length of the NAL unit (Excluding the start code, which does not belong to the NALU)
193*437bfbebSnyanmisaka     RK_S32         forbidden_bit;         //!< should be always FALSE
194*437bfbebSnyanmisaka     H264NaluType   nalu_type;             //!< NALU_TYPE_xxxx
195*437bfbebSnyanmisaka     H264NalRefIdcType   nal_reference_idc;     //!< NALU_PRIORITY_xxxx
196*437bfbebSnyanmisaka     RK_U8          *sodb_buf;             //!< Data of the NAL unit (Excluding the start code, which does not belong to the NALU)
197*437bfbebSnyanmisaka     RK_U16          lost_packets;          //!< true, if packet loss is detected, used in RTPNALU
198*437bfbebSnyanmisaka     //---- MVC extension
199*437bfbebSnyanmisaka     RK_S32   svc_extension_flag;    //!< should be always 0, for MVC
200*437bfbebSnyanmisaka     RK_S32   non_idr_flag;          //!< 0 = current is IDR
201*437bfbebSnyanmisaka     RK_S32   priority_id;           //!< a lower value of priority_id specifies a higher priority
202*437bfbebSnyanmisaka     RK_S32   view_id;               //!< view identifier for the NAL unit
203*437bfbebSnyanmisaka     RK_S32   temporal_id;           //!< temporal identifier for the NAL unit
204*437bfbebSnyanmisaka     RK_S32   anchor_pic_flag;       //!< anchor access unit
205*437bfbebSnyanmisaka     RK_S32   inter_view_flag;       //!< inter-view prediction enable
206*437bfbebSnyanmisaka     RK_S32   reserved_one_bit;      //!< shall be equal to 1
207*437bfbebSnyanmisaka     RK_S32   MVCExt_is_valid;
208*437bfbebSnyanmisaka     RK_S32   MVCExt_is_prefixNALU;
209*437bfbebSnyanmisaka     //------
210*437bfbebSnyanmisaka     RK_U8    ualu_header_bytes;     //!< for rbsp start
211*437bfbebSnyanmisaka     RK_S32   used_bits;
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka } H264_Nalu_t;
214*437bfbebSnyanmisaka 
215*437bfbebSnyanmisaka typedef struct h264_nalu_svc_ext_t {
216*437bfbebSnyanmisaka     RK_U32    valid;
217*437bfbebSnyanmisaka     RK_U32    idr_flag;
218*437bfbebSnyanmisaka     RK_U32    priority_id;
219*437bfbebSnyanmisaka     RK_U32    no_inter_layer_pred_flag;
220*437bfbebSnyanmisaka     RK_U32    dependency_id;
221*437bfbebSnyanmisaka     RK_U32    quality_id;
222*437bfbebSnyanmisaka     RK_U32    temporal_id;
223*437bfbebSnyanmisaka     RK_U32    use_ref_base_pic_flag;
224*437bfbebSnyanmisaka     RK_U32    discardable_flag;
225*437bfbebSnyanmisaka     RK_U32    output_flag;
226*437bfbebSnyanmisaka } H264_NaluSvcExt_t;
227*437bfbebSnyanmisaka 
228*437bfbebSnyanmisaka typedef struct h264_nalu_mvc_ext_t {
229*437bfbebSnyanmisaka     RK_U32    valid;
230*437bfbebSnyanmisaka     RK_U32    non_idr_flag;
231*437bfbebSnyanmisaka     RK_U32    priority_id;
232*437bfbebSnyanmisaka     RK_U32    view_id;
233*437bfbebSnyanmisaka     RK_U32    temporal_id;
234*437bfbebSnyanmisaka     RK_U32    anchor_pic_flag;
235*437bfbebSnyanmisaka     RK_U32    inter_view_flag;
236*437bfbebSnyanmisaka     RK_U32    reserved_one_bit;
237*437bfbebSnyanmisaka     RK_U32    iPrefixNALU;
238*437bfbebSnyanmisaka } H264_NaluMvcExt_t;
239*437bfbebSnyanmisaka 
240*437bfbebSnyanmisaka //!< decoder refence picture marking
241*437bfbebSnyanmisaka typedef struct h264_drpm_t {
242*437bfbebSnyanmisaka     RK_S32 memory_management_control_operation;
243*437bfbebSnyanmisaka     RK_S32 difference_of_pic_nums_minus1;
244*437bfbebSnyanmisaka     RK_S32 long_term_pic_num;
245*437bfbebSnyanmisaka     RK_S32 long_term_frame_idx;
246*437bfbebSnyanmisaka     RK_S32 max_long_term_frame_idx_plus1;
247*437bfbebSnyanmisaka     struct  h264_drpm_t *Next;
248*437bfbebSnyanmisaka } H264_DRPM_t;
249*437bfbebSnyanmisaka 
250*437bfbebSnyanmisaka typedef enum {
251*437bfbebSnyanmisaka     Mem_NULL     = 0,
252*437bfbebSnyanmisaka     Mem_Malloc   = 1,
253*437bfbebSnyanmisaka     Mem_Clone    = 2,
254*437bfbebSnyanmisaka     Mem_UnPaired = 3,
255*437bfbebSnyanmisaka     Mem_TopOnly  = 4,
256*437bfbebSnyanmisaka     Mem_BotOnly  = 5,
257*437bfbebSnyanmisaka     Mem_Fake     = 6,
258*437bfbebSnyanmisaka     Mem_Max,
259*437bfbebSnyanmisaka } H264_Mem_type;
260*437bfbebSnyanmisaka 
261*437bfbebSnyanmisaka //!< decoder picture memory
262*437bfbebSnyanmisaka typedef struct h264_dpb_mark_t {
263*437bfbebSnyanmisaka     RK_U8    top_used;
264*437bfbebSnyanmisaka     RK_U8    bot_used;
265*437bfbebSnyanmisaka     RK_U8    out_flag;
266*437bfbebSnyanmisaka     RK_U8    mark_idx;
267*437bfbebSnyanmisaka     MppFrame mframe;
268*437bfbebSnyanmisaka     RK_S32   slot_idx;
269*437bfbebSnyanmisaka     struct h264_store_pic_t *pic;
270*437bfbebSnyanmisaka } H264_DpbMark_t;
271*437bfbebSnyanmisaka 
272*437bfbebSnyanmisaka //!< decoder picture buffer information
273*437bfbebSnyanmisaka typedef struct h264_dpb_info_t {
274*437bfbebSnyanmisaka     RK_U8     colmv_is_used;
275*437bfbebSnyanmisaka     RK_S32    slot_index;
276*437bfbebSnyanmisaka 
277*437bfbebSnyanmisaka     RK_S32    TOP_POC;
278*437bfbebSnyanmisaka     RK_S32    BOT_POC;
279*437bfbebSnyanmisaka     RK_U16    frame_num;
280*437bfbebSnyanmisaka     RK_U32    field_flag;
281*437bfbebSnyanmisaka     RK_U32    is_long_term;
282*437bfbebSnyanmisaka     RK_U32    is_ilt_flag;
283*437bfbebSnyanmisaka     RK_U32    long_term_frame_idx;
284*437bfbebSnyanmisaka     RK_U32    long_term_pic_num;
285*437bfbebSnyanmisaka     RK_U32    voidx;
286*437bfbebSnyanmisaka     RK_U32    view_id;
287*437bfbebSnyanmisaka     RK_U32    is_used;
288*437bfbebSnyanmisaka     RK_U32    top_valid;
289*437bfbebSnyanmisaka     RK_U32    bot_valid;
290*437bfbebSnyanmisaka     struct h264_store_pic_t *refpic;
291*437bfbebSnyanmisaka 
292*437bfbebSnyanmisaka     RK_U32    have_same;
293*437bfbebSnyanmisaka } H264_DpbInfo_t;
294*437bfbebSnyanmisaka 
295*437bfbebSnyanmisaka //!< refence picture information
296*437bfbebSnyanmisaka typedef struct h264_refpic_info_t {
297*437bfbebSnyanmisaka     RK_U32    valid;
298*437bfbebSnyanmisaka     RK_S32    dpb_idx;
299*437bfbebSnyanmisaka     RK_S32    bottom_flag;
300*437bfbebSnyanmisaka } H264_RefPicInfo_t;
301*437bfbebSnyanmisaka 
302*437bfbebSnyanmisaka //!< definition a picture (field or frame)
303*437bfbebSnyanmisaka typedef struct h264_store_pic_t {
304*437bfbebSnyanmisaka     RK_S32    structure;
305*437bfbebSnyanmisaka     RK_S32    poc;
306*437bfbebSnyanmisaka     RK_S32    top_poc;
307*437bfbebSnyanmisaka     RK_S32    bottom_poc;
308*437bfbebSnyanmisaka     RK_S32    frame_poc;
309*437bfbebSnyanmisaka     RK_S32    ThisPOC;
310*437bfbebSnyanmisaka     RK_S32    pic_num;
311*437bfbebSnyanmisaka     RK_S32    long_term_pic_num;
312*437bfbebSnyanmisaka     RK_S32    long_term_frame_idx;
313*437bfbebSnyanmisaka 
314*437bfbebSnyanmisaka     RK_U32    frame_num;
315*437bfbebSnyanmisaka     RK_U8     is_long_term;
316*437bfbebSnyanmisaka     RK_S32    used_for_reference;
317*437bfbebSnyanmisaka     RK_S32    is_output;
318*437bfbebSnyanmisaka     RK_S32    non_existing;
319*437bfbebSnyanmisaka     RK_S16    max_slice_id;
320*437bfbebSnyanmisaka     RK_S32    mb_aff_frame_flag;
321*437bfbebSnyanmisaka     RK_U32    PicWidthInMbs;
322*437bfbebSnyanmisaka     RK_U8     colmv_no_used_flag;
323*437bfbebSnyanmisaka     struct h264_store_pic_t *top_field;     //!< for mb aff, if frame for referencing the top field
324*437bfbebSnyanmisaka     struct h264_store_pic_t *bottom_field;  //!< for mb aff, if frame for referencing the bottom field
325*437bfbebSnyanmisaka     struct h264_store_pic_t *frame;         //!< for mb aff, if field for referencing the combined frame
326*437bfbebSnyanmisaka 
327*437bfbebSnyanmisaka     RK_S32       slice_type;
328*437bfbebSnyanmisaka     RK_S32       idr_flag;
329*437bfbebSnyanmisaka     RK_S32       no_output_of_prior_pics_flag;
330*437bfbebSnyanmisaka     RK_S32       long_term_reference_flag;
331*437bfbebSnyanmisaka     RK_S32       adaptive_ref_pic_buffering_flag;
332*437bfbebSnyanmisaka     RK_S32       chroma_format_idc;
333*437bfbebSnyanmisaka     RK_S32       frame_mbs_only_flag;
334*437bfbebSnyanmisaka     RK_S32       frame_cropping_flag;
335*437bfbebSnyanmisaka 
336*437bfbebSnyanmisaka     RK_S32       frame_crop_left_offset;
337*437bfbebSnyanmisaka     RK_S32       frame_crop_right_offset;
338*437bfbebSnyanmisaka     RK_S32       frame_crop_top_offset;
339*437bfbebSnyanmisaka     RK_S32       frame_crop_bottom_offset;
340*437bfbebSnyanmisaka     RK_S32       width;
341*437bfbebSnyanmisaka     RK_S32       height;
342*437bfbebSnyanmisaka     RK_U32       width_after_crop;
343*437bfbebSnyanmisaka     RK_U32       height_after_crop;
344*437bfbebSnyanmisaka 
345*437bfbebSnyanmisaka     struct h264_drpm_t   *dec_ref_pic_marking_buffer;                    //!< stores the memory management control operations
346*437bfbebSnyanmisaka     RK_S32       proc_flag;
347*437bfbebSnyanmisaka     RK_S32       view_id;
348*437bfbebSnyanmisaka     RK_S32       inter_view_flag;
349*437bfbebSnyanmisaka     RK_S32       anchor_pic_flag;
350*437bfbebSnyanmisaka     RK_S32       iCodingType;
351*437bfbebSnyanmisaka 
352*437bfbebSnyanmisaka     RK_S32       layer_id;
353*437bfbebSnyanmisaka     RK_U8        is_mmco_5;
354*437bfbebSnyanmisaka     RK_S32       poc_mmco5;
355*437bfbebSnyanmisaka     RK_S32       top_poc_mmco5;
356*437bfbebSnyanmisaka     RK_S32       bot_poc_mmco5;
357*437bfbebSnyanmisaka     RK_S32       combine_flag;  // top && bottom field combined flag
358*437bfbebSnyanmisaka     H264_Mem_type       mem_malloc_type;
359*437bfbebSnyanmisaka     struct h264_dpb_mark_t     *mem_mark;
360*437bfbebSnyanmisaka } H264_StorePic_t;
361*437bfbebSnyanmisaka 
362*437bfbebSnyanmisaka //!< Frame Stores for Decoded Picture Buffer
363*437bfbebSnyanmisaka typedef struct h264_frame_store_t {
364*437bfbebSnyanmisaka     RK_S32    is_used;                //!< 0=empty; 1=top; 2=bottom; 3=both fields (or frame)
365*437bfbebSnyanmisaka     RK_S32    is_reference;           //!< 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used
366*437bfbebSnyanmisaka     RK_S32    is_long_term;           //!< 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used
367*437bfbebSnyanmisaka     RK_S32    is_orig_reference;      //!< original marking by nal_ref_idc: 0=not used for ref; 1=top used; 2=bottom used; 3=both fields (or frame) used
368*437bfbebSnyanmisaka     RK_S32    is_non_existent;
369*437bfbebSnyanmisaka     RK_S32    frame_num_wrap;
370*437bfbebSnyanmisaka     RK_S32    long_term_frame_idx;
371*437bfbebSnyanmisaka     RK_S32    is_output;
372*437bfbebSnyanmisaka     RK_S32    poc;
373*437bfbebSnyanmisaka     RK_S32    view_id;
374*437bfbebSnyanmisaka     RK_S32    inter_view_flag[2];
375*437bfbebSnyanmisaka     RK_S32    anchor_pic_flag[2];
376*437bfbebSnyanmisaka     RK_S32    layer_id;
377*437bfbebSnyanmisaka     RK_S32    slice_type;
378*437bfbebSnyanmisaka     RK_U32    frame_num;
379*437bfbebSnyanmisaka     RK_S32    structure;
380*437bfbebSnyanmisaka     RK_U32    is_directout;
381*437bfbebSnyanmisaka     struct h264_store_pic_t *frame;
382*437bfbebSnyanmisaka     struct h264_store_pic_t *top_field;
383*437bfbebSnyanmisaka     struct h264_store_pic_t *bottom_field;
384*437bfbebSnyanmisaka 
385*437bfbebSnyanmisaka } H264_FrameStore_t;
386*437bfbebSnyanmisaka 
387*437bfbebSnyanmisaka //!< decode picture buffer
388*437bfbebSnyanmisaka typedef struct h264_dpb_buf_t {
389*437bfbebSnyanmisaka     RK_U32   size;
390*437bfbebSnyanmisaka     RK_U32   used_size;
391*437bfbebSnyanmisaka     RK_U32   allocated_size;
392*437bfbebSnyanmisaka     RK_U32   ref_frames_in_buffer;
393*437bfbebSnyanmisaka     RK_U32   ltref_frames_in_buffer;
394*437bfbebSnyanmisaka     RK_U32   used_size_il;
395*437bfbebSnyanmisaka 
396*437bfbebSnyanmisaka     RK_S32   poc_interval;
397*437bfbebSnyanmisaka     RK_S32   last_output_poc;
398*437bfbebSnyanmisaka     RK_S32   last_output_view_id;
399*437bfbebSnyanmisaka     RK_S32   max_long_term_pic_idx;
400*437bfbebSnyanmisaka     RK_S32   init_done;
401*437bfbebSnyanmisaka     RK_S32   num_ref_frames;
402*437bfbebSnyanmisaka     RK_S32   layer_id;
403*437bfbebSnyanmisaka 
404*437bfbebSnyanmisaka     struct h264_frame_store_t  **fs;
405*437bfbebSnyanmisaka     struct h264_frame_store_t  **fs_ref;
406*437bfbebSnyanmisaka     struct h264_frame_store_t  **fs_ltref;
407*437bfbebSnyanmisaka     struct h264_frame_store_t  **fs_ilref;   //!< inter-layer reference (for multi-layered codecs)
408*437bfbebSnyanmisaka     struct h264_frame_store_t   *last_picture;
409*437bfbebSnyanmisaka 
410*437bfbebSnyanmisaka     struct h264d_video_ctx_t   *p_Vid;
411*437bfbebSnyanmisaka } H264_DpbBuf_t;
412*437bfbebSnyanmisaka 
413*437bfbebSnyanmisaka //!< HRD
414*437bfbebSnyanmisaka #define MAXIMUMVALUEOFcpb_cnt   32
415*437bfbebSnyanmisaka typedef struct h264_hrd_t {
416*437bfbebSnyanmisaka     RK_U32    cpb_cnt_minus1;                                  // ue(v)
417*437bfbebSnyanmisaka     RK_U32    bit_rate_scale;                                  // u(4)
418*437bfbebSnyanmisaka     RK_U32    cpb_size_scale;                                  // u(4)
419*437bfbebSnyanmisaka     RK_U32    bit_rate_value_minus1[MAXIMUMVALUEOFcpb_cnt];    // ue(v)
420*437bfbebSnyanmisaka     RK_U32    cpb_size_value_minus1[MAXIMUMVALUEOFcpb_cnt];    // ue(v)
421*437bfbebSnyanmisaka     RK_U32    cbr_flag[MAXIMUMVALUEOFcpb_cnt];                 // u(1)
422*437bfbebSnyanmisaka     RK_U32    initial_cpb_removal_delay_length_minus1;         // u(5)
423*437bfbebSnyanmisaka     RK_U32    cpb_removal_delay_length_minus1;                 // u(5)
424*437bfbebSnyanmisaka     RK_U32    dpb_output_delay_length_minus1;                  // u(5)
425*437bfbebSnyanmisaka     RK_U32    time_offset_length;                              // u(5)
426*437bfbebSnyanmisaka } H264_HRD_t;
427*437bfbebSnyanmisaka 
428*437bfbebSnyanmisaka //!< VUI
429*437bfbebSnyanmisaka typedef struct h264_vui_t {
430*437bfbebSnyanmisaka     RK_S32       aspect_ratio_info_present_flag;                   // u(1)
431*437bfbebSnyanmisaka     RK_U32       aspect_ratio_idc;                                 // u(8)
432*437bfbebSnyanmisaka     RK_U16       sar_width;                                        // u(16)
433*437bfbebSnyanmisaka     RK_U16       sar_height;                                       // u(16)
434*437bfbebSnyanmisaka     RK_S32       overscan_info_present_flag;                       // u(1)
435*437bfbebSnyanmisaka     RK_S32       overscan_appropriate_flag;                        // u(1)
436*437bfbebSnyanmisaka     RK_S32       video_signal_type_present_flag;                   // u(1)
437*437bfbebSnyanmisaka     RK_U32       video_format;                                     // u(3)
438*437bfbebSnyanmisaka     RK_S32       video_full_range_flag;                            // u(1)
439*437bfbebSnyanmisaka     RK_S32       colour_description_present_flag;                  // u(1)
440*437bfbebSnyanmisaka     RK_U32       colour_primaries;                                 // u(8)
441*437bfbebSnyanmisaka     RK_U32       transfer_characteristics;                         // u(8)
442*437bfbebSnyanmisaka     RK_U32       matrix_coefficients;                              // u(8)
443*437bfbebSnyanmisaka     RK_S32       chroma_location_info_present_flag;                // u(1)
444*437bfbebSnyanmisaka     RK_U32       chroma_sample_loc_type_top_field;                // ue(v)
445*437bfbebSnyanmisaka     RK_U32       chroma_sample_loc_type_bottom_field;             // ue(v)
446*437bfbebSnyanmisaka     RK_S32       timing_info_present_flag;                         // u(1)
447*437bfbebSnyanmisaka     RK_U32       num_units_in_tick;                                // u(32)
448*437bfbebSnyanmisaka     RK_U32       time_scale;                                       // u(32)
449*437bfbebSnyanmisaka     RK_S32       fixed_frame_rate_flag;                            // u(1)
450*437bfbebSnyanmisaka     RK_S32       nal_hrd_parameters_present_flag;                  // u(1)
451*437bfbebSnyanmisaka     struct h264_hrd_t    nal_hrd_parameters;                        // hrd_paramters_t
452*437bfbebSnyanmisaka     RK_S32       vcl_hrd_parameters_present_flag;                  // u(1)
453*437bfbebSnyanmisaka     struct h264_hrd_t    vcl_hrd_parameters;                        // hrd_paramters_t
454*437bfbebSnyanmisaka     // if ((nal_hrd_parameters_present_flag || (vcl_hrd_parameters_present_flag))
455*437bfbebSnyanmisaka     RK_S32       low_delay_hrd_flag;                               // u(1)
456*437bfbebSnyanmisaka     RK_S32       pic_struct_present_flag;                          // u(1)
457*437bfbebSnyanmisaka     RK_S32       bitstream_restriction_flag;                       // u(1)
458*437bfbebSnyanmisaka     RK_S32       motion_vectors_over_pic_boundaries_flag;          // u(1)
459*437bfbebSnyanmisaka     RK_U32       max_bytes_per_pic_denom;                          // ue(v)
460*437bfbebSnyanmisaka     RK_U32       max_bits_per_mb_denom;                            // ue(v)
461*437bfbebSnyanmisaka     RK_U32       log2_max_mv_length_vertical;                      // ue(v)
462*437bfbebSnyanmisaka     RK_U32       log2_max_mv_length_horizontal;                    // ue(v)
463*437bfbebSnyanmisaka     RK_U32       num_reorder_frames;                               // ue(v)
464*437bfbebSnyanmisaka     RK_U32       max_dec_frame_buffering;                          // ue(v)
465*437bfbebSnyanmisaka } H264_VUI_t;
466*437bfbebSnyanmisaka 
467*437bfbebSnyanmisaka //!< MVC_VUI
468*437bfbebSnyanmisaka typedef struct h264_mvc_vui_t {
469*437bfbebSnyanmisaka     RK_S32  num_ops_minus1;
470*437bfbebSnyanmisaka     RK_S8   *temporal_id;
471*437bfbebSnyanmisaka     RK_S32  *num_target_output_views_minus1;
472*437bfbebSnyanmisaka     RK_S32  **view_id;
473*437bfbebSnyanmisaka     RK_S8   *timing_info_present_flag;
474*437bfbebSnyanmisaka     RK_S32  *num_units_in_tick;
475*437bfbebSnyanmisaka     RK_S32  *time_scale;
476*437bfbebSnyanmisaka     RK_S8   *fixed_frame_rate_flag;
477*437bfbebSnyanmisaka     RK_S8   *nal_hrd_parameters_present_flag;
478*437bfbebSnyanmisaka     RK_S8   *vcl_hrd_parameters_present_flag;
479*437bfbebSnyanmisaka     RK_S8   *low_delay_hrd_flag;
480*437bfbebSnyanmisaka     RK_S8   *pic_struct_present_flag;
481*437bfbebSnyanmisaka 
482*437bfbebSnyanmisaka     //hrd parameters;
483*437bfbebSnyanmisaka     RK_S8   cpb_cnt_minus1;
484*437bfbebSnyanmisaka     RK_S8   bit_rate_scale;
485*437bfbebSnyanmisaka     RK_S8   cpb_size_scale;
486*437bfbebSnyanmisaka     RK_S32  bit_rate_value_minus1[32];
487*437bfbebSnyanmisaka     RK_S32  cpb_size_value_minus1[32];
488*437bfbebSnyanmisaka     RK_S8   cbr_flag[32];
489*437bfbebSnyanmisaka     RK_S8   initial_cpb_removal_delay_length_minus1;
490*437bfbebSnyanmisaka     RK_S8   cpb_removal_delay_length_minus1;
491*437bfbebSnyanmisaka     RK_S8   dpb_output_delay_length_minus1;
492*437bfbebSnyanmisaka     RK_S8   time_offset_length;
493*437bfbebSnyanmisaka } H264_mvcVUI_t;
494*437bfbebSnyanmisaka 
495*437bfbebSnyanmisaka //!< PREFIX
496*437bfbebSnyanmisaka 
497*437bfbebSnyanmisaka typedef struct h264_prefix_t {
498*437bfbebSnyanmisaka     RK_S32    Valid;                  // indicates the prefix set is valid
499*437bfbebSnyanmisaka     // nal svc syntax
500*437bfbebSnyanmisaka     RK_S32    store_ref_base_pic_flag;                            // u(1)
501*437bfbebSnyanmisaka     // svc base pic marking
502*437bfbebSnyanmisaka     RK_S32    adaptive_ref_base_pic_marking_mode_flag;
503*437bfbebSnyanmisaka     RK_S32    memory_management_base_control_operation;
504*437bfbebSnyanmisaka     RK_S32    difference_of_base_pic_nums_minus1;
505*437bfbebSnyanmisaka     RK_S32    long_term_base_pic_num;
506*437bfbebSnyanmisaka 
507*437bfbebSnyanmisaka     RK_S32    additional_prefix_nal_unit_extension_flag;          // u(1)
508*437bfbebSnyanmisaka     RK_S32    additional_prefix_nal_unit_extension_data_flag;     // u(1)
509*437bfbebSnyanmisaka } H264_PREFIX_t;
510*437bfbebSnyanmisaka 
511*437bfbebSnyanmisaka //!< SPS
512*437bfbebSnyanmisaka #define MAXnum_ref_frames_in_POC_cycle  256
513*437bfbebSnyanmisaka 
514*437bfbebSnyanmisaka typedef struct h264_sps_t {
515*437bfbebSnyanmisaka     RK_S32    Valid;                  // indicates the parameter set is valid
516*437bfbebSnyanmisaka 
517*437bfbebSnyanmisaka     RK_S32    profile_idc;                                       // u(8)
518*437bfbebSnyanmisaka     RK_S32    constrained_set0_flag;                             // u(1)
519*437bfbebSnyanmisaka     RK_S32    constrained_set1_flag;                             // u(1)
520*437bfbebSnyanmisaka     RK_S32    constrained_set2_flag;                             // u(1)
521*437bfbebSnyanmisaka     RK_S32    constrained_set3_flag;                             // u(1)
522*437bfbebSnyanmisaka     RK_S32    constrained_set4_flag;                             // u(1)
523*437bfbebSnyanmisaka     RK_S32    constrained_set5_flag;                             // u(2)
524*437bfbebSnyanmisaka 
525*437bfbebSnyanmisaka     RK_S32    level_idc;                                         // u(8)
526*437bfbebSnyanmisaka     RK_U32    seq_parameter_set_id;                              // ue(v)
527*437bfbebSnyanmisaka     RK_S32    chroma_format_idc;                                 // ue(v)
528*437bfbebSnyanmisaka 
529*437bfbebSnyanmisaka     RK_S32    seq_scaling_matrix_present_flag;                   // u(1)
530*437bfbebSnyanmisaka     RK_S32    seq_scaling_list_present_flag[12];                 // u(1)
531*437bfbebSnyanmisaka     RK_S32    ScalingList4x4[6][H264ScalingList4x4Length];       // se(v)
532*437bfbebSnyanmisaka     RK_S32    ScalingList8x8[6][H264ScalingList8x8Length];       // se(v)
533*437bfbebSnyanmisaka     RK_S32    UseDefaultScalingMatrix4x4Flag[6];
534*437bfbebSnyanmisaka     RK_S32    UseDefaultScalingMatrix8x8Flag[6];
535*437bfbebSnyanmisaka 
536*437bfbebSnyanmisaka     RK_S32    bit_depth_luma_minus8;                             // ue(v)
537*437bfbebSnyanmisaka     RK_S32    bit_depth_chroma_minus8;                           // ue(v)
538*437bfbebSnyanmisaka     RK_S32    log2_max_frame_num_minus4;                         // ue(v)
539*437bfbebSnyanmisaka     RK_S32    pic_order_cnt_type;
540*437bfbebSnyanmisaka     // if( pic_order_cnt_type == 0 )
541*437bfbebSnyanmisaka     RK_S32    log2_max_pic_order_cnt_lsb_minus4;                 // ue(v)
542*437bfbebSnyanmisaka     // else if( pic_order_cnt_type == 1 )
543*437bfbebSnyanmisaka     RK_S32    delta_pic_order_always_zero_flag;                  // u(1)
544*437bfbebSnyanmisaka     RK_S32    offset_for_non_ref_pic;                            // se(v)
545*437bfbebSnyanmisaka     RK_S32    offset_for_top_to_bottom_field;                    // se(v)
546*437bfbebSnyanmisaka     RK_S32    num_ref_frames_in_pic_order_cnt_cycle;             // ue(v)
547*437bfbebSnyanmisaka     // for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ )
548*437bfbebSnyanmisaka     RK_S32    offset_for_ref_frame[MAXnum_ref_frames_in_POC_cycle];   // se(v)
549*437bfbebSnyanmisaka     RK_S32    max_num_ref_frames;                                     // ue(v)
550*437bfbebSnyanmisaka     RK_S32    gaps_in_frame_num_value_allowed_flag;             // u(1)
551*437bfbebSnyanmisaka     RK_S32    pic_width_in_mbs_minus1;                          // ue(v)
552*437bfbebSnyanmisaka     RK_S32    pic_height_in_map_units_minus1;                   // ue(v)
553*437bfbebSnyanmisaka     RK_S32    frame_mbs_only_flag;                              // u(1)
554*437bfbebSnyanmisaka     // if( !frame_mbs_only_flag )
555*437bfbebSnyanmisaka     RK_S32    mb_adaptive_frame_field_flag;                     // u(1)
556*437bfbebSnyanmisaka     RK_S32    direct_8x8_inference_flag;                        // u(1)
557*437bfbebSnyanmisaka     RK_S32    frame_cropping_flag;                              // u(1)
558*437bfbebSnyanmisaka     RK_S32    frame_crop_left_offset;                // ue(v)
559*437bfbebSnyanmisaka     RK_S32    frame_crop_right_offset;               // ue(v)
560*437bfbebSnyanmisaka     RK_S32    frame_crop_top_offset;                 // ue(v)
561*437bfbebSnyanmisaka     RK_S32    frame_crop_bottom_offset;              // ue(v)
562*437bfbebSnyanmisaka     RK_S32    vui_parameters_present_flag;           // u(1)
563*437bfbebSnyanmisaka     struct h264_vui_t vui_seq_parameters;             // vui_seq_parameters_t
564*437bfbebSnyanmisaka     RK_S32    separate_colour_plane_flag;            // u(1)
565*437bfbebSnyanmisaka     RK_S32    max_dec_frame_buffering;
566*437bfbebSnyanmisaka     RK_S32    qpprime_y_zero_transform_bypass_flag;
567*437bfbebSnyanmisaka     //----
568*437bfbebSnyanmisaka     RK_S32    expected_delta_per_pic_order_cnt_cycle;
569*437bfbebSnyanmisaka 
570*437bfbebSnyanmisaka } H264_SPS_t;
571*437bfbebSnyanmisaka 
572*437bfbebSnyanmisaka //!< subSPS
573*437bfbebSnyanmisaka typedef struct h264_subsps_t {
574*437bfbebSnyanmisaka     struct h264_sps_t sps;
575*437bfbebSnyanmisaka 
576*437bfbebSnyanmisaka     RK_S32     bit_equal_to_one;
577*437bfbebSnyanmisaka     RK_S32     num_views_minus1;
578*437bfbebSnyanmisaka     RK_S32     *view_id;
579*437bfbebSnyanmisaka     RK_S32     *num_anchor_refs_l0;
580*437bfbebSnyanmisaka     RK_S32     **anchor_ref_l0;
581*437bfbebSnyanmisaka     RK_S32     *num_anchor_refs_l1;
582*437bfbebSnyanmisaka     RK_S32     **anchor_ref_l1;
583*437bfbebSnyanmisaka 
584*437bfbebSnyanmisaka     RK_S32     *num_non_anchor_refs_l0;
585*437bfbebSnyanmisaka     RK_S32     **non_anchor_ref_l0;
586*437bfbebSnyanmisaka     RK_S32     *num_non_anchor_refs_l1;
587*437bfbebSnyanmisaka     RK_S32     **non_anchor_ref_l1;
588*437bfbebSnyanmisaka 
589*437bfbebSnyanmisaka     RK_S32     num_level_values_signalled_minus1;
590*437bfbebSnyanmisaka     RK_S32     *level_idc;
591*437bfbebSnyanmisaka     RK_S32     *num_applicable_ops_minus1;
592*437bfbebSnyanmisaka     RK_S32     **applicable_op_temporal_id;
593*437bfbebSnyanmisaka     RK_S32     **applicable_op_num_target_views_minus1;
594*437bfbebSnyanmisaka     RK_S32     ***applicable_op_target_view_id;
595*437bfbebSnyanmisaka     RK_S32     **applicable_op_num_views_minus1;
596*437bfbebSnyanmisaka 
597*437bfbebSnyanmisaka     RK_S32     mvc_vui_parameters_present_flag;
598*437bfbebSnyanmisaka     RK_S32     Valid;          // indicates the parameter set is valid
599*437bfbebSnyanmisaka 
600*437bfbebSnyanmisaka } H264_subSPS_t;
601*437bfbebSnyanmisaka 
602*437bfbebSnyanmisaka //!< PPS
603*437bfbebSnyanmisaka 
604*437bfbebSnyanmisaka typedef struct h264_pps_t {
605*437bfbebSnyanmisaka     RK_S32   Valid;                  // indicates the parameter set is valid
606*437bfbebSnyanmisaka     RK_U32   pic_parameter_set_id;                             // ue(v)
607*437bfbebSnyanmisaka     RK_U32   seq_parameter_set_id;                             // ue(v)
608*437bfbebSnyanmisaka     RK_S32   entropy_coding_mode_flag;                            // u(1)
609*437bfbebSnyanmisaka     RK_S32   transform_8x8_mode_flag;                             // u(1)
610*437bfbebSnyanmisaka 
611*437bfbebSnyanmisaka     RK_S32   pic_scaling_matrix_present_flag;                     // u(1)
612*437bfbebSnyanmisaka     RK_S32   pic_scaling_list_present_flag[12];                   // u(1)
613*437bfbebSnyanmisaka     RK_S32   ScalingList4x4[6][H264ScalingList4x4Length];                               // se(v)
614*437bfbebSnyanmisaka     RK_S32   ScalingList8x8[6][H264ScalingList8x8Length];                               // se(v)
615*437bfbebSnyanmisaka     RK_S32   UseDefaultScalingMatrix4x4Flag[6];
616*437bfbebSnyanmisaka     RK_S32   UseDefaultScalingMatrix8x8Flag[6];
617*437bfbebSnyanmisaka 
618*437bfbebSnyanmisaka     // if( pic_order_cnt_type < 2 )  in the sequence parameter set
619*437bfbebSnyanmisaka     RK_S32   bottom_field_pic_order_in_frame_present_flag;                           // u(1)
620*437bfbebSnyanmisaka     RK_S32   num_slice_groups_minus1;                          // ue(v)
621*437bfbebSnyanmisaka     RK_S32   slice_group_map_type;                             // ue(v)
622*437bfbebSnyanmisaka     // if( slice_group_map_type = = 0 )
623*437bfbebSnyanmisaka     RK_S32   run_length_minus1[MAXnum_slice_groups_minus1];    // ue(v)
624*437bfbebSnyanmisaka     // else if( slice_group_map_type = = 2 )
625*437bfbebSnyanmisaka     RK_S32   top_left[MAXnum_slice_groups_minus1];             // ue(v)
626*437bfbebSnyanmisaka     RK_S32   bottom_right[MAXnum_slice_groups_minus1];         // ue(v)
627*437bfbebSnyanmisaka     // else if( slice_group_map_type = = 3 || 4 || 5
628*437bfbebSnyanmisaka     RK_S32   slice_group_change_direction_flag;                // u(1)
629*437bfbebSnyanmisaka     RK_S32   slice_group_change_rate_minus1;                   // ue(v)
630*437bfbebSnyanmisaka     // else if( slice_group_map_type = = 6 )
631*437bfbebSnyanmisaka     RK_S32   pic_size_in_map_units_minus1;                     // ue(v)
632*437bfbebSnyanmisaka     RK_U8    *slice_group_id;                                  // complete MBAmap u(v)
633*437bfbebSnyanmisaka 
634*437bfbebSnyanmisaka     RK_S32   num_ref_idx_l0_default_active_minus1;             // ue(v)
635*437bfbebSnyanmisaka     RK_S32   num_ref_idx_l1_default_active_minus1;             // ue(v)
636*437bfbebSnyanmisaka     RK_S32   weighted_pred_flag;                               // u(1)
637*437bfbebSnyanmisaka     RK_S32   weighted_bipred_idc;                              // u(2)
638*437bfbebSnyanmisaka     RK_S32   pic_init_qp_minus26;                              // se(v)
639*437bfbebSnyanmisaka     RK_S32   pic_init_qs_minus26;                              // se(v)
640*437bfbebSnyanmisaka     RK_S32   chroma_qp_index_offset;                           // se(v)
641*437bfbebSnyanmisaka 
642*437bfbebSnyanmisaka     RK_S32   cb_qp_index_offset;                               // se(v)
643*437bfbebSnyanmisaka     RK_S32   cr_qp_index_offset;                               // se(v)
644*437bfbebSnyanmisaka     RK_S32   second_chroma_qp_index_offset;                    // se(v)
645*437bfbebSnyanmisaka 
646*437bfbebSnyanmisaka     RK_S32   deblocking_filter_control_present_flag;           // u(1)
647*437bfbebSnyanmisaka     RK_S32   constrained_intra_pred_flag;                      // u(1)
648*437bfbebSnyanmisaka     RK_S32   redundant_pic_cnt_present_flag;                   // u(1)
649*437bfbebSnyanmisaka     RK_S32   vui_pic_parameters_flag;                          // u(1)
650*437bfbebSnyanmisaka     RK_S32   scaleing_list_enable_flag;
651*437bfbebSnyanmisaka     RK_U32   scaleing_list_address;
652*437bfbebSnyanmisaka 
653*437bfbebSnyanmisaka } H264_PPS_t;
654*437bfbebSnyanmisaka 
655*437bfbebSnyanmisaka //!< MVC_scalable_nesting
656*437bfbebSnyanmisaka typedef struct {
657*437bfbebSnyanmisaka     RK_S32   operation_point_flag;
658*437bfbebSnyanmisaka     RK_S32   all_view_components_in_au_flag;
659*437bfbebSnyanmisaka     RK_S32   num_view_components_minus1;
660*437bfbebSnyanmisaka     RK_S32   *sei_view_id;
661*437bfbebSnyanmisaka     RK_S32   num_view_components_op_minus1;
662*437bfbebSnyanmisaka     RK_S32   *sei_op_view_id;
663*437bfbebSnyanmisaka     RK_S32   sei_op_temporal_id;
664*437bfbebSnyanmisaka     RK_S32   Valid;
665*437bfbebSnyanmisaka } MVC_scalable_nesting_t;
666*437bfbebSnyanmisaka 
667*437bfbebSnyanmisaka //!< MVC_scalability_info
668*437bfbebSnyanmisaka typedef struct {
669*437bfbebSnyanmisaka     RK_S32 num_operation_points_minus1;
670*437bfbebSnyanmisaka     RK_S32 *operation_point_id;
671*437bfbebSnyanmisaka     RK_S32 *priority_id;
672*437bfbebSnyanmisaka     RK_S32 *temporal_id;
673*437bfbebSnyanmisaka     RK_S32 *num_target_output_views_minus1;
674*437bfbebSnyanmisaka     RK_S32 **view_id;
675*437bfbebSnyanmisaka     RK_S32 *profile_level_info_present_flag;
676*437bfbebSnyanmisaka     RK_S32 *bitrate_info_present_flag;
677*437bfbebSnyanmisaka     RK_S32 *frm_rate_info_present_flag;
678*437bfbebSnyanmisaka 
679*437bfbebSnyanmisaka     RK_S32 *view_dependency_info_present_flag;
680*437bfbebSnyanmisaka     RK_S32 *parameter_sets_info_present_flag;
681*437bfbebSnyanmisaka     RK_S32 *bitstream_restriction_info_present_flag;
682*437bfbebSnyanmisaka     RK_S32 *op_profile_level_idc;
683*437bfbebSnyanmisaka     RK_S32 *avg_bitrate;
684*437bfbebSnyanmisaka     RK_S32 *max_bitrate;
685*437bfbebSnyanmisaka     RK_S32 *max_bitrate_calc_window;
686*437bfbebSnyanmisaka     RK_S32 *constant_frm_rate_idc;
687*437bfbebSnyanmisaka     RK_S32 *avg_frm_rate;
688*437bfbebSnyanmisaka     RK_S32 *num_directly_dependent_views;
689*437bfbebSnyanmisaka     RK_S32 **directly_dependent_view_id;
690*437bfbebSnyanmisaka     RK_S32 *view_dependency_info_src_op_id;
691*437bfbebSnyanmisaka     RK_S32 *num_seq_parameter_sets;
692*437bfbebSnyanmisaka     RK_S32 **seq_parameter_set_id_delta;
693*437bfbebSnyanmisaka     RK_S32 *num_subset_seq_parameter_sets;
694*437bfbebSnyanmisaka     RK_S32 **subset_seq_parameter_set_id_delta;
695*437bfbebSnyanmisaka     RK_S32 *num_pic_parameter_sets_minus1;
696*437bfbebSnyanmisaka     RK_S32 **pic_parameter_set_id_delta;
697*437bfbebSnyanmisaka     RK_S32 *parameter_sets_info_src_op_id;
698*437bfbebSnyanmisaka     RK_S32 *motion_vectors_over_pic_boundaries_flag;
699*437bfbebSnyanmisaka     RK_S32 *max_bytes_per_pic_denom;
700*437bfbebSnyanmisaka     RK_S32 *max_bits_per_mb_denom;
701*437bfbebSnyanmisaka     RK_S32 *log2_max_mv_length_horizontal;
702*437bfbebSnyanmisaka     RK_S32 *log2_max_mv_length_vertical;
703*437bfbebSnyanmisaka     RK_S32 *max_num_reorder_frames;
704*437bfbebSnyanmisaka     RK_S32 *max_dec_frame_buffering;
705*437bfbebSnyanmisaka } MVC_scalability_info_t;
706*437bfbebSnyanmisaka 
707*437bfbebSnyanmisaka typedef struct h264_sei_pic_timing_t {
708*437bfbebSnyanmisaka     RK_S32 cpb_removal_delay;
709*437bfbebSnyanmisaka     RK_S32 dpb_output_delay;
710*437bfbebSnyanmisaka     RK_S32 pic_struct;
711*437bfbebSnyanmisaka     RK_S32 clock_timestamp_flag[3];
712*437bfbebSnyanmisaka     RK_S32 clock_timestamp[3];
713*437bfbebSnyanmisaka     RK_S32 ct_type[3];
714*437bfbebSnyanmisaka     RK_S32 nuit_field_based_flag[3];
715*437bfbebSnyanmisaka     RK_S32 counting_type[3];
716*437bfbebSnyanmisaka     RK_S32 full_timestamp_flag[3];
717*437bfbebSnyanmisaka     RK_S32 discontinuity_flag[3];
718*437bfbebSnyanmisaka     RK_S32 cnt_dropped_flag[3];
719*437bfbebSnyanmisaka     RK_S32 n_frames[3];
720*437bfbebSnyanmisaka     RK_S32 seconds_flag[3];
721*437bfbebSnyanmisaka     RK_S32 seconds_value[3];
722*437bfbebSnyanmisaka     RK_S32 minutes_flag[3];
723*437bfbebSnyanmisaka     RK_S32 minutes_value[3];
724*437bfbebSnyanmisaka     RK_S32 hours_flag[3];
725*437bfbebSnyanmisaka     RK_S32 hours_value[3];
726*437bfbebSnyanmisaka     RK_S32 time_offset[3];
727*437bfbebSnyanmisaka } H264_SEI_PIC_TIMING_t;
728*437bfbebSnyanmisaka 
729*437bfbebSnyanmisaka //!< SEI struct
730*437bfbebSnyanmisaka typedef struct h264_sei_t {
731*437bfbebSnyanmisaka     RK_S32 type;
732*437bfbebSnyanmisaka     RK_S32 payload_size;
733*437bfbebSnyanmisaka     struct {
734*437bfbebSnyanmisaka         RK_U32  recovery_frame_cnt;
735*437bfbebSnyanmisaka         RK_S32  exact_match_flag;
736*437bfbebSnyanmisaka         RK_S32  broken_link_flag;
737*437bfbebSnyanmisaka         RK_S32  changing_slice_group_idc;
738*437bfbebSnyanmisaka     } recovery_point;
739*437bfbebSnyanmisaka     struct {
740*437bfbebSnyanmisaka         RK_S32 operation_point_flag;
741*437bfbebSnyanmisaka         //-- for adding
742*437bfbebSnyanmisaka     } scalable_nesting;
743*437bfbebSnyanmisaka 
744*437bfbebSnyanmisaka     // Placeholder; in future more supported types will contribute to more
745*437bfbebSnyanmisaka     //---- follow is used in other parts
746*437bfbebSnyanmisaka     RK_S32 mvc_scalable_nesting_flag;
747*437bfbebSnyanmisaka     RK_U32 seq_parameter_set_id;
748*437bfbebSnyanmisaka 
749*437bfbebSnyanmisaka     H264_SEI_PIC_TIMING_t pic_timing;
750*437bfbebSnyanmisaka 
751*437bfbebSnyanmisaka     struct h264_dec_ctx_t *p_Dec;
752*437bfbebSnyanmisaka } H264_SEI_t;
753*437bfbebSnyanmisaka 
754*437bfbebSnyanmisaka //!< SLICE
755*437bfbebSnyanmisaka typedef struct h264_slice_t {
756*437bfbebSnyanmisaka     struct h264_nalu_svc_ext_t svcExt;
757*437bfbebSnyanmisaka     struct h264_nalu_mvc_ext_t mvcExt;
758*437bfbebSnyanmisaka     //--- slice property;
759*437bfbebSnyanmisaka     RK_S32       layer_id;
760*437bfbebSnyanmisaka     RK_S32       idr_flag;
761*437bfbebSnyanmisaka     RK_S32       idr_pic_id;
762*437bfbebSnyanmisaka     RK_S32       nal_reference_idc;            //!< nal_reference_idc from NAL unit
763*437bfbebSnyanmisaka     RK_U32       start_mb_nr;                  //!< MUST be set by NAL even in case of ei_flag == 1
764*437bfbebSnyanmisaka     RK_S32       slice_type;                   //!< slice type
765*437bfbebSnyanmisaka     RK_U32       pic_parameter_set_id;
766*437bfbebSnyanmisaka     RK_S32       colour_plane_id;
767*437bfbebSnyanmisaka     RK_S32       frame_num;
768*437bfbebSnyanmisaka     RK_S32       field_pic_flag;
769*437bfbebSnyanmisaka     RK_S32       bottom_field_flag;
770*437bfbebSnyanmisaka     RK_S32       structure;
771*437bfbebSnyanmisaka     RK_S32       mb_aff_frame_flag;
772*437bfbebSnyanmisaka     RK_S32       pic_order_cnt_lsb;              // for poc mode 0
773*437bfbebSnyanmisaka     RK_S32       delta_pic_order_cnt_bottom;
774*437bfbebSnyanmisaka     RK_S32       delta_pic_order_cnt[2];         // for poc mode 1
775*437bfbebSnyanmisaka     RK_U32       poc_used_bitlen;
776*437bfbebSnyanmisaka     RK_S32       redundant_pic_cnt;
777*437bfbebSnyanmisaka     RK_S32       direct_spatial_mv_pred_flag;
778*437bfbebSnyanmisaka     RK_S32       num_ref_idx_active[2];          //!< number of available list references
779*437bfbebSnyanmisaka     RK_S32       num_ref_idx_override_flag;
780*437bfbebSnyanmisaka     RK_S32       ref_pic_list_reordering_flag[2];
781*437bfbebSnyanmisaka     RK_S32       *modification_of_pic_nums_idc[2];
782*437bfbebSnyanmisaka     RK_S32       *abs_diff_pic_num_minus1[2];
783*437bfbebSnyanmisaka     RK_S32       *long_term_pic_idx[2];
784*437bfbebSnyanmisaka     RK_S32       *abs_diff_view_idx_minus1[2];
785*437bfbebSnyanmisaka     struct h264_drpm_t   *dec_ref_pic_marking_buffer;
786*437bfbebSnyanmisaka     RK_U32       drpm_used_bitlen;
787*437bfbebSnyanmisaka     RK_S32       no_output_of_prior_pics_flag;
788*437bfbebSnyanmisaka     RK_S32       long_term_reference_flag;
789*437bfbebSnyanmisaka     RK_S32       adaptive_ref_pic_buffering_flag;
790*437bfbebSnyanmisaka     RK_U32       model_number;
791*437bfbebSnyanmisaka     RK_S32       slice_qp_delta;
792*437bfbebSnyanmisaka     RK_S32       qp;
793*437bfbebSnyanmisaka     RK_S32       current_mb_nr;
794*437bfbebSnyanmisaka     RK_S32       ThisPOC;
795*437bfbebSnyanmisaka     RK_S32       toppoc;      //poc for this top field
796*437bfbebSnyanmisaka     RK_S32       bottompoc;   //poc of bottom field of frame
797*437bfbebSnyanmisaka     RK_S32       framepoc;    //poc of this frame
798*437bfbebSnyanmisaka     RK_U32       AbsFrameNum;
799*437bfbebSnyanmisaka     RK_S32       PicOrderCntMsb;
800*437bfbebSnyanmisaka     //RK_S32       new_frame_flag;
801*437bfbebSnyanmisaka     struct h264_sps_t    *active_sps;
802*437bfbebSnyanmisaka     struct h264_subsps_t *active_subsps;
803*437bfbebSnyanmisaka     struct h264_pps_t    *active_pps;
804*437bfbebSnyanmisaka 
805*437bfbebSnyanmisaka     struct h264_dpb_buf_t  *p_Dpb;
806*437bfbebSnyanmisaka     struct h264_dpb_buf_t  *p_Dpb_layer[MAX_NUM_DPB_LAYERS];
807*437bfbebSnyanmisaka     //----
808*437bfbebSnyanmisaka     RK_S32       listinterviewidx0;
809*437bfbebSnyanmisaka     RK_S32       listinterviewidx1;
810*437bfbebSnyanmisaka 
811*437bfbebSnyanmisaka     RK_U8        listXsizeP[2];
812*437bfbebSnyanmisaka     RK_U8        listXsizeB[2];
813*437bfbebSnyanmisaka 
814*437bfbebSnyanmisaka     struct h264_frame_store_t    **fs_listinterview0;
815*437bfbebSnyanmisaka     struct h264_frame_store_t    **fs_listinterview1;
816*437bfbebSnyanmisaka     //struct h264_store_pic_t     **listX[6];
817*437bfbebSnyanmisaka     struct h264_store_pic_t      **listP[MAX_NUM_DPB_LAYERS];
818*437bfbebSnyanmisaka     struct h264_store_pic_t      **listB[MAX_NUM_DPB_LAYERS];
819*437bfbebSnyanmisaka 
820*437bfbebSnyanmisaka     //---- MVC extend ----
821*437bfbebSnyanmisaka     RK_S32   svc_extension_flag;      // should be always 0, for MVC
822*437bfbebSnyanmisaka     RK_S32   non_idr_flag;            // 0 = current is IDR
823*437bfbebSnyanmisaka     RK_S32   priority_id;             // a lower value of priority_id specifies a higher priority
824*437bfbebSnyanmisaka     RK_S32   view_id;                 // view identifier for the NAL unit
825*437bfbebSnyanmisaka     RK_S32   temporal_id;             // temporal identifier for the NAL unit
826*437bfbebSnyanmisaka     RK_S32   anchor_pic_flag;         // anchor access unit
827*437bfbebSnyanmisaka     RK_S32   inter_view_flag;         // inter-view prediction enable
828*437bfbebSnyanmisaka     RK_S32   reserved_one_bit;        // shall be equal to 1
829*437bfbebSnyanmisaka     RK_S32   MVCExt_is_valid;
830*437bfbebSnyanmisaka     RK_S32   MVCExt_is_prefixNALU;
831*437bfbebSnyanmisaka 
832*437bfbebSnyanmisaka     struct h264_dec_ctx_t     *p_Dec;    // H264_DecCtx_t
833*437bfbebSnyanmisaka     struct h264d_input_ctx_t  *p_Inp;    // H264_InputParameters
834*437bfbebSnyanmisaka     struct h264d_cur_ctx_t    *p_Cur;    // H264_CurParameters
835*437bfbebSnyanmisaka     struct h264d_video_ctx_t  *p_Vid;
836*437bfbebSnyanmisaka } H264_SLICE_t;
837*437bfbebSnyanmisaka 
838*437bfbebSnyanmisaka //!< Old slice parameter for check new frame
839*437bfbebSnyanmisaka typedef struct h264_old_slice_par_t {
840*437bfbebSnyanmisaka     RK_U32  current_mb_nr;
841*437bfbebSnyanmisaka     RK_U8   field_pic_flag;
842*437bfbebSnyanmisaka     RK_U8   frame_num;
843*437bfbebSnyanmisaka     RK_S32  nal_ref_idc;
844*437bfbebSnyanmisaka     RK_U8   pic_oder_cnt_lsb;
845*437bfbebSnyanmisaka     RK_S32  delta_pic_oder_cnt_bottom;
846*437bfbebSnyanmisaka     RK_S32  delta_pic_order_cnt[2];
847*437bfbebSnyanmisaka     RK_U8   bottom_field_flag;
848*437bfbebSnyanmisaka     RK_U8   idr_flag;
849*437bfbebSnyanmisaka     RK_S32  idr_pic_id;
850*437bfbebSnyanmisaka     RK_U32  pps_id;
851*437bfbebSnyanmisaka     RK_S32  view_id;
852*437bfbebSnyanmisaka     RK_S32  inter_view_flag;
853*437bfbebSnyanmisaka     RK_S32  anchor_pic_flag;
854*437bfbebSnyanmisaka     RK_S32  layer_id;
855*437bfbebSnyanmisaka } H264_OldSlice_t;
856*437bfbebSnyanmisaka 
857*437bfbebSnyanmisaka //!< DXVA context
858*437bfbebSnyanmisaka #define MAX_SLICE_NUM              (20)
859*437bfbebSnyanmisaka #define ADD_SLICE_SIZE             (5)
860*437bfbebSnyanmisaka #define BITSTREAM_MAX_SIZE         (2*1024*1024)
861*437bfbebSnyanmisaka #define BITSTREAM_ADD_SIZE         (512)
862*437bfbebSnyanmisaka #define SYNTAX_BUF_SIZE            (5)
863*437bfbebSnyanmisaka typedef struct h264d_dxva_ctx_t {
864*437bfbebSnyanmisaka     RK_U8                            cfgBitstrmRaw;
865*437bfbebSnyanmisaka     struct _DXVA_PicParams_H264_MVC  pp;
866*437bfbebSnyanmisaka     struct _DXVA_Qmatrix_H264        qm;
867*437bfbebSnyanmisaka     RK_U32                           max_slice_size;
868*437bfbebSnyanmisaka     RK_U32                           slice_count;
869*437bfbebSnyanmisaka     struct _DXVA_Slice_H264_Long     *slice_long;   //!<  MAX_SLICES
870*437bfbebSnyanmisaka     RK_U8                            *bitstream;
871*437bfbebSnyanmisaka     RK_U32                           max_strm_size;
872*437bfbebSnyanmisaka     RK_U32                           strm_offset;
873*437bfbebSnyanmisaka     struct h264d_syntax_t            syn;
874*437bfbebSnyanmisaka     struct h264_dec_ctx_t            *p_Dec;
875*437bfbebSnyanmisaka } H264dDxvaCtx_t;
876*437bfbebSnyanmisaka 
877*437bfbebSnyanmisaka //!< input parameter
878*437bfbebSnyanmisaka typedef struct h264d_input_ctx_t {
879*437bfbebSnyanmisaka     struct h264_dec_ctx_t      *p_Dec;
880*437bfbebSnyanmisaka     struct h264d_cur_ctx_t     *p_Cur;   //!< current parameters, use in read nalu
881*437bfbebSnyanmisaka     struct h264d_video_ctx_t   *p_Vid;   //!< parameters for video decoder
882*437bfbebSnyanmisaka     enum   mpp_decmtd_type      dec_mtd;
883*437bfbebSnyanmisaka 
884*437bfbebSnyanmisaka     //!< input data
885*437bfbebSnyanmisaka     RK_U8  *in_buf;
886*437bfbebSnyanmisaka     size_t in_length;
887*437bfbebSnyanmisaka     RK_U32 pkt_eos;
888*437bfbebSnyanmisaka 
889*437bfbebSnyanmisaka     MppPacket in_pkt;
890*437bfbebSnyanmisaka 
891*437bfbebSnyanmisaka     RK_S64 in_pts;
892*437bfbebSnyanmisaka     RK_S64 in_dts;
893*437bfbebSnyanmisaka     RK_U8  has_get_eos;
894*437bfbebSnyanmisaka     RK_U32 max_buf_size;
895*437bfbebSnyanmisaka     //!< output data
896*437bfbebSnyanmisaka     RK_U8  task_valid;
897*437bfbebSnyanmisaka     RK_U32 task_eos;
898*437bfbebSnyanmisaka 
899*437bfbebSnyanmisaka     //!< have extradata
900*437bfbebSnyanmisaka     RK_U8  is_nalff;
901*437bfbebSnyanmisaka     RK_U8  profile;
902*437bfbebSnyanmisaka     RK_U8  level;
903*437bfbebSnyanmisaka     RK_U32 nal_size;
904*437bfbebSnyanmisaka     RK_S32 sps_num;
905*437bfbebSnyanmisaka     RK_S32 pps_num;
906*437bfbebSnyanmisaka     //!< write stream
907*437bfbebSnyanmisaka     char fname[2][512];
908*437bfbebSnyanmisaka     FILE *fp;
909*437bfbebSnyanmisaka     RK_U8 *spspps_buf;
910*437bfbebSnyanmisaka     RK_U32 spspps_size;
911*437bfbebSnyanmisaka     RK_U32 spspps_len;
912*437bfbebSnyanmisaka     RK_U32 spspps_offset;
913*437bfbebSnyanmisaka     RK_U32 spspps_update_flag;
914*437bfbebSnyanmisaka 
915*437bfbebSnyanmisaka } H264dInputCtx_t;
916*437bfbebSnyanmisaka 
917*437bfbebSnyanmisaka 
918*437bfbebSnyanmisaka //!< current stream
919*437bfbebSnyanmisaka typedef struct h264d_curstrm_t {
920*437bfbebSnyanmisaka     RK_U32    nalu_offset;       //!< The offset of the input stream
921*437bfbebSnyanmisaka     RK_U32    nalu_max_size;     //!< Cur Unit Buffer size
922*437bfbebSnyanmisaka     RK_U8     *curdata;
923*437bfbebSnyanmisaka 
924*437bfbebSnyanmisaka     RK_S32    nalu_type;
925*437bfbebSnyanmisaka     RK_U32    nalu_len;
926*437bfbebSnyanmisaka     RK_U8     *nalu_buf;         //!< store read nalu data
927*437bfbebSnyanmisaka 
928*437bfbebSnyanmisaka     RK_U32    head_offset;
929*437bfbebSnyanmisaka     RK_U32    head_max_size;
930*437bfbebSnyanmisaka     RK_U8     *head_buf;         //!< store header data, sps/pps/slice header
931*437bfbebSnyanmisaka 
932*437bfbebSnyanmisaka     RK_U32    first_mb_in_slice; //!< mark current slice
933*437bfbebSnyanmisaka     RK_U32    tmp_offset;
934*437bfbebSnyanmisaka     RK_U32    tmp_max_size;
935*437bfbebSnyanmisaka     RK_U8     *tmp_buf;          //!< store temporary header data
936*437bfbebSnyanmisaka 
937*437bfbebSnyanmisaka     RK_U32    prefixdata;
938*437bfbebSnyanmisaka     RK_U8     startcode_found;
939*437bfbebSnyanmisaka     RK_U8     endcode_found;
940*437bfbebSnyanmisaka 
941*437bfbebSnyanmisaka } H264dCurStream_t;
942*437bfbebSnyanmisaka 
943*437bfbebSnyanmisaka #define MAX_REORDER_TIMES   33      // MVC: 2 * H264_MAX_REFS + 1
944*437bfbebSnyanmisaka #define MAX_MARKING_TIMES   35
945*437bfbebSnyanmisaka //!< current parameters
946*437bfbebSnyanmisaka typedef struct h264d_cur_ctx_t {
947*437bfbebSnyanmisaka     struct h264_sps_t        sps;
948*437bfbebSnyanmisaka     struct h264_subsps_t     *subsps;
949*437bfbebSnyanmisaka     struct h264_pps_t        pps;
950*437bfbebSnyanmisaka     struct h264_prefix_t     prefix;
951*437bfbebSnyanmisaka     struct h264_sei_t        *sei;
952*437bfbebSnyanmisaka     struct h264_nalu_t       nalu;
953*437bfbebSnyanmisaka     struct bitread_ctx_t     bitctx; //!< for control bit_read
954*437bfbebSnyanmisaka     struct h264d_curstrm_t   strm;
955*437bfbebSnyanmisaka     struct h264_slice_t      slice;
956*437bfbebSnyanmisaka 
957*437bfbebSnyanmisaka     struct h264_store_pic_t **listP[MAX_NUM_DPB_LAYERS];
958*437bfbebSnyanmisaka     struct h264_store_pic_t **listB[MAX_NUM_DPB_LAYERS];
959*437bfbebSnyanmisaka     struct h264d_input_ctx_t *p_Inp;
960*437bfbebSnyanmisaka     struct h264_dec_ctx_t    *p_Dec;
961*437bfbebSnyanmisaka     struct h264d_video_ctx_t *p_Vid;   //!< parameters for video decoder
962*437bfbebSnyanmisaka 
963*437bfbebSnyanmisaka     RK_S64                    last_pts;
964*437bfbebSnyanmisaka     RK_S64                    last_dts;
965*437bfbebSnyanmisaka     RK_S64                    curr_pts;
966*437bfbebSnyanmisaka     RK_S64                    curr_dts;
967*437bfbebSnyanmisaka     //!< malloc buffer for current slice
968*437bfbebSnyanmisaka     RK_S32                    modification_of_pic_nums_idc[2][MAX_REORDER_TIMES];
969*437bfbebSnyanmisaka     RK_S32                    abs_diff_pic_num_minus1[2][MAX_REORDER_TIMES];
970*437bfbebSnyanmisaka     RK_S32                    long_term_pic_idx[2][MAX_REORDER_TIMES];
971*437bfbebSnyanmisaka     RK_S32                    abs_diff_view_idx_minus1[2][MAX_REORDER_TIMES];
972*437bfbebSnyanmisaka 
973*437bfbebSnyanmisaka     struct h264_drpm_t        *dec_ref_pic_marking_buffer[MAX_MARKING_TIMES];
974*437bfbebSnyanmisaka     MppFrameHdrDynamicMeta    *hdr_dynamic_meta;
975*437bfbebSnyanmisaka     RK_U32                    hdr_dynamic;
976*437bfbebSnyanmisaka } H264dCurCtx_t;
977*437bfbebSnyanmisaka 
978*437bfbebSnyanmisaka //!< parameters for video decoder
979*437bfbebSnyanmisaka typedef struct h264d_video_ctx_t {
980*437bfbebSnyanmisaka     struct h264_sps_t            *spsSet[MAXSPS];      //!< MAXSPS, all sps storage
981*437bfbebSnyanmisaka     struct h264_subsps_t         *subspsSet[MAXSPS];   //!< MAXSPS, all subpps storage
982*437bfbebSnyanmisaka     struct h264_pps_t            *ppsSet[MAXPPS];      //!< MAXPPS, all pps storage
983*437bfbebSnyanmisaka     struct h264_sps_t            *active_sps;
984*437bfbebSnyanmisaka     struct h264_subsps_t         *active_subsps;
985*437bfbebSnyanmisaka     struct h264_pps_t            *active_pps;
986*437bfbebSnyanmisaka     struct h264_dec_ctx_t        *p_Dec;  //!< H264_DecCtx_t
987*437bfbebSnyanmisaka     struct h264d_input_ctx_t     *p_Inp;  //!< H264_InputParameters
988*437bfbebSnyanmisaka     struct h264d_cur_ctx_t       *p_Cur;  //!< H264_CurParameters
989*437bfbebSnyanmisaka     struct h264_dpb_buf_t        *p_Dpb_layer[MAX_NUM_DPB_LAYERS];
990*437bfbebSnyanmisaka     struct h264_store_pic_t      *dec_pic;    //!< current decoder picture
991*437bfbebSnyanmisaka     struct h264_store_pic_t      *last_pic;
992*437bfbebSnyanmisaka 
993*437bfbebSnyanmisaka     struct h264_store_pic_t      *no_ref_pic; //!< no reference picture
994*437bfbebSnyanmisaka     struct h264_frame_store_t    out_buffer;
995*437bfbebSnyanmisaka     struct h264_dpb_mark_t       *active_dpb_mark[MAX_NUM_DPB_LAYERS];  //!< acitve_dpb_memory
996*437bfbebSnyanmisaka 
997*437bfbebSnyanmisaka     struct h264_store_pic_t      old_pic;
998*437bfbebSnyanmisaka 
999*437bfbebSnyanmisaka     RK_S32    *qmatrix[12];  //!< scanlist pointer
1000*437bfbebSnyanmisaka     RK_U32    stream_size;
1001*437bfbebSnyanmisaka     RK_S32    last_toppoc[MAX_NUM_DPB_LAYERS];
1002*437bfbebSnyanmisaka     RK_S32    last_bottompoc[MAX_NUM_DPB_LAYERS];
1003*437bfbebSnyanmisaka     RK_S32    last_framepoc[MAX_NUM_DPB_LAYERS];
1004*437bfbebSnyanmisaka     RK_S32    last_thispoc[MAX_NUM_DPB_LAYERS];
1005*437bfbebSnyanmisaka     //!<
1006*437bfbebSnyanmisaka     RK_S32     profile_idc;                                       // u(8)
1007*437bfbebSnyanmisaka     RK_S32     slice_type;
1008*437bfbebSnyanmisaka     RK_S32     structure;
1009*437bfbebSnyanmisaka     RK_S32     iNumOfSlicesDecoded;
1010*437bfbebSnyanmisaka     RK_S32     no_output_of_prior_pics_flag;
1011*437bfbebSnyanmisaka     RK_S32     last_has_mmco_5;
1012*437bfbebSnyanmisaka     RK_S32     max_frame_num;
1013*437bfbebSnyanmisaka     RK_U32     active_sps_id[MAX_NUM_DPB_LAYERS];
1014*437bfbebSnyanmisaka     RK_U32     PicWidthInMbs;
1015*437bfbebSnyanmisaka     RK_U32     FrameHeightInMbs;
1016*437bfbebSnyanmisaka     RK_S32     frame_mbs_only_flag;
1017*437bfbebSnyanmisaka     RK_S32     yuv_format;
1018*437bfbebSnyanmisaka     RK_U32     bit_depth_chroma;
1019*437bfbebSnyanmisaka     RK_U32     bit_depth_luma;
1020*437bfbebSnyanmisaka     RK_S32     width;
1021*437bfbebSnyanmisaka     RK_S32     height;
1022*437bfbebSnyanmisaka     RK_U32     width_after_crop;
1023*437bfbebSnyanmisaka     RK_U32     height_after_crop;
1024*437bfbebSnyanmisaka     RK_S32     width_cr;                               //!< width chroma
1025*437bfbebSnyanmisaka     RK_S32     height_cr;                              //!< height chroma
1026*437bfbebSnyanmisaka     RK_S32     last_pic_structure;
1027*437bfbebSnyanmisaka     RK_S32     last_pic_bottom_field;
1028*437bfbebSnyanmisaka     RK_S32     last_pic_width_in_mbs_minus1[2];
1029*437bfbebSnyanmisaka     RK_S32     last_pic_height_in_map_units_minus1[2];
1030*437bfbebSnyanmisaka     RK_S32     last_profile_idc[2];
1031*437bfbebSnyanmisaka     RK_S32     last_level_idc[2];
1032*437bfbebSnyanmisaka     RK_U32     last_sps_id;
1033*437bfbebSnyanmisaka     RK_U32     last_pps_id;
1034*437bfbebSnyanmisaka     RK_S32     PrevPicOrderCntMsb;
1035*437bfbebSnyanmisaka     RK_S32     PrevPicOrderCntLsb;
1036*437bfbebSnyanmisaka     RK_U32     PreviousFrameNum;
1037*437bfbebSnyanmisaka     RK_U32     FrameNumOffset;
1038*437bfbebSnyanmisaka     RK_S32     PreviousFrameNumOffset;
1039*437bfbebSnyanmisaka     RK_S32     ExpectedDeltaPerPicOrderCntCycle;
1040*437bfbebSnyanmisaka     RK_S32     ExpectedPicOrderCnt;
1041*437bfbebSnyanmisaka     RK_S32     PicOrderCntCycleCnt;
1042*437bfbebSnyanmisaka     RK_S32     FrameNumInPicOrderCntCycle;
1043*437bfbebSnyanmisaka     RK_S32     ThisPOC;
1044*437bfbebSnyanmisaka     RK_S32     type;
1045*437bfbebSnyanmisaka     //!< for control running
1046*437bfbebSnyanmisaka     RK_S32     have_outpicture_flag;
1047*437bfbebSnyanmisaka     RK_S32     exit_picture_flag;
1048*437bfbebSnyanmisaka     RK_S32     active_mvc_sps_flag;
1049*437bfbebSnyanmisaka     //!< for error tolerance
1050*437bfbebSnyanmisaka     RK_U32     g_framecnt;
1051*437bfbebSnyanmisaka     RK_U32     dpb_size[MAX_NUM_DPB_LAYERS];
1052*437bfbebSnyanmisaka 
1053*437bfbebSnyanmisaka     MppMemPool pic_st;
1054*437bfbebSnyanmisaka     //!< spspps data update
1055*437bfbebSnyanmisaka     RK_U32     spspps_update;
1056*437bfbebSnyanmisaka 
1057*437bfbebSnyanmisaka     RK_U32     dpb_fast_out;
1058*437bfbebSnyanmisaka     RK_U32     dpb_first_fast_played;
1059*437bfbebSnyanmisaka     RK_U32     last_ref_frame_num;
1060*437bfbebSnyanmisaka     RK_U32     deny_flag;
1061*437bfbebSnyanmisaka     RecoveryPoint recovery;
1062*437bfbebSnyanmisaka } H264dVideoCtx_t;
1063*437bfbebSnyanmisaka 
1064*437bfbebSnyanmisaka typedef struct h264d_mem_t {
1065*437bfbebSnyanmisaka     struct h264_dpb_mark_t     dpb_mark[MAX_MARK_SIZE];         //!< for fpga register check, dpb mark
1066*437bfbebSnyanmisaka     struct h264_dpb_info_t     dpb_info[MAX_DPB_SIZE];         //!< 16
1067*437bfbebSnyanmisaka     struct h264_refpic_info_t  refpic_info_p[MAX_REF_SIZE];    //!< 32
1068*437bfbebSnyanmisaka     struct h264_refpic_info_t  refpic_info_b[2][MAX_REF_SIZE];   //!< [2][32]
1069*437bfbebSnyanmisaka     struct h264d_dxva_ctx_t    dxva_ctx;
1070*437bfbebSnyanmisaka } H264_DecMem_t;
1071*437bfbebSnyanmisaka 
1072*437bfbebSnyanmisaka //!< nalu state used in read nalu
1073*437bfbebSnyanmisaka typedef enum nalu_state_tpye {
1074*437bfbebSnyanmisaka     NALU_NULL = 0,
1075*437bfbebSnyanmisaka 
1076*437bfbebSnyanmisaka     StreamError,
1077*437bfbebSnyanmisaka     HaveNoStream,
1078*437bfbebSnyanmisaka     NaluNotSupport,
1079*437bfbebSnyanmisaka     ReadNaluError,
1080*437bfbebSnyanmisaka     StartofNalu,
1081*437bfbebSnyanmisaka     EndofStream,
1082*437bfbebSnyanmisaka     MvcDisAble,
1083*437bfbebSnyanmisaka     MidOfNalu,
1084*437bfbebSnyanmisaka     EndOfNalu,
1085*437bfbebSnyanmisaka     StartOfPicture,
1086*437bfbebSnyanmisaka     StartOfSlice,
1087*437bfbebSnyanmisaka     SkipNALU,
1088*437bfbebSnyanmisaka     NALU_SPS,
1089*437bfbebSnyanmisaka     NALU_SubSPS,
1090*437bfbebSnyanmisaka     NALU_PPS,
1091*437bfbebSnyanmisaka     NALU_SEI,
1092*437bfbebSnyanmisaka 
1093*437bfbebSnyanmisaka     NALU_MAX,
1094*437bfbebSnyanmisaka } NALU_STATUS;
1095*437bfbebSnyanmisaka 
1096*437bfbebSnyanmisaka //!< slice state used in parse loop
1097*437bfbebSnyanmisaka typedef enum slice_state_type {
1098*437bfbebSnyanmisaka     SliceSTATE_NULL = 0,
1099*437bfbebSnyanmisaka     SliceSTATE_IDLE,
1100*437bfbebSnyanmisaka 
1101*437bfbebSnyanmisaka     SliceSTATE_ResetSlice,
1102*437bfbebSnyanmisaka     SliceSTATE_ReadNalu,
1103*437bfbebSnyanmisaka     SliceSTATE_ParseNalu,
1104*437bfbebSnyanmisaka     SliceSTATE_InitPicture,
1105*437bfbebSnyanmisaka     ////SliceSTATE_InitSlice,
1106*437bfbebSnyanmisaka     SliceSTATE_GetSliceData,
1107*437bfbebSnyanmisaka     //SliceSTATE_RegisterOneSlice,
1108*437bfbebSnyanmisaka     SliceSTATE_RegisterOneFrame,
1109*437bfbebSnyanmisaka     SliceSTATE_Error,
1110*437bfbebSnyanmisaka     SliceSTATE_MAX,
1111*437bfbebSnyanmisaka 
1112*437bfbebSnyanmisaka } SLICE_STATUS;
1113*437bfbebSnyanmisaka 
1114*437bfbebSnyanmisaka typedef struct h264_err_ctx_t {
1115*437bfbebSnyanmisaka     RK_U32    un_spt_flag;
1116*437bfbebSnyanmisaka     RK_U32    cur_err_flag;    //!< current decoded picture error
1117*437bfbebSnyanmisaka     RK_U32    used_ref_flag;
1118*437bfbebSnyanmisaka     RK_U32    dpb_err_flag;    //!< dpb storage had error
1119*437bfbebSnyanmisaka 
1120*437bfbebSnyanmisaka     RK_U32    i_slice_no;
1121*437bfbebSnyanmisaka     RK_S32    first_iframe_poc;
1122*437bfbebSnyanmisaka     RK_S32    first_iframe_is_output;
1123*437bfbebSnyanmisaka } H264dErrCtx_t;
1124*437bfbebSnyanmisaka //!< decoder video parameter
1125*437bfbebSnyanmisaka typedef struct h264_dec_ctx_t {
1126*437bfbebSnyanmisaka     struct h264d_mem_t        *mem;
1127*437bfbebSnyanmisaka     struct h264_dpb_mark_t    *dpb_mark;         //!< for write out, MAX_DPB_SIZE
1128*437bfbebSnyanmisaka     struct h264_dpb_info_t    *dpb_info;         //!< 16
1129*437bfbebSnyanmisaka     struct h264_refpic_info_t *refpic_info_p;    //!< 32
1130*437bfbebSnyanmisaka     struct h264_refpic_info_t *refpic_info_b[2]; //!< [2][32]
1131*437bfbebSnyanmisaka     struct h264d_dxva_ctx_t   *dxva_ctx;
1132*437bfbebSnyanmisaka 
1133*437bfbebSnyanmisaka     struct h264d_input_ctx_t  *p_Inp;
1134*437bfbebSnyanmisaka     struct h264d_cur_ctx_t    *p_Cur;            //!< current parameters, use in read nalu
1135*437bfbebSnyanmisaka     struct h264d_video_ctx_t  *p_Vid;            //!< parameters for video decoder
1136*437bfbebSnyanmisaka     RK_U32                     spt_decode_mtds;  //!< support decoder methods
1137*437bfbebSnyanmisaka     NALU_STATUS                nalu_ret;         //!< current nalu state
1138*437bfbebSnyanmisaka     SLICE_STATUS               next_state;       //!< RKV_SLICE_STATUS
1139*437bfbebSnyanmisaka     RK_U8                      have_slice_data;
1140*437bfbebSnyanmisaka     RK_U8                      is_new_frame;
1141*437bfbebSnyanmisaka     RK_U8                      is_parser_end;
1142*437bfbebSnyanmisaka     RK_U8                      svc_valid;
1143*437bfbebSnyanmisaka     RK_U8                      mvc_valid;
1144*437bfbebSnyanmisaka     //!< add
1145*437bfbebSnyanmisaka     MppBufSlots                frame_slots;   //!< corresponding to dpb_mark
1146*437bfbebSnyanmisaka     MppBufSlots                packet_slots;
1147*437bfbebSnyanmisaka     MppDecCfgSet               *cfg;
1148*437bfbebSnyanmisaka     const MppDecHwCap          *hw_info;
1149*437bfbebSnyanmisaka 
1150*437bfbebSnyanmisaka     MppFrame                   curframe;
1151*437bfbebSnyanmisaka     MppPacket                  task_pkt;
1152*437bfbebSnyanmisaka 
1153*437bfbebSnyanmisaka     RK_S64                     task_pts;
1154*437bfbebSnyanmisaka     RK_U32                     task_eos;
1155*437bfbebSnyanmisaka     HalDecTask                *in_task;
1156*437bfbebSnyanmisaka     RK_S32                     last_frame_slot_idx;
1157*437bfbebSnyanmisaka     RK_U32                     immediate_out;
1158*437bfbebSnyanmisaka     struct h264_err_ctx_t      errctx;
1159*437bfbebSnyanmisaka } H264_DecCtx_t;
1160*437bfbebSnyanmisaka 
1161*437bfbebSnyanmisaka #endif /* __H264D_GLOBAL_H__ */
1162