1 /*
2 * Copyright (c) 2017, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file     codec_def_decode_vc1.h
24 //! \brief    Defines decode VC1 types and macros shared by CodecHal, MHW, and DDI layer
25 //! \details  Applies to JPEG decode only. Should not contain any DDI specific code.
26 //!
27 #ifndef __CODEC_DEF_DECODE_VC1_H__
28 #define __CODEC_DEF_DECODE_VC1_H__
29 
30 // VC1 reference flags
31 #define CODECHAL_WMV9_RANGE_ADJUSTMENT   0x00100000
32 #define CODECHAL_VC1_PROGRESSIVE         0x00200000
33 #define CODECHAL_VC1_TOP_FIELD_COMP      0x00010000
34 #define CODECHAL_VC1_TOP_FIELD_COMP_2    0x00020000
35 #define CODECHAL_VC1_BOT_FIELD_COMP      0x00040000
36 #define CODECHAL_VC1_BOT_FIELD_COMP_2    0x00080000
37 #define CODECHAL_VC1_FRAME_COMP          (CODECHAL_VC1_TOP_FIELD_COMP | CODECHAL_VC1_BOT_FIELD_COMP)
38 #define CODECHAL_VC1_ALL_COMP            0x000F0000
39 
40 //!
41 //! \enum  Vc1FramPictureType
42 //! \brief VC1 fram picture Types
43 //!
44 enum Vc1FramPictureType
45 {
46     vc1IFrame = 0,
47     vc1PFrame,
48     vc1BFrame,
49     vc1BIFrame,
50     vc1SkippedFrame
51 };
52 
53 //!
54 //! \enum  Vc1FieldPictureType
55 //! \brief VC1 field picture Types
56 //!
57 enum Vc1FieldPictureType
58 {
59     vc1IIField = 0,
60     vc1IPField,
61     vc1PIField,
62     vc1PPField,
63     vc1BBField,
64     vc1BBIField,
65     vc1BIBField,
66     vc1BIBIField
67 };
68 
69 //!
70 //! \enum  Vc1QuantizerType
71 //! \brief VC-1 Spec Table 259: Quantizer Specification
72 //!
73 enum Vc1QuantizerType
74 {
75     vc1QuantizerImplicit = 0, // specified at frame level
76     vc1QuantizerExplicit,     // specified at frame level
77     vc1QuantizerNonuniform,   // used for all frames
78     vc1QuantizerUniform       // used for all frames
79 };
80 
81 typedef struct _CODEC_VC1_PIC_PARAMS
82 {
83     CODEC_PICTURE    CurrPic;
84     uint16_t         DeblockedPicIdx;
85     uint16_t         ForwardRefIdx;
86     uint16_t         BackwardRefIdx;
87 
88     /* sequence layer for AP or meta data for SP and MP */
89     union
90     {
91         struct
92         {
93             uint32_t         pulldown                       : 1;    /* SEQUENCE_LAYER::PULLDOWN */
94             uint32_t         interlace                      : 1;    /* SEQUENCE_LAYER::INTERLACE */
95             uint32_t         tfcntrflag                     : 1;    /* SEQUENCE_LAYER::TFCNTRFLAG */
96             uint32_t         finterpflag                    : 1;    /* SEQUENCE_LAYER::FINTERPFLAG */
97             uint32_t         psf                            : 1;    /* SEQUENCE_LAYER::PSF */
98             uint32_t         multires                       : 1;    /* METADATA::MULTIRES */
99             uint32_t         overlap                        : 1;    /* METADATA::OVERLAP */
100             uint32_t         syncmarker                     : 1;    /* METADATA::SYNCMARKER */
101             uint32_t         rangered                       : 1;    /* METADATA::RANGERED */
102             uint32_t         max_b_frames                   : 3;    /* METADATA::MAXBFRAMES */
103             uint32_t         AdvancedProfileFlag            : 1;
104         };
105         uint32_t         value;
106     } sequence_fields;
107 
108     uint16_t         coded_width;                                 /* ENTRY_POINT_LAYER::CODED_WIDTH */
109     uint16_t         coded_height;                                /* ENTRY_POINT_LAYER::CODED_HEIGHT */
110     union
111     {
112         struct
113         {
114             uint32_t         broken_link                    : 1;    /* ENTRY_POINT_LAYER::BROKEN_LINK */
115             uint32_t         closed_entry                   : 1;    /* ENTRY_POINT_LAYER::CLOSED_ENTRY */
116             uint32_t         panscan_flag                   : 1;    /* ENTRY_POINT_LAYER::PANSCAN_FLAG */
117             uint32_t         loopfilter                     : 1;    /* ENTRY_POINT_LAYER::LOOPFILTER */
118         };
119         uint32_t         value;
120     } entrypoint_fields;
121     uint8_t         conditional_overlap_flag;                     /* ENTRY_POINT_LAYER::CONDOVER */
122     uint8_t         fast_uvmc_flag;                               /* ENTRY_POINT_LAYER::FASTUVMC */
123     union
124     {
125         struct
126         {
127             uint32_t         luma_flag                      : 1;    /* ENTRY_POINT_LAYER::RANGE_MAPY_FLAG */
128             uint32_t         luma                           : 3;    /* ENTRY_POINT_LAYER::RANGE_MAPY */
129             uint32_t         chroma_flag                    : 1;    /* ENTRY_POINT_LAYER::RANGE_MAPUV_FLAG */
130             uint32_t         chroma                         : 3;    /* ENTRY_POINT_LAYER::RANGE_MAPUV */
131         };
132         uint32_t         range_mapping_enabled;
133     } range_mapping_fields;
134 
135     uint8_t         UpsamplingFlag;
136     uint8_t         ScaleFactor;                                  /* derived from BFRACTION*/
137     uint8_t         b_picture_fraction;                           /* PICTURE_LAYER::BFRACTION */
138     uint8_t         cbp_table;                                    /* PICTURE_LAYER::CBPTAB/ICBPTAB */
139     uint8_t         mb_mode_table;                                /* PICTURE_LAYER::MBMODETAB */
140     uint8_t         range_reduction_frame;                        /* PICTURE_LAYER::RANGEREDFRM */
141     uint8_t         rounding_control;                             /* PICTURE_LAYER::RNDCTRL */
142     uint8_t         post_processing;                              /* PICTURE_LAYER::POSTPROC */
143     uint8_t         picture_resolution_index;                     /* PICTURE_LAYER::RESPIC */
144     uint16_t        luma_scale;                                   /* PICTURE_LAYER::LUMSCALE */
145     uint16_t        luma_shift;                                   /* PICTURE_LAYER::LUMSHIFT */
146     union
147     {
148         struct
149         {
150             uint32_t         picture_type                   : 3;    /* PICTURE_LAYER::PTYPE */
151             uint32_t         frame_coding_mode              : 3;    /* PICTURE_LAYER::FCM */
152             uint32_t         top_field_first                : 1;    /* PICTURE_LAYER::TFF */
153             uint32_t         is_first_field                 : 1;    /* set to 1 if it is the first field */
154             uint32_t         intensity_compensation         : 1;    /* PICTURE_LAYER::INTCOMP */
155         };
156         uint32_t         value;
157     } picture_fields;
158     union
159     {
160         struct
161         {
162             uint32_t         bitplane_present               : 1;
163             uint32_t         mv_type_mb                     : 1;    /* PICTURE::MVTYPEMB */
164             uint32_t         direct_mb                      : 1;    /* PICTURE::DIRECTMB */
165             uint32_t         skip_mb                        : 1;    /* PICTURE::SKIPMB */
166             uint32_t         field_tx                       : 1;    /* PICTURE::FIELDTX */
167             uint32_t         forward_mb                     : 1;    /* PICTURE::FORWARDMB */
168             uint32_t         ac_pred                        : 1;    /* PICTURE::ACPRED */
169             uint32_t         overflags                      : 1;    /* PICTURE::OVERFLAGS */
170         };
171         uint32_t         value;
172     } raw_coding;
173 
174     union
175     {
176         struct
177         {
178             uint32_t         reference_distance_flag        : 1;    /* PICTURE_LAYER::REFDIST_FLAG */
179             uint32_t         reference_distance             : 5;    /* PICTURE_LAYER::REFDIST */
180             uint32_t         BwdReferenceDistance           : 5;
181             uint32_t         num_reference_pictures         : 1;    /* PICTURE_LAYER::NUMREF */
182             uint32_t         reference_field_pic_indicator  : 1;    /* PICTURE_LAYER::REFFIELD */
183             uint32_t         reference_picture_flag         : 1;    /* set to 1 if it will be used as a reference picture */
184         };
185         uint32_t         value;
186     } reference_fields;
187     union
188     {
189         struct
190         {
191             uint32_t         MvMode                         : 4;
192             uint32_t         UnifiedMvMode                  : 3;    /* Combination of MVMODE and MVMODE1 */
193             uint32_t         mv_table                       : 3;    /* PICTURE_LAYER::MVTAB/IMVTAB */
194             uint32_t         two_mv_block_pattern_table     : 2;    /* PICTURE_LAYER::2MVBPTAB */
195             uint32_t         four_mv_switch                 : 1;    /* PICTURE_LAYER::4MVSWITCH */
196             uint32_t         four_mv_block_pattern_table    : 2;    /* PICTURE_LAYER::4MVBPTAB */
197             uint32_t         extended_mv_flag               : 1;    /* ENTRY_POINT_LAYER::EXTENDED_MV */
198             uint32_t         extended_mv_range              : 2;    /* PICTURE_LAYER::MVRANGE */
199             uint32_t         extended_dmv_flag              : 1;    /* ENTRY_POINT_LAYER::EXTENDED_DMV */
200             uint32_t         extended_dmv_range             : 2;    /* PICTURE_LAYER::DMVRANGE */
201             uint32_t         four_mv_allowed                : 1;    /* PICTURE_LAYER::4MVSWITCH */
202         };
203         uint32_t         value;
204     } mv_fields;
205     union
206     {
207         struct
208         {
209             uint32_t         dquant                         : 2;    /* ENTRY_POINT_LAYER::DQUANT */
210             uint32_t         quantizer                      : 2;    /* ENTRY_POINT_LAYER::QUANTIZER */
211             uint32_t         half_qp                        : 1;    /* PICTURE_LAYER::HALFQP */
212             uint32_t         AltPQuantEdgeMask              : 4;    /* Derived from DQUANT, DQUANTTFRM, DQPROFILE, DDQSBEDGE, DQDBEDGE, DQBILEVEL*/
213             uint32_t         AltPQuantConfig                : 2;    /* Derived from DQUANT, DQUANTTFRM, DQPROFILE, DDQSBEDGE, DQDBEDGE, DQBILEVEL*/
214             uint32_t         pic_quantizer_scale            : 5;    /* PICTURE_LAYER::PQUANT */
215             uint32_t         pic_quantizer_type             : 1;    /* PICTURE_LAYER::PQUANTIZER */
216             uint32_t         alt_pic_quantizer              : 5;    /* VOPDQUANT::ALTPQUANT */
217         };
218         uint32_t         value;
219     } pic_quantizer_fields;
220     union
221     {
222         struct
223         {
224             uint32_t         variable_sized_transform_flag  : 1;    /* ENTRY_POINT_LAYER::VSTRANSFORM */
225             uint32_t         mb_level_transform_type_flag   : 1;    /* PICTURE_LAYER::TTMBF */
226             uint32_t         frame_level_transform_type     : 2;    /* PICTURE_LAYER::TTFRM */
227             uint32_t         transform_ac_codingset_idx1    : 2;    /* PICTURE_LAYER::TRANSACFRM */
228             uint32_t         transform_ac_codingset_idx2    : 2;    /* PICTURE_LAYER::TRANSACFRM2 */
229             uint32_t         intra_transform_dc_table       : 1;    /* PICTURE_LAYER::TRANSDCTAB */
230         };
231         uint32_t         value;
232     } transform_fields;
233 
234     uint32_t         StatusReportFeedbackNumber;
235 } CODEC_VC1_PIC_PARAMS, *PCODEC_VC1_PIC_PARAMS;
236 
237 typedef struct _CODEC_VC1_SLICE_PARAMS
238 {
239     uint32_t                        slice_data_size;    /* number of bytes in the slice data buffer for this slice */
240     uint32_t                        slice_data_offset;  /* the offset to the first byte of slice data */
241     uint32_t                        macroblock_offset;  /* the offset to the first bit of MB from the first byte of slice data */
242     uint32_t                        slice_vertical_position;
243     uint32_t                        b_picture_fraction; /* BFRACTION */
244     uint32_t                        number_macroblocks; /* number of macroblocks in the slice */
245 } CODEC_VC1_SLICE_PARAMS, *PCODEC_VC1_SLICE_PARAMS;
246 
247 typedef struct _CODEC_VC1_MB_PARAMS
248 {
249     uint16_t                      mb_address;
250     uint8_t                       mb_skips_following; /* the number of skipped macroblocks to be generated following the current macroblock */
251     uint8_t                       num_coef[CODEC_NUM_BLOCK_PER_MB];    /* the number of coefficients in the residual difference data buffer for each block i of the macroblock */
252     uint32_t                      data_offset;        /* data offset in the residual data buffer, byte offset (32-bit multiple index) */
253     uint32_t                      data_length;        /* length of the residual data for the macroblock */
254     union
255     {
256         struct
257         {
258             uint16_t         intra_mb                     : 1;
259             uint16_t         motion_forward               : 1;
260             uint16_t         motion_backward              : 1;
261             uint16_t         motion_4mv                   : 1;
262             uint16_t         h261_loopfilter              : 1;
263             uint16_t         field_residual               : 1;
264             uint16_t         mb_scan_method               : 2;
265             uint16_t         motion_type                  : 2;
266             uint16_t         host_resid_diff              : 1;
267             uint16_t         reserved                     : 1;
268             uint16_t         mvert_field_sel_0            : 1;
269             uint16_t         mvert_field_sel_1            : 1;
270             uint16_t         mvert_field_sel_2            : 1;
271             uint16_t         mvert_field_sel_3            : 1;
272         };
273         uint16_t         value;
274     } mb_type;
275     union
276     {
277         struct
278         {
279             uint16_t         block_coded_pattern          : 6;
280             uint16_t         block_luma_intra             : 4;
281             uint16_t         block_chroma_intra           : 1;
282             uint16_t                                      : 5;
283         };
284         uint16_t         value;
285     } pattern_code;
286     union
287     {
288         struct
289         {
290             uint16_t         mv_x         : 16;
291             uint16_t         mv_y         : 16;
292         };
293         uint32_t         value;
294     } motion_vector[4];
295 } CODEC_VC1_MB_PARAMS, *PCODEC_VC1_MB_PARAMS;
296 
297 #endif  // __CODEC_DEF_DECODE_VC1_H__
298 
299