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