1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
|
/*
* 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:
* Waldo Bastian <waldo.bastian@intel.com>
*
*/
#ifndef _VC1_HEADER_H_
#define _VC1_HEADER_H_
#include "psb_VC1.h"
#include "psb_def.h"
#include "psb_surface.h"
#include "psb_cmdbuf.h"
#include <img_types.h>
/* Picture header parameters */
typedef struct _vc1PicHeader_ {
/* TTMBF signals whether transform type coding is enabled at the frame or macroblock level. */
IMG_UINT8 TTMBF; /* PICTURE_LAYER::TTMBF - 1 bit */
/* TTFRM signals the transform type used to transform the 8x8 pixel error signal in predicted blocks. */
IMG_UINT8 TTFRM; /* PICTURE_LAYER::TTFRM - 2 bits */
/*
BFRACTION signals a fraction that may take on a limited set of fractional values between 0 and 1,
denoting the relative temporal position of the B frame within the interval formed by its anchors.
*/
IMG_UINT8 BFRACTION; /* PICTURE_LAYER::BFRACTION - 2 bits */
/*
CONDOVER affects overlap smoothing in advanced profile.
*/
IMG_UINT8 CONDOVER; /* PICTURE_LAYER::CONDOVER - 2 bits */
/*
TRANSACFRM shall provide the index that selects the coding set used to decode the
Transform AC coefficients for the Cb, Cr blocks.
*/
IMG_UINT8 TRANSACFRM; /* PICTURE_LAYER::TRANSACFRM - 2 bits */
/*
TRANSACFRM2 shall provide the index that selects the coding set used to decode the
Transform AC coefficients for the Y blocks.
*/
IMG_UINT8 TRANSACFRM2; /* PICTURE_LAYER::TRANSACFRM2 - 2 bits */
/*
MVMODE syntax element shall signal one of four motion vector coding modes,
or the intensity compensation mode.
*/
IMG_UINT8 MVMODE; /* PICTURE_LAYER::MVMODE - 2 bits */
IMG_UINT8 MVMODE2; /* PICTURE_LAYER::MVMODE2 - 2 bits */
/* These are needed just for finding out what VLC tables are used in the current picture */
IMG_UINT8 MV4SWITCH; /* PICTURE_LAYER::MV4SWITCH - 1 bit */
IMG_UINT8 CBPTAB; /* PICTURE_LAYER::CBPTAB - 2 bits */
IMG_UINT8 ICBPTAB; /* PICTURE_LAYER::ICBPTAB - 3 bits */
IMG_UINT8 MVTAB; /* PICTURE_LAYER::MVTAB - 2 bits */
IMG_UINT8 IMVTAB; /* PICTURE_LAYER::IMVTAB - 3 bits */
IMG_UINT8 MV4BPTAB; /* PICTURE_LAYER::4MVBPTAB - 2 bits */
IMG_UINT8 MV2BPTAB; /* PICTURE_LAYER::2MVBPTAB - 2 bits */
IMG_UINT8 MBMODETAB; /* PICTURE_LAYER::MBMODETAB - 3 bits */
IMG_UINT8 TRANSDCTAB; /* PICTURE_LAYER::TRANSDCTAB - 1 bits */
/* PQINDEX is used in VLD and the hardware actually only needs to know if it is greater than 8 or not. */
IMG_UINT8 PQINDEX; /* PICTURE_LAYER::PQINDEX - 5 bits */
/*
HALFQP syntax element allows the picture quantizer to be expressed in half step increments.
If HALFQP == 1, then the picture quantizer step size shall be equal to PQUANT + 1/2. If
HALFQP == 0, then the picture quantizer step size shall be equal to PQUANT.
*/
IMG_UINT8 HALFQP; /* PICTURE_LAYER::HALFQP - 1 bit */
IMG_UINT8 bNonUniformQuantizer;
IMG_UINT8 VOPDQUANT_Present;
IMG_UINT8 bDQUANT_InFrame; // Indicates whether quantisation can be specified at a MB level
/* If DQUANTFRM == 0, then the current picture shall only be quantized with PQUANT. */
IMG_UINT8 DQUANTFRM; /* VOPDQUANT::DQUANTFRM - 1 bit */
/* DQPROFILE specifies where it is allowable to change quantization step sizes within the current picture. */
IMG_UINT8 DQPROFILE; /* VOPDQUANT::DQPROFILE - 2 bits */
/*
DQBILEVEL determines the number of possible quantization step sizes which can be
used by each macroblock in the frame.
*/
IMG_UINT8 DQBILEVEL; /* VOPDQUANT::DQBILEVEL - 1 bit */
/* DQDBEDGE specifies which two edges will be quantized with ALTPQUANT when DQPROFILE == 'Double Edge'. */
IMG_UINT8 DQDBEDGE; /* VOPDQUANT::DQDBEDGE - 2 bits */
/* DQSBEDGE specifies which edge will be quantized with ALTPQUANT when DQPROFILE == 'Single Edge'. */
IMG_UINT8 DQSBEDGE; /* VOPDQUANT::DQSBEDGE - 2 bits */
IMG_UINT8 ALTPQUANT; /* VOPDQUANT::ALTPQUANT - 5 bits */
/* REFDIST defines the number of frames between the current frame and the reference frame. */
IMG_UINT8 REFDIST; /* PICTURE_LAYER::REFDIST - 1 bit */
/*
If NUMREF == 0, then the current interlace P field picture shall reference one field. If
NUMREF == 1, then the current interlace P field picture shall reference the two temporally
closest (in display order) I or P field pictures.
*/
IMG_UINT8 NUMREF; /* PICTURE_LAYER::NUMREF - 1 bit */
/*
If REFFIELD == 1, then the second most temporally recent interlace I or P field picture
shall be used as reference.
*/
IMG_UINT8 REFFIELD; /* PICTURE_LAYER::REFFIELD - 1 bit */
/* MVRANGE specifies the motion vector range. */
IMG_UINT8 MVRANGE; /* PICTURE_LAYER::MVRANGE - 2 bits */
/*
DMVRANGE indicates if the extended range for motion vector differential is used in the
vertical, horizontal, both or none of the components of the motion vector.
*/
IMG_UINT8 DMVRANGE; /* PICTURE_LAYER::DMVRANGE - 2 bits */
/* BitplanePresent indicates which bitplanes are present in the picture header */
IMG_UINT8 BP_PRESENT;
/* RawCodingFlag signals whether the bitplanes are coded in raw mode (bit set to 1) or not (set to 0) */
IMG_UINT8 RAWCODINGFLAG;
} vc1PicHeader;
/* Sequence header parameters */
typedef struct _vc1SeqHeader_ {
IMG_UINT8 POSTPROCFLAG;
IMG_UINT8 PULLDOWN;
IMG_UINT8 INTERLACE;
IMG_UINT8 TFCNTRFLAG;
IMG_UINT8 FINTERPFLAG;
IMG_UINT8 PSF;
IMG_UINT8 EXTENDED_DMV;
IMG_UINT8 PANSCAN_FLAG;
IMG_UINT8 REFDIST_FLAG;
IMG_UINT8 LOOPFILTER;
IMG_UINT8 FASTUVMC;
IMG_UINT8 EXTENDED_MV;
IMG_UINT8 DQUANT;
IMG_UINT8 VSTRANSFORM;
IMG_UINT8 QUANTIZER;
IMG_UINT8 MULTIRES;
IMG_UINT8 SYNCMARKER;
IMG_UINT8 RANGERED;
IMG_UINT8 MAXBFRAMES;
IMG_UINT8 OVERLAP;
IMG_UINT8 PROFILE;
} vc1SeqHeader;
//! Maximum number of VLC tables for MB/block layer decode
#define MAX_VLC_TABLES (12)
typedef struct { // Information about VLC tables
IMG_UINT16 aui16StartLocation; //!< Byte offset within the packed VLC tables array
IMG_UINT16 aui16VLCTableLength; //!< Length of the table in number of bytes
IMG_UINT16 aui16RAMLocation; //!< Location of the VLC table in the destination buffer
IMG_UINT16 aui16InitialWidth;
IMG_UINT16 aui16InitialOpcode;
} sTableData;
typedef struct { // Information about the intensity compensation history of previous pictures
IMG_UINT8 ui8LumaScale1;
IMG_UINT8 ui8LumaShift1;
IMG_UINT8 ui8LumaScale2;
IMG_UINT8 ui8LumaShift2;
/* Indication of what fields undergo intensity compensation */
IMG_UINT8 ui8IC1; // 1 - IC top field, 2 - IC bottom field, 3 - IC both fields
IMG_UINT8 ui8IC2;
} IC_PARAM;
#define VLC_INDEX_TABLE_SIZE 83
struct context_VC1_s {
object_context_p obj_context; /* back reference */
uint32_t profile;
/* Picture parameters */
VAPictureParameterBufferVC1 *pic_params;
object_surface_p forward_ref_surface;
object_surface_p backward_ref_surface;
object_surface_p decoded_surface;
uint32_t display_picture_width; /* in pixels */
uint32_t display_picture_height; /* in pixels */
uint32_t coded_picture_width; /* in pixels */
uint32_t coded_picture_height; /* in pixels */
uint32_t picture_width_mb; /* in macroblocks */
uint32_t picture_height_mb; /* in macroblocks */
uint32_t size_mb; /* in macroblocks */
IMG_BOOL is_first_slice;
uint32_t scan_index;
uint32_t slice_field_type;
uint8_t bitplane_present; /* Required bitplanes */
IMG_BOOL has_bitplane; /* Whether a bitplane was passed to the driver */
IMG_BOOL bottom_field;
IMG_BOOL half_pel;
IMG_BOOL extend_x;
IMG_BOOL extend_y;
uint8_t mode_config;
uint32_t pull_back_x;
uint32_t pull_back_y;
uint8_t condover; /* Adjusted local version of conditional_overlap_flag */
uint8_t mv_mode; /* Adjusted local version of mv_mode / mv_mode2 */
IMG_BOOL pqindex_gt8; /* Flag to indicate PQINDEX > 8 */
/* TODO:
LOOPFILTER
*/
/*
CurrPic is the picture currently being decoded.
Ref0Pic is the most recent forward reference picture (only used when decoding interlaced field pictures and
the reference picture is in the same frame as the current picture).
Ref1Pic can either be the most recent forward reference picture (when decoding interlaced frame or
progressive pictures) or the 2nd most recent reference picture (when decoding interlaced field pictures).
Ref2Pic is the most recent backward reference picture (only used when decoding B pictures).
*/
IMG_UINT8 ui8FCM_Ref0Pic; /* Used */
IMG_UINT8 ui8FCM_Ref1Pic; /* Used */
IMG_UINT8 ui8FCM_Ref2Pic; /* Used */
IMG_BOOL bTFF_FwRefFrm; /* Used */
IMG_BOOL bTFF_BwRefFrm; /* Used */
IMG_BOOL bRef0RangeRed; /* RangeRed flag */
IMG_BOOL bRef1RangeRed;
IMG_UINT8 ui8IntCompField; /* Used, replace with local var? */
IMG_UINT8 ui8MVmode; /* TODO: Fix, differs slightly from pic_params->mv_mode! */
IMG_INT8 i8FwrdRefFrmDist; /* Used */
IMG_INT8 i8BckwrdRefFrmDist; /* Used */
IMG_UINT32 ui32ScaleFactor; /* Used */
/* IC parameters in current picture */
IMG_UINT8 ui8CurrLumaScale1;
IMG_UINT8 ui8CurrLumaShift1;
IMG_UINT8 ui8CurrLumaScale2;
IMG_UINT8 ui8CurrLumaShift2;
/* Information about the intensity compensation history of previous pictures */
IC_PARAM sICparams[2][2];
/* VLC table information */
IMG_UINT32 ui32NumTables; /* VLC table accumulator */
sTableData sTableInfo[MAX_VLC_TABLES]; /* structure of VLC table information */
/* Split buffers */
int split_buffer_pending;
/* List of VASliceParameterBuffers */
object_buffer_p *slice_param_list;
int slice_param_list_size;
int slice_param_list_idx;
/* VLC packed data */
struct psb_buffer_s vlc_packed_table;
uint32_t vlc_packed_index_table[VLC_INDEX_TABLE_SIZE];
/* Preload buffer */
struct psb_buffer_s preload_buffer;
/* CoLocated buffers */
struct psb_buffer_s *colocated_buffers;
int colocated_buffers_size;
int colocated_buffers_idx;
/* Aux MSB buffer */
struct psb_buffer_s aux_msb_buffer;
psb_buffer_p bitplane_buffer;
struct psb_buffer_s bitplane_hw_buffer; /* For hw parase */
uint32_t *p_range_mapping_base; /* pointer to ui32RangeMappingBase in CMD_HEADER_VC1 */
uint32_t *p_range_mapping_base1;
uint32_t *p_slice_params; /* pointer to ui32SliceParams in CMD_HEADER_VC1 */
uint32_t *slice_first_pic_last;
uint32_t *alt_output_flags;
uint32_t forward_ref_fcm;
uint32_t backward_ref_fcm;
};
typedef struct context_VC1_s *context_VC1_p;
/* VC1 Sequence Header Data Bit Positions Within 32 bit Command Word */
#define VC1_SEQHDR_EXTENDED_DMV 0
#define VC1_SEQHDR_PSF 1
#define VC1_SEQHDR_SECONDFIELD 2
#define VC1_SEQHDR_FINTERPFLAG 3
#define VC1_SEQHDR_TFCNTRFLAG 4
#define VC1_SEQHDR_INTERLACE 5
#define VC1_SEQHDR_PULLDOWN 6
#define VC1_SEQHDR_POSTPROCFLAG 7
#define VC1_SEQHDR_VSTRANSFORM 8
#define VC1_SEQHDR_DQUANT 9
#define VC1_SEQHDR_EXTENDED_MV 11
#define VC1_SEQHDR_FASTUVMC 12
#define VC1_SEQHDR_LOOPFILTER 13
#define VC1_SEQHDR_REFDIST_FLAG 14
#define VC1_SEQHDR_PANSCAN_FLAG 15
#define VC1_SEQHDR_MAXBFRAMES 16
#define VC1_SEQHDR_RANGERED 19
#define VC1_SEQHDR_SYNCMARKER 20
#define VC1_SEQHDR_MULTIRES 21
#define VC1_SEQHDR_QUANTIZER 22
#define VC1_SEQHDR_OVERLAP 24
#define VC1_SEQHDR_PROFILE 25
#define VC1_SEQHDR_PICTYPE 27
#define VC1_SEQHDR_ICFLAG 29
#define VC1_SEQHDR_FCM_CURRPIC 30
#if 0
/****************************************************************************************/
/* Local Context */
/****************************************************************************************/
typedef struct {
VA_CONTEXT sVAContext; /* Must be the first Item */
const char *pszHandleType;
VA_PictureParameters sPicParamVC1;
vc1PicHeader sPicHdr;
vc1SeqHeader sSeqHdr;
VA_SliceInfo *pSliceCtrl;
PVRSRV_CLIENT_MEM_INFO *psAuxMSBBuffer;
PVRSRV_CLIENT_MEM_INFO *hVlcPackedTableData;
PVRSRV_CLIENT_MEM_INFO *psCoLocatedData;
PVRSRV_CLIENT_MEM_INFO *psPreloadBuffer;
#if (!VC1_INTERLEAVED_BITPLANE || VC1_BITPLANE_HARDWARE)
PVRSRV_CLIENT_MEM_INFO *hBitplaneData[3];
IMG_UINT8 *pui8BitplaneData[3];
#else
PVRSRV_CLIENT_MEM_INFO *hBitplaneData;
IMG_UINT8 *pui8BitplaneData;
#endif
#ifdef VC1_LLDMA
CMD_BUFFER sCmdBuff;
#else
PVRSRV_CLIENT_MEM_INFO *psRenderCommandBuffer;
#endif
PVRSRV_CLIENT_MEM_INFO *psStatusBuffer;
IMG_UINT32 *pui32CmdBuffer;
IMG_UINT32 *pui32CmdBufferBase;
IMG_UINT32 ui32CoLocatedSlot;
/* Status report */
IMG_BOOL bBetweenBeginAndEnd;
IMG_UINT32 ui32StatusWof;
IMG_UINT32 ui32StatusRof;
IMG_UINT32 ui32DevPhysStatusAddr;
SGX_DDSURFDATA* psDecodeSurfData;
SGX_DDSURFDATA* psDeblockSurfData;
SGX_DDSURFDATA* psForwardRefSurfData;
SGX_DDSURFDATA* psBackwardRefSurfData;
} VC1VLDContext;
#endif
/*
******************************************************************************
Extern global variables
******************************************************************************/
extern vc1PicHeader *psPicHdr;
extern vc1SeqHeader *psSeqHdr;
#endif /* _VC1_HEADER_H_ */
|