Home | History | Annotate | Download | only in src
      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 (at) intel.com>
     27  *    Zeng Li <zeng.li (at) 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