/*
* 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 <elaine.wang@intel.com>
* Zeng Li <zeng.li@intel.com>
* Edward Lin <edward.lin@intel.com>
*
*/
/*
* 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_ */