blob: a3490b4d153d3e169fcb6a54a4f7d7313fcd6565 [file] [log] [blame]
/* ///////////////////////////////////////////////////////////////////////
//
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright (c) 2001-2006 Intel Corporation. All Rights Reserved.
//
// Description: MPEG-4 header.
//
*/
#ifndef _H264_H_
#define _H264_H_
#ifdef HOST_ONLY
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#endif
#include "stdint.h"
#include "viddec_debug.h"
#include "viddec_fw_workload.h"
#include "h264parse_sei.h"
#ifdef WIN32
#define mfd_printf OS_INFO
#endif
#ifdef H264_VERBOSE
#define PRINTF(format, args...) OS_INFO("%s: %s[%d]:: " format, __FILE__, __FUNCTION__ , __LINE__ , ## args )
#else
//#define PRINTF(args...)
#endif
//#pragma warning(disable : 4710) // function not inlined
//#pragma warning(disable : 4514) // unreferenced inline function has been removed CL
//#pragma warning(disable : 4100) // unreferenced formal parameter CL
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_INT32_VALUE 0x7fffffff
#define MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE 256
#define MAX_CPB_CNT 32
#define MAX_NUM_SLICE_GRPS 1 //As per Annex A for high profile, the num_slice_groups_minus1 is 0
#define MAX_PIC_LIST_NUM 8
//#define MAX_PIC_SIZE_IN_MAP_UNITS 1024 //0 ???????? Henry
#define MAX_NUM_REF_IDX_L0_ACTIVE 32
//#define STARTCODE_BUF_SIZE 2048+1024
#define NUM_MMCO_OPERATIONS 17
// Used to check whether the SEI RP is the only way for recovery (cisco contents)
// This threshold will decide the interval of recovery even no error detected if no IDR during this time
#define SEI_REC_CHECK_TH 8
//SPS
#define MAX_NUM_SPS 32
#define SCL_DEFAULT 1
//PPS
#define MAX_PIC_PARAMS 255
#define MAX_NUM_REF_FRAMES 32
#define MAX_QP 51
#define MAX_NUM_PPS 256
#define PUT_FS_IDC_BITS(w) (w&0x1F)
#define PUT_LIST_INDEX_FIELD_BIT(w) ((w&0x1)<<5)
#define PUT_LIST_LONG_TERM_BITS(w) ((w&0x1)<<6)
#define PUT_LIST_PTR_LIST_ID_BIT(id) (id<<5)
// DPB
#define FRAME_FLAG_DANGLING_TOP_FIELD ( 0x1 << 3 )
#define FRAME_FLAG_DANGLING_BOTTOM_FIELD ( 0x1 << 4 )
#define MPD_DPB_FS_NULL_IDC 31 // May need to be changed if we alter gaps_in_frame_num to use
#define MFD_H264_MAX_FRAME_BUFFERS 17
#define NUM_DPB_FRAME_STORES (MFD_H264_MAX_FRAME_BUFFERS + 1) // 1 extra for storign non-existent pictures.
//Scalling Matrix Type
#define PPS_QM 0
#define SPS_QM 1
#define FB_QM 2
#define DEFAULT_QM 3
//Frame Type
#define FRAME_TYPE_IDR 0x00
#define FRAME_TYPE_I 0x01
#define FRAME_TYPE_P 0x02
#define FRAME_TYPE_B 0x03
#define FRAME_TYPE_INVALID 0x04
#define FRAME_TYPE_FRAME_OFFSET 3
#define FRAME_TYPE_TOP_OFFSET 3
#define FRAME_TYPE_BOTTOM_OFFSET 0
#define FRAME_TYPE_STRUCTRUE_OFFSET 6
//// Error handling
#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
////Bits Handling
#define h264_bitfields_extract(x_32, start, mask) (((x_32) >> (start)) & (mask) )
#define h264_bitfields_insert(x_32, val_32, start, mask) ((x_32) = (((x_32) & ~( (mask) << (start))) | (((val_32) & (mask)) << (start))))
//// PIP
typedef enum _pip_setting_t
{
PIP_SCALER_DISABLED,
PIP_SCALE_FACTOR_1_BY_4,
PIP_SCALE_FACTOR_1_BY_2,
PIP_SCALER_INVALID,
} pip_setting_t;
#ifdef VERBOSE
#define DEBUGGETBITS(args...) OS_INFO( args )
#else
//#define DEBUGGETBITS(args...)
#endif
/* status codes */
typedef enum _h264_Status
{
H264_STATUS_EOF = 1, // end of file
H264_STATUS_OK = 0, // no error
H264_STATUS_NO_MEM = 2, // out of memory
H264_STATUS_FILE_ERROR = 3, // file error
H264_STATUS_NOTSUPPORT = 4, // not supported mode
H264_STATUS_PARSE_ERROR = 5, // fail in parse MPEG-4 stream
H264_STATUS_ERROR = 6, // unknown/unspecified error
H264_NAL_ERROR,
H264_SPS_INVALID_PROFILE,
H264_SPS_INVALID_LEVEL,
H264_SPS_INVALID_SEQ_PARAM_ID,
H264_SPS_ERROR,
H264_PPS_INVALID_PIC_ID,
H264_PPS_INVALID_SEQ_ID,
H264_PPS_ERROR,
H264_SliceHeader_INVALID_MB,
H264_SliceHeader_ERROR,
H264_FRAME_DONE,
H264_SLICE_DONE,
H264_STATUS_POLL_ONCE_ERROR,
H264_STATUS_DEC_MEMINIT_ERROR,
H264_STATUS_NAL_UNIT_TYPE_ERROR,
H264_STATUS_SEI_ERROR,
H264_STATUS_SEI_DONE,
} h264_Status;
typedef enum _picture_structure_t
{
TOP_FIELD = 1,
BOTTOM_FIELD = 2,
FRAME = 3,
INVALID = 4
} picture_structure_t;
///// Chorma format
typedef enum _h264_chroma_format_t
{
H264_CHROMA_MONOCHROME,
H264_CHROMA_420,
H264_CHROMA_422,
H264_CHROMA_444,
} h264_chroma_format_t;
/* H264 start code values */
typedef enum _h264_nal_unit_type
{
h264_NAL_UNIT_TYPE_unspecified = 0,
h264_NAL_UNIT_TYPE_SLICE,
h264_NAL_UNIT_TYPE_DPA,
h264_NAL_UNIT_TYPE_DPB,
h264_NAL_UNIT_TYPE_DPC,
h264_NAL_UNIT_TYPE_IDR,
h264_NAL_UNIT_TYPE_SEI,
h264_NAL_UNIT_TYPE_SPS,
h264_NAL_UNIT_TYPE_PPS,
h264_NAL_UNIT_TYPE_Acc_unit_delimiter,
h264_NAL_UNIT_TYPE_EOSeq,
h264_NAL_UNIT_TYPE_EOstream,
h264_NAL_UNIT_TYPE_filler_data,
h264_NAL_UNIT_TYPE_SPS_extension,
h264_NAL_UNIT_TYPE_Reserved1 =14, /*14-18*/
h264_NAL_UNIT_TYPE_Reserved2 =15, /*14-18*/
h264_NAL_UNIT_TYPE_Reserved3 =16, /*14-18*/
h264_NAL_UNIT_TYPE_Reserved4 =17, /*14-18*/
h264_NAL_UNIT_TYPE_Reserved5 =18, /*14-18*/
h264_NAL_UNIT_TYPE_ACP =19,
h264_NAL_UNIT_TYPE_Reserved6 =20, /*20-23*/
h264_NAL_UNIT_TYPE_unspecified2 =24, /*24-31*/
} h264_nal_unit_type;
#define h264_NAL_PRIORITY_HIGHEST 3
#define h264_NAL_PRIORITY_HIGH 2
#define h264_NAL_PRIRITY_LOW 1
#define h264_NAL_PRIORITY_DISPOSABLE 0
typedef enum _h264_Profile
{
h264_ProfileBaseline = 66, /** Baseline profile */
h264_ProfileMain = 77, /** Main profile */
h264_ProfileExtended = 88, /** Extended profile */
h264_ProfileHigh = 100 , /** High profile */
h264_ProfileHigh10 = 110, /** High 10 profile */
h264_ProfileHigh422 = 122, /** High profile 4:2:2 */
h264_ProfileHigh444 = 144, /** High profile 4:4:4 */
} h264_Profile;
typedef enum _h264_Level
{
h264_Level1b = 9, /** Level 1b */
h264_Level1 = 10, /** Level 1 */
h264_Level11 = 11, /** Level 1.1 */
h264_Level12 = 12, /** Level 1.2 */
h264_Level13 = 13, /** Level 1.3 */
h264_Level2 = 20, /** Level 2 */
h264_Level21 = 21, /** Level 2.1 */
h264_Level22 = 22, /** Level 2.2 */
h264_Level3 = 30, /** Level 3 */
h264_Level31 = 31, /** Level 3.1 */
h264_Level32 = 32, /** Level 3.2 */
h264_Level4 = 40, /** Level 4 */
h264_Level41 = 41, /** Level 4.1 */
h264_Level42 = 42, /** Level 4.2 */
h264_Level5 = 50, /** Level 5 */
h264_Level51 = 51, /** Level 5.1 */
h264_LevelReserved = 255 /** Unknown profile */
} h264_Level;
typedef enum _h264_video_format
{
h264_Component =0,
h264_PAL,
h264_NTSC,
h264_SECAM,
h264_MAC,
h264_unspecified,
h264_Reserved6,
h264_Reserved7
} h264_video_format;
typedef enum _h264_fcm
{
h264_ProgressiveFrame = 0,
h264_InterlacedFrame = 1,
h264_InterlacedField = 3,
h264_PictureFormatNone
} h264_fcm;
///// Define the picture types []
typedef enum _h264_ptype_t
{
h264_PtypeP = 0,
h264_PtypeB = 1,
h264_PtypeI = 2,
h264_PtypeSP = 3,
h264_PtypeSI = 4,
h264_Ptype_unspecified,
} h264_ptype_t;
///// Aspect ratio
typedef enum _h264_aspect_ratio
{
h264_AR_Unspecified = 0,
h264_AR_1_1 = 1,
h264_AR_12_11 = 2,
h264_AR_10_11 = 3,
h264_AR_16_11 = 4,
h264_AR_40_33 = 5,
h264_AR_24_11 = 6,
h264_AR_20_11 = 7,
h264_AR_32_11 = 8,
h264_AR_80_33 = 9,
h264_AR_18_11 = 10,
h264_AR_15_11 = 11,
h264_AR_64_33 = 12,
h264_AR_160_99 = 13,
h264_AR_4_3 = 14,
h264_AR_3_2 = 15,
h264_AR_2_1 = 16,
h264_AR_RESERVED = 17,
h264_AR_Extended_SAR = 255,
} h264_aspect_ratio;
//////////////////////////////////////////////
//////////////////////////////////////////////
// storable_picture
/* Structure details
If all members remain ints
Size = 11 ints, i.e. 44 bytes
*/
typedef struct
{
int32_t poc;
int32_t pic_num;
int32_t long_term_pic_num;
uint8_t long_term_frame_idx;
uint8_t is_long_term;
uint8_t used_for_reference;
uint8_t pad_flag; // Used to indicate the status
} storable_picture, *storable_picture_ptr;
//////////////////////////////////////////////
// frame store
/* Structure details
If all members remain ints
Size = 46 ints, i.e. 184 bytes
*/
typedef struct _frame_store
{
storable_picture frame;
storable_picture top_field;
storable_picture bottom_field;
int32_t frame_num;
int32_t frame_num_wrap;
uint8_t fs_idc;
uint8_t pic_type; //bit7 structure: 1 frame , 0 field;
//bit4,5,6 top field (frame) pic type, 00 IDR 01 I 10 P 11 B 100 INVALID
//bit1,2,3 bottom pic type, 00 IDR 01 I 10 P 11 B 100 INVALID
uint8_t long_term_frame_idx; // No two frame stores may have the same long-term frame index
#define viddec_h264_get_dec_structure(x) h264_bitfields_extract( (x)->fs_flag_1, 0, 0x03)
#define viddec_h264_set_dec_structure(x, val) h264_bitfields_insert ( (x)->fs_flag_1, (val), 0, 0x03)
#define viddec_h264_get_is_used(x) h264_bitfields_extract( (x)->fs_flag_1, 2, 0x03)
#define viddec_h264_set_is_frame_used(x, val) h264_bitfields_insert ( (x)->fs_flag_1, (val), 2, 0x03)
#define viddec_h264_set_is_top_used(x, val) h264_bitfields_insert ( (x)->fs_flag_1, (val), 2, 0x01)
#define viddec_h264_set_is_bottom_used(x, val) h264_bitfields_insert ( (x)->fs_flag_1, (val), 3, 0x01)
#define viddec_h264_get_is_skipped(x) h264_bitfields_extract( (x)->fs_flag_1, 4, 0x03)
#define viddec_h264_set_is_frame_skipped(x, val) h264_bitfields_insert ( (x)->fs_flag_1, (val), 4, 0x03)
#define viddec_h264_set_is_top_skipped(x, val) h264_bitfields_insert ( (x)->fs_flag_1, (val), 4, 0x01)
#define viddec_h264_set_is_bottom_skipped(x, val) h264_bitfields_insert ( (x)->fs_flag_1, (val), 5, 0x01)
#define viddec_h264_get_is_long_term(x) h264_bitfields_extract( (x)->fs_flag_1, 6, 0x03)
#define viddec_h264_set_is_frame_long_term(x, val) h264_bitfields_insert ( (x)->fs_flag_1, (val), 6, 0x03)
#define viddec_h264_set_is_top_long_term(x, val) h264_bitfields_insert ( (x)->fs_flag_1, (val), 6, 0x01)
#define viddec_h264_set_is_bottom_long_term(x, val) h264_bitfields_insert ( (x)->fs_flag_1, (val), 7, 0x01)
uint8_t fs_flag_1;
#define viddec_h264_get_is_non_existent(x) h264_bitfields_extract( (x)->fs_flag_2, 0, 0x01)
#define viddec_h264_set_is_non_existent(x, val) h264_bitfields_insert ( (x)->fs_flag_2, (val), 0, 0x01)
#define viddec_h264_get_is_output(x) h264_bitfields_extract( (x)->fs_flag_2, 1, 0x01)
#define viddec_h264_set_is_output(x, val) h264_bitfields_insert ( (x)->fs_flag_2, (val), 1, 0x01)
#define viddec_h264_get_is_dangling(x) h264_bitfields_extract( (x)->fs_flag_2, 2, 0x01)
#define viddec_h264_set_is_dangling(x, val) h264_bitfields_insert ( (x)->fs_flag_2, (val), 2, 0x01)
#define viddec_h264_get_recovery_pt_picture(x) h264_bitfields_extract( (x)->fs_flag_2, 3, 0x01)
#define viddec_h264_set_recovery_pt_picture(x, val) h264_bitfields_insert ( (x)->fs_flag_2, (val), 3, 0x01)
#define viddec_h264_get_broken_link_picture(x) h264_bitfields_extract( (x)->fs_flag_2, 4, 0x01)
#define viddec_h264_set_broken_link_picture(x, val) h264_bitfields_insert ( (x)->fs_flag_2, (val), 4, 0x01)
#define viddec_h264_get_open_gop_entry(x) h264_bitfields_extract( (x)->fs_flag_2, 5, 0x01)
#define viddec_h264_set_open_gop_entry(x, val) h264_bitfields_insert ( (x)->fs_flag_2, (val), 5, 0x01)
#define viddec_h264_get_first_field_intra(x) h264_bitfields_extract( (x)->fs_flag_2, 6, 0x01)
#define viddec_h264_set_first_field_intra(x, val) h264_bitfields_insert ( (x)->fs_flag_2, (val), 6, 0x01)
uint8_t fs_flag_2;
uint8_t fs_flag_reserve_1;
uint8_t fs_flag_reserve_2;
uint8_t fs_flag_reserve_3;
// If non-reference, may have skipped pixel decode
//uint8_t non_ref_skipped;
} frame_store, *frame_param_ptr;
//! Decoded Picture Buffer
typedef struct _h264_decoded_picture_buffer
{
///
int32_t last_output_poc;
int32_t max_long_term_pic_idx;
//// Resolutions
int32_t PicWidthInMbs;
int32_t FrameHeightInMbs;
frame_store fs[NUM_DPB_FRAME_STORES];
uint8_t fs_ref_idc[16];
uint8_t fs_ltref_idc[16];
uint8_t fs_dpb_idc[NUM_DPB_FRAME_STORES+2];
uint8_t listX_0[33+3]; // [bit5}:field_flag:0 for top, 1 for bottom, [bit4~0]:fs_idc
uint8_t listX_1[33+3];
uint8_t listXsize[2]; // 1 to 32
uint8_t nInitListSize[2];
//uint32_t size;
uint8_t fs_dec_idc;
uint8_t fs_non_exist_idc;
uint8_t BumpLevel;
uint8_t used_size;
uint8_t OutputLevel;
uint8_t OutputLevelValid;
uint8_t OutputCtrl;
uint8_t num_ref_frames;
uint8_t ref_frames_in_buffer;
uint8_t ltref_frames_in_buffer;
uint8_t SuspendOutput;
uint8_t WaitSeiRecovery;
uint8_t frame_numbers_need_to_be_allocated;
uint8_t frame_id_need_to_be_allocated;
//// frame list to release from dpb, need be displayed
uint8_t frame_numbers_need_to_be_removed;
uint8_t frame_id_need_to_be_removed[17];
//// frame list to removed from dpb but not display
uint8_t frame_numbers_need_to_be_dropped;
uint8_t frame_id_need_to_be_dropped[17];
//// frame list to display (in display order)
uint8_t frame_numbers_need_to_be_displayed;
uint8_t frame_id_need_to_be_displayed[17];
} h264_DecodedPictureBuffer;
//////////////////////////////////////////////
// qm_matrix_set
typedef struct _qm_matrix_set
{
// uint8_t scaling_default_vector;
uint8_t scaling_list[56]; // 0 to 23 for qm 0 to 5 (4x4), 24 to 55 for qm 6 & 7 (8x8)
} qm_matrix_set, *qm_matrix_set_ptr;
/*
///////// Currently not enabled in parser fw///////////////////
typedef struct _h264_SPS_Extension_RBSP {
int32_t seq_parameter_set_id; //UE
int32_t aux_format_idc; //UE
int32_t bit_depth_aux_minus8; //UE
int32_t alpha_incr_flag;
int32_t alpha_opaque_value;
int32_t alpha_transparent_value;
int32_t additional_extension_flag;
// h264_rbsp_trail_set* rbsp_trail_ptr;
}h264_SPS_Extension_RBSP_t;
*/
typedef struct _h264_hrd_param_set {
int32_t bit_rate_value_minus1[MAX_CPB_CNT]; // ue(v), 0 to (2^32)-2
int32_t cpb_size_value_minus1[MAX_CPB_CNT]; // ue(v), 0 to (2^32)-2
uint8_t cbr_flag[MAX_CPB_CNT]; // u(1) * 32
} h264_hrd_param_set, *h264_hrd_param_set_ptr;
typedef struct _vui_seq_parameters_t_used
{
uint32_t num_units_in_tick; // u(32)
uint32_t time_scale; // u(32)
int32_t num_reorder_frames; // ue(v), 0 to max_dec_frame_buffering
int32_t max_dec_frame_buffering; // ue(v), 0 to MaxDpbSize, specified in subclause A.3
uint16_t sar_width; // u(16)
uint16_t sar_height; // u(16)
uint8_t aspect_ratio_info_present_flag; // u(1)
uint8_t aspect_ratio_idc; // u(8)
uint8_t video_signal_type_present_flag; // u(1)
uint8_t video_format; // u(3)
#ifdef VBP
uint8_t video_full_range_flag; // u(1)
uint8_t matrix_coefficients; // u(8)
uint32_t bit_rate_value;
#endif
uint8_t colour_description_present_flag; // u(1)
uint8_t colour_primaries; // u(8)
uint8_t transfer_characteristics; // u(8)
uint8_t timing_info_present_flag; // u(1)
uint8_t fixed_frame_rate_flag; // u(1)
uint8_t low_delay_hrd_flag; // u(1)
uint8_t bitstream_restriction_flag; // u(1)
uint8_t pic_struct_present_flag;
uint8_t nal_hrd_parameters_present_flag; // u(1)
uint8_t nal_hrd_cpb_removal_delay_length_minus1; // u(5)
uint8_t nal_hrd_dpb_output_delay_length_minus1; // u(5)
uint8_t nal_hrd_time_offset_length; // u(5)
uint8_t nal_hrd_cpb_cnt_minus1; // ue(v), 0 to 31
uint8_t nal_hrd_initial_cpb_removal_delay_length_minus1; // u(5)
uint8_t vcl_hrd_parameters_present_flag; // u(1)
uint8_t vcl_hrd_cpb_removal_delay_length_minus1; // u(5)
uint8_t vcl_hrd_dpb_output_delay_length_minus1; // u(5)
uint8_t vcl_hrd_time_offset_length; // u(5)
uint8_t vcl_hrd_cpb_cnt_minus1; // ue(v), 0 to 31
uint8_t vcl_hrd_initial_cpb_removal_delay_length_minus1; // u(5)
/////// Here should be kept as 32-bits aligned for next structures
/// 2 structures for NAL&VCL HRD
} vui_seq_parameters_t_used;
typedef struct _vui_seq_parameters_t_not_used
{
int16_t chroma_sample_loc_type_top_field; // ue(v)
int16_t chroma_sample_loc_type_bottom_field; // ue(v)
uint8_t overscan_info_present_flag; // u(1)
uint8_t overscan_appropriate_flag; // u(1)
uint8_t video_full_range_flag; // u(1)
uint8_t matrix_coefficients; // u(8)
uint8_t chroma_location_info_present_flag; // u(1)
uint8_t max_bytes_per_pic_denom; // ue(v), 0 to 16
uint8_t max_bits_per_mb_denom; // ue(v), 0 to 16
uint8_t log2_max_mv_length_vertical; // ue(v), 0 to 16, default to 16
uint8_t log2_max_mv_length_horizontal; // ue(v), 0 to 16, default to 16
uint8_t motion_vectors_over_pic_boundaries_flag; // u(1)
uint8_t nal_hrd_bit_rate_scale; // u(4)
uint8_t nal_hrd_cpb_size_scale; // u(4)
uint8_t vcl_hrd_bit_rate_scale; // u(4)
uint8_t vcl_hrd_cpb_size_scale; // u(4)
h264_hrd_param_set nal_hrd_parameters;
h264_hrd_param_set vcl_hrd_parameters;
} vui_seq_parameters_t_not_used, *vui_seq_parameters_t_not_used_ptr;
//////////////////////////////////////////////
// picture parameter set
typedef struct _PPS_PAR
{
//int32_t DOUBLE_ALIGN valid; // indicates the parameter set is valid
int32_t pic_init_qp_minus26; // se(v), -26 to +25
int32_t pic_init_qs_minus26; // se(v), -26 to +25
int32_t chroma_qp_index_offset; // se(v), -12 to +12
int32_t second_chroma_qp_index_offset;
uint8_t pic_parameter_set_id; // ue(v), 0 to 255, restricted to 0 to 127 by MPD_CTRL_MAXPPS = 128
uint8_t seq_parameter_set_id; // ue(v), 0 to 31
uint8_t entropy_coding_mode_flag; // u(1)
uint8_t pic_order_present_flag; // u(1)
uint8_t num_slice_groups_minus1; // ue(v), shall be 0 for MP
// Below are not relevant for main profile...
uint8_t slice_group_map_type; // ue(v), 0 to 6
uint8_t num_ref_idx_l0_active; // ue(v), 0 to 31
uint8_t num_ref_idx_l1_active; // ue(v), 0 to 31
uint8_t weighted_pred_flag; // u(1)
uint8_t weighted_bipred_idc; // u(2)
uint8_t deblocking_filter_control_present_flag; // u(1)
uint8_t constrained_intra_pred_flag; // u(1)
uint8_t redundant_pic_cnt_present_flag; // u(1)
uint8_t transform_8x8_mode_flag;
uint8_t pic_scaling_matrix_present_flag;
uint8_t pps_status_flag;
//// Keep here with 32-bits aligned
uint8_t pic_scaling_list_present_flag[MAX_PIC_LIST_NUM];
qm_matrix_set pps_qm;
uint8_t ScalingList4x4[6][16];
uint8_t ScalingList8x8[2][64];
uint8_t UseDefaultScalingMatrix4x4Flag[6+2];
uint8_t UseDefaultScalingMatrix8x8Flag[6+2];
} pic_param_set, *pic_param_set_ptr, h264_PicParameterSet_t;
typedef union _list_reordering_num_t
{
int32_t abs_diff_pic_num_minus1;
int32_t long_term_pic_num;
} list_reordering_num_t;
typedef struct _h264_Ref_Pic_List_Reordering ////size = 8*33+ 1 + 33
{
list_reordering_num_t list_reordering_num[MAX_NUM_REF_FRAMES+1];
uint8_t ref_pic_list_reordering_flag;
uint8_t reordering_of_pic_nums_idc[MAX_NUM_REF_FRAMES+1]; //UE
} h264_Ref_Pic_List_Reordering_t;
typedef enum _H264_DANGLING_TYPE
{
DANGLING_TYPE_LAST_FIELD,
DANGLING_TYPE_DPB_RESET,
DANGLING_TYPE_FIELD,
DANGLING_TYPE_FRAME,
DANGLING_TYPE_GAP_IN_FRAME
} H264_DANGLING_TYPE;
typedef struct _h264_Dec_Ref_Pic_Marking //size = 17*4*2 + 17*3 + 4 + 1
{
int32_t difference_of_pic_num_minus1[NUM_MMCO_OPERATIONS];
int32_t long_term_pic_num[NUM_MMCO_OPERATIONS];
/// MMCO
uint8_t memory_management_control_operation[NUM_MMCO_OPERATIONS];
uint8_t max_long_term_frame_idx_plus1[NUM_MMCO_OPERATIONS];
uint8_t long_term_frame_idx[NUM_MMCO_OPERATIONS];
uint8_t long_term_reference_flag;
uint8_t adaptive_ref_pic_marking_mode_flag;
uint8_t dec_ref_pic_marking_count;
uint8_t no_output_of_prior_pics_flag;
uint8_t pad;
} h264_Dec_Ref_Pic_Marking_t;
typedef struct old_slice_par
{
int32_t frame_num;
int32_t pic_order_cnt_lsb;
int32_t delta_pic_order_cnt_bottom;
int32_t delta_pic_order_cnt[2];
uint8_t field_pic_flag;
uint8_t bottom_field_flag;
uint8_t nal_ref_idc;
uint8_t structure;
uint8_t idr_flag;
uint8_t idr_pic_id;
uint8_t pic_parameter_id;
uint8_t status;
} OldSliceParams;
#ifdef VBP
typedef struct _h264__pred_weight_table
{
uint8_t luma_log2_weight_denom;
uint8_t chroma_log2_weight_denom;
uint8_t luma_weight_l0_flag;
int16_t luma_weight_l0[32];
int8_t luma_offset_l0[32];
uint8_t chroma_weight_l0_flag;
int16_t chroma_weight_l0[32][2];
int8_t chroma_offset_l0[32][2];
uint8_t luma_weight_l1_flag;
int16_t luma_weight_l1[32];
int8_t luma_offset_l1[32];
uint8_t chroma_weight_l1_flag;
int16_t chroma_weight_l1[32][2];
int8_t chroma_offset_l1[32][2];
} h264_pred_weight_table;
#endif
typedef struct _h264_Slice_Header
{
int32_t first_mb_in_slice; //UE
int32_t frame_num; //UV
int32_t pic_order_cnt_lsb; //UV
int32_t delta_pic_order_cnt_bottom; //SE
int32_t delta_pic_order_cnt[2]; //SE
int32_t redundant_pic_cnt; //UE
uint32_t num_ref_idx_l0_active; //UE
uint32_t num_ref_idx_l1_active; //UE
int32_t slice_qp_delta; //SE
int32_t slice_qs_delta; //SE
int32_t slice_alpha_c0_offset_div2; //SE
int32_t slice_beta_offset_div2; //SE
int32_t slice_group_change_cycle; //UV
#ifdef VBP
h264_pred_weight_table sh_predwttbl;
#endif
///// Flags or IDs
//h264_ptype_t slice_type; //UE
uint8_t slice_type;
uint8_t nal_ref_idc;
uint8_t structure;
uint8_t pic_parameter_id; //UE
uint8_t field_pic_flag;
uint8_t bottom_field_flag;
uint8_t idr_flag; //UE
uint8_t idr_pic_id; //UE
uint8_t sh_error;
uint8_t cabac_init_idc; //UE
uint8_t sp_for_switch_flag;
uint8_t disable_deblocking_filter_idc; //UE
uint8_t direct_spatial_mv_pred_flag;
uint8_t num_ref_idx_active_override_flag;
int16_t current_slice_nr;
//// For Ref list reordering
h264_Dec_Ref_Pic_Marking_t sh_dec_refpic;
h264_Ref_Pic_List_Reordering_t sh_refpic_l0;
h264_Ref_Pic_List_Reordering_t sh_refpic_l1;
} h264_Slice_Header_t;
#define MAX_USER_DATA_SIZE 1024
typedef struct _h264_user_data_t
{
h264_sei_payloadtype user_data_type;
int32_t user_data_id;
int32_t dsn;
int32_t user_data_size;
int32_t user_data[MAX_USER_DATA_SIZE>>2];
} h264_user_data_t;
// SPS DISPLAY parameters: seq_param_set_disp, *seq_param_set_disp_ptr;
typedef struct _SPS_DISP
{
///// VUI info
vui_seq_parameters_t_used vui_seq_parameters; //size =
///// Resolution
int16_t pic_width_in_mbs_minus1;
int16_t pic_height_in_map_units_minus1;
///// Cropping
int16_t frame_crop_rect_left_offset;
int16_t frame_crop_rect_right_offset;
int16_t frame_crop_rect_top_offset;
int16_t frame_crop_rect_bottom_offset;
///// Flags
uint8_t frame_mbs_only_flag;
uint8_t mb_adaptive_frame_field_flag;
uint8_t direct_8x8_inference_flag;
uint8_t frame_cropping_flag;
#ifdef VBP
uint8_t separate_colour_plane_flag;
#endif
uint16_t vui_parameters_present_flag;
uint16_t chroma_format_idc;
} seq_param_set_disp, *seq_param_set_disp_ptr;
////SPS: seq_param_set, *seq_param_set_ptr;
typedef struct _SPS_PAR_USED
{
uint32_t is_updated;
/////////// Required for display section //////////////////////////
seq_param_set_disp sps_disp;
int32_t expectedDeltaPerPOCCycle;
int32_t offset_for_non_ref_pic; // se(v), -2^31 to (2^31)-1, 32-bit integer
int32_t offset_for_top_to_bottom_field; // se(v), -2^31 to (2^31)-1, 32-bit integer
/////////// IDC
uint8_t profile_idc; // u(8), 0x77 for MP
uint8_t constraint_set_flags; // bit 0 to 3 for set0 to set3
uint8_t level_idc; // u(8)
uint8_t seq_parameter_set_id; // ue(v), 0 to 31
uint8_t pic_order_cnt_type; // ue(v), 0 to 2
uint8_t log2_max_frame_num_minus4; // ue(v), 0 to 12
uint8_t log2_max_pic_order_cnt_lsb_minus4; // ue(v), 0 to 12
uint8_t num_ref_frames_in_pic_order_cnt_cycle; // ue(v), 0 to 255
//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
uint8_t num_ref_frames; // ue(v), 0 to 16,
uint8_t gaps_in_frame_num_value_allowed_flag; // u(1)
// This is my addition, we should calculate this once and leave it with the sps
// as opposed to calculating it each time in h264_hdr_decoding_POC()
uint8_t delta_pic_order_always_zero_flag; // u(1)
uint8_t residual_colour_transform_flag;
uint8_t bit_depth_luma_minus8;
uint8_t bit_depth_chroma_minus8;
uint8_t lossless_qpprime_y_zero_flag;
uint8_t seq_scaling_matrix_present_flag;
uint8_t seq_scaling_list_present_flag[MAX_PIC_LIST_NUM]; //0-7
//// Combine the scaling matrix to word ( 24 + 32)
uint8_t ScalingList4x4[6][16];
uint8_t ScalingList8x8[2][64];
uint8_t UseDefaultScalingMatrix4x4Flag[6];
uint8_t UseDefaultScalingMatrix8x8Flag[6];
} seq_param_set_used, *seq_param_set_used_ptr;
typedef struct _SPS_PAR_ALL
{
seq_param_set_used sps_par_used;
vui_seq_parameters_t_not_used sps_vui_par_not_used;
} seq_param_set_all, *seq_param_set_all_ptr;
///// Image control parameter////////////
typedef struct _h264_img_par
{
int32_t frame_num; // decoding num of current frame
int32_t frame_count; // count of decoded frames
int32_t current_slice_num;
int32_t gaps_in_frame_num;
// POC decoding
int32_t num_ref_frames_in_pic_order_cnt_cycle;
int32_t delta_pic_order_always_zero_flag;
int32_t offset_for_non_ref_pic;
int32_t offset_for_top_to_bottom_field;
int32_t pic_order_cnt_lsb;
int32_t pic_order_cnt_msb;
int32_t delta_pic_order_cnt_bottom;
int32_t delta_pic_order_cnt[2];
int32_t PicOrderCntMsb;
int32_t CurrPicOrderCntMsb;
int32_t PrevPicOrderCntLsb;
int32_t FrameNumOffset;
int32_t PreviousFrameNum;
int32_t PreviousFrameNumOffset;
int32_t toppoc;
int32_t bottompoc;
int32_t framepoc;
int32_t ThisPOC;
//int32_t sei_freeze_this_image;
///////////////////// Resolutions
int32_t PicWidthInMbs;
int32_t FrameHeightInMbs;
///////////////////// MMCO
uint8_t last_has_mmco_5;
uint8_t curr_has_mmco_5;
/////////////////// Flags
uint8_t g_new_frame;
uint8_t g_new_pic;
uint8_t structure;
uint8_t second_field; // Set to one if this is the second field of a set of paired fields...
uint8_t field_pic_flag;
uint8_t last_pic_bottom_field;
uint8_t bottom_field_flag;
uint8_t MbaffFrameFlag;
uint8_t no_output_of_prior_pics_flag;
uint8_t long_term_reference_flag;
uint8_t skip_this_pic;
uint8_t pic_order_cnt_type;
// Recovery
uint8_t recovery_point_found;
uint8_t used_for_reference;
} h264_img_par;
typedef struct _h264_slice_reg_data
{
uint32_t h264_bsd_slice_p1; // 0x150
//uint32_t h264_mpr_list0[8]; // from 0x380 to 0x3BC
uint32_t h264_bsd_slice_p2; // 0x154
uint32_t h264_bsd_slice_start; // 0x158
} h264_slice_data;
typedef struct _h264_pic_data
{
uint32_t h264_dpb_init; // 0x40
//info For current pic
uint32_t h264_cur_bsd_img_init; // 0x140
uint32_t h264_cur_mpr_tf_poc; // 0x300
uint32_t h264_cur_mpr_bf_poc; // 0x304
//info For framess in DPB
//uint32_t h264_dpb_bsd_img_init[16]; //0x140
//uint32_t h264_dpb_mpr_tf_poc[16]; // 0x300
//uint32_t h264_dpb_mpr_bf_poc[16]; // 0x304
} h264_pic_data;
enum h264_workload_item_type
{
VIDDEC_WORKLOAD_H264_SLICE_REG = VIDDEC_WORKLOAD_DECODER_SPECIFIC,
VIDDEC_WORKLOAD_H264_PIC_REG,
VIDDEC_WORKLOAD_H264_DPB_FRAME_POC,
VIDDEC_WORKLOAD_H264_SH_BITS_OFFSET,
VIDDEC_WORKLOAD_H264_PWT_BITS_OFFSET,
VIDDEC_WORKLOAD_H264_PWT_ES_BYTES,
VIDDEC_WORKLOAD_H264_SCALING_MATRIX,
VIDDEC_WORKLOAD_H264_DEBUG
};
////////////////////////////////////////////
/* Full Info set*/
////////////////////////////////////////////
typedef struct _h264_Info
{
h264_DecodedPictureBuffer dpb;
//// Structures
//// need to gurantee active_SPS and active_PPS start from 4-bytes alignment address
seq_param_set_used active_SPS;
pic_param_set active_PPS;
h264_Slice_Header_t SliceHeader;
OldSliceParams old_slice;
sei_info sei_information;
h264_img_par img;
uint32_t SPS_PADDR_GL;
uint32_t PPS_PADDR_GL;
uint32_t OFFSET_REF_FRAME_PADDR_GL;
uint32_t TMP_OFFSET_REFFRM_PADDR_GL;
uint32_t h264_list_replacement;
uint32_t h264_pwt_start_byte_offset;
uint32_t h264_pwt_start_bit_offset;
uint32_t h264_pwt_end_byte_offset;
uint32_t h264_pwt_end_bit_offset;
uint32_t h264_pwt_enabled;
uint32_t sps_valid;
uint8_t slice_ref_list0[32];
uint8_t slice_ref_list1[32];
uint8_t qm_present_list;
//h264_NAL_Unit_t
uint8_t nal_unit_type;
uint8_t old_nal_unit_type;
uint8_t got_start;
//workload
uint8_t push_to_cur;
uint8_t Is_first_frame_in_stream;
uint8_t Is_SPS_updated;
uint8_t number_of_first_au_info_nal_before_first_slice;
uint8_t is_frame_boundary_detected_by_non_slice_nal;
uint8_t is_frame_boundary_detected_by_slice_nal;
uint8_t is_current_workload_done;
uint8_t primary_pic_type_plus_one; //AUD---[0,7]
//Error handling
uint8_t sei_rp_received;
uint8_t last_I_frame_idc;
uint8_t sei_b_state_ready;
uint8_t gop_err_flag;
uint32_t wl_err_curr;
uint32_t wl_err_next;
} h264_Info;
struct h264_viddec_parser
{
uint32_t sps_pps_ddr_paddr;
h264_Info info;
};
#ifdef __cplusplus
}
#endif
#endif //_H264_H_