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  *    Zeng Li <zeng.li@intel.com>
27  *    Shengquan Yuan  <shengquan.yuan@intel.com>
28  *    Binglin Chen <binglin.chen@intel.com>
29  *
30  */
31 
32 
33 /*
34  * Description  DMA code for mtx Platform     : Generic
35  */
36 
37 #ifndef _LNC_HOSTHEADER_H_
38 #define _LNC_HOSTHEADER_H_
39 
40 
41 #include "img_types.h"
42 
43 /* Structure contains QP parameters, used with the DoHeader() routine */
44 typedef struct {
45     IMG_UINT32 H264_QP;
46     IMG_UINT32 H263_MPG4_FrameQ_scale;
47     IMG_UINT32 H263_MPG4_SliceQ_scale;
48 } MTX_QP_INFO;
49 
50 /* #include "topaz_vlc_regs.h" */
51 
52 /* Allocating 32 words (128 bytes aligned to 8 bytes) */
53 #define MAX_HEADERSIZEWORDS (32)
54 
55 typedef enum {
56     ELEMENT_STARTCODE_RAWDATA = 0,/* Rawdata that includes a start code */
57     ELEMENT_RAWDATA,            /* Rawdata */
58     ELEMENT_QP,                 /* Insert the H264 Picture Header QP parameter (no rawdata) */
59     ELEMENT_SQP,                /* Insert the H264 Slice Header QP parameter (no rawdata) */
60     ELEMENT_FRAMEQSCALE,        /* Insert the H263/MPEG4 Frame Q_scale parameter (vob_quant field) (no rawdata) */
61     ELEMENT_SLICEQSCALE,        /* Insert the H263/MPEG4 Slice Q_scale parameter (quant_scale field) (no rawdata) */
62     ELEMENT_INSERTBYTEALIGN_H264,/* Insert the byte align field (no rawdata) */
63     ELEMENT_INSERTBYTEALIGN_MPG4 /* Insert the byte align field  (no rawdata) */
64 } HEADER_ELEMENT_TYPE;
65 
66 
67 typedef struct _MTX_HEADER_ELEMENT_ {
68     HEADER_ELEMENT_TYPE Element_Type;
69     IMG_UINT8 Size;
70     IMG_UINT8 Bits;
71 } MTX_HEADER_ELEMENT;
72 
73 
74 typedef struct _MTX_HEADER_PARAMS_ {
75     IMG_UINT32 Elements;
76     MTX_HEADER_ELEMENT asElementStream[MAX_HEADERSIZEWORDS-1];
77 } MTX_HEADER_PARAMS;
78 
79 #define ELEMENTS_EMPTY 9999
80 
81 /* H264 Structures
82  */
83 
84 /* Define some constants for the variable elements in the header stream */
85 typedef enum _SHPROFILES {
86     SH_PROFILE_BP = 0,
87     SH_PROFILE_MP = 1
88 } SH_PROFILE_TYPE;
89 
90 /* Level number definitions (integer level numbers, non-intermediary only.. except level 1b) */
91 typedef enum _SHLEVELS {
92     SH_LEVEL_1 = 10,
93     SH_LEVEL_1B = 111,
94     SH_LEVEL_11 = 11,
95     SH_LEVEL_12 = 12,
96     SH_LEVEL_2 = 20,
97     SH_LEVEL_3 = 30,
98     SH_LEVEL_31 = 31,
99     SH_LEVEL_32 = 32,
100     SH_LEVEL_4 = 40,
101     SH_LEVEL_5 = 50
102 } SH_LEVEL_TYPE;
103 
104 
105 typedef enum _SLHP_SLICEFRAME_TYPE_ {
106     SLHP_P_SLICEFRAME_TYPE,
107     SLHP_B_SLICEFRAME_TYPE,
108     SLHP_I_SLICEFRAME_TYPE,
109     SLHP_SP_SLICEFRAME_TYPE,
110     SLHP_SI_SLICEFRAME_TYPE,
111 
112     SLHP_IDR_SLICEFRAME_TYPE
113 
114 } SLHP_SLICEFRAME_TYPE;
115 
116 
117 /* Input parameters for the header generation
118  * Some of the following data structures may have fields that are actually static..
119  * may want to prune them down a bit later.
120  */
121 typedef struct _H264_VUI_PARAMS_STRUC {
122     IMG_UINT32 Time_Scale;
123     IMG_UINT32 bit_rate_value_minus1; /* bitrate/64)-1 */
124     IMG_UINT32 cbp_size_value_minus1; /* (bitrate*1.5)/16 */
125     IMG_UINT8 CBR;
126     IMG_UINT8 initial_cpb_removal_delay_length_minus1;
127     IMG_UINT8 cpb_removal_delay_length_minus1;
128     IMG_UINT8 dpb_output_delay_length_minus1;
129     IMG_UINT8 time_offset_length;
130 } H264_VUI_PARAMS;
131 
132 typedef struct _H264_CROP_PARAMS_STRUCT_ {
133     IMG_BOOL bClip;
134     IMG_UINT16 LeftCropOffset;
135     IMG_UINT16 RightCropOffset;
136     IMG_UINT16 TopCropOffset;
137     IMG_UINT16 BottomCropOffset;
138 } H264_CROP_PARAMS;
139 
140 typedef struct _H264_SEQUENCE_HEADER_PARAMS_STRUC {
141     SH_PROFILE_TYPE ucProfile;
142     SH_LEVEL_TYPE ucLevel;
143     IMG_UINT8 ucMax_num_ref_frames;
144     IMG_UINT8 ucWidth_in_mbs_minus1;
145     IMG_UINT8 ucHeight_in_maps_units_minus1;
146     IMG_UINT8 VUI_Params_Present;
147     H264_VUI_PARAMS VUI_Params;
148 } H264_SEQUENCE_HEADER_PARAMS;
149 
150 
151 typedef struct _H264_SLICE_HEADER_PARAMS_STRUC {
152     IMG_UINT8 Start_Code_Prefix_Size_Bytes;
153     SLHP_SLICEFRAME_TYPE SliceFrame_Type;
154     IMG_UINT32 First_MB_Address;
155     IMG_UINT8 Frame_Num_DO;
156     IMG_UINT8 Picture_Num_DO;
157     IMG_BOOL bUsesLongTermRef;
158     IMG_BOOL bIsLongTermRef;
159     IMG_UINT8 Disable_Deblocking_Filter_Idc;
160 } H264_SLICE_HEADER_PARAMS;
161 
162 
163 
164 /* MPEG4 Structures
165  */
166 typedef enum _MPEG4_PROFILE {
167     SP = 1,
168     ASP = 3
169 } MPEG4_PROFILE_TYPE;
170 
171 typedef enum _FIXED_VOP_TIME_ENUM {
172     _30FPS = 1,
173     _15FPS = 2,
174     _10FPS = 3
175 } FIXED_VOP_TIME_TYPE;
176 
177 typedef struct _VBVPARAMS_STRUC {
178     IMG_UINT32  First_half_bit_rate;
179     IMG_UINT32  Latter_half_bit_rate;
180     IMG_UINT32  First_half_vbv_buffer_size;
181     IMG_UINT32  Latter_half_vbv_buffer_size;
182     IMG_UINT32  First_half_vbv_occupancy;
183     IMG_UINT32  Latter_half_vbv_occupancy;
184 } VBVPARAMS;
185 
186 
187 /*
188  * H263 Structures
189  */
190 
191 typedef enum _VOP_CODING_ENUM {
192     I_FRAME = 0,
193     P_FRAME = 1
194 } VOP_CODING_TYPE, H263_PICTURE_CODING_TYPE;
195 
196 typedef enum _SEARCH_RANGE_ENUM {
197     PLUSMINUS_32 = 2,
198     PLUSMINUS_64 = 3,
199     FCODE_EQ_4 = 4
200 }  SEARCH_RANGE_TYPE;
201 
202 typedef enum _H263_SOURCE_FORMAT_ENUM {
203     _128x96_SubQCIF = 1,
204     _176x144_QCIF = 2,
205     _352x288_CIF = 3,
206     _704x576_4CIF = 4
207 } H263_SOURCE_FORMAT_TYPE;
208 
209 
210 #define SIZEINBITS(a) (sizeof(a)*8)
211 
212 /* H264 header preparation */
213 void lnc__H264_prepare_sequence_header(
214     IMG_UINT32 *pHeaderMemory,
215     IMG_UINT32 uiMaxNumRefFrames,
216     IMG_UINT32 uiPicWidthInMbs,
217     IMG_UINT32 uiPicHeightInMbs,
218     IMG_BOOL VUI_present, H264_VUI_PARAMS *VUI_params,
219     H264_CROP_PARAMS *psCropParams,
220     IMG_UINT8 uiLevel,
221     IMG_UINT8 uiProfile);
222 
223 void lnc__H264_prepare_picture_header(IMG_UINT32 *pHeaderMemory);
224 void lnc__H264_prepare_slice_header(
225     IMG_UINT32 *pHeaderMemory,
226     IMG_BOOL    bIntraSlice,
227     IMG_UINT32 uiDisableDeblockingFilterIDC,
228     IMG_UINT32 uiFrameNumber,
229     IMG_UINT32 uiFirst_MB_Address,
230     IMG_UINT32 uiMBSkipRun,
231     IMG_UINT32 ui_need_idr,
232     IMG_BOOL bUsesLongTermRef,
233     IMG_BOOL bIsLongTermRef,
234     IMG_UINT16 uiIdrPicId);
235 
236 void lnc__H264_prepare_eodofstream_header(IMG_UINT32 *pHeaderMemory);
237 void lnc__H264_prepare_endofpicture_header(IMG_UINT32 *pHeaderMemory);
238 void lnc__H264_prepare_endofsequence_header(IMG_UINT32 *pHeaderMemory);
239 
240 
241 /* MPEG4 header preparation */
242 void lnc__MPEG4_prepare_sequence_header(
243     IMG_UINT32 *pHeaderMemory,
244     IMG_BOOL bBFrame,
245     MPEG4_PROFILE_TYPE sProfile,
246     IMG_UINT8 Profile_and_level_indication,
247     FIXED_VOP_TIME_TYPE sFixed_vop_time_increment,
248     IMG_UINT32 Picture_Width_Pixels,
249     IMG_UINT32 Picture_Height_Pixels,
250     IMG_BOOL bVBVPresent,
251     IMG_UINT32  First_half_bit_rate,
252     IMG_UINT32  Latter_half_bit_rate,
253     IMG_UINT32  First_half_vbv_buffer_size,
254     IMG_UINT32  Latter_half_vbv_buffer_size,
255     IMG_UINT32  First_half_vbv_occupancy,
256     IMG_UINT32  Latter_half_vbv_occupancy,
257     IMG_UINT32 VopTimeResolution);
258 
259 void lnc__MPEG4_prepare_vop_header(
260     IMG_UINT32 *pHeaderMem,
261     IMG_BOOL bIsVOP_coded,
262     IMG_UINT32 VOP_time_increment,
263     IMG_UINT8 sSearch_range,
264     IMG_UINT8 eVop_Coding_Type,
265     IMG_UINT32 VopTimeResolution);
266 
267 
268 /* H263 header preparation */
269 void lnc__H263_prepare_sequence_header(
270     IMG_UINT32 *pHeaderMem,
271     IMG_UINT8 Profile_and_level_indication);
272 
273 void lnc__H263_prepare_picture_header(
274     IMG_UINT32 *pHeaderMem,
275     IMG_UINT8 Temporal_Ref,
276     H263_PICTURE_CODING_TYPE PictureCodingType,
277     H263_SOURCE_FORMAT_TYPE SourceFormatType,
278     IMG_UINT8 FrameRate,
279     IMG_UINT16 PictureWidth,
280     IMG_UINT16 PictureHeight,
281     IMG_UINT8 *OptionalCustomPCF);
282 
283 void lnc__H263_prepare_GOBslice_header(
284     IMG_UINT32 *pHeaderMem,
285     IMG_UINT8 GOBNumber,
286     IMG_UINT8 GOBFrameId);
287 
288 
289 #endif /* _LNC_HOSTHEADER_H_ */
290 
291 
292 
293 
294