1 /* ///////////////////////////////////////////////////////////////////////
2 //
3 //               INTEL CORPORATION PROPRIETARY INFORMATION
4 //  This software is supplied under the terms of a license agreement or
5 //  nondisclosure agreement with Intel Corporation and may not be copied
6 //  or disclosed except in accordance with the terms of that agreement.
7 //        Copyright (c) 2001-2006 Intel Corporation. All Rights Reserved.
8 //
9 //  Description:    MPEG-4 header.
10 //
11 */
12 
13 
14 #ifndef _H264_H_
15 #define _H264_H_
16 
17 #ifdef HOST_ONLY
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <memory.h>
21 #endif
22 
23 #include "stdint.h"
24 #include "viddec_debug.h"
25 
26 #include "viddec_fw_workload.h"
27 #include "h264parse_sei.h"
28 
29 
30 #ifdef WIN32
31 #define mfd_printf OS_INFO
32 #endif
33 
34 #ifdef H264_VERBOSE
35 #define PRINTF(format, args...) OS_INFO("%s:  %s[%d]:: " format, __FILE__, __FUNCTION__ , __LINE__ ,  ## args )
36 #else
37 //#define PRINTF(args...)
38 #endif
39 
40 //#pragma warning(disable : 4710) // function not inlined
41 //#pragma warning(disable : 4514) // unreferenced inline function has been removed CL
42 //#pragma warning(disable : 4100) // unreferenced formal parameter CL
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 #define MAX_INT32_VALUE 	0x7fffffff
49 
50 #define MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE 256
51 #define MAX_CPB_CNT	32
52 #define MAX_NUM_SLICE_GRPS 	1				//As per Annex A for high profile, the num_slice_groups_minus1 is 0
53 #define MAX_PIC_LIST_NUM	8
54 
55 //#define MAX_PIC_SIZE_IN_MAP_UNITS	1024 //0 ???????? Henry
56 #define MAX_NUM_REF_IDX_L0_ACTIVE	32
57 //#define STARTCODE_BUF_SIZE 			2048+1024
58 
59 #define NUM_MMCO_OPERATIONS         17
60 
61 // Used to check whether the SEI RP is the only way for recovery (cisco contents)
62 // This threshold will decide the interval of recovery even no error detected if no IDR during this time
63 #define SEI_REC_CHECK_TH				8
64 
65 //SPS
66 #define MAX_NUM_SPS			32
67 #define SCL_DEFAULT 		1
68 
69 //PPS
70 #define MAX_PIC_PARAMS		255
71 #define MAX_NUM_REF_FRAMES	32
72 #define MAX_QP				51
73 #define MAX_NUM_PPS			256
74 
75 #define PUT_FS_IDC_BITS(w)                                (w&0x1F)
76 #define PUT_LIST_INDEX_FIELD_BIT(w)                       ((w&0x1)<<5)
77 #define PUT_LIST_LONG_TERM_BITS(w)                        ((w&0x1)<<6)
78 #define PUT_LIST_PTR_LIST_ID_BIT(id)                      (id<<5)
79 
80 
81 // DPB
82 #define FRAME_FLAG_DANGLING_TOP_FIELD        ( 0x1 << 3  )
83 #define FRAME_FLAG_DANGLING_BOTTOM_FIELD     ( 0x1 << 4  )
84 
85 #define MPD_DPB_FS_NULL_IDC			31            // May need to be changed if we alter gaps_in_frame_num to use
86 
87 #define MFD_H264_MAX_FRAME_BUFFERS  17
88 #define NUM_DPB_FRAME_STORES        (MFD_H264_MAX_FRAME_BUFFERS + 1)  // 1 extra for storign non-existent pictures.
89 
90 //Scalling Matrix Type
91 #define PPS_QM                  0
92 #define SPS_QM                  1
93 #define FB_QM                   2
94 #define DEFAULT_QM              3
95 
96 //Frame Type
97 #define FRAME_TYPE_IDR        0x00
98 #define FRAME_TYPE_I          0x01
99 #define FRAME_TYPE_P          0x02
100 #define FRAME_TYPE_B          0x03
101 #define FRAME_TYPE_INVALID    0x04
102 
103 
104 #define FRAME_TYPE_FRAME_OFFSET     3
105 #define FRAME_TYPE_TOP_OFFSET       3
106 #define FRAME_TYPE_BOTTOM_OFFSET    0
107 #define FRAME_TYPE_STRUCTRUE_OFFSET 6
108 
109 //// Error handling
110 #define FIELD_ERR_OFFSET		17			//offset for Field error flag ----refer to the structure definition viddec_fw_workload_error_codes in viddec_fw_common_defs.h
111 
112 ////Bits Handling
113 #define h264_bitfields_extract(x_32, start, mask)     (((x_32) >> (start)) & (mask) )
114 #define h264_bitfields_insert(x_32, val_32, start, mask) ((x_32) = (((x_32) & ~( (mask) << (start))) | (((val_32) & (mask)) << (start))))
115 
116 
117 //// PIP
118 typedef enum _pip_setting_t
119 {
120   PIP_SCALER_DISABLED,
121   PIP_SCALE_FACTOR_1_BY_4,
122   PIP_SCALE_FACTOR_1_BY_2,
123   PIP_SCALER_INVALID,
124 
125 } pip_setting_t;
126 
127 
128 #ifdef VERBOSE
129 #define DEBUGGETBITS(args...)  OS_INFO( args )
130 #else
131 //#define DEBUGGETBITS(args...)
132 #endif
133 
134 /* status codes */
135 typedef enum _h264_Status
136 {
137     H264_STATUS_EOF          =  1,   // end of file
138     H264_STATUS_OK           =  0,   // no error
139     H264_STATUS_NO_MEM       =  2,   // out of memory
140     H264_STATUS_FILE_ERROR   =  3,   // file error
141     H264_STATUS_NOTSUPPORT   =  4,   // not supported mode
142     H264_STATUS_PARSE_ERROR  =  5,   // fail in parse MPEG-4 stream
143     H264_STATUS_ERROR        =  6,   // unknown/unspecified error
144     H264_NAL_ERROR,
145 	H264_SPS_INVALID_PROFILE,
146 	H264_SPS_INVALID_LEVEL,
147 	H264_SPS_INVALID_SEQ_PARAM_ID,
148 	H264_SPS_ERROR,
149 	H264_PPS_INVALID_PIC_ID,
150 	H264_PPS_INVALID_SEQ_ID,
151 	H264_PPS_ERROR,
152 	H264_SliceHeader_INVALID_MB,
153 	H264_SliceHeader_ERROR,
154 	H264_FRAME_DONE,
155 	H264_SLICE_DONE,
156 	H264_STATUS_POLL_ONCE_ERROR,
157 	H264_STATUS_DEC_MEMINIT_ERROR,
158 	H264_STATUS_NAL_UNIT_TYPE_ERROR,
159 	H264_STATUS_SEI_ERROR,
160 	H264_STATUS_SEI_DONE,
161 } h264_Status;
162 
163 
164 
165 typedef enum _picture_structure_t
166 {
167    TOP_FIELD		= 1,
168    BOTTOM_FIELD		= 2,
169    FRAME			= 3,
170    INVALID			= 4
171 } picture_structure_t;
172 
173 ///// Chorma format
174 
175 typedef enum _h264_chroma_format_t
176 {
177 	H264_CHROMA_MONOCHROME,
178 	H264_CHROMA_420,
179 	H264_CHROMA_422,
180 	H264_CHROMA_444,
181 }h264_chroma_format_t;
182 
183 /* H264 start code values */
184 typedef enum _h264_nal_unit_type
185 {
186   	h264_NAL_UNIT_TYPE_unspecified = 0,
187 	h264_NAL_UNIT_TYPE_SLICE,
188 	h264_NAL_UNIT_TYPE_DPA,
189 	h264_NAL_UNIT_TYPE_DPB,
190 	h264_NAL_UNIT_TYPE_DPC,
191 	h264_NAL_UNIT_TYPE_IDR,
192 	h264_NAL_UNIT_TYPE_SEI,
193 	h264_NAL_UNIT_TYPE_SPS,
194 	h264_NAL_UNIT_TYPE_PPS,
195 	h264_NAL_UNIT_TYPE_Acc_unit_delimiter,
196 	h264_NAL_UNIT_TYPE_EOSeq,
197 	h264_NAL_UNIT_TYPE_EOstream,
198 	h264_NAL_UNIT_TYPE_filler_data,
199 	h264_NAL_UNIT_TYPE_SPS_extension,
200 	h264_NAL_UNIT_TYPE_Reserved1			=14,		/*14-18*/
201 	h264_NAL_UNIT_TYPE_Reserved2			=15,		/*14-18*/
202 	h264_NAL_UNIT_TYPE_Reserved3			=16,		/*14-18*/
203 	h264_NAL_UNIT_TYPE_Reserved4			=17,		/*14-18*/
204 	h264_NAL_UNIT_TYPE_Reserved5			=18,		/*14-18*/
205 	h264_NAL_UNIT_TYPE_ACP				=19,
206 	h264_NAL_UNIT_TYPE_Reserved6			=20,		/*20-23*/
207 	h264_NAL_UNIT_TYPE_unspecified2		=24,		/*24-31*/
208 } h264_nal_unit_type;
209 
210 #define h264_NAL_PRIORITY_HIGHEST     3
211 #define h264_NAL_PRIORITY_HIGH        2
212 #define h264_NAL_PRIRITY_LOW          1
213 #define h264_NAL_PRIORITY_DISPOSABLE  0
214 
215 
216 typedef enum _h264_Profile
217 {
218     h264_ProfileBaseline = 66,  	/** Baseline profile */
219     h264_ProfileMain = 77,        	/** Main profile */
220     h264_ProfileExtended = 88,    	/** Extended profile */
221     h264_ProfileHigh = 100 ,     		/** High profile */
222     h264_ProfileHigh10 = 110,			/** High 10 profile */
223     h264_ProfileHigh422 = 122,		/** High profile 4:2:2 */
224     h264_ProfileHigh444 = 144,		/** High profile 4:4:4 */
225 } h264_Profile;
226 
227 
228 typedef enum _h264_Level
229 {
230     h264_Level1b	= 9,		    /** Level 1b */
231     h264_Level1		= 10,			/** Level 1 */
232     h264_Level11	= 11, 		    /** Level 1.1 */
233 	h264_Level12	= 12, 		    /** Level 1.2 */
234 	h264_Level13	= 13, 		    /** Level 1.3 */
235 	h264_Level2		= 20,			/** Level 2 */
236     h264_Level21 	= 21, 		    /** Level 2.1 */
237 	h264_Level22	= 22, 		    /** Level 2.2 */
238 	h264_Level3		= 30, 		    /** Level 3 */
239 	h264_Level31	= 31, 		    /** Level 3.1 */
240 	h264_Level32	= 32, 		    /** Level 3.2 */
241 	h264_Level4		= 40, 		    /** Level 4 */
242 	h264_Level41	= 41, 		    /** Level 4.1 */
243 	h264_Level42	= 42, 		    /** Level 4.2 */
244 	h264_Level5		= 50, 		    /** Level 5 */
245 	h264_Level51	= 51, 		    /** Level 5.1 */
246 	h264_LevelReserved = 255  /** Unknown profile */
247 } h264_Level;
248 
249 
250 typedef enum _h264_video_format
251 {
252 	h264_Component	=0,
253 	h264_PAL,
254 	h264_NTSC,
255 	h264_SECAM,
256 	h264_MAC,
257 	h264_unspecified,
258 	h264_Reserved6,
259 	h264_Reserved7
260 }h264_video_format;
261 
262 
263 typedef enum _h264_fcm
264 {
265     h264_ProgressiveFrame = 0,
266     h264_InterlacedFrame  = 1,
267     h264_InterlacedField  = 3,
268     h264_PictureFormatNone
269 } h264_fcm;
270 
271 
272 ///// Define the picture types []
273 typedef enum _h264_ptype_t
274 {
275     h264_PtypeP = 0,
276     h264_PtypeB = 1,
277     h264_PtypeI = 2,
278     h264_PtypeSP = 3,
279     h264_PtypeSI = 4,
280     h264_Ptype_unspecified,
281 } h264_ptype_t;
282 
283 
284 ///// Aspect ratio
285 typedef enum _h264_aspect_ratio
286 {
287 	h264_AR_Unspecified = 0,
288 	h264_AR_1_1 = 1,
289 	h264_AR_12_11 = 2,
290 	h264_AR_10_11 = 3,
291 	h264_AR_16_11 = 4,
292 	h264_AR_40_33 = 5,
293 	h264_AR_24_11 = 6,
294 	h264_AR_20_11 = 7,
295 	h264_AR_32_11 = 8,
296 	h264_AR_80_33 = 9,
297 	h264_AR_18_11 = 10,
298 	h264_AR_15_11 = 11,
299 	h264_AR_64_33 = 12,
300 	h264_AR_160_99 = 13,
301 	h264_AR_4_3 = 14,
302 	h264_AR_3_2 = 15,
303 	h264_AR_2_1 = 16,
304 	h264_AR_RESERVED = 17,
305 	h264_AR_Extended_SAR = 255,
306 }h264_aspect_ratio;
307 
308 
309 //////////////////////////////////////////////
310 
311 //////////////////////////////////////////////
312 // storable_picture
313 
314 /* Structure details
315    If all members remain ints
316    Size = 11 ints, i.e. 44 bytes
317 */
318 
319 typedef struct
320 {
321   int32_t	poc;
322   int32_t	pic_num;
323 
324   int32_t	long_term_pic_num;
325 
326   uint8_t	long_term_frame_idx;
327   uint8_t	is_long_term;
328   uint8_t	used_for_reference;
329   uint8_t	pad_flag;  		// Used to indicate the status
330 
331 } storable_picture, *storable_picture_ptr;
332 
333 //////////////////////////////////////////////
334 // frame store
335 
336 /* Structure details
337    If all members remain ints
338    Size = 46 ints, i.e. 184 bytes
339 */
340 
341 typedef struct _frame_store
342 {
343 	storable_picture frame;
344 	storable_picture top_field;
345 	storable_picture bottom_field;
346 
347 	int32_t	frame_num;
348 
349 	int32_t	frame_num_wrap;
350 
351 
352 	uint8_t	fs_idc;
353 	uint8_t	pic_type;            //bit7 structure: 1 frame , 0 field;
354 	                              //bit4,5,6 top field (frame) pic type,  00 IDR 01 I 10 P 11 B 100 INVALID
355 	                              //bit1,2,3 bottom pic type,  00 IDR 01 I 10 P 11 B 100 INVALID
356    uint8_t	long_term_frame_idx; // No two frame stores may have the same long-term frame index
357 
358    #define viddec_h264_get_dec_structure(x)         h264_bitfields_extract( (x)->fs_flag_1, 0, 0x03)
359    #define viddec_h264_set_dec_structure(x, val)    h264_bitfields_insert ( (x)->fs_flag_1, (val), 0, 0x03)
360    #define viddec_h264_get_is_used(x)         h264_bitfields_extract( (x)->fs_flag_1, 2, 0x03)
361    #define viddec_h264_set_is_frame_used(x, val)    h264_bitfields_insert ( (x)->fs_flag_1, (val), 2, 0x03)
362    #define viddec_h264_set_is_top_used(x, val)    h264_bitfields_insert ( (x)->fs_flag_1, (val), 2, 0x01)
363    #define viddec_h264_set_is_bottom_used(x, val)    h264_bitfields_insert ( (x)->fs_flag_1, (val), 3, 0x01)
364    #define viddec_h264_get_is_skipped(x)         h264_bitfields_extract( (x)->fs_flag_1, 4, 0x03)
365    #define viddec_h264_set_is_frame_skipped(x, val)    h264_bitfields_insert ( (x)->fs_flag_1, (val), 4, 0x03)
366    #define viddec_h264_set_is_top_skipped(x, val)    h264_bitfields_insert ( (x)->fs_flag_1, (val), 4, 0x01)
367    #define viddec_h264_set_is_bottom_skipped(x, val)    h264_bitfields_insert ( (x)->fs_flag_1, (val), 5, 0x01)
368    #define viddec_h264_get_is_long_term(x)         h264_bitfields_extract( (x)->fs_flag_1, 6, 0x03)
369    #define viddec_h264_set_is_frame_long_term(x, val)    h264_bitfields_insert ( (x)->fs_flag_1, (val), 6, 0x03)
370    #define viddec_h264_set_is_top_long_term(x, val)    h264_bitfields_insert ( (x)->fs_flag_1, (val), 6, 0x01)
371    #define viddec_h264_set_is_bottom_long_term(x, val)    h264_bitfields_insert ( (x)->fs_flag_1, (val), 7, 0x01)
372    uint8_t  fs_flag_1;
373 
374 
375    #define viddec_h264_get_is_non_existent(x)            h264_bitfields_extract( (x)->fs_flag_2, 0, 0x01)
376    #define viddec_h264_set_is_non_existent(x, val)       h264_bitfields_insert ( (x)->fs_flag_2, (val), 0, 0x01)
377    #define viddec_h264_get_is_output(x)                  h264_bitfields_extract( (x)->fs_flag_2, 1, 0x01)
378    #define viddec_h264_set_is_output(x, val)             h264_bitfields_insert ( (x)->fs_flag_2, (val), 1, 0x01)
379    #define viddec_h264_get_is_dangling(x)                h264_bitfields_extract( (x)->fs_flag_2, 2, 0x01)
380    #define viddec_h264_set_is_dangling(x, val)           h264_bitfields_insert ( (x)->fs_flag_2, (val), 2, 0x01)
381    #define viddec_h264_get_recovery_pt_picture(x)        h264_bitfields_extract( (x)->fs_flag_2, 3, 0x01)
382    #define viddec_h264_set_recovery_pt_picture(x, val)   h264_bitfields_insert ( (x)->fs_flag_2, (val), 3, 0x01)
383    #define viddec_h264_get_broken_link_picture(x)        h264_bitfields_extract( (x)->fs_flag_2, 4, 0x01)
384    #define viddec_h264_set_broken_link_picture(x, val)   h264_bitfields_insert ( (x)->fs_flag_2, (val), 4, 0x01)
385    #define viddec_h264_get_open_gop_entry(x)             h264_bitfields_extract( (x)->fs_flag_2, 5, 0x01)
386    #define viddec_h264_set_open_gop_entry(x, val)        h264_bitfields_insert ( (x)->fs_flag_2, (val), 5, 0x01)
387    #define viddec_h264_get_first_field_intra(x)          h264_bitfields_extract( (x)->fs_flag_2, 6, 0x01)
388    #define viddec_h264_set_first_field_intra(x, val)     h264_bitfields_insert ( (x)->fs_flag_2, (val), 6, 0x01)
389 	uint8_t  fs_flag_2;
390 
391    uint8_t  fs_flag_reserve_1;
392    uint8_t  fs_flag_reserve_2;
393    uint8_t  fs_flag_reserve_3;
394 
395 	// If non-reference, may have skipped pixel decode
396 	//uint8_t	non_ref_skipped;
397 } frame_store, *frame_param_ptr;
398 
399 //! Decoded Picture Buffer
400 typedef struct _h264_decoded_picture_buffer
401 {
402 	///
403 	int32_t     last_output_poc;
404 	int32_t     max_long_term_pic_idx;
405 
406 	//// Resolutions
407 	int32_t		PicWidthInMbs;
408 	int32_t		FrameHeightInMbs;
409 
410 	frame_store	fs[NUM_DPB_FRAME_STORES];
411 
412 	uint8_t		fs_ref_idc[16];
413 	uint8_t		fs_ltref_idc[16];
414 
415 	uint8_t		fs_dpb_idc[NUM_DPB_FRAME_STORES+2];
416 
417 	uint8_t		listX_0[33+3];  // [bit5}:field_flag:0 for top, 1 for bottom, [bit4~0]:fs_idc
418 	uint8_t		listX_1[33+3];
419 
420 	uint8_t		listXsize[2]; // 1 to 32
421 	uint8_t		nInitListSize[2];
422 
423 	//uint32_t	size;
424 	uint8_t		fs_dec_idc;
425 	uint8_t		fs_non_exist_idc;
426 	uint8_t		BumpLevel;
427 	uint8_t		used_size;
428 
429 	uint8_t		OutputLevel;
430 	uint8_t		OutputLevelValid;
431 	uint8_t		OutputCtrl;
432 	uint8_t     num_ref_frames;
433 
434 	uint8_t		ref_frames_in_buffer;
435 	uint8_t		ltref_frames_in_buffer;
436 	uint8_t		SuspendOutput;
437 	uint8_t		WaitSeiRecovery;
438 
439 
440    uint8_t		frame_numbers_need_to_be_allocated;
441    uint8_t		frame_id_need_to_be_allocated;
442 
443 	//// frame list to release from dpb, need be displayed
444    uint8_t		frame_numbers_need_to_be_removed;
445    uint8_t		frame_id_need_to_be_removed[17];
446 
447 	//// frame list to removed from dpb but not display
448    uint8_t		frame_numbers_need_to_be_dropped;
449    uint8_t		frame_id_need_to_be_dropped[17];
450 
451 	//// frame list to display (in display order)
452    uint8_t		frame_numbers_need_to_be_displayed;
453    uint8_t		frame_id_need_to_be_displayed[17];
454 
455 
456 } h264_DecodedPictureBuffer;
457 
458 
459 //////////////////////////////////////////////
460 // qm_matrix_set
461 typedef struct _qm_matrix_set
462 {
463  // uint8_t scaling_default_vector;
464   uint8_t scaling_list[56];            // 0 to 23 for qm 0 to 5 (4x4), 24 to 55 for qm 6 & 7 (8x8)
465 
466 } qm_matrix_set, *qm_matrix_set_ptr;
467 
468 /*
469 ///////// Currently not enabled in parser fw///////////////////
470 typedef struct _h264_SPS_Extension_RBSP {
471 	int32_t 			seq_parameter_set_id;					//UE
472 	int32_t				aux_format_idc;							//UE
473 	int32_t				bit_depth_aux_minus8;					//UE
474 	int32_t				alpha_incr_flag;
475 	int32_t				alpha_opaque_value;
476 	int32_t				alpha_transparent_value;
477 	int32_t				additional_extension_flag;
478 //	h264_rbsp_trail_set* rbsp_trail_ptr;
479 }h264_SPS_Extension_RBSP_t;
480 */
481 
482 typedef struct _h264_hrd_param_set {
483 	int32_t				bit_rate_value_minus1[MAX_CPB_CNT];			// ue(v), 0 to (2^32)-2
484 	int32_t				cpb_size_value_minus1[MAX_CPB_CNT];			// ue(v), 0 to (2^32)-2
485 
486 	uint8_t				cbr_flag[MAX_CPB_CNT];							// u(1) * 32
487 
488 } h264_hrd_param_set, *h264_hrd_param_set_ptr;
489 
490 typedef struct _vui_seq_parameters_t_used
491 {
492 	uint32_t	num_units_in_tick;                             // u(32)
493 	uint32_t	time_scale;                                    // u(32)
494 
495 	int32_t  num_reorder_frames;                               // ue(v), 0 to max_dec_frame_buffering
496 	int32_t	max_dec_frame_buffering;                          // ue(v), 0 to MaxDpbSize, specified in subclause A.3
497 
498 	uint16_t	 sar_width;                                       // u(16)
499 	uint16_t	 sar_height;                                      // u(16)
500 
501 	uint8_t   aspect_ratio_info_present_flag;                  // u(1)
502 	uint8_t   aspect_ratio_idc;                                // u(8)
503 	uint8_t   video_signal_type_present_flag;                  // u(1)
504 	uint8_t   video_format;                                    // u(3)
505 
506 	uint8_t   colour_description_present_flag;                 // u(1)
507 	uint8_t   colour_primaries;                                // u(8)
508 	uint8_t   transfer_characteristics;                        // u(8)
509 	uint8_t   timing_info_present_flag;                        // u(1)
510 
511 	uint8_t   fixed_frame_rate_flag;                           // u(1)
512 	uint8_t   low_delay_hrd_flag;                              // u(1)
513 	uint8_t   bitstream_restriction_flag;                      // u(1)
514 	uint8_t   pic_struct_present_flag;
515 
516 	uint8_t   nal_hrd_parameters_present_flag;                 // u(1)
517 	uint8_t 	 nal_hrd_cpb_removal_delay_length_minus1;				// u(5)
518 	uint8_t   nal_hrd_dpb_output_delay_length_minus1;				// u(5)
519 	uint8_t   nal_hrd_time_offset_length;								// u(5)
520 
521 	uint8_t   nal_hrd_cpb_cnt_minus1;									// ue(v), 0 to 31
522 	uint8_t   nal_hrd_initial_cpb_removal_delay_length_minus1;	// u(5)
523    uint8_t   vcl_hrd_parameters_present_flag;                 // u(1)
524 	uint8_t 	 vcl_hrd_cpb_removal_delay_length_minus1;				// u(5)
525 
526 	uint8_t   vcl_hrd_dpb_output_delay_length_minus1;				// u(5)
527 	uint8_t   vcl_hrd_time_offset_length;								// u(5)
528 	uint8_t   vcl_hrd_cpb_cnt_minus1;									// ue(v), 0 to 31
529 	uint8_t   vcl_hrd_initial_cpb_removal_delay_length_minus1;	// u(5)
530 
531 	/////// Here should be kept as 32-bits aligned for next structures
532 	/// 2 structures for NAL&VCL HRD
533 
534 
535 } vui_seq_parameters_t_used;
536 
537 
538 typedef struct _vui_seq_parameters_t_not_used
539 {
540 	int16_t  chroma_sample_loc_type_top_field;                // ue(v)
541 	int16_t  chroma_sample_loc_type_bottom_field;             // ue(v)
542 
543 	uint8_t   overscan_info_present_flag;                      // u(1)
544 	uint8_t   overscan_appropriate_flag;                       // u(1)
545 
546    uint8_t   video_full_range_flag;                           // u(1)
547 	uint8_t   matrix_coefficients;                             // u(8)
548 
549    uint8_t   chroma_location_info_present_flag;               // u(1)
550 	uint8_t   max_bytes_per_pic_denom;                          // ue(v), 0 to 16
551 	uint8_t   max_bits_per_mb_denom;                            // ue(v), 0 to 16
552 	uint8_t   log2_max_mv_length_vertical;                      // ue(v), 0 to 16, default to 16
553 	uint8_t   log2_max_mv_length_horizontal;                    // ue(v), 0 to 16, default to 16
554 
555 	uint8_t   motion_vectors_over_pic_boundaries_flag;          // u(1)
556 
557    uint8_t   nal_hrd_bit_rate_scale;									// u(4)
558 	uint8_t   nal_hrd_cpb_size_scale;									// u(4)
559 
560    uint8_t   vcl_hrd_bit_rate_scale;									// u(4)
561 	uint8_t   vcl_hrd_cpb_size_scale;									// u(4)
562 
563    h264_hrd_param_set nal_hrd_parameters;
564    h264_hrd_param_set vcl_hrd_parameters;
565 
566 
567 } vui_seq_parameters_t_not_used, *vui_seq_parameters_t_not_used_ptr;
568 
569 
570 //////////////////////////////////////////////
571 // picture parameter set
572 
573 typedef struct _PPS_PAR
574 {
575 	//int32_t DOUBLE_ALIGN valid;                          // indicates the parameter set is valid
576 
577 	int32_t pic_init_qp_minus26;                             // se(v), -26 to +25
578 	int32_t pic_init_qs_minus26;                             // se(v), -26 to +25
579 	int32_t chroma_qp_index_offset;                          // se(v), -12 to +12
580 	int32_t second_chroma_qp_index_offset;
581 
582 	uint8_t pic_parameter_set_id;                            // ue(v), 0 to 255, restricted to 0 to 127 by MPD_CTRL_MAXPPS = 128
583 	uint8_t seq_parameter_set_id;                            // ue(v), 0 to 31
584 	uint8_t entropy_coding_mode_flag;                        // u(1)
585 	uint8_t pic_order_present_flag;                          // u(1)
586 
587 	uint8_t num_slice_groups_minus1;                         // ue(v), shall be 0 for MP
588 	// Below are not relevant for main profile...
589 	uint8_t slice_group_map_type;                            // ue(v), 0 to 6
590 	uint8_t num_ref_idx_l0_active;							// ue(v), 0 to 31
591 	uint8_t num_ref_idx_l1_active;							// ue(v), 0 to 31
592 
593 	uint8_t weighted_pred_flag;                              // u(1)
594 	uint8_t weighted_bipred_idc;                             // u(2)
595 	uint8_t deblocking_filter_control_present_flag;          // u(1)
596 	uint8_t constrained_intra_pred_flag;                     // u(1)
597 
598 	uint8_t redundant_pic_cnt_present_flag;                  // u(1)
599 	uint8_t transform_8x8_mode_flag;
600 	uint8_t pic_scaling_matrix_present_flag;
601 	uint8_t pps_status_flag;
602 
603 	//// Keep here with 32-bits aligned
604 	uint8_t	pic_scaling_list_present_flag[MAX_PIC_LIST_NUM];
605 
606 	qm_matrix_set	pps_qm;
607 
608 	uint8_t 		ScalingList4x4[6][16];
609 	uint8_t 		ScalingList8x8[2][64];
610 	uint8_t   	UseDefaultScalingMatrix4x4Flag[6+2];
611 	uint8_t		UseDefaultScalingMatrix8x8Flag[6+2];
612 
613 } pic_param_set, *pic_param_set_ptr, h264_PicParameterSet_t;
614 
615 typedef union _list_reordering_num_t
616 {
617 	int32_t abs_diff_pic_num_minus1;
618 	int32_t long_term_pic_num;
619 } list_reordering_num_t;
620 
621 typedef struct _h264_Ref_Pic_List_Reordering				////size = 8*33+ 1 + 33
622 {
623 	list_reordering_num_t list_reordering_num[MAX_NUM_REF_FRAMES+1];
624 
625 	uint8_t			ref_pic_list_reordering_flag;
626 	uint8_t			reordering_of_pic_nums_idc[MAX_NUM_REF_FRAMES+1];							//UE
627 
628 }h264_Ref_Pic_List_Reordering_t;
629 
630 typedef enum _H264_DANGLING_TYPE
631 {
632 	DANGLING_TYPE_LAST_FIELD,
633 	DANGLING_TYPE_DPB_RESET,
634 	DANGLING_TYPE_FIELD,
635 	DANGLING_TYPE_FRAME,
636 	DANGLING_TYPE_GAP_IN_FRAME
637 
638 } H264_DANGLING_TYPE;
639 
640 
641 typedef struct _h264_Dec_Ref_Pic_Marking			//size = 17*4*2 + 17*3 + 4 + 1
642 {
643 	int32_t		difference_of_pic_num_minus1[NUM_MMCO_OPERATIONS];
644 	int32_t		long_term_pic_num[NUM_MMCO_OPERATIONS];
645 
646 	/// MMCO
647 	uint8_t		memory_management_control_operation[NUM_MMCO_OPERATIONS];
648 	uint8_t		max_long_term_frame_idx_plus1[NUM_MMCO_OPERATIONS];
649 	uint8_t		long_term_frame_idx[NUM_MMCO_OPERATIONS];
650 	uint8_t		long_term_reference_flag;
651 
652 	uint8_t		adaptive_ref_pic_marking_mode_flag;
653 	uint8_t		dec_ref_pic_marking_count;
654 	uint8_t		no_output_of_prior_pics_flag;
655 
656 	uint8_t		pad;
657 }h264_Dec_Ref_Pic_Marking_t;
658 
659 
660 
661 typedef struct old_slice_par
662 {
663 	int32_t		frame_num;
664 	int32_t		pic_order_cnt_lsb;
665 	int32_t		delta_pic_order_cnt_bottom;
666 	int32_t		delta_pic_order_cnt[2];
667 
668 	uint8_t		field_pic_flag;
669 	uint8_t		bottom_field_flag;
670 	uint8_t		nal_ref_idc;
671 	uint8_t		structure;
672 
673 	uint8_t		idr_flag;
674 	uint8_t		idr_pic_id;
675 	uint8_t		pic_parameter_id;
676 	uint8_t		status;
677 } OldSliceParams;
678 
679 #ifdef VBP
680 typedef struct _h264__pred_weight_table
681 {
682   uint8_t luma_log2_weight_denom;
683   uint8_t chroma_log2_weight_denom;
684   uint8_t luma_weight_l0_flag;
685   int16_t luma_weight_l0[32];
686   int8_t luma_offset_l0[32];
687   uint8_t chroma_weight_l0_flag;
688   int16_t chroma_weight_l0[32][2];
689   int8_t chroma_offset_l0[32][2];
690 
691   uint8_t luma_weight_l1_flag;
692   int16_t luma_weight_l1[32];
693   int8_t luma_offset_l1[32];
694   uint8_t chroma_weight_l1_flag;
695   int16_t chroma_weight_l1[32][2];
696   int8_t chroma_offset_l1[32][2];
697 } h264_pred_weight_table;
698 #endif
699 
700 typedef struct _h264_Slice_Header
701 {
702 	int32_t 		first_mb_in_slice;								//UE
703 	int32_t		frame_num;											//UV
704 	int32_t		pic_order_cnt_lsb;								//UV
705 	int32_t		delta_pic_order_cnt_bottom;					//SE
706 	int32_t		delta_pic_order_cnt[2];								//SE
707 	int32_t		redundant_pic_cnt;									//UE
708 
709 	uint32_t		num_ref_idx_l0_active;								//UE
710 	uint32_t		num_ref_idx_l1_active;								//UE
711 
712 	int32_t		slice_qp_delta;										//SE
713 	int32_t		slice_qs_delta;										//SE
714 	int32_t		slice_alpha_c0_offset_div2;						//SE
715 	int32_t		slice_beta_offset_div2;								//SE
716 	int32_t		slice_group_change_cycle;							//UV
717 
718 #ifdef VBP
719   h264_pred_weight_table  sh_predwttbl;
720 #endif
721 
722 	///// Flags or IDs
723 	//h264_ptype_t	slice_type;											//UE
724 	uint8_t			slice_type;
725 	uint8_t 			nal_ref_idc;
726 	uint8_t			structure;
727 	uint8_t 			pic_parameter_id;									//UE
728 
729 	uint8_t			field_pic_flag;
730 	uint8_t			bottom_field_flag;
731 	uint8_t			idr_flag;											//UE
732 	uint8_t			idr_pic_id;											//UE
733 
734 	uint8_t 			sh_error;
735 	uint8_t			cabac_init_idc;										//UE
736 	uint8_t			sp_for_switch_flag;
737 	uint8_t			disable_deblocking_filter_idc;						//UE
738 
739 	uint8_t			direct_spatial_mv_pred_flag;
740 	uint8_t			num_ref_idx_active_override_flag;
741 	int16_t			current_slice_nr;
742 
743 	//// For Ref list reordering
744 	h264_Dec_Ref_Pic_Marking_t sh_dec_refpic;
745 	h264_Ref_Pic_List_Reordering_t sh_refpic_l0;
746 	h264_Ref_Pic_List_Reordering_t sh_refpic_l1;
747 
748 } h264_Slice_Header_t;
749 
750 
751 #define   MAX_USER_DATA_SIZE              1024
752 typedef struct _h264_user_data_t
753 {
754 	h264_sei_payloadtype    user_data_type;
755 
756   	int32_t    user_data_id;
757   	int32_t    dsn;
758   	int32_t    user_data_size;
759   	int32_t    user_data[MAX_USER_DATA_SIZE>>2];
760 } h264_user_data_t;
761 
762 // SPS DISPLAY parameters: seq_param_set_disp, *seq_param_set_disp_ptr;
763 typedef struct _SPS_DISP
764 {
765 	///// VUI info
766 	vui_seq_parameters_t_used vui_seq_parameters;    //size =
767 
768 	///// Resolution
769 	int16_t pic_width_in_mbs_minus1;
770 	int16_t pic_height_in_map_units_minus1;
771 
772 	///// Cropping
773 	int16_t frame_crop_rect_left_offset;
774 	int16_t frame_crop_rect_right_offset;
775 
776 	int16_t frame_crop_rect_top_offset;
777 	int16_t frame_crop_rect_bottom_offset;
778 
779 	///// Flags
780 	uint8_t frame_mbs_only_flag;
781 	uint8_t mb_adaptive_frame_field_flag;
782 	uint8_t direct_8x8_inference_flag;
783 	uint8_t frame_cropping_flag;
784 
785 	uint16_t vui_parameters_present_flag;
786 	uint16_t chroma_format_idc;
787 } seq_param_set_disp, *seq_param_set_disp_ptr;
788 
789 
790 ////SPS: seq_param_set, *seq_param_set_ptr;
791 
792 typedef struct _SPS_PAR_USED
793 {
794    uint32_t    is_updated;
795 
796 	/////////// Required for display section //////////////////////////
797 	seq_param_set_disp sps_disp;
798 
799 	int32_t		expectedDeltaPerPOCCycle;
800 	int32_t 		offset_for_non_ref_pic;                           // se(v), -2^31 to (2^31)-1, 32-bit integer
801 	int32_t 		offset_for_top_to_bottom_field;                   // se(v), -2^31 to (2^31)-1, 32-bit integer
802 
803 	/////////// IDC
804 	uint8_t 		profile_idc;                                      // u(8), 0x77 for MP
805 	uint8_t 		constraint_set_flags;                             // bit 0 to 3 for set0 to set3
806 	uint8_t 		level_idc;                                        // u(8)
807 	uint8_t 		seq_parameter_set_id;                             // ue(v), 0 to 31
808 
809 
810 	uint8_t 		pic_order_cnt_type;                               // ue(v), 0 to 2
811 	uint8_t 		log2_max_frame_num_minus4;                        // ue(v), 0 to 12
812 	uint8_t 		log2_max_pic_order_cnt_lsb_minus4;                // ue(v), 0 to 12
813 	uint8_t 		num_ref_frames_in_pic_order_cnt_cycle;            // ue(v), 0 to 255
814 
815 	//int32_t offset_for_ref_frame[MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE];   // se(v), -2^31 to (2^31)-1, 32-bit integer
816 	uint8_t 		num_ref_frames;                                   // ue(v), 0 to 16,
817 	uint8_t 		gaps_in_frame_num_value_allowed_flag;             // u(1)
818 	// This is my addition, we should calculate this once and leave it with the sps
819 	// as opposed to calculating it each time in h264_hdr_decoding_POC()
820 
821 	uint8_t 		delta_pic_order_always_zero_flag;                 // u(1)
822 	uint8_t		residual_colour_transform_flag;
823 
824 	uint8_t		bit_depth_luma_minus8;
825 	uint8_t		bit_depth_chroma_minus8;
826 	uint8_t		lossless_qpprime_y_zero_flag;
827 	uint8_t		seq_scaling_matrix_present_flag;
828 
829 	uint8_t		seq_scaling_list_present_flag[MAX_PIC_LIST_NUM];			//0-7
830 
831 	//// Combine the scaling matrix to word ( 24 + 32)
832 	uint8_t 		ScalingList4x4[6][16];
833 	uint8_t 		ScalingList8x8[2][64];
834 	uint8_t		UseDefaultScalingMatrix4x4Flag[6];
835 	uint8_t		UseDefaultScalingMatrix8x8Flag[6];
836 
837 } seq_param_set_used, *seq_param_set_used_ptr;
838 
839 
840 typedef struct _SPS_PAR_ALL
841 {
842 
843     seq_param_set_used  sps_par_used;
844     vui_seq_parameters_t_not_used sps_vui_par_not_used;
845 
846 }seq_param_set_all, *seq_param_set_all_ptr;
847 
848 
849 ///// Image control parameter////////////
850 typedef struct _h264_img_par
851 {
852 	int32_t frame_num;				// decoding num of current frame
853 	int32_t frame_count;				// count of decoded frames
854 	int32_t current_slice_num;
855 	int32_t gaps_in_frame_num;
856 
857 	// POC decoding
858 	int32_t num_ref_frames_in_pic_order_cnt_cycle;
859 	int32_t delta_pic_order_always_zero_flag;
860 	int32_t offset_for_non_ref_pic;
861 	int32_t offset_for_top_to_bottom_field;
862 
863 	int32_t pic_order_cnt_lsb;
864 	int32_t pic_order_cnt_msb;
865 	int32_t delta_pic_order_cnt_bottom;
866 	int32_t delta_pic_order_cnt[2];
867 
868 	int32_t PicOrderCntMsb;
869 	int32_t CurrPicOrderCntMsb;
870 	int32_t PrevPicOrderCntLsb;
871 
872 	int32_t FrameNumOffset;
873 
874 	int32_t PreviousFrameNum;
875 	int32_t PreviousFrameNumOffset;
876 
877 	int32_t toppoc;
878 	int32_t bottompoc;
879 	int32_t framepoc;
880 	int32_t ThisPOC;
881 
882 	//int32_t sei_freeze_this_image;
883 
884 	///////////////////// Resolutions
885 	int32_t PicWidthInMbs;
886 	int32_t FrameHeightInMbs;
887 
888 	///////////////////// MMCO
889 	uint8_t last_has_mmco_5;
890 	uint8_t curr_has_mmco_5;
891 
892 	/////////////////// Flags
893 	uint8_t g_new_frame;
894 	uint8_t g_new_pic;
895 
896 	uint8_t structure;
897 	uint8_t second_field;           // Set to one if this is the second field of a set of paired fields...
898 	uint8_t field_pic_flag;
899 	uint8_t last_pic_bottom_field;
900 
901 	uint8_t bottom_field_flag;
902 	uint8_t MbaffFrameFlag;
903 	uint8_t no_output_of_prior_pics_flag;
904 	uint8_t long_term_reference_flag;
905 
906 	uint8_t skip_this_pic;
907 	uint8_t pic_order_cnt_type;
908 	// Recovery
909 	uint8_t recovery_point_found;
910 	uint8_t used_for_reference;
911 } h264_img_par;
912 
913 
914 typedef struct  _h264_slice_reg_data
915 {
916 	uint32_t h264_bsd_slice_p1;      // 0x150
917 	//uint32_t h264_mpr_list0[8];       // from 0x380 to 0x3BC
918 	uint32_t h264_bsd_slice_p2;      // 0x154
919 	uint32_t h264_bsd_slice_start;   // 0x158
920 
921 } h264_slice_data;
922 
923 
924 typedef struct  _h264_pic_data
925 {
926 	uint32_t h264_dpb_init;          // 0x40
927 	//info For current pic
928 	uint32_t h264_cur_bsd_img_init;      // 0x140
929 	uint32_t h264_cur_mpr_tf_poc;        // 0x300
930 	uint32_t h264_cur_mpr_bf_poc;        // 0x304
931 
932 	//info For framess in DPB
933 	//uint32_t h264_dpb_bsd_img_init[16];      //0x140
934 	//uint32_t h264_dpb_mpr_tf_poc[16];        // 0x300
935 	//uint32_t h264_dpb_mpr_bf_poc[16];        // 0x304
936 } h264_pic_data;
937 
938 enum h264_workload_item_type
939 {
940    VIDDEC_WORKLOAD_H264_SLICE_REG = VIDDEC_WORKLOAD_DECODER_SPECIFIC,
941    VIDDEC_WORKLOAD_H264_PIC_REG,
942    VIDDEC_WORKLOAD_H264_DPB_FRAME_POC,
943    VIDDEC_WORKLOAD_H264_SH_BITS_OFFSET,
944    VIDDEC_WORKLOAD_H264_PWT_BITS_OFFSET,
945    VIDDEC_WORKLOAD_H264_PWT_ES_BYTES,
946    VIDDEC_WORKLOAD_H264_SCALING_MATRIX,
947    VIDDEC_WORKLOAD_H264_DEBUG
948 };
949 
950 
951 
952 ////////////////////////////////////////////
953 /* Full Info set*/
954 ////////////////////////////////////////////
955 typedef struct _h264_Info
956 {
957 
958    h264_DecodedPictureBuffer           dpb;
959 
960    //// Structures
961    //// need to gurantee active_SPS and active_PPS start from 4-bytes alignment address
962    seq_param_set_used	active_SPS;
963    pic_param_set			active_PPS;
964 
965 
966    h264_Slice_Header_t  SliceHeader;
967    OldSliceParams       old_slice;
968    sei_info             sei_information;
969 
970    h264_img_par      img;
971 
972    uint32_t          SPS_PADDR_GL;
973    uint32_t          PPS_PADDR_GL;
974    uint32_t          OFFSET_REF_FRAME_PADDR_GL;
975 	uint32_t				TMP_OFFSET_REFFRM_PADDR_GL;
976 
977    uint32_t          h264_list_replacement;
978 
979    uint32_t          h264_pwt_start_byte_offset;
980    uint32_t          h264_pwt_start_bit_offset;
981    uint32_t          h264_pwt_end_byte_offset;
982    uint32_t          h264_pwt_end_bit_offset;
983    uint32_t          h264_pwt_enabled;
984 
985 	uint32_t          sps_valid;
986 
987    uint8_t           slice_ref_list0[32];
988    uint8_t           slice_ref_list1[32];
989 
990 
991    uint8_t           qm_present_list;
992    //h264_NAL_Unit_t
993    uint8_t           nal_unit_type;
994    uint8_t           old_nal_unit_type;
995    uint8_t    			got_start;
996 
997    //workload
998    uint8_t           push_to_cur;
999    uint8_t           Is_first_frame_in_stream;
1000    uint8_t           Is_SPS_updated;
1001    uint8_t           number_of_first_au_info_nal_before_first_slice;
1002 
1003    uint8_t           is_frame_boundary_detected_by_non_slice_nal;
1004    uint8_t           is_frame_boundary_detected_by_slice_nal;
1005    uint8_t           is_current_workload_done;
1006    uint8_t			 primary_pic_type_plus_one;	  //AUD---[0,7]
1007 
1008 	//Error handling
1009 	uint8_t			sei_rp_received;
1010 	uint8_t			last_I_frame_idc;
1011 	uint8_t			sei_b_state_ready;
1012 	uint8_t			gop_err_flag;
1013 
1014 
1015 	uint32_t		wl_err_curr;
1016 	uint32_t		wl_err_next;
1017 
1018 } h264_Info;
1019 
1020 
1021 
1022 struct h264_viddec_parser
1023 {
1024    uint32_t     sps_pps_ddr_paddr;
1025    h264_Info    info;
1026 };
1027 
1028 
1029 
1030 
1031 
1032 #endif  //_H264_H_
1033 
1034 
1035