1 /* 2 * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 3 * Copyright (c) Imagination Technologies Limited, UK 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 * 25 * Authors: 26 * Elaine Wang <elaine.wang@intel.com> 27 * Zeng Li <zeng.li@intel.com> 28 * 29 */ 30 31 /* 32 * Description DMA code for mtx Platform : Generic 33 */ 34 35 #ifndef _PNW_HOSTHEADER_H_ 36 #define _PNW_HOSTHEADER_H_ 37 38 39 #include "img_types.h" 40 41 /* Structure contains QP parameters, used with the DoHeader() routine */ 42 typedef struct { 43 IMG_UINT32 H264_QP; 44 IMG_UINT32 H263_MPG4_FrameQ_scale; 45 IMG_UINT32 H263_MPG4_SliceQ_scale; 46 } MTX_QP_INFO; 47 48 /* #include "topaz_vlc_regs.h" */ 49 50 /* Allocating 32 words (128 bytes aligned to 8 bytes) */ 51 #define MAX_HEADERSIZEWORDS (32) 52 53 typedef enum { 54 ELEMENT_STARTCODE_RAWDATA = 0,/* Rawdata that includes a start code */ 55 ELEMENT_RAWDATA, /* Rawdata */ 56 ELEMENT_QP, /* Insert the H264 Picture Header QP parameter (no rawdata) */ 57 ELEMENT_SQP, /* Insert the H264 Slice Header QP parameter (no rawdata) */ 58 ELEMENT_FRAMEQSCALE, /* Insert the H263/MPEG4 Frame Q_scale parameter (vob_quant field) (no rawdata) */ 59 ELEMENT_SLICEQSCALE, /* Insert the H263/MPEG4 Slice Q_scale parameter (quant_scale field) (no rawdata) */ 60 ELEMENT_INSERTBYTEALIGN_H264,/* Insert the byte align field (no rawdata) */ 61 ELEMENT_INSERTBYTEALIGN_MPG4, /* Insert the byte align field (no rawdata) */ 62 63 /*SEI_INSERTION*/ 64 BPH_SEI_NAL_INITIAL_CPB_REMOVAL_DELAY, 65 BPH_SEI_NAL_INITIAL_CPB_REMOVAL_DELAY_OFFSET, 66 PTH_SEI_NAL_CPB_REMOVAL_DELAY, 67 PTH_SEI_NAL_DPB_OUTPUT_DELAY 68 } HEADER_ELEMENT_TYPE; 69 70 71 typedef struct _MTX_HEADER_ELEMENT_ { 72 HEADER_ELEMENT_TYPE Element_Type; 73 IMG_UINT8 Size; 74 IMG_UINT8 Bits; 75 } MTX_HEADER_ELEMENT; 76 77 78 typedef struct _MTX_HEADER_PARAMS_ { 79 IMG_UINT32 Elements; 80 MTX_HEADER_ELEMENT asElementStream[MAX_HEADERSIZEWORDS-1]; 81 } MTX_HEADER_PARAMS; 82 83 #define ELEMENTS_EMPTY 9999 84 85 /* H264 Structures 86 */ 87 88 /* Define some constants for the variable elements in the header stream */ 89 typedef enum _SHPROFILES { 90 SH_PROFILE_BP = 0, 91 SH_PROFILE_MP = 1, 92 SH_PROFILE_HP = 2, 93 } SH_PROFILE_TYPE; 94 95 /* Level number definitions (integer level numbers, non-intermediary only.. except level 1b) */ 96 typedef enum _SHLEVELS { 97 SH_LEVEL_1 = 10, 98 SH_LEVEL_1B = 11, 99 SH_LEVEL_11 = 11, 100 SH_LEVEL_12 = 12, 101 SH_LEVEL_13 = 13, 102 SH_LEVEL_2 = 20, 103 SH_LEVEL_21 = 21, 104 SH_LEVEL_22 = 22, 105 SH_LEVEL_3 = 30, 106 SH_LEVEL_31 = 31, 107 SH_LEVEL_32 = 32, 108 SH_LEVEL_4 = 40, 109 SH_LEVEL_41 = 41, 110 SH_LEVEL_42 = 42, 111 SH_LEVEL_5 = 50, 112 SH_LEVEL_51 = 51 113 } SH_LEVEL_TYPE; 114 115 116 typedef enum _SLHP_SLICEFRAME_TYPE_ { 117 SLHP_P_SLICEFRAME_TYPE, 118 SLHP_B_SLICEFRAME_TYPE, 119 SLHP_I_SLICEFRAME_TYPE, 120 SLHP_SP_SLICEFRAME_TYPE, 121 SLHP_SI_SLICEFRAME_TYPE, 122 123 SLHP_IDR_SLICEFRAME_TYPE 124 125 } SLHP_SLICEFRAME_TYPE; 126 127 128 /* Input parameters for the header generation 129 * Some of the following data structures may have fields that are actually static.. 130 * may want to prune them down a bit later. 131 */ 132 typedef struct _H264_VUI_PARAMS_STRUC { 133 IMG_BOOL aspect_ratio_info_present_flag; 134 IMG_UINT8 aspect_ratio_idc; 135 IMG_UINT16 sar_width; 136 IMG_UINT16 sar_height; 137 IMG_UINT32 Time_Scale; 138 IMG_UINT32 num_units_in_tick; 139 IMG_UINT32 bit_rate_value_minus1; /* bitrate/64)-1 */ 140 IMG_UINT32 cbp_size_value_minus1; /* (bitrate*1.5)/16 */ 141 IMG_UINT8 CBR; 142 IMG_UINT8 initial_cpb_removal_delay_length_minus1; 143 IMG_UINT8 cpb_removal_delay_length_minus1; 144 IMG_UINT8 dpb_output_delay_length_minus1; 145 IMG_UINT8 time_offset_length; 146 } H264_VUI_PARAMS; 147 148 typedef struct _H264_CROP_PARAMS_STRUCT_ { 149 IMG_BOOL bClip; 150 IMG_UINT16 LeftCropOffset; 151 IMG_UINT16 RightCropOffset; 152 IMG_UINT16 TopCropOffset; 153 IMG_UINT16 BottomCropOffset; 154 } H264_CROP_PARAMS; 155 156 typedef struct _H264_SEQUENCE_HEADER_PARAMS_STRUC { 157 SH_PROFILE_TYPE ucProfile; 158 SH_LEVEL_TYPE ucLevel; 159 IMG_UINT8 ucWidth_in_mbs_minus1; 160 IMG_UINT8 ucHeight_in_maps_units_minus1; 161 IMG_UINT8 gaps_in_frame_num_value; 162 IMG_UINT8 ucFrame_mbs_only_flag; 163 IMG_UINT8 VUI_Params_Present; 164 H264_VUI_PARAMS VUI_Params; 165 } H264_SEQUENCE_HEADER_PARAMS; 166 167 168 typedef struct _H264_SLICE_HEADER_PARAMS_STRUC { 169 IMG_UINT8 Start_Code_Prefix_Size_Bytes; 170 SLHP_SLICEFRAME_TYPE SliceFrame_Type; 171 IMG_UINT32 First_MB_Address; 172 IMG_UINT8 Frame_Num_DO; 173 IMG_UINT8 Picture_Num_DO; 174 IMG_BOOL UsesLongTermRef; 175 IMG_BOOL IsLongTermRef; 176 IMG_UINT8 Disable_Deblocking_Filter_Idc; 177 IMG_INT8 iDebAlphaOffsetDiv2; 178 IMG_INT8 iDebBetaOffsetDiv2; 179 } H264_SLICE_HEADER_PARAMS; 180 181 182 183 /* MPEG4 Structures 184 */ 185 typedef enum _MPEG4_PROFILE { 186 SP = 1, 187 ASP = 3 188 } MPEG4_PROFILE_TYPE; 189 190 typedef enum _FIXED_VOP_TIME_ENUM { 191 _30FPS = 1, 192 _15FPS = 2, 193 _10FPS = 3 194 } FIXED_VOP_TIME_TYPE; 195 196 typedef struct _VBVPARAMS_STRUC { 197 IMG_UINT32 First_half_bit_rate; 198 IMG_UINT32 Latter_half_bit_rate; 199 IMG_UINT32 First_half_vbv_buffer_size; 200 IMG_UINT32 Latter_half_vbv_buffer_size; 201 IMG_UINT32 First_half_vbv_occupancy; 202 IMG_UINT32 Latter_half_vbv_occupancy; 203 } VBVPARAMS; 204 205 206 /* 207 * H263 Structures 208 */ 209 210 typedef enum _VOP_CODING_ENUM { 211 I_FRAME = 0, 212 P_FRAME = 1 213 } VOP_CODING_TYPE, H263_PICTURE_CODING_TYPE; 214 215 typedef enum _SEARCH_RANGE_ENUM { 216 PLUSMINUS_32 = 2, 217 PLUSMINUS_64 = 3, 218 FCODE_EQ_4 = 4 219 } SEARCH_RANGE_TYPE; 220 221 typedef enum _H263_SOURCE_FORMAT_ENUM { 222 _128x96_SubQCIF = 1, 223 _176x144_QCIF = 2, 224 _352x288_CIF = 3, 225 _704x576_4CIF = 4 226 } H263_SOURCE_FORMAT_TYPE; 227 228 229 #define SIZEINBITS(a) (sizeof(a)*8) 230 231 /* H264 header preparation */ 232 void pnw__H264_prepare_sequence_header( 233 unsigned char *pHeaderMemory, 234 IMG_UINT32 uiPicWidthInMbs, 235 IMG_UINT32 uiPicHeightInMbs, 236 IMG_BOOL VUI_present, H264_VUI_PARAMS *VUI_params, 237 H264_CROP_PARAMS *psCropParams, 238 IMG_UINT8 uiLevel, 239 IMG_UINT8 uiProfile); 240 241 void pnw__H264_prepare_picture_header(unsigned char *pHeaderMemory, IMG_BOOL bCabacEnaled, IMG_INT8 CQPOffset); 242 243 void pnw__H264_prepare_slice_header( 244 unsigned char *pHeaderMemory, 245 IMG_BOOL bIntraSlice, 246 IMG_UINT32 uiDisableDeblockingFilterIDC, 247 IMG_UINT32 uiFrameNumber, 248 IMG_UINT32 uiFirst_MB_Address, 249 IMG_UINT32 uiMBSkipRun, 250 IMG_BOOL bCabacEnabled, 251 IMG_BOOL bForceIDR, 252 IMG_BOOL bUsesLongTermRef, 253 IMG_BOOL bIsLOngTermRef, 254 IMG_UINT16 uiIdrPicId); 255 256 void pnw__H264_prepare_eodofstream_header(unsigned char *pHeaderMemory); 257 void pnw__H264_prepare_endofpicture_header(unsigned char *pHeaderMemory); 258 void pnw__H264_prepare_endofsequence_header(unsigned char *pHeaderMemory); 259 260 261 /* MPEG4 header preparation */ 262 void pnw__MPEG4_prepare_sequence_header( 263 unsigned char *pHeaderMemory, 264 IMG_BOOL bBFrame, 265 MPEG4_PROFILE_TYPE sProfile, 266 IMG_UINT8 Profile_and_level_indication, 267 FIXED_VOP_TIME_TYPE sFixed_vop_time_increment, 268 IMG_UINT32 Picture_Width_Pixels, 269 IMG_UINT32 Picture_Height_Pixels, 270 VBVPARAMS * psVBVParams, 271 IMG_UINT32 VopTimeResolution); 272 273 void pnw__MPEG4_prepare_vop_header( 274 unsigned char *pHeaderMem, 275 IMG_BOOL bIsVOP_coded, 276 IMG_UINT32 VOP_time_increment, 277 IMG_UINT8 sSearch_range, 278 IMG_UINT8 eVop_Coding_Type, 279 IMG_UINT32 VopTimeResolution); 280 281 282 /* H263 header preparation */ 283 void pnw__H263_prepare_sequence_header( 284 unsigned char *pHeaderMem, 285 IMG_UINT8 Profile_and_level_indication); 286 287 void pnw__H263_prepare_picture_header( 288 unsigned char *pHeaderMem, 289 IMG_UINT8 Temporal_Ref, 290 H263_PICTURE_CODING_TYPE PictureCodingType, 291 H263_SOURCE_FORMAT_TYPE SourceFormatType, 292 IMG_UINT8 FrameRate, 293 IMG_UINT16 PictureWidth, 294 IMG_UINT16 PictureHeigth); 295 296 void pnw__H263_prepare_GOBslice_header( 297 unsigned char *pHeaderMem, 298 IMG_UINT8 GOBNumber, 299 IMG_UINT8 GOBFrameId); 300 301 void pnw__H264_prepare_SEI_buffering_period_header( 302 MTX_HEADER_PARAMS * pMTX_Header, 303 IMG_UINT8 ui8NalHrdBpPresentFlag, 304 IMG_UINT8 ui8nal_cpb_cnt_minus1, 305 IMG_UINT8 ui8nal_initial_cpb_removal_delay_length, 306 IMG_UINT32 ui32nal_initial_cpb_removal_delay, 307 IMG_UINT32 ui32nal_initial_cpb_removal_delay_offset, 308 IMG_UINT8 ui8VclHrdBpPresentFlag, 309 IMG_UINT8 ui8vcl_cpb_cnt_minus1, 310 IMG_UINT32 ui32vcl_initial_cpb_removal_delay, 311 IMG_UINT32 ui32vcl_initial_cpb_removal_delay_offset); 312 313 void pnw__H264_prepare_SEI_picture_timing_header( 314 MTX_HEADER_PARAMS * pMTX_Header, 315 IMG_UINT8 ui8CpbDpbDelaysPresentFlag, 316 IMG_UINT32 ui32cpb_removal_delay_length_minus1, 317 IMG_UINT32 ui32dpb_output_delay_length_minus1, 318 IMG_UINT32 ui32cpb_removal_delay, 319 IMG_UINT32 ui32dpb_output_delay, 320 IMG_UINT8 ui8pic_struct_present_flag, 321 IMG_UINT8 ui8pic_struct, 322 IMG_UINT8 ui8NumClockTS, 323 IMG_UINT8 *aui8clock_timestamp_flag, 324 IMG_UINT8 ui8full_timestamp_flag, 325 IMG_UINT8 ui8seconds_flag, 326 IMG_UINT8 ui8minutes_flag, 327 IMG_UINT8 ui8hours_flag, 328 IMG_UINT8 ui8seconds_value, 329 IMG_UINT8 ui8minutes_value, 330 IMG_UINT8 ui8hours_value, 331 IMG_UINT8 ui8ct_type, 332 IMG_UINT8 ui8nuit_field_based_flag, 333 IMG_UINT8 ui8counting_type, 334 IMG_UINT8 ui8discontinuity_flag, 335 IMG_UINT8 ui8cnt_dropped_flag, 336 IMG_UINT8 ui8n_frames, 337 IMG_UINT8 ui8time_offset_length, 338 IMG_INT32 i32time_offset); 339 340 341 #endif /* _PNW_HOSTHEADER_H_ */ 342 343 344 345 346