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 */
44typedef 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
55typedef 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
67typedef struct _MTX_HEADER_ELEMENT_ {
68    HEADER_ELEMENT_TYPE Element_Type;
69    IMG_UINT8 Size;
70    IMG_UINT8 Bits;
71} MTX_HEADER_ELEMENT;
72
73
74typedef 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 */
85typedef 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) */
91typedef 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
105typedef 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 */
121typedef 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
132typedef 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
140typedef 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
151typedef 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 */
166typedef enum _MPEG4_PROFILE {
167    SP = 1,
168    ASP = 3
169} MPEG4_PROFILE_TYPE;
170
171typedef enum _FIXED_VOP_TIME_ENUM {
172    _30FPS = 1,
173    _15FPS = 2,
174    _10FPS = 3
175} FIXED_VOP_TIME_TYPE;
176
177typedef 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
191typedef enum _VOP_CODING_ENUM {
192    I_FRAME = 0,
193    P_FRAME = 1
194} VOP_CODING_TYPE, H263_PICTURE_CODING_TYPE;
195
196typedef enum _SEARCH_RANGE_ENUM {
197    PLUSMINUS_32 = 2,
198    PLUSMINUS_64 = 3,
199    FCODE_EQ_4 = 4
200}  SEARCH_RANGE_TYPE;
201
202typedef 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 */
213void 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
223void lnc__H264_prepare_picture_header(IMG_UINT32 *pHeaderMemory);
224void 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
236void lnc__H264_prepare_eodofstream_header(IMG_UINT32 *pHeaderMemory);
237void lnc__H264_prepare_endofpicture_header(IMG_UINT32 *pHeaderMemory);
238void lnc__H264_prepare_endofsequence_header(IMG_UINT32 *pHeaderMemory);
239
240
241/* MPEG4 header preparation */
242void 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
259void 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 */
269void lnc__H263_prepare_sequence_header(
270    IMG_UINT32 *pHeaderMem,
271    IMG_UINT8 Profile_and_level_indication);
272
273void 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
283void 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