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