/* ///////////////////////////////////////////////////////////////////////
//
//               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 VBP
//#define SW_ERROR_CONCEALEMNT
#endif

#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;
#ifdef VBP
#ifdef SW_ERROR_CONCEALEMNT
        uint32_t                sw_bail;
#endif
#endif
    } h264_Info;



    struct h264_viddec_parser
    {
        uint32_t     sps_pps_ddr_paddr;
        h264_Info    info;
    };

#ifdef __cplusplus
}
#endif





#endif  //_H264_H_


