/* * Copyright (c) 2011 Intel Corporation. All Rights Reserved. * Copyright (c) Imagination Technologies Limited, UK * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Elaine Wang * Zeng Li * Edward Lin * */ /* * Description DMA code for mtx Platform : Generic */ #ifndef _TNG_HOSTHEADER_H_ #define _TNG_HOSTHEADER_H_ #include "img_types.h" #define MAX_MVC_VIEWS 2 #define MVC_BASE_VIEW_IDX 0 #define NON_MVC_VIEW (~0x0) #define MVC_SPS_ID 1 #define MVC_PPS_ID 1 /* Structure contains QP parameters, used with the DoHeader() routine */ typedef struct { IMG_UINT32 H264_QP; IMG_UINT32 H263_MPG4_FrameQ_scale; IMG_UINT32 H263_MPG4_SliceQ_scale; } MTX_QP_INFO; typedef struct { IMG_UINT8 frameType; IMG_BOOL8 weighted_pred_flag; // Corresponds to field in the pps IMG_UINT8 weighted_bipred_idc; IMG_UINT32 luma_log2_weight_denom; IMG_UINT32 chroma_log2_weight_denom; IMG_BOOL8 weight_flag[3][2]; // Y,Cb, Cr Support for 2 ref pictures on P, or 1 pic in each direction on B. IMG_INT32 weight[3][2]; IMG_INT32 offset[3][2]; } WEIGHTED_PREDICTION_VALUES; /* #include "topaz_vlc_regs.h" */ /* Allocating 32 words (128 bytes aligned to 8 bytes) */ #define MAX_HEADERSIZEWORDS (32) /***************************************************************************** * @details Enum describing partially coded header element types * @brief Header element type ****************************************************************************/ typedef enum { ELEMENT_STARTCODE_RAWDATA=0, //!< Raw data that includes a start code ELEMENT_STARTCODE_MIDHDR, //!< Start code in middle of header ELEMENT_RAWDATA, //!< Raw data ELEMENT_QP, //!< Insert the H264 Picture Header QP parameter (no rawdata) ELEMENT_SQP, //!< Insert the H264 Slice Header QP parameter (no rawdata) ELEMENT_FRAMEQSCALE, //!< Insert the H263/MPEG4 Frame Q_scale parameter (vob_quant field) (no rawdata) ELEMENT_SLICEQSCALE, //!< Insert the H263/MPEG4 Slice Q_scale parameter (quant_scale field) (no rawdata) ELEMENT_INSERTBYTEALIGN_H264, //!< Insert the byte align field for H264 (no rawdata) ELEMENT_INSERTBYTEALIGN_MPG4, //!< Insert the byte align field for MPEG4(no rawdata) ELEMENT_INSERTBYTEALIGN_MPG2, //!< Insert the byte align field for MPEG2(no rawdata) ELEMENT_VBV_MPG2, ELEMENT_TEMPORAL_REF_MPG2, ELEMENT_CURRMBNR, //!< Insert the current macrloblock number for a slice. ELEMENT_FRAME_NUM, //!< Insert frame_num field (used as ID for ref. pictures in H264) ELEMENT_TEMPORAL_REFERENCE, //!< Insert Temporal Reference field (used as ID for ref. pictures in H263) ELEMENT_EXTENDED_TR, //!< Insert Extended Temporal Reference field ELEMENT_IDR_PIC_ID, //!< Insert idr_pic_id field (used to distinguish consecutive IDR frames) ELEMENT_PIC_ORDER_CNT, //!< Insert pic_order_cnt_lsb field (used for display ordering in H264) ELEMENT_GOB_FRAME_ID, //!< Insert gob_frame_id field (used for display ordering in H263) ELEMENT_VOP_TIME_INCREMENT, //!< Insert vop_time_increment field (used for display ordering in MPEG4) ELEMENT_MODULO_TIME_BASE, //!< modulo_time_base used in MPEG4 (depends on vop_time_increment_resolution) ELEMENT_BOTTOM_FIELD, //!< Insert bottom_field flag ELEMENT_SLICE_NUM, //!< Insert slice num (used for GOB headers in H263) ELEMENT_MPEG2_SLICE_VERTICAL_POS, //!< Insert slice vertical pos (MPEG2 slice header) ELEMENT_MPEG2_IS_INTRA_SLICE, //!< Insert 1 bit flag indicating if slice is Intra or not (MPEG2 slice header) ELEMENT_MPEG2_PICTURE_STRUCTURE, //!< Insert 2 bit field indicating if the current header is for a frame picture (11), top field (01) or bottom field (10) - (MPEG2 picture header) ELEMENT_REFERENCE, //!< NAL header element. Specifies if this frame is used as reference ELEMENT_ADAPTIVE, //!< Adaptive reference marking mode: this element presented only in reference pictures ELEMENT_DIRECT_SPATIAL_MV_FLAG, //!< Spatial direct mode flag ELEMENT_NUM_REF_IDX_ACTIVE, //!< Override active number of references, if required ELEMENT_REORDER_L0, //!< Reference list 0 reordering ELEMENT_REORDER_L1, //!< Reference list 1 reordering ELEMENT_TEMPORAL_ID, //!< Temporal ID of the picture, used for MVC header ELEMENT_ANCHOR_PIC_FLAG, //!< True if this picture is an anchor picture BPH_SEI_NAL_INITIAL_CPB_REMOVAL_DELAY, BPH_SEI_NAL_INITIAL_CPB_REMOVAL_DELAY_OFFSET, PTH_SEI_NAL_CPB_REMOVAL_DELAY, PTH_SEI_NAL_DPB_OUTPUT_DELAY, ELEMENT_SLICEWEIGHTEDPREDICTIONSTRUCT, ELEMENT_CUSTOM_QUANT } HEADER_ELEMENT_TYPE; typedef struct _MTX_HEADER_ELEMENT_ { HEADER_ELEMENT_TYPE Element_Type; IMG_UINT8 ui8Size; IMG_UINT8 aui8Bits; } MTX_HEADER_ELEMENT; typedef struct _MTX_HEADER_PARAMS_ { IMG_UINT32 ui32Elements; MTX_HEADER_ELEMENT asElementStream[MAX_HEADERSIZEWORDS-1]; } MTX_HEADER_PARAMS; #define ELEMENTS_EMPTY 9999 /* H264 Structures */ /* Define some constants for the variable elements in the header stream */ typedef enum _SHPROFILES { SH_PROFILE_BP = 0, //!< H.264 Baseline Profile SH_PROFILE_MP = 1, //!< H.264 Main Profile SH_PROFILE_HP = 2, //!< H.264 High Profile SH_PROFILE_H444P = 3 //!< H.264 High 4:4:4 Profile } SH_PROFILE_TYPE; /* Level number definitions (integer level numbers, non-intermediary only.. except level 1b) */ typedef enum _SHLEVELS { SH_LEVEL_10 = 10, SH_LEVEL_1B = 9, SH_LEVEL_11 = 11, SH_LEVEL_12 = 12, SH_LEVEL_13 = 13, SH_LEVEL_20 = 20, SH_LEVEL_21 = 21, SH_LEVEL_22 = 22, SH_LEVEL_30 = 30, SH_LEVEL_31 = 31, SH_LEVEL_32 = 32, SH_LEVEL_40 = 40, SH_LEVEL_41 = 41, SH_LEVEL_42 = 42, SH_LEVEL_50 = 50, SH_LEVEL_51 = 51 } SH_LEVEL_TYPE; typedef enum _SLHP_SLICEFRAME_TYPE_ { SLHP_P_SLICEFRAME_TYPE, SLHP_B_SLICEFRAME_TYPE, SLHP_I_SLICEFRAME_TYPE, SLHP_SP_SLICEFRAME_TYPE, SLHP_SI_SLICEFRAME_TYPE, SLHP_IDR_SLICEFRAME_TYPE } SLHP_SLICEFRAME_TYPE; typedef enum _frame_template_type_ { IMG_FRAME_IDR = 0, IMG_FRAME_INTRA, IMG_FRAME_INTER_P, IMG_FRAME_INTER_B, IMG_FRAME_INTER_P_IDR, IMG_FRAME_UNDEFINED } IMG_FRAME_TEMPLATE_TYPE; /* This holds the data that is needed at the start of a slice */ typedef struct _SLICE_PARAMS_ { IMG_UINT32 ui32Flags; //!< Flags for slice encode // the config registers, these are passed straigth through from drivers to hardware. // change per slice IMG_UINT32 ui32SliceConfig; //!< Value to use for Slice Config register IMG_UINT32 ui32IPEControl; //!< Value to use for IPEControl register IMG_UINT32 ui32SeqConfig; //!< Value to use for Sequencer Config register IMG_FRAME_TEMPLATE_TYPE eTemplateType; //!< Slice header template type MTX_HEADER_PARAMS sSliceHdrTmpl; //!< Template of corresponding slice header } SLICE_PARAMS; /* Input parameters for the header generation * Some of the following data structures may have fields that are actually static.. * may want to prune them down a bit later. */ typedef struct _H264_VUI_PARAMS_STRUC { IMG_UINT32 vui_flag; IMG_UINT32 Time_Scale; IMG_UINT32 num_units_in_tick; IMG_UINT32 bit_rate_value_minus1; /* bitrate/64)-1 */ IMG_UINT32 cbp_size_value_minus1; /* (bitrate*1.5)/16 */ IMG_UINT8 CBR; IMG_UINT8 initial_cpb_removal_delay_length_minus1; IMG_UINT8 cpb_removal_delay_length_minus1; IMG_UINT8 dpb_output_delay_length_minus1; IMG_UINT8 time_offset_length; } H264_VUI_PARAMS; typedef struct _H264_CROP_PARAMS_STRUCT_ { IMG_BOOL bClip; IMG_UINT16 ui16LeftCropOffset; IMG_UINT16 ui16RightCropOffset; IMG_UINT16 ui16TopCropOffset; IMG_UINT16 ui16BottomCropOffset; } H264_CROP_PARAMS; typedef struct { IMG_UINT8 ui8ScalingLists4x4[6][16]; IMG_UINT8 ui8ScalingLists8x8[2][64]; IMG_UINT32 ui32ListMask; } H264_SCALING_MATRIX_PARAMS; typedef struct _H264_SEQUENCE_HEADER_PARAMS_STRUC { SH_PROFILE_TYPE ucProfile; SH_LEVEL_TYPE ucLevel; IMG_UINT8 ucWidth_in_mbs_minus1; IMG_UINT8 ucHeight_in_maps_units_minus1; IMG_UINT8 log2_max_pic_order_cnt; IMG_UINT8 max_num_ref_frames; IMG_UINT8 gaps_in_frame_num_value; IMG_UINT8 ucFrame_mbs_only_flag; IMG_UINT8 VUI_Params_Present; IMG_UINT8 seq_scaling_matrix_present_flag; IMG_BOOL bUseDefaultScalingList; IMG_BOOL bIsLossless; H264_VUI_PARAMS VUI_Params; } H264_SEQUENCE_HEADER_PARAMS; typedef struct { IMG_UINT8 pic_parameter_set_id; IMG_UINT8 seq_parameter_set_id; IMG_UINT8 entropy_coding_mode_flag; IMG_UINT8 weighted_pred_flag; IMG_UINT8 weighted_bipred_idc; IMG_INT8 chroma_qp_index_offset; IMG_UINT8 constrained_intra_pred_flag; IMG_UINT8 transform_8x8_mode_flag; IMG_BOOL pic_scaling_matrix_present_flag; IMG_BOOL bUseDefaultScalingList; IMG_INT8 second_chroma_qp_index_offset; } H264_PICTURE_HEADER_PARAMS; typedef struct _H264_SLICE_HEADER_PARAMS_STRUC { IMG_UINT32 First_MB_Address; IMG_INT32 luma_log2_weight_denom; IMG_INT32 chroma_log2_weight_denom; IMG_INT32 luma_weight_l0[2]; IMG_INT32 luma_offset_l0[2]; IMG_INT32 chromaB_weight_l0[2]; IMG_INT32 chromaB_offset_l0[2]; IMG_INT32 chromaR_weight_l0[2]; IMG_INT32 chromaR_offset_l0[2]; IMG_UINT8 uRefLongTermRefNum[2]; IMG_INT8 diff_ref_pic_num[2]; //when non-zero reorders reference pic list IMG_UINT16 ui16MvcViewIdx; IMG_UINT8 ui8Start_Code_Prefix_Size_Bytes; IMG_UINT8 Frame_Num_DO; IMG_UINT8 Idr_Pic_Id; IMG_UINT8 log2_max_pic_order_cnt; IMG_UINT8 Picture_Num_DO; IMG_UINT8 Disable_Deblocking_Filter_Idc; IMG_UINT8 num_ref_idx_l0_active_minus1; IMG_UINT8 weighted_bipred_idc; IMG_UINT8 uLongTermRefNum; IMG_INT8 iDebAlphaOffsetDiv2; IMG_INT8 iDebBetaOffsetDiv2; SLHP_SLICEFRAME_TYPE SliceFrame_Type; IMG_BOOL bPiCInterlace; IMG_BOOL bFieldType; IMG_BOOL bReferencePicture; IMG_BOOL direct_spatial_mv_pred_flag; IMG_BOOL weighted_pred_flag; // Corresponds to field in the pps IMG_BOOL chroma_weight_l0_flag[2]; IMG_BOOL luma_weight_l0_flag[2]; // Support for 2 ref pictures on P, or 1 pic in each direction on B. IMG_BOOL bIsLongTermRef; IMG_BOOL bRefIsLongTermRef[2]; //Long term reference info for reference frames } H264_SLICE_HEADER_PARAMS; /* MPEG4 Structures */ typedef enum _MPEG4_PROFILE { SP = 1, ASP = 3 } MPEG4_PROFILE_TYPE; typedef enum _FIXED_VOP_TIME_ENUM { _30FPS = 1, _15FPS = 2, _10FPS = 3 } FIXED_VOP_TIME_TYPE; typedef struct _VBVPARAMS_STRUC { IMG_UINT32 First_half_bit_rate; IMG_UINT32 Latter_half_bit_rate; IMG_UINT32 First_half_vbv_buffer_size; IMG_UINT32 Latter_half_vbv_buffer_size; IMG_UINT32 First_half_vbv_occupancy; IMG_UINT32 Latter_half_vbv_occupancy; } VBVPARAMS; /* * H263 Structures */ typedef enum _VOP_CODING_ENUM { I_FRAME = 0, P_FRAME = 1 } VOP_CODING_TYPE, H263_PICTURE_CODING_TYPE; typedef enum _SEARCH_RANGE_ENUM { PLUSMINUS_32 = 2, PLUSMINUS_64 = 3, FCODE_EQ_4 = 4 } SEARCH_RANGE_TYPE; typedef enum _H263_SOURCE_FORMAT_ENUM { _128x96_SubQCIF = 1, _176x144_QCIF = 2, _352x288_CIF = 3, _704x576_4CIF = 4 } H263_SOURCE_FORMAT_TYPE; #define SIZEINBITS(a) (sizeof(a)*8) /* H264 header preparation */ void tng__H264ES_prepare_sequence_header( void *pHeaderMemory, H264_VUI_PARAMS *psVUI_Params, H264_CROP_PARAMS *psCropParams, IMG_UINT16 ui16PictureWidth, IMG_UINT16 ui16PictureHeight, IMG_UINT32 ui32CustomQuantMask, IMG_UINT8 ui8ProfileIdc, IMG_UINT8 ui8LevelIdc, IMG_UINT8 ui8FieldCount, IMG_UINT8 ui8MaxNumRefFrames, IMG_BOOL bPpsScaling, IMG_BOOL bUseDefaultScalingList, IMG_BOOL bEnableLossless, IMG_BOOL bASO ); void tng__H264ES_prepare_picture_header( void *pHeaderMemory, IMG_BOOL bCabacEnabled, IMG_BOOL b_8x8transform, IMG_BOOL bIntraConstrained, IMG_INT8 i8CQPOffset, IMG_BOOL bWeightedPrediction, IMG_UINT8 ui8WeightedBiPred, IMG_BOOL bMvcPPS, IMG_BOOL bScalingMatrix, IMG_BOOL bScalingLists ); void tng__H264_prepare_slice_header( IMG_UINT32 *pHeaderMemory, IMG_BOOL bIntraSlice, IMG_BOOL bInterBSlice, IMG_BOOL bMultiRef, IMG_UINT8 ui8DisableDeblockingFilterIDC, IMG_UINT32 ui32DisplayFrameNumber, IMG_UINT32 ui32FrameNumId, IMG_UINT32 uiFirst_MB_Address, IMG_UINT32 uiMBSkipRun, IMG_BOOL bCabacEnabled, IMG_BOOL bIsInterlaced, IMG_UINT8 ui8FieldNum, WEIGHTED_PREDICTION_VALUES *pWeightedSetup, IMG_BOOL bIsLongTermRef); /* MPEG4 header preparation */ void tng__MPEG4_prepare_sequence_header( void *pHeaderMemory, IMG_BOOL bBFrame, MPEG4_PROFILE_TYPE sProfile, IMG_UINT8 Profile_and_level_indication, FIXED_VOP_TIME_TYPE sFixed_vop_time_increment, IMG_UINT32 Picture_Width_Pixels, IMG_UINT32 Picture_Height_Pixels, VBVPARAMS * psVBVParams, IMG_UINT32 VopTimeResolution); void tng__MPEG4_prepare_vop_header( IMG_UINT32 *pHeaderMem, IMG_BOOL bIsVOP_coded, IMG_UINT32 VOP_time_increment, IMG_UINT8 sSearch_range, IMG_UINT8 eVop_Coding_Type, IMG_UINT32 VopTimeResolution); /* H263 header preparation */ void tng__H263_prepare_sequence_header( IMG_UINT32 *pHeaderMem, IMG_UINT8 Profile_and_level_indication); void tng__H263_prepare_picture_header( IMG_UINT32 *pHeaderMem, IMG_UINT8 Temporal_Ref, H263_PICTURE_CODING_TYPE PictureCodingType, H263_SOURCE_FORMAT_TYPE SourceFormatType, IMG_UINT8 FrameRate, IMG_UINT16 PictureWidth, IMG_UINT16 PictureHeigth); void tng__H263_notforsims_prepare_video_pictureheader( MTX_HEADER_PARAMS* pMTX_Header, H263_PICTURE_CODING_TYPE ePictureCodingType, H263_SOURCE_FORMAT_TYPE eSourceFormatType, IMG_UINT8 ui8FrameRate, IMG_UINT32 ui32PictureWidth, IMG_UINT32 ui32PictureHeigth); void tng__H263_prepare_GOBslice_header( IMG_UINT32 *pHeaderMem, IMG_UINT8 GOBNumber, IMG_UINT8 GOBFrameId); void tng__H264ES_prepare_AUD_header(unsigned char *virtual_addr); void tng__H264ES_prepare_SEI_buffering_period_header( unsigned char *virtual_addr, IMG_UINT8 ui8NalHrdBpPresentFlag, IMG_UINT8 ui8nal_cpb_cnt_minus1, IMG_UINT8 ui8nal_initial_cpb_removal_delay_length, IMG_UINT32 ui32nal_initial_cpb_removal_delay, IMG_UINT32 ui32nal_initial_cpb_removal_delay_offset, IMG_UINT8 ui8VclHrdBpPresentFlag, IMG_UINT32 ui32vcl_initial_cpb_removal_delay, IMG_UINT32 ui32vcl_initial_cpb_removal_delay_offset); void tng__H264ES_prepare_SEI_picture_timing_header( unsigned char *virtual_addr, IMG_UINT8 ui8CpbDpbDelaysPresentFlag, IMG_UINT32 ui32cpb_removal_delay_length_minus1, IMG_UINT32 ui32dpb_output_delay_length_minus1, IMG_UINT32 ui32cpb_removal_delay, IMG_UINT32 ui32dpb_output_delay, IMG_UINT8 ui8pic_struct_present_flag, IMG_UINT8 ui8pic_struct, IMG_UINT8 ui8NumClockTS, IMG_UINT8 *aui8clock_timestamp_flag, IMG_UINT8 ui8full_timestamp_flag, IMG_UINT8 ui8seconds_flag, IMG_UINT8 ui8minutes_flag, IMG_UINT8 ui8hours_flag, IMG_UINT8 ui8seconds_value, IMG_UINT8 ui8minutes_value, IMG_UINT8 ui8hours_value, IMG_UINT8 ui8ct_type, IMG_UINT8 ui8nuit_field_based_flag, IMG_UINT8 ui8counting_type, IMG_UINT8 ui8discontinuity_flag, IMG_UINT8 ui8cnt_dropped_flag, IMG_UINT8 ui8n_frames, IMG_UINT8 ui8time_offset_length, IMG_INT32 i32time_offset); void tng__H264ES_notforsims_prepare_sliceheader( IMG_UINT8 *slice_mem_p, IMG_UINT32 ui32SliceType, IMG_UINT8 ui8DisableDeblockingFilterIDC, IMG_UINT32 uiFirst_MB_Address, IMG_UINT32 uiMBSkipRun, IMG_BOOL bCabacEnabled, IMG_BOOL bIsInterlaced, IMG_UINT16 ui16MvcViewIdx, IMG_BOOL bIsLongTermRef); void tng__H264ES_prepare_mvc_sequence_header( void *pHeaderMemory, H264_CROP_PARAMS *psCropParams, IMG_UINT16 ui16PictureWidth, IMG_UINT16 ui16PictureHeight, IMG_UINT32 ui32CustomQuantMask, IMG_UINT8 ui8ProfileIdc, IMG_UINT8 ui8LevelIdc, IMG_UINT8 ui8FieldCount, IMG_UINT8 ui8MaxNumRefFrames, IMG_BOOL bPpsScaling, IMG_BOOL bUseDefaultScalingList, IMG_BOOL bEnableLossless, IMG_BOOL bASO); void tng__H263ES_notforsims_prepare_gobsliceheader(IMG_UINT8 *slice_mem_p); void tng__MPEG2_prepare_sliceheader(IMG_UINT8 *slice_mem_p); void tng__MPEG4_notforsims_prepare_vop_header( MTX_HEADER_PARAMS* pMTX_Header, IMG_BOOL bIsVOP_coded, SEARCH_RANGE_TYPE eSearch_range, VOP_CODING_TYPE eVop_Coding_Type); #endif /* _TNG_HOSTHEADER_H_ */