1/**************************************************************************
2 *
3 * Copyright 2009 Younes Manton.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28#ifndef PIPE_VIDEO_STATE_H
29#define PIPE_VIDEO_STATE_H
30
31#include "pipe/p_defines.h"
32#include "pipe/p_format.h"
33#include "pipe/p_state.h"
34#include "pipe/p_screen.h"
35#include "util/u_inlines.h"
36
37#ifdef __cplusplus
38extern "C" {
39#endif
40
41/*
42 * see table 6-12 in the spec
43 */
44enum pipe_mpeg12_picture_coding_type
45{
46   PIPE_MPEG12_PICTURE_CODING_TYPE_I = 0x01,
47   PIPE_MPEG12_PICTURE_CODING_TYPE_P = 0x02,
48   PIPE_MPEG12_PICTURE_CODING_TYPE_B = 0x03,
49   PIPE_MPEG12_PICTURE_CODING_TYPE_D = 0x04
50};
51
52/*
53 * see table 6-14 in the spec
54 */
55enum pipe_mpeg12_picture_structure
56{
57   PIPE_MPEG12_PICTURE_STRUCTURE_RESERVED = 0x00,
58   PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_TOP = 0x01,
59   PIPE_MPEG12_PICTURE_STRUCTURE_FIELD_BOTTOM = 0x02,
60   PIPE_MPEG12_PICTURE_STRUCTURE_FRAME = 0x03
61};
62
63/*
64 * flags for macroblock_type, see section 6.3.17.1 in the spec
65 */
66enum pipe_mpeg12_macroblock_type
67{
68   PIPE_MPEG12_MB_TYPE_QUANT = 0x01,
69   PIPE_MPEG12_MB_TYPE_MOTION_FORWARD = 0x02,
70   PIPE_MPEG12_MB_TYPE_MOTION_BACKWARD = 0x04,
71   PIPE_MPEG12_MB_TYPE_PATTERN = 0x08,
72   PIPE_MPEG12_MB_TYPE_INTRA = 0x10
73};
74
75/*
76 * flags for motion_type, see table 6-17 and 6-18 in the spec
77 */
78enum pipe_mpeg12_motion_type
79{
80   PIPE_MPEG12_MO_TYPE_RESERVED = 0x00,
81   PIPE_MPEG12_MO_TYPE_FIELD = 0x01,
82   PIPE_MPEG12_MO_TYPE_FRAME = 0x02,
83   PIPE_MPEG12_MO_TYPE_16x8 = 0x02,
84   PIPE_MPEG12_MO_TYPE_DUAL_PRIME = 0x03
85};
86
87/*
88 * see section 6.3.17.1 and table 6-19 in the spec
89 */
90enum pipe_mpeg12_dct_type
91{
92   PIPE_MPEG12_DCT_TYPE_FRAME = 0,
93   PIPE_MPEG12_DCT_TYPE_FIELD = 1
94};
95
96enum pipe_mpeg12_field_select
97{
98   PIPE_MPEG12_FS_FIRST_FORWARD = 0x01,
99   PIPE_MPEG12_FS_FIRST_BACKWARD = 0x02,
100   PIPE_MPEG12_FS_SECOND_FORWARD = 0x04,
101   PIPE_MPEG12_FS_SECOND_BACKWARD = 0x08
102};
103
104struct pipe_picture_desc
105{
106   enum pipe_video_profile profile;
107};
108
109struct pipe_quant_matrix
110{
111   enum pipe_video_codec codec;
112};
113
114struct pipe_macroblock
115{
116   enum pipe_video_codec codec;
117};
118
119struct pipe_mpeg12_picture_desc
120{
121   struct pipe_picture_desc base;
122
123   unsigned picture_coding_type;
124   unsigned picture_structure;
125   unsigned frame_pred_frame_dct;
126   unsigned q_scale_type;
127   unsigned alternate_scan;
128   unsigned intra_vlc_format;
129   unsigned concealment_motion_vectors;
130   unsigned intra_dc_precision;
131   unsigned f_code[2][2];
132   unsigned top_field_first;
133   unsigned full_pel_forward_vector;
134   unsigned full_pel_backward_vector;
135   unsigned num_slices;
136
137   const uint8_t *intra_matrix;
138   const uint8_t *non_intra_matrix;
139
140   struct pipe_video_buffer *ref[2];
141};
142
143struct pipe_mpeg12_macroblock
144{
145   struct pipe_macroblock base;
146
147   /* see section 6.3.17 in the spec */
148   unsigned short x, y;
149
150   /* see section 6.3.17.1 in the spec */
151   unsigned char macroblock_type;
152
153   union {
154      struct {
155         /* see table 6-17 in the spec */
156         unsigned int frame_motion_type:2;
157
158         /* see table 6-18 in the spec */
159         unsigned int field_motion_type:2;
160
161         /* see table 6-19 in the spec */
162         unsigned int dct_type:1;
163      } bits;
164      unsigned int value;
165   } macroblock_modes;
166
167    /* see section 6.3.17.2 in the spec */
168   unsigned char motion_vertical_field_select;
169
170   /* see Table 7-7 in the spec */
171   short PMV[2][2][2];
172
173   /* see figure 6.10-12 in the spec */
174   unsigned short coded_block_pattern;
175
176   /* see figure 6.10-12 in the spec */
177   short *blocks;
178
179   /* Number of skipped macroblocks after this macroblock */
180   unsigned short num_skipped_macroblocks;
181};
182
183struct pipe_mpeg4_picture_desc
184{
185   struct pipe_picture_desc base;
186
187   int32_t trd[2];
188   int32_t trb[2];
189   uint16_t vop_time_increment_resolution;
190   uint8_t vop_coding_type;
191   uint8_t vop_fcode_forward;
192   uint8_t vop_fcode_backward;
193   uint8_t resync_marker_disable;
194   uint8_t interlaced;
195   uint8_t quant_type;
196   uint8_t quarter_sample;
197   uint8_t short_video_header;
198   uint8_t rounding_control;
199   uint8_t alternate_vertical_scan_flag;
200   uint8_t top_field_first;
201
202   const uint8_t *intra_matrix;
203   const uint8_t *non_intra_matrix;
204
205   struct pipe_video_buffer *ref[2];
206};
207
208struct pipe_vc1_picture_desc
209{
210   struct pipe_picture_desc base;
211
212   uint32_t slice_count;
213   uint8_t picture_type;
214   uint8_t frame_coding_mode;
215   uint8_t postprocflag;
216   uint8_t pulldown;
217   uint8_t interlace;
218   uint8_t tfcntrflag;
219   uint8_t finterpflag;
220   uint8_t psf;
221   uint8_t dquant;
222   uint8_t panscan_flag;
223   uint8_t refdist_flag;
224   uint8_t quantizer;
225   uint8_t extended_mv;
226   uint8_t extended_dmv;
227   uint8_t overlap;
228   uint8_t vstransform;
229   uint8_t loopfilter;
230   uint8_t fastuvmc;
231   uint8_t range_mapy_flag;
232   uint8_t range_mapy;
233   uint8_t range_mapuv_flag;
234   uint8_t range_mapuv;
235   uint8_t multires;
236   uint8_t syncmarker;
237   uint8_t rangered;
238   uint8_t maxbframes;
239   uint8_t deblockEnable;
240   uint8_t pquant;
241
242   struct pipe_video_buffer *ref[2];
243};
244
245struct pipe_h264_picture_desc
246{
247   struct pipe_picture_desc base;
248
249   uint32_t slice_count;
250   int32_t  field_order_cnt[2];
251   bool     is_reference;
252   uint32_t frame_num;
253   uint8_t  field_pic_flag;
254   uint8_t  bottom_field_flag;
255   uint8_t  num_ref_frames;
256   uint8_t  mb_adaptive_frame_field_flag;
257   uint8_t  constrained_intra_pred_flag;
258   uint8_t  weighted_pred_flag;
259   uint8_t  weighted_bipred_idc;
260   uint8_t  frame_mbs_only_flag;
261   uint8_t  transform_8x8_mode_flag;
262   int8_t   chroma_qp_index_offset;
263   int8_t   second_chroma_qp_index_offset;
264   int8_t   pic_init_qp_minus26;
265   uint8_t  num_ref_idx_l0_active_minus1;
266   uint8_t  num_ref_idx_l1_active_minus1;
267   uint8_t  log2_max_frame_num_minus4;
268   uint8_t  pic_order_cnt_type;
269   uint8_t  log2_max_pic_order_cnt_lsb_minus4;
270   uint8_t  delta_pic_order_always_zero_flag;
271   uint8_t  direct_8x8_inference_flag;
272   uint8_t  entropy_coding_mode_flag;
273   uint8_t  pic_order_present_flag;
274   uint8_t  deblocking_filter_control_present_flag;
275   uint8_t  redundant_pic_cnt_present_flag;
276   uint8_t  scaling_lists_4x4[6][16];
277   uint8_t  scaling_lists_8x8[2][64];
278
279   bool     is_long_term[16];
280   bool     top_is_reference[16];
281   bool     bottom_is_reference[16];
282   uint32_t field_order_cnt_list[16][2];
283   uint32_t frame_num_list[16];
284
285   struct pipe_video_buffer *ref[16];
286};
287
288#ifdef __cplusplus
289}
290#endif
291
292#endif /* PIPE_VIDEO_STATE_H */
293