1/* ///////////////////////////////////////////////////////////////////////
2//
3//               INTEL CORPORATION PROPRIETARY INFORMATION
4//  This software is supplied under the terms of a license agreement or
5//  nondisclosure agreement with Intel Corporation and may not be copied
6//  or disclosed except in accordance with the terms of that agreement.
7//        Copyright (c) 2008 Intel Corporation. All Rights Reserved.
8//
9//  Description: Common definitions for parsing VC-1 bitstreams.
10//
11*/
12
13#ifndef _VC1PARSE_COMMON_DEFS_H_
14#define _VC1PARSE_COMMON_DEFS_H_
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
20#include <stdint.h>
21
22/** @weakgroup vc1parse_common_defs VC-1 Common Definitions */
23/** @ingroup vc1parse_common_defs */
24/*@{*/
25
26/** This defines the maximum number of horizontal macroblocks in a picture. */
27#define VC1_WIDTH_MB_MAX         ((2048+15)/16)
28
29/** This defines the maximum number of vertical macroblocks in a picture. */
30#define VC1_HEIGHT_MB_MAX        ((1088+15)/16)
31
32/** This defines the maximum number of bitplane storage per picture. */
33#define VC1_MAX_BITPLANE_CHUNKS   3
34
35/** This defines the value for an invalid BFRACTION syntax element. */
36#define VC1_BFRACTION_INVALID    0
37
38/** This defines the value for BFRACTION syntax element that defines a BI
39picture. */
40#define VC1_BFRACTION_BI         9
41
42/** This enumeration defines the various supported profiles as defined in
43PROFILE syntax element. */
44enum
45{
46    VC1_PROFILE_SIMPLE,
47    VC1_PROFILE_MAIN,
48    VC1_PROFILE_RESERVED,
49    VC1_PROFILE_ADVANCED
50};
51
52/** This enumeration defines the frame coding mode as defined in FCM syntax
53element. */
54enum
55{
56    VC1_FCM_PROGRESSIVE,
57    VC1_FCM_FRAME_INTERLACE = 2,
58    VC1_FCM_FIELD_INTERLACE = 3
59};
60
61/** This enumeration defines the various bitplane types as defined in IMODE
62syntax element. */
63enum
64{
65    VC1_BITPLANE_RAW_MODE,
66    VC1_BITPLANE_NORM2_MODE,
67    VC1_BITPLANE_DIFF2_MODE,
68    VC1_BITPLANE_NORM6_MODE,
69    VC1_BITPLANE_DIFF6_MODE,
70    VC1_BITPLANE_ROWSKIP_MODE,
71    VC1_BITPLANE_COLSKIP_MODE
72};
73
74/** This enumeration defines the various motion vector modes as defined in
75MVMODE or MVMODE2 syntax element. */
76enum
77{
78    VC1_MVMODE_1MV,
79#ifdef VBP
80    VC1_MVMODE_HPELBI_1MV,
81    VC1_MVMODE_HPEL_1MV,
82#else
83    VC1_MVMODE_HPEL_1MV,
84    VC1_MVMODE_HPELBI_1MV,
85#endif
86    VC1_MVMODE_MIXED_MV,
87    VC1_MVMODE_INTENSCOMP
88};
89
90/** This enumeration defines the extended differential motion vector range flag
91as defined in DMVRANGE syntax element. */
92enum
93{
94    VC1_DMVRANGE_NONE,
95    VC1_DMVRANGE_HORIZONTAL_RANGE,
96    VC1_DMVRANGE_VERTICAL_RANGE,
97    VC1_DMVRANGE_HORIZONTAL_VERTICAL_RANGE
98};
99
100/** This enumeration defines the intensity compensation field as defined in
101INTCOMPFIELD syntax element. */
102enum
103{
104    VC1_INTCOMP_TOP_FIELD    = 1,
105    VC1_INTCOMP_BOTTOM_FIELD = 2,
106    VC1_INTCOMP_BOTH_FIELD   = 3
107};
108
109/** This enumeration defines the differential quantizer profiles as defined in
110DQPROFILE syntax element. */
111enum
112{
113    VC1_DQPROFILE_ALL4EDGES,
114    VC1_DQPROFILE_DBLEDGES,
115    VC1_DQPROFILE_SNGLEDGES,
116    VC1_DQPROFILE_ALLMBLKS
117};
118
119/** This enumeration defines the conditional overlap flag as defined in CONDOVER
120syntax element. */
121enum
122{
123    VC1_CONDOVER_FLAG_NONE = 0,
124    VC1_CONDOVER_FLAG_ALL  = 2,
125    VC1_CONDOVER_FLAG_SOME = 3
126};
127
128/** This enumeration defines the type of quantizer to be used and is derived
129from bitstream syntax. */
130enum
131{
132    VC1_QUANTIZER_NONUNIFORM,
133    VC1_QUANTIZER_UNIFORM
134};
135
136/** This structure represents the various bitplanes within VC-1 bitstream. */
137typedef struct
138{
139    uint8_t invert;
140    int32_t imode;
141    uint32_t *databits;
142} vc1_Bitplane;
143
144/** This structure represents all bitstream metadata needed for register programming. */
145typedef struct
146{
147    // From Sequence Layer for Advanced Profile
148    uint8_t  PROFILE;                   /**  2 bit(s). */
149#ifdef VBP
150    uint8_t  LEVEL;
151#endif
152    uint8_t  POSTPROCFLAG;              /**  1 bit(s). */
153    uint8_t  PULLDOWN;                  /**  1 bit(s). */
154    uint8_t  INTERLACE;                 /**  1 bit(s). */
155    uint8_t  TFCNTRFLAG;                /**  1 bit(s). */
156    uint8_t  FINTERPFLAG;               /**  1 bit(s). */
157    uint8_t  PSF;                       /**  1 bit(s). */
158    uint8_t  HRD_NUM_LEAKY_BUCKETS;     /**  5 bit(s). */
159
160    // From STRUCT_C
161    uint8_t  MAXBFRAMES;                /**  3 bit(s). */
162    uint8_t  MULTIRES;                  /**  1 bit(s). */
163
164    // From EntryPoint Layer for Advanced Profile
165    uint8_t PANSCAN_FLAG;
166    uint8_t REFDIST_FLAG;
167    uint8_t LOOPFILTER;
168    uint8_t FASTUVMC;
169    uint8_t EXTENDED_MV;
170    uint8_t DQUANT;
171    uint8_t VSTRANSFORM;
172    uint8_t OVERLAP;
173    uint8_t QUANTIZER;
174    uint8_t EXTENDED_DMV;
175    uint8_t RANGE_MAPY_FLAG;
176    uint8_t RANGE_MAPY;
177    uint8_t RANGE_MAPUV_FLAG;
178    uint8_t RANGE_MAPUV;
179
180    // From Picture Header
181    uint8_t  RANGERED;                  /**  1 bit(s). */
182    uint8_t  RNDCTRL;                   /**  1 bit(s), rcv specific. */
183
184    // REFDIST is present only in field-interlaced mode on I/I, I/P, P/I, P/P frames
185    // From Canmore, looks like this needs to be propagated to following B frames
186    uint8_t  REFDIST;
187    uint8_t  INTCOMPFIELD;              /**  ? bit(s)? */
188    uint8_t  LUMSCALE2;                 /**  6 bit(s). */
189    uint8_t  LUMSHIFT2;                 /**  6 bit(s). */
190    uint8_t bp_raw[VC1_MAX_BITPLANE_CHUNKS];
191
192    // From SequenceLayerHeader, EntryPointHeader or Struct_A
193    uint16_t width;
194    uint16_t height;
195    uint16_t widthMB;
196    uint16_t heightMB;
197
198#ifdef VBP
199    uint8_t CLOSED_ENTRY;
200    uint8_t BROKEN_LINK;
201    uint8_t SYNCMARKER;
202#endif
203
204} vc1_metadata_t;
205
206/** This structure represents the sequence header for advanced profile. */
207typedef struct
208{
209    union
210    {
211#ifndef MFDBIGENDIAN
212        struct
213        {
214            unsigned BITRTQ_POSTPROC:5;
215            unsigned FRMRTQ_POSTPROC:3;
216            unsigned COLORDIFF_FORMAT:2;
217            unsigned LEVEL:3;
218            unsigned PROFILE:2;
219            unsigned pad:17;
220        } seq_flags;
221#else
222        struct
223        {
224            unsigned pad:17;
225            unsigned PROFILE:2;
226            unsigned LEVEL:3;
227            unsigned COLORDIFF_FORMAT:2;
228            unsigned FRMRTQ_POSTPROC:3;
229            unsigned BITRTQ_POSTPROC:5;
230        } seq_flags;
231#endif
232        uint32_t flags;
233    };
234
235    union
236    {
237#ifndef MFDBIGENDIAN
238        struct
239        {
240            unsigned DISPLAY_EXT:1;
241            unsigned PSF:1;
242            unsigned RESERVED:1;
243            unsigned FINTERPFLAG:1;
244            unsigned TFCNTRFLAG:1;
245            unsigned INTERLACE:1;
246            unsigned PULLDOWN:1;
247            unsigned MAX_CODED_HEIGHT:12;
248            unsigned MAX_CODED_WIDTH:12;
249            unsigned POSTPROCFLAG:1;
250        } seq_max_size;
251#else
252        struct
253        {
254            unsigned POSTPROCFLAG:1;
255            unsigned MAX_CODED_WIDTH:12;
256            unsigned MAX_CODED_HEIGHT:12;
257            unsigned PULLDOWN:1;
258            unsigned INTERLACE:1;
259            unsigned TFCNTRFLAG:1;
260            unsigned FINTERPFLAG:1;
261            unsigned RESERVED:1;
262            unsigned PSF:1;
263            unsigned DISPLAY_EXT:1;
264        } seq_max_size;
265#endif
266        uint32_t max_size;
267    };
268
269    union
270    {
271#ifndef MFDBIGENDIAN
272        struct
273        {
274            unsigned ASPECT_RATIO_FLAG:1;
275            unsigned DISP_VERT_SIZE:14;
276            unsigned DISP_HORIZ_SIZE:14;
277            unsigned pad:3;
278        } seq_disp_size;
279#else
280        struct
281        {
282            unsigned pad:3;
283            unsigned DISP_HORIZ_SIZE:14;
284            unsigned DISP_VERT_SIZE:14;
285            unsigned ASPECT_RATIO_FLAG:1;
286        } seq_disp_size;
287#endif
288        uint32_t disp_size;
289    };
290
291    uint8_t ASPECT_RATIO;   // 4 bits
292
293    union
294    {
295#ifndef MFDBIGENDIAN
296        struct
297        {
298            unsigned ASPECT_VERT_SIZE:8;
299            unsigned ASPECT_HORIZ_SIZE:8;
300            unsigned pad:16;
301        } seq_aspect_size;
302#else
303        struct
304        {
305            unsigned pad:16;
306            unsigned ASPECT_HORIZ_SIZE:8;
307            unsigned ASPECT_VERT_SIZE:8;
308        } seq_aspect_size;
309#endif
310        uint32_t aspect_size;
311    };
312
313    uint8_t FRAMERATE_FLAG; // 1b
314    uint8_t FRAMERATEIND;   // 1b
315
316    union
317    {
318#ifndef MFDBIGENDIAN
319        struct
320        {
321            unsigned FRAMERATEDR:4;
322            unsigned FRAMERATENR:8;
323            unsigned pad:20;
324        } seq_framerate_fraction;
325#else
326        struct
327        {
328            unsigned pad:20;
329            unsigned FRAMERATENR:8;
330            unsigned FRAMERATEDR:4;
331        } seq_framerate_fraction;
332#endif
333        uint32_t framerate_fraction;
334    };
335
336    uint16_t FRAMERATEEXP;      // 16b
337    uint8_t COLOR_FORMAT_FLAG; // 1b
338
339    union
340    {
341#ifndef MFDBIGENDIAN
342        struct
343        {
344            unsigned MATRIX_COEF:8;
345            unsigned TRANSFER_CHAR:8;
346            unsigned COLOR_PRIM:8;
347            unsigned pad:8;
348        } seq_color_format;
349#else
350        struct
351        {
352            unsigned pad:8;
353            unsigned COLOR_PRIM:8;
354            unsigned TRANSFER_CHAR:8;
355            unsigned MATRIX_COEF:8;
356        } seq_color_format;
357#endif
358        uint32_t color_format;
359    };
360
361    uint8_t HRD_PARAM_FLAG;         // 1b
362    uint8_t HRD_NUM_LEAKY_BUCKETS;  // 5b
363    // No need to parse remaining items - not needed so far
364} vc1_SequenceLayerHeader;
365
366/** This structure represents metadata for struct c. */
367typedef struct
368{
369    union
370    {
371#ifndef MFDBIGENDIAN
372        struct
373        {
374            unsigned res6:1;
375            unsigned FINTERPFLAG:1;
376            unsigned QUANTIZER:2;
377            unsigned MAXBFRAMES:3;
378            unsigned RANGERED:1;
379            unsigned SYNCMARKER:1;
380            unsigned OVERLAP:1;
381            unsigned res5:1;
382            unsigned VSTRANSFORM:1;
383            unsigned DQUANT:2;
384            unsigned EXTENDED_MV:1;
385            unsigned FASTUVMC:1;
386            unsigned res4:1;
387            unsigned MULTIRES:1;
388            unsigned res3:1;
389            unsigned LOOPFILTER:1;
390            unsigned BITRTQ_POSTPROC:5;
391            unsigned FRMRTQ_POSTPROC:3;
392            unsigned PROFILE:4;
393        } struct_c;
394#else
395        struct
396        {
397            unsigned PROFILE:4;
398            unsigned FRMRTQ_POSTPROC:3;
399            unsigned BITRTQ_POSTPROC:5;
400            unsigned LOOPFILTER:1;
401            unsigned res3:1;
402            unsigned MULTIRES:1;
403            unsigned res4:1;
404            unsigned FASTUVMC:1;
405            unsigned EXTENDED_MV:1;
406            unsigned DQUANT:2;
407            unsigned VSTRANSFORM:1;
408            unsigned res5:1;
409            unsigned OVERLAP:1;
410            unsigned SYNCMARKER:1;
411            unsigned RANGERED:1;
412            unsigned MAXBFRAMES:3;
413            unsigned QUANTIZER:2;
414            unsigned FINTERPFLAG:1;
415            unsigned res6:1;
416        } struct_c;
417#endif
418        uint32_t struct_c_rcv;
419    };
420
421    union
422    {
423#ifndef MFDBIGENDIAN
424        struct
425        {
426            unsigned VERT_SIZE:16;
427            unsigned HORIZ_SIZE:16;
428        } struct_a;
429#else
430        struct
431        {
432            unsigned HORIZ_SIZE:16;
433            unsigned VERT_SIZE:16;
434        } struct_a;
435#endif
436        uint32_t struct_a_rcv;
437    };
438
439} vc1_RcvSequenceHeader;
440
441/** This structure represents metadata for entry point layers. */
442typedef struct
443{
444    union
445    {
446#ifndef MFDBIGENDIAN
447        struct
448        {
449            unsigned QUANTIZER:2;
450            unsigned OVERLAP:1;
451            unsigned VSTRANSFORM:1;
452            unsigned DQUANT:2;
453            unsigned EXTENDED_MV:1;
454            unsigned FASTUVMC:1;
455            unsigned LOOPFILTER:1;
456            unsigned REFDIST_FLAG:1;
457            unsigned PANSCAN_FLAG:1;
458            unsigned CLOSED_ENTRY:1;
459            unsigned BROKEN_LINK:1;
460            unsigned pad1:19;
461        } ep_flags;
462#else
463        struct
464        {
465            unsigned pad1:19;
466            unsigned BROKEN_LINK:1;
467            unsigned CLOSED_ENTRY:1;
468            unsigned PANSCAN_FLAG:1;
469            unsigned REFDIST_FLAG:1;
470            unsigned LOOPFILTER:1;
471            unsigned FASTUVMC:1;
472            unsigned EXTENDED_MV:1;
473            unsigned DQUANT:2;
474            unsigned VSTRANSFORM:1;
475            unsigned OVERLAP:1;
476            unsigned QUANTIZER:2;
477        } ep_flags;
478#endif
479        uint32_t flags;
480    };
481
482    // Skipping HRD data because it is not needed for our processing
483
484    union
485    {
486#ifndef MFDBIGENDIAN
487        struct
488        {
489            unsigned CODED_HEIGHT:12;
490            unsigned CODED_WIDTH:12;
491            unsigned pad2:8;
492        } ep_size;
493#else
494        struct
495        {
496            unsigned pad2:8;
497            unsigned CODED_WIDTH:12;
498            unsigned CODED_HEIGHT:12;
499        } ep_size;
500#endif
501        uint32_t size;
502    };
503
504    uint8_t  CODED_SIZE_FLAG;           /**  1 bit(s). */
505    uint8_t  EXTENDED_DMV;              /**  1 bit(s). */
506    uint8_t  RANGE_MAPY_FLAG;           /**  1 bit(s). */
507    uint8_t  RANGE_MAPY;                /**  3 bit(s). */
508    uint8_t  RANGE_MAPUV_FLAG;          /**  1 bit(s). */
509    uint8_t  RANGE_MAPUV;               /**  3 bit(s). */
510} vc1_EntryPointHeader;
511
512/** This structure represents metadata for slice and picture layers. */
513typedef struct
514{
515    /* Slice layer. */
516    uint16_t SLICE_ADDR;                /**  9 bit(s). */
517
518    /* Picture layer for simple or main profile. */
519    uint8_t  RANGEREDFRM;               /**  1 bit(s). */
520    uint8_t  PTYPE;                     /**  4 bit(s)? */
521    int8_t   BFRACTION_NUM;             /**  ? bit(s). */
522    int16_t  BFRACTION_DEN;             /**  ? bit(s). */
523    uint8_t  PQINDEX;                   /**  5 bit(s). */
524    uint8_t  HALFQP;                    /**  1 bit(s). */
525    uint8_t  PQUANTIZER;                /**  1 bit(s). */
526    uint8_t  MVRANGE;                   /**  3 bit(s)? */
527    uint8_t  MVMODE;                    /**  4 bit(s)? */
528    uint8_t  MVMODE2;                   /**  3 bit(s)? */
529    uint8_t  LUMSCALE;                  /**  6 bit(s). */
530    uint8_t  LUMSHIFT;                  /**  6 bit(s). */
531    uint8_t  MVTAB;                     /**  2 bit(s). */
532    uint8_t  CBPTAB;                    /**  2 bit(s). */
533    uint8_t  TTMBF;                     /**  1 bit(s). */
534    uint8_t  TTFRM;                     /**  2 bit(s). */
535    uint8_t  TRANSACFRM;                /**  2 bit(s)? */
536    uint8_t  TRANSACFRM2;               /**  2 bit(s)? */
537    uint8_t  TRANSDCTAB;                /**  1 bit(s). */
538
539    /* Picture layer for advanced profile. */
540    uint8_t  FCM;                       /**  2 bit(s)? */
541    uint8_t  FPTYPE;                    /**  3 bit(s). */
542    uint8_t  TFCNTR;                    /**  8 bit(s) */
543    uint8_t  RPTFRM;                    /**  2 bit(s) */
544    uint8_t  TFF;                       /**  1 bit(s). */
545    uint8_t  RFF;                    	/**  1 bit(s) */
546    uint8_t  RNDCTRL;                   /**  1 bit(s). */
547    uint8_t  UVSAMP;                    /**  1 bit(s). */
548    uint8_t  POSTPROC;                  /**  2 bit(s). */
549    uint8_t  CONDOVER;                  /**  2 bit(s)? */
550    uint8_t  DMVRANGE;                  /**  ? bit(s)? */
551    uint8_t  MV4SWITCH;                 /**  1 bit(s). */
552    uint8_t  INTCOMP;                   /**  1 bit(s). */
553    uint8_t  MBMODETAB;                 /**  2 bit(s). */
554    uint8_t  MV2BPTAB;                  /**  2 bit(s). */
555    uint8_t  MV4BPTAB;                  /**  2 bit(s). */
556    uint8_t  NUMREF;                    /**  1 bit(s). */
557    uint8_t  REFFIELD;                  /**  1 bit(s). */
558
559    /* PAN SCAN */
560    uint8_t  PS_PRESENT;                /**  1 bit(s). */
561    uint8_t number_of_pan_scan_window;	/** 4 max. */
562    viddec_vc1_pan_scan_window_t PAN_SCAN_WINDOW[VIDDEC_PANSCAN_MAX_OFFSETS];
563
564    /* VOPDQUANT. */
565    uint8_t  PQDIFF;                    /**  3 bit(s). */
566    uint8_t  ABSPQ;                     /**  5 bit(s). */
567    uint8_t  DQUANTFRM;                 /**  1 bit(s). */
568    uint8_t  DQPROFILE;                 /**  2 bit(s). */
569    uint8_t  DQSBEDGE;                  /**  2 bit(s). */
570    uint8_t  DQBILEVEL;                 /**  1 bit(s). */
571
572    /* Others. */
573    uint8_t  PTypeField1;
574    uint8_t  PTypeField2;
575    uint32_t PQUANT;
576    uint8_t  CurrField;
577    uint8_t  BottomField;
578    uint32_t UniformQuant;
579
580#ifdef VBP
581    uint8_t  raw_MVTYPEMB;
582    uint8_t  raw_DIRECTMB;
583    uint8_t  raw_SKIPMB;
584    uint8_t  raw_ACPRED;
585    uint8_t  raw_FIELDTX;
586    uint8_t  raw_OVERFLAGS;
587    uint8_t  raw_FORWARDMB;
588
589    vc1_Bitplane MVTYPEMB;
590    vc1_Bitplane DIRECTMB;
591    vc1_Bitplane SKIPMB;
592    vc1_Bitplane ACPRED;
593    vc1_Bitplane FIELDTX;
594    vc1_Bitplane OVERFLAGS;
595    vc1_Bitplane FORWARDMB;
596    uint32_t  ALTPQUANT;
597    uint8_t		DQDBEDGE;
598#endif
599
600} vc1_PictureLayerHeader;
601
602/*@}*/
603
604#ifdef __cplusplus
605}
606#endif /* __cplusplus. */
607
608#endif /* _VC1PARSE_COMMON_DEFS_H_. */
609