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 
26 
27 /*
28 ******************************************************************************
29  Profile calculation masks
30 ******************************************************************************/
31 #define iWMVA_MASK                              (0x08)
32 #define iWMV9_MASK                              (0x80)
33 
34 /* system environment dependent switches */
35 //! Pack decoded bitplane bits into bytes (instead of 1-bit per byte)
36 //#define BITPLANE_PACKED_BYTES
37 
38 //! Generate bitplane test vectors
39 #define BITPLANE_TEST_VECTORS   (0)
40 
41 //! Measure bitplane decode time
42 #define BITPLANE_DECODE_TIME    (0)
43 
44 //! Measure time spent parsing the picture header
45 #define PARSE_HEADER_TIME               (0)
46 
47 //! Use VC1 reference decoder implementation for bitplane decoding
48 #define REFDEC_BITPLANE_DECODER         (0)
49 
50 //! Interleave individual bitplanes into packed format
51 #define VC1_INTERLEAVED_BITPLANE        (1)
52 
53 //! Use MSVDX hardware for bitplane decoding
54 #define VC1_BITPLANE_HARDWARE           (0)
55 
56 /*****************************************************************************/
57 #if VC1_BITPLANE_HARDWARE
58 //! VC1_INTERLEAVED_BITPLANE must be set to 0 when using MSVDX hardware for bitplane decoding
59 #if VC1_INTERLEAVED_BITPLANE
60 #error VC1_INTERLEAVED_BITPLANE must not be defined together with VC1_BITPLANE_HARDWARE
61 #endif
62 #endif
63 /*****************************************************************************/
64 
65 /*
66 Possible combinations for bitplane decoding operation:
67 
68 + To use the hardware bitplane decoder, define VC1_BITPLANE_HARDWARE in the
69 preprocessor definitions of um_drivers, set REFDEC_BITPLANE_DECODER to 1 and
70 VC1_INTERLEAVED_BITPLANE to 0.
71 + To use the software bitplane decoder, don't define VC1_BITPLANE_HARDWARE.
72 There are two implementations of the decoder:
73         - To use the VC1 reference decoder implementation, set
74         REFDEC_BITPLANE_DECODER to 1.
75         - Otherwise, set REFDEC_BITPLANE_DECODER to 0.
76 + When using the software bitplane decoder, the data can be sent to
77 the hardware in two formats.
78         - Set VC1_INTERLEAVED_BITPLANE to 1, if using the three-plane
79         interleaved format.
80         - Otherwise, set VC1_INTERLEAVED_BITPLANE to 0.
81 */
82 
83 /*!
84 ******************************************************************************
85  This enumeration defines PTYPE [All]
86 ******************************************************************************/
87 typedef enum {
88     WMF_PTYPE_I       = 0,      //!< I Picture
89     WMF_PTYPE_P       = 1,      //!< P Picture
90     WMF_PTYPE_B       = 2,      //!< B Picture
91     WMF_PTYPE_BI      = 3,      //!< BI Picture
92     WMF_PTYPE_SKIPPED = 4       //!< Skipped Picture
93 
94 } WMF_ePTYPE;
95 
96 /*!
97 ******************************************************************************
98  This enumeration defines the stream profile
99 ******************************************************************************/
100 typedef enum {
101     WMF_PROFILE_SIMPLE          = 0,    //!< Simple profile
102     WMF_PROFILE_MAIN            = 1,    //!< Main profile
103     WMF_PROFILE_ADVANCED        = 2,    //!< Advanced profile (VC1 Only)
104     WMF_PROFILE_UNDEFINED   = 3,    //!< Undefined profile
105 
106 } WMF_eProfile;
107 
108 /*!
109 ******************************************************************************
110  This enumeration defines MVMODE [All] Tables 46-50 MVMODE and MVMODE2
111 ******************************************************************************/
112 typedef enum {
113     WMF_MVMODE_1MV                      = 0,    //!<    1 MV
114     WMF_MVMODE_1MV_HALF_PEL_BILINEAR    = 1,    //!<    1 MV Half-pel bilinear
115     WMF_MVMODE_1MV_HALF_PEL             = 2,    //!<    1 MV Half-pel
116     WMF_MVMODE_MIXED_MV                 = 3,    //!<    Mixed MV
117     WMF_MVMODE_INTENSITY_COMPENSATION   = 4,    //!<    Intensity Compensation
118     WMF_MVMODE_QUARTER_PEL_BICUBIC      = 5,    //!<    Quarter pel bicubic
119 
120 } WMF_eMVMODE;
121 
122 /*!
123 ******************************************************************************
124  This enumeration defines FCM [Advanced Profile Only] Table 41 gFCM_VlcTable
125 ******************************************************************************/
126 typedef enum {
127     VC1_FCM_P       = 0,    //!< 0      Progressive
128     VC1_FCM_FRMI    = 2,        //!< 10 Frame-Interlace
129     VC1_FCM_FLDI    = 3,        //!< 11 Field-Interlace
130 
131 } VC1_eFCM;
132 
133 /*!
134 ******************************************************************************
135  This enumeration defines the BDU Start Code Suffixes \n
136     0x00 - 0x09         SMPTE Reserved \n
137     0x20 - 0x7F         SMPTE Reserved \n
138     0x80  -0xFF         Forbidden
139 ******************************************************************************/
140 typedef enum {
141     VC1_SCS_ENDOFSEQU                           = 0x0A,         //!< End of sequence
142     VC1_SCS_SLICE                                       = 0x0B,         //!< Slice
143     VC1_SCS_FIELD                                       = 0x0C,         //!< Field
144     VC1_SCS_PIC_LAYER                           = 0x0D,         //!< Frame
145     VC1_SCS_ENTRYPNT_LAYER                      = 0x0E,         //!< Entry-point Header
146     VC1_SCS_SEQ_LAYER                           = 0x0F,         //!< Sequence Header
147     VC1_SCS_SLICELVL_USERDATA           = 0x1B,         //!< Slice Level User Data
148     VC1_SCS_FIELDLVL_USERDATA           = 0x1C,         //!< Field Level User Data
149     VC1_SCS_PICLVL_USERDATA                     = 0x1D,         //!< Frame Level User Data
150     VC1_SCS_ENTRYPNTLVL_USERDATA        = 0x1E,         //!< Entry-point Level User Data
151     VC1_SCS_SEQLVL_USERDATA                     = 0x1F,         //!< Sequence Level User Data
152 
153 } VC1_eSCS;
154 
155 /*! Test if picture type is a reference (I or P) */
156 #define PIC_TYPE_IS_REF(Type)   ((Type) == WMF_PTYPE_I || (Type) == WMF_PTYPE_P)
157 
158 /*! Test if picture type is intra (I or BI) */
159 #define PIC_TYPE_IS_INTRA(Type) ((Type) == WMF_PTYPE_I || (Type) == WMF_PTYPE_BI)
160 
161 /*! Test if picture type is inter (P or B) */
162 #define PIC_TYPE_IS_INTER(Type) ((Type) == WMF_PTYPE_P || (Type) == WMF_PTYPE_B)
163 
164 //! Maximum number of VLC tables for MB/block layer decode
165 #define MAX_VLC_TABLES  (12)
166 
167 #define COMPUTE_PULLBACK(s)     (VC1_MB_SIZE*((s+15)/VC1_MB_SIZE)*4 - 4)      /* 8.4.5.8 */
168 
169 //! VC1 MB Parameter Stride
170 #define VC1_MB_PARAM_STRIDE     (128)
171 
172 #define VC1_MAX_NUM_BITPLANES   (3)
173 
174 #define CABAC_RAM_WIDTH_IN_BITS (16)
175 
176 /*
177 ******************************************************************************
178  Frame Dimension Parameters
179 ******************************************************************************/
180 
181 //! Number of pixels in each MB dimension
182 #define VC1_MB_SIZE (16)
183 
184 //! Maximum resolution in frame width (X)
185 #define VC1_MAX_X   (4096)      // 1920
186 
187 //! Maximum resolution in frame height (Y)
188 #define VC1_MAX_Y   (2048)              // 1080
189 
190 //! Maximum resolution of frame
191 #define VC1_MAX_RES                     (VC1_MAX_X*VC1_MAX_Y)
192 
193 //! Maximum number of MBs in frame width (X)
194 #define VC1_MAX_NO_MBS_X        ((VC1_MAX_X + VC1_MB_SIZE - 1)/VC1_MB_SIZE)
195 
196 //! Maximum number of MBs in frame height (Y)
197 #define VC1_MAX_NO_MBS_Y        ((VC1_MAX_Y + VC1_MB_SIZE - 1)/VC1_MB_SIZE)
198 
199 //! Maximum number of MBs in frame
200 #define VC1_MAX_NO_MBS          ((VC1_MAX_RES + (VC1_MB_SIZE*VC1_MB_SIZE) - 1) /(VC1_MB_SIZE*VC1_MB_SIZE))
201 
202 //! Maximum number of bytes in bitplane
203 #define BITPLANE_BYTES          VC1_MAX_NO_MBS
204 
205 //! Maximum number of pan/scan windows per frame (VC1 Specification: 7.1.1.20)
206 #define VC1_MAX_PANSCAN_WINDOWS (4)
207