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 */
40 typedef 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 */
140 typedef 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 
172 typedef 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 
181 typedef 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 
197 struct 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 
313 typedef 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 
348 typedef 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 
401 extern vc1PicHeader             *psPicHdr;
402 extern vc1SeqHeader             *psSeqHdr;
403 
404 #endif /* _VC1_HEADER_H_ */
405