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 * Li Zeng <li.zeng@intel.com>
28 *
29 */
30
31 #include "pnw_MPEG4.h"
32 #include "tng_vld_dec.h"
33 #include "psb_def.h"
34 #include "psb_drv_debug.h"
35
36 #include "hwdefs/reg_io2.h"
37 #include "hwdefs/msvdx_offsets.h"
38 #include "hwdefs/msvdx_cmds_io2.h"
39 #include "hwdefs/msvdx_vec_reg_io2.h"
40 #include "hwdefs/msvdx_vec_mpeg4_reg_io2.h"
41 #include "hwdefs/dxva_fw_ctrl.h"
42
43 #include <stdlib.h>
44 #include <stdint.h>
45 #include <string.h>
46
47 #define GET_SURFACE_INFO_is_defined(psb_surface) ((int) (psb_surface->extra_info[0]))
48 #define SET_SURFACE_INFO_is_defined(psb_surface, val) psb_surface->extra_info[0] = (uint32_t) val;
49 #define GET_SURFACE_INFO_picture_structure(psb_surface) (psb_surface->extra_info[1])
50 #define SET_SURFACE_INFO_picture_structure(psb_surface, val) psb_surface->extra_info[1] = val;
51 #define GET_SURFACE_INFO_picture_coding_type(psb_surface) ((int) (psb_surface->extra_info[2]))
52 #define SET_SURFACE_INFO_picture_coding_type(psb_surface, val) psb_surface->extra_info[2] = (uint32_t) val;
53
54 #define SLICEDATA_BUFFER_TYPE(type) ((type==VASliceDataBufferType)?"VASliceDataBufferType":"VAProtectedSliceDataBufferType")
55
56 #define PIXELS_TO_MB(x) ((x + 15) / 16)
57
58 /*
59 * Frame types - format dependant!
60 */
61 #define PICTURE_CODING_I 0x00
62 #define PICTURE_CODING_P 0x01
63 #define PICTURE_CODING_B 0x02
64 #define PICTURE_CODING_S 0x03
65
66
67 #define FE_STATE_BUFFER_SIZE 4096
68 #define FE_STATE_SAVE_SIZE ( 0xB40 - 0x700 )
69
70 #define MPEG4_PROFILE_SIMPLE 0
71 #define MPEG4_PROFILE_ASP 2
72
73 #define HW_SUPPORTED_MAX_PICTURE_WIDTH_MPEG4 1920
74 #define HW_SUPPORTED_MAX_PICTURE_HEIGHT_MPEG4 1088
75 #define HW_SUPPORTED_MAX_PICTURE_WIDTH_H263 720
76 #define HW_SUPPORTED_MAX_PICTURE_HEIGHT_H263 576
77
78 /* Table V2-2 ISO/IEC 14496-2:2001(E) - sprite enable codewords */
79 typedef enum {
80 SPRITE_NOT_USED = 0,
81 STATIC,
82 GMC,
83 } MPEG4_eSpriteEnable;
84
85
86 #define MAX_QUANT_TABLES (2) /* only 2 tables for 4:2:0 decode */
87
88 static int scan0[64] = { // spec, fig 7-2
89 /*u 0 ..... 7*/
90 0, 1, 5, 6, 14, 15, 27, 28, /* v = 0 */
91 2, 4, 7, 13, 16, 26, 29, 42,
92 3, 8, 12, 17, 25, 30, 41, 43,
93 9, 11, 18, 24, 31, 40, 44, 53,
94 10, 19, 23, 32, 39, 45, 52, 54,
95 20, 22, 33, 38, 46, 51, 55, 60,
96 21, 34, 37, 47, 50, 56, 59, 61,
97 35, 36, 48, 49, 57, 58, 62, 63 /* v = 7 */
98 };
99
100 typedef enum {
101 NONINTRA_LUMA_Q = 0,
102 INTRA_LUMA_Q = 1
103 } QUANT_IDX;
104
105 /************************************************************************************/
106 /* Variable length codes in 'packed' format */
107 /************************************************************************************/
108
109 /* Format is: opcode, width, symbol. All VLC tables are concatenated. */
110 #define VLC_PACK(a,b,c) ( ( (a) << 12 ) | ( (b) << 9 ) | (c) )
111 static const IMG_UINT16 gaui16mpeg4VlcTableDataPacked[] =
112 {
113 /* B6_mcbpc_i_s_vops_piece.out */
114 VLC_PACK( 4 , 0 , 12 ) ,
115 VLC_PACK( 5 , 0 , 7 ) ,
116 VLC_PACK( 4 , 2 , 13 ) ,
117 VLC_PACK( 4 , 3 , 16 ) ,
118 VLC_PACK( 5 , 0 , 9 ) ,
119 VLC_PACK( 4 , 5 , 17 ) ,
120 VLC_PACK( 2 , 2 , 1 ) ,
121 VLC_PACK( 3 , 2 , 0 ) ,
122 VLC_PACK( 3 , 2 , 0 ) ,
123 VLC_PACK( 4 , 2 , 36 ) ,
124 VLC_PACK( 3 , 2 , 0 ) ,
125 /* B7_mcbpc_p_s_vops_update.out */
126 VLC_PACK( 4 , 0 , 0 ) ,
127 VLC_PACK( 0 , 0 , 6 ) ,
128 VLC_PACK( 0 , 0 , 7 ) ,
129 VLC_PACK( 2 , 1 , 8 ) ,
130 VLC_PACK( 0 , 1 , 10 ) ,
131 VLC_PACK( 2 , 1 , 13 ) ,
132 VLC_PACK( 0 , 2 , 15 ) ,
133 VLC_PACK( 4 , 0 , 8 ) ,
134 VLC_PACK( 4 , 0 , 4 ) ,
135 VLC_PACK( 4 , 0 , 2 ) ,
136 VLC_PACK( 4 , 0 , 1 ) ,
137 VLC_PACK( 4 , 0 , 12 ) ,
138 VLC_PACK( 4 , 1 , 3 ) ,
139 VLC_PACK( 4 , 1 , 16 ) ,
140 VLC_PACK( 4 , 1 , 10 ) ,
141 VLC_PACK( 4 , 1 , 9 ) ,
142 VLC_PACK( 4 , 1 , 6 ) ,
143 VLC_PACK( 4 , 1 , 5 ) ,
144 VLC_PACK( 4 , 0 , 15 ) ,
145 VLC_PACK( 4 , 1 , 11 ) ,
146 VLC_PACK( 4 , 1 , 13 ) ,
147 VLC_PACK( 3 , 2 , 0 ) ,
148 VLC_PACK( 4 , 2 , 36 ) ,
149 VLC_PACK( 4 , 2 , 19 ) ,
150 VLC_PACK( 4 , 2 , 18 ) ,
151 VLC_PACK( 4 , 2 , 17 ) ,
152 VLC_PACK( 4 , 2 , 7 ) ,
153 VLC_PACK( 4 , 1 , 14 ) ,
154 VLC_PACK( 4 , 1 , 14 ) ,
155 /* B8_cbpy_intra.out */
156 VLC_PACK( 1 , 1 , 16 ) ,
157 VLC_PACK( 0 , 0 , 18 ) ,
158 VLC_PACK( 0 , 0 , 19 ) ,
159 VLC_PACK( 4 , 3 , 0 ) ,
160 VLC_PACK( 4 , 3 , 12 ) ,
161 VLC_PACK( 4 , 3 , 10 ) ,
162 VLC_PACK( 4 , 3 , 14 ) ,
163 VLC_PACK( 4 , 3 , 5 ) ,
164 VLC_PACK( 4 , 3 , 13 ) ,
165 VLC_PACK( 4 , 3 , 3 ) ,
166 VLC_PACK( 4 , 3 , 11 ) ,
167 VLC_PACK( 4 , 3 , 7 ) ,
168 VLC_PACK( 4 , 1 , 15 ) ,
169 VLC_PACK( 4 , 1 , 15 ) ,
170 VLC_PACK( 4 , 1 , 15 ) ,
171 VLC_PACK( 4 , 1 , 15 ) ,
172 VLC_PACK( 3 , 1 , 0 ) ,
173 VLC_PACK( 4 , 1 , 6 ) ,
174 VLC_PACK( 4 , 1 , 9 ) ,
175 VLC_PACK( 4 , 0 , 8 ) ,
176 VLC_PACK( 4 , 0 , 4 ) ,
177 VLC_PACK( 4 , 0 , 2 ) ,
178 VLC_PACK( 4 , 0 , 1 ) ,
179 /* B8_cbpy_inter.out */
180 VLC_PACK( 1 , 1 , 16 ) ,
181 VLC_PACK( 0 , 0 , 18 ) ,
182 VLC_PACK( 6 , 0 , 6 ) ,
183 VLC_PACK( 4 , 3 , 15 ) ,
184 VLC_PACK( 4 , 3 , 3 ) ,
185 VLC_PACK( 4 , 3 , 5 ) ,
186 VLC_PACK( 4 , 3 , 1 ) ,
187 VLC_PACK( 4 , 3 , 10 ) ,
188 VLC_PACK( 4 , 3 , 2 ) ,
189 VLC_PACK( 4 , 3 , 12 ) ,
190 VLC_PACK( 4 , 3 , 4 ) ,
191 VLC_PACK( 4 , 3 , 8 ) ,
192 VLC_PACK( 4 , 1 , 0 ) ,
193 VLC_PACK( 4 , 1 , 0 ) ,
194 VLC_PACK( 4 , 1 , 0 ) ,
195 VLC_PACK( 4 , 1 , 0 ) ,
196 VLC_PACK( 3 , 1 , 0 ) ,
197 VLC_PACK( 4 , 1 , 9 ) ,
198 VLC_PACK( 4 , 1 , 6 ) ,
199 VLC_PACK( 4 , 0 , 7 ) ,
200 VLC_PACK( 4 , 0 , 11 ) ,
201 /* B3_modb.out */
202 VLC_PACK( 4 , 0 , 0 ) ,
203 VLC_PACK( 4 , 1 , 1 ) ,
204 VLC_PACK( 4 , 1 , 2 ) ,
205 /* B4_mb_type.out */
206 VLC_PACK( 4 , 0 , 0 ) ,
207 VLC_PACK( 4 , 1 , 1 ) ,
208 VLC_PACK( 4 , 2 , 2 ) ,
209 VLC_PACK( 4 , 3 , 3 ) ,
210 VLC_PACK( 3 , 3 , 0 ) ,
211 /* 6_33_dbquant.out */
212 VLC_PACK( 4 , 0 , 0 ) ,
213 VLC_PACK( 4 , 1 , 6 ) ,
214 VLC_PACK( 4 , 1 , 2 ) ,
215 /* B12_mvd.out */
216 VLC_PACK( 4 , 0 , 0 ) ,
217 VLC_PACK( 5 , 0 , 1 ) ,
218 VLC_PACK( 5 , 0 , 2 ) ,
219 VLC_PACK( 5 , 0 , 3 ) ,
220 VLC_PACK( 2 , 1 , 3 ) ,
221 VLC_PACK( 2 , 3 , 5 ) ,
222 VLC_PACK( 0 , 3 , 11 ) ,
223 VLC_PACK( 5 , 0 , 4 ) ,
224 VLC_PACK( 5 , 0 , 5 ) ,
225 VLC_PACK( 5 , 0 , 6 ) ,
226 VLC_PACK( 5 , 0 , 7 ) ,
227 VLC_PACK( 0 , 0 , 4 ) ,
228 VLC_PACK( 5 , 0 , 10 ) ,
229 VLC_PACK( 5 , 0 , 11 ) ,
230 VLC_PACK( 5 , 0 , 12 ) ,
231 VLC_PACK( 5 , 0 , 9 ) ,
232 VLC_PACK( 5 , 0 , 8 ) ,
233 VLC_PACK( 1 , 1 , 16 ) ,
234 VLC_PACK( 0 , 0 , 18 ) ,
235 VLC_PACK( 0 , 0 , 19 ) ,
236 VLC_PACK( 0 , 0 , 20 ) ,
237 VLC_PACK( 5 , 0 , 24 ) ,
238 VLC_PACK( 5 , 0 , 23 ) ,
239 VLC_PACK( 5 , 0 , 22 ) ,
240 VLC_PACK( 5 , 0 , 21 ) ,
241 VLC_PACK( 5 , 0 , 20 ) ,
242 VLC_PACK( 5 , 0 , 19 ) ,
243 VLC_PACK( 5 , 0 , 18 ) ,
244 VLC_PACK( 5 , 0 , 17 ) ,
245 VLC_PACK( 5 , 0 , 16 ) ,
246 VLC_PACK( 5 , 0 , 15 ) ,
247 VLC_PACK( 5 , 0 , 14 ) ,
248 VLC_PACK( 5 , 0 , 13 ) ,
249 VLC_PACK( 3 , 1 , 0 ) ,
250 VLC_PACK( 5 , 0 , 32 ) ,
251 VLC_PACK( 5 , 0 , 31 ) ,
252 VLC_PACK( 5 , 0 , 30 ) ,
253 VLC_PACK( 5 , 0 , 29 ) ,
254 VLC_PACK( 5 , 0 , 28 ) ,
255 VLC_PACK( 5 , 0 , 27 ) ,
256 VLC_PACK( 5 , 0 , 26 ) ,
257 VLC_PACK( 5 , 0 , 25 ) ,
258 /* B13_dct_dc_size_luminance.out */
259 VLC_PACK( 2 , 5 , 4 ) ,
260 VLC_PACK( 0 , 0 , 14 ) ,
261 VLC_PACK( 4 , 1 , 2 ) ,
262 VLC_PACK( 4 , 1 , 1 ) ,
263 VLC_PACK( 4 , 0 , 4 ) ,
264 VLC_PACK( 4 , 1 , 5 ) ,
265 VLC_PACK( 4 , 2 , 6 ) ,
266 VLC_PACK( 4 , 3 , 7 ) ,
267 VLC_PACK( 4 , 4 , 8 ) ,
268 VLC_PACK( 4 , 5 , 9 ) ,
269 VLC_PACK( 2 , 2 , 1 ) ,
270 VLC_PACK( 4 , 0 , 10 ) ,
271 VLC_PACK( 4 , 1 , 11 ) ,
272 VLC_PACK( 4 , 2 , 12 ) ,
273 VLC_PACK( 3 , 2 , 0 ) ,
274 VLC_PACK( 4 , 0 , 3 ) ,
275 VLC_PACK( 4 , 0 , 0 ) ,
276 /* B14_dct_dc_size_chrominance.out */
277 VLC_PACK( 2 , 5 , 4 ) ,
278 VLC_PACK( 4 , 1 , 2 ) ,
279 VLC_PACK( 4 , 1 , 1 ) ,
280 VLC_PACK( 4 , 1 , 0 ) ,
281 VLC_PACK( 4 , 0 , 3 ) ,
282 VLC_PACK( 4 , 1 , 4 ) ,
283 VLC_PACK( 4 , 2 , 5 ) ,
284 VLC_PACK( 4 , 3 , 6 ) ,
285 VLC_PACK( 4 , 4 , 7 ) ,
286 VLC_PACK( 4 , 5 , 8 ) ,
287 VLC_PACK( 2 , 3 , 1 ) ,
288 VLC_PACK( 4 , 0 , 9 ) ,
289 VLC_PACK( 4 , 1 , 10 ) ,
290 VLC_PACK( 4 , 2 , 11 ) ,
291 VLC_PACK( 4 , 3 , 12 ) ,
292 VLC_PACK( 3 , 3 , 0 ) ,
293 /* B16_intra_tcoeff.out */
294 VLC_PACK( 2 , 1 , 16 ) ,
295 VLC_PACK( 0 , 3 , 77 ) ,
296 VLC_PACK( 0 , 2 , 96 ) ,
297 VLC_PACK( 0 , 1 , 103 ) ,
298 VLC_PACK( 2 , 1 , 106 ) ,
299 VLC_PACK( 2 , 1 , 108 ) ,
300 VLC_PACK( 5 , 1 , 250 ) ,
301 VLC_PACK( 7 , 0 , 254 ) ,
302 VLC_PACK( 4 , 2 , 508 ) ,
303 VLC_PACK( 4 , 2 , 508 ) ,
304 VLC_PACK( 4 , 2 , 509 ) ,
305 VLC_PACK( 4 , 2 , 509 ) ,
306 VLC_PACK( 4 , 3 , 506 ) ,
307 VLC_PACK( 4 , 3 , 507 ) ,
308 VLC_PACK( 5 , 0 , 222 ) ,
309 VLC_PACK( 5 , 0 , 252 ) ,
310 VLC_PACK( 0 , 3 , 3 ) ,
311 VLC_PACK( 2 , 1 , 18 ) ,
312 VLC_PACK( 0 , 3 , 44 ) ,
313 VLC_PACK( 5 , 1 , 237 ) ,
314 VLC_PACK( 7 , 0 , 433 ) ,
315 VLC_PACK( 7 , 0 , 434 ) ,
316 VLC_PACK( 7 , 0 , 435 ) ,
317 VLC_PACK( 7 , 0 , 436 ) ,
318 VLC_PACK( 7 , 0 , 437 ) ,
319 VLC_PACK( 7 , 0 , 221 ) ,
320 VLC_PACK( 7 , 0 , 251 ) ,
321 VLC_PACK( 5 , 0 , 435 ) ,
322 VLC_PACK( 5 , 0 , 436 ) ,
323 VLC_PACK( 5 , 0 , 29 ) ,
324 VLC_PACK( 5 , 0 , 61 ) ,
325 VLC_PACK( 5 , 0 , 93 ) ,
326 VLC_PACK( 5 , 0 , 156 ) ,
327 VLC_PACK( 5 , 0 , 188 ) ,
328 VLC_PACK( 5 , 0 , 217 ) ,
329 VLC_PACK( 4 , 0 , 255 ) ,
330 VLC_PACK( 0 , 3 , 2 ) ,
331 VLC_PACK( 0 , 2 , 17 ) ,
332 VLC_PACK( 5 , 0 , 230 ) ,
333 VLC_PACK( 5 , 0 , 229 ) ,
334 VLC_PACK( 5 , 0 , 228 ) ,
335 VLC_PACK( 5 , 0 , 214 ) ,
336 VLC_PACK( 5 , 0 , 60 ) ,
337 VLC_PACK( 5 , 0 , 213 ) ,
338 VLC_PACK( 5 , 0 , 186 ) ,
339 VLC_PACK( 5 , 0 , 28 ) ,
340 VLC_PACK( 5 , 0 , 433 ) ,
341 VLC_PACK( 7 , 0 , 247 ) ,
342 VLC_PACK( 7 , 0 , 93 ) ,
343 VLC_PACK( 7 , 0 , 61 ) ,
344 VLC_PACK( 7 , 0 , 430 ) ,
345 VLC_PACK( 7 , 0 , 429 ) ,
346 VLC_PACK( 7 , 0 , 428 ) ,
347 VLC_PACK( 7 , 0 , 427 ) ,
348 VLC_PACK( 5 , 0 , 232 ) ,
349 VLC_PACK( 5 , 0 , 231 ) ,
350 VLC_PACK( 5 , 0 , 215 ) ,
351 VLC_PACK( 5 , 0 , 374 ) ,
352 VLC_PACK( 7 , 0 , 157 ) ,
353 VLC_PACK( 7 , 0 , 125 ) ,
354 VLC_PACK( 7 , 0 , 432 ) ,
355 VLC_PACK( 7 , 0 , 431 ) ,
356 VLC_PACK( 3 , 3 , 0 ) ,
357 VLC_PACK( 3 , 3 , 0 ) ,
358 VLC_PACK( 7 , 1 , 248 ) ,
359 VLC_PACK( 5 , 1 , 233 ) ,
360 VLC_PACK( 7 , 0 , 189 ) ,
361 VLC_PACK( 7 , 0 , 220 ) ,
362 VLC_PACK( 7 , 0 , 250 ) ,
363 VLC_PACK( 5 , 0 , 434 ) ,
364 VLC_PACK( 5 , 0 , 92 ) ,
365 VLC_PACK( 5 , 0 , 375 ) ,
366 VLC_PACK( 5 , 0 , 124 ) ,
367 VLC_PACK( 5 , 0 , 155 ) ,
368 VLC_PACK( 5 , 0 , 187 ) ,
369 VLC_PACK( 5 , 0 , 216 ) ,
370 VLC_PACK( 5 , 0 , 235 ) ,
371 VLC_PACK( 5 , 0 , 236 ) ,
372 VLC_PACK( 0 , 0 , 16 ) ,
373 VLC_PACK( 0 , 0 , 17 ) ,
374 VLC_PACK( 5 , 1 , 241 ) ,
375 VLC_PACK( 7 , 0 , 439 ) ,
376 VLC_PACK( 7 , 0 , 30 ) ,
377 VLC_PACK( 7 , 0 , 62 ) ,
378 VLC_PACK( 7 , 0 , 252 ) ,
379 VLC_PACK( 5 , 0 , 437 ) ,
380 VLC_PACK( 5 , 0 , 438 ) ,
381 VLC_PACK( 5 , 0 , 439 ) ,
382 VLC_PACK( 7 , 0 , 438 ) ,
383 VLC_PACK( 5 , 0 , 157 ) ,
384 VLC_PACK( 5 , 0 , 219 ) ,
385 VLC_PACK( 5 , 0 , 243 ) ,
386 VLC_PACK( 5 , 0 , 244 ) ,
387 VLC_PACK( 5 , 0 , 245 ) ,
388 VLC_PACK( 5 , 0 , 218 ) ,
389 VLC_PACK( 5 , 0 , 239 ) ,
390 VLC_PACK( 5 , 0 , 125 ) ,
391 VLC_PACK( 5 , 0 , 240 ) ,
392 VLC_PACK( 7 , 0 , 126 ) ,
393 VLC_PACK( 7 , 0 , 158 ) ,
394 VLC_PACK( 5 , 0 , 62 ) ,
395 VLC_PACK( 7 , 0 , 94 ) ,
396 VLC_PACK( 5 , 0 , 30 ) ,
397 VLC_PACK( 5 , 0 , 189 ) ,
398 VLC_PACK( 5 , 0 , 220 ) ,
399 VLC_PACK( 5 , 0 , 246 ) ,
400 VLC_PACK( 7 , 0 , 253 ) ,
401 VLC_PACK( 5 , 0 , 94 ) ,
402 VLC_PACK( 7 , 0 , 190 ) ,
403 VLC_PACK( 7 , 0 , 222 ) ,
404 VLC_PACK( 5 , 1 , 247 ) ,
405 VLC_PACK( 5 , 0 , 158 ) ,
406 VLC_PACK( 5 , 0 , 126 ) ,
407 VLC_PACK( 5 , 0 , 190 ) ,
408 VLC_PACK( 5 , 0 , 249 ) ,
409 VLC_PACK( 5 , 0 , 221 ) ,
410 /* B17_inter_tcoeff.out */
411 VLC_PACK( 2 , 4 , 16 ) ,
412 VLC_PACK( 2 , 3 , 68 ) ,
413 VLC_PACK( 0 , 2 , 84 ) ,
414 VLC_PACK( 0 , 1 , 91 ) ,
415 VLC_PACK( 1 , 1 , 94 ) ,
416 VLC_PACK( 2 , 1 , 96 ) ,
417 VLC_PACK( 0 , 0 , 98 ) ,
418 VLC_PACK( 7 , 0 , 254 ) ,
419 VLC_PACK( 4 , 2 , 508 ) ,
420 VLC_PACK( 4 , 2 , 508 ) ,
421 VLC_PACK( 4 , 2 , 509 ) ,
422 VLC_PACK( 4 , 2 , 509 ) ,
423 VLC_PACK( 4 , 3 , 444 ) ,
424 VLC_PACK( 4 , 3 , 445 ) ,
425 VLC_PACK( 5 , 0 , 190 ) ,
426 VLC_PACK( 5 , 0 , 253 ) ,
427 VLC_PACK( 2 , 3 , 6 ) ,
428 VLC_PACK( 2 , 1 , 14 ) ,
429 VLC_PACK( 0 , 2 , 40 ) ,
430 VLC_PACK( 7 , 2 , 419 ) ,
431 VLC_PACK( 2 , 1 , 46 ) ,
432 VLC_PACK( 3 , 4 , 0 ) ,
433 VLC_PACK( 2 , 2 , 5 ) ,
434 VLC_PACK( 7 , 2 , 426 ) ,
435 VLC_PACK( 7 , 1 , 424 ) ,
436 VLC_PACK( 7 , 0 , 423 ) ,
437 VLC_PACK( 5 , 1 , 246 ) ,
438 VLC_PACK( 5 , 2 , 427 ) ,
439 VLC_PACK( 5 , 1 , 425 ) ,
440 VLC_PACK( 7 , 0 , 253 ) ,
441 VLC_PACK( 7 , 0 , 430 ) ,
442 VLC_PACK( 4 , 0 , 255 ) ,
443 VLC_PACK( 0 , 3 , 2 ) ,
444 VLC_PACK( 0 , 2 , 17 ) ,
445 VLC_PACK( 5 , 0 , 217 ) ,
446 VLC_PACK( 5 , 0 , 187 ) ,
447 VLC_PACK( 5 , 0 , 124 ) ,
448 VLC_PACK( 5 , 0 , 92 ) ,
449 VLC_PACK( 5 , 0 , 60 ) ,
450 VLC_PACK( 5 , 0 , 373 ) ,
451 VLC_PACK( 5 , 0 , 422 ) ,
452 VLC_PACK( 5 , 0 , 421 ) ,
453 VLC_PACK( 7 , 0 , 414 ) ,
454 VLC_PACK( 7 , 0 , 413 ) ,
455 VLC_PACK( 7 , 0 , 412 ) ,
456 VLC_PACK( 7 , 0 , 411 ) ,
457 VLC_PACK( 7 , 0 , 410 ) ,
458 VLC_PACK( 7 , 0 , 409 ) ,
459 VLC_PACK( 7 , 0 , 408 ) ,
460 VLC_PACK( 7 , 0 , 407 ) ,
461 VLC_PACK( 5 , 0 , 243 ) ,
462 VLC_PACK( 5 , 0 , 218 ) ,
463 VLC_PACK( 5 , 0 , 424 ) ,
464 VLC_PACK( 5 , 0 , 423 ) ,
465 VLC_PACK( 7 , 0 , 418 ) ,
466 VLC_PACK( 7 , 0 , 417 ) ,
467 VLC_PACK( 7 , 0 , 416 ) ,
468 VLC_PACK( 7 , 0 , 415 ) ,
469 VLC_PACK( 5 , 0 , 374 ) ,
470 VLC_PACK( 5 , 0 , 375 ) ,
471 VLC_PACK( 5 , 0 , 29 ) ,
472 VLC_PACK( 5 , 0 , 61 ) ,
473 VLC_PACK( 5 , 0 , 93 ) ,
474 VLC_PACK( 5 , 0 , 156 ) ,
475 VLC_PACK( 5 , 0 , 188 ) ,
476 VLC_PACK( 5 , 0 , 219 ) ,
477 VLC_PACK( 5 , 1 , 244 ) ,
478 VLC_PACK( 7 , 0 , 252 ) ,
479 VLC_PACK( 7 , 0 , 221 ) ,
480 VLC_PACK( 0 , 2 , 5 ) ,
481 VLC_PACK( 7 , 2 , 432 ) ,
482 VLC_PACK( 0 , 0 , 11 ) ,
483 VLC_PACK( 0 , 0 , 12 ) ,
484 VLC_PACK( 5 , 1 , 431 ) ,
485 VLC_PACK( 7 , 0 , 436 ) ,
486 VLC_PACK( 7 , 0 , 437 ) ,
487 VLC_PACK( 7 , 0 , 438 ) ,
488 VLC_PACK( 5 , 0 , 433 ) ,
489 VLC_PACK( 5 , 0 , 434 ) ,
490 VLC_PACK( 5 , 0 , 189 ) ,
491 VLC_PACK( 5 , 0 , 220 ) ,
492 VLC_PACK( 5 , 0 , 250 ) ,
493 VLC_PACK( 5 , 1 , 248 ) ,
494 VLC_PACK( 7 , 0 , 431 ) ,
495 VLC_PACK( 5 , 0 , 125 ) ,
496 VLC_PACK( 5 , 0 , 157 ) ,
497 VLC_PACK( 7 , 0 , 439 ) ,
498 VLC_PACK( 7 , 0 , 30 ) ,
499 VLC_PACK( 7 , 0 , 62 ) ,
500 VLC_PACK( 7 , 0 , 94 ) ,
501 VLC_PACK( 5 , 0 , 435 ) ,
502 VLC_PACK( 5 , 0 , 436 ) ,
503 VLC_PACK( 5 , 0 , 437 ) ,
504 VLC_PACK( 5 , 0 , 251 ) ,
505 VLC_PACK( 7 , 0 , 126 ) ,
506 VLC_PACK( 7 , 0 , 158 ) ,
507 VLC_PACK( 7 , 0 , 190 ) ,
508 VLC_PACK( 7 , 0 , 222 ) ,
509 VLC_PACK( 5 , 1 , 438 ) ,
510 VLC_PACK( 5 , 0 , 30 ) ,
511 VLC_PACK( 5 , 0 , 62 ) ,
512 VLC_PACK( 5 , 0 , 94 ) ,
513 VLC_PACK( 5 , 0 , 252 ) ,
514 VLC_PACK( 5 , 0 , 221 ) ,
515 VLC_PACK( 5 , 0 , 126 ) ,
516 VLC_PACK( 5 , 0 , 158 ) ,
517 /* B23_rvlc_tcoeff_0.out */
518 VLC_PACK( 5 , 0 , 255 ) ,
519 VLC_PACK( 5 , 0 , 222 ) ,
520 VLC_PACK( 0 , 0 , 14 ) ,
521 VLC_PACK( 0 , 1 , 15 ) ,
522 VLC_PACK( 0 , 0 , 44 ) ,
523 VLC_PACK( 0 , 1 , 45 ) ,
524 VLC_PACK( 0 , 1 , 74 ) ,
525 VLC_PACK( 0 , 2 , 103 ) ,
526 VLC_PACK( 0 , 1 , 230 ) ,
527 VLC_PACK( 0 , 0 , 256 ) ,
528 VLC_PACK( 5 , 0 , 252 ) ,
529 VLC_PACK( 7 , 0 , 254 ) ,
530 VLC_PACK( 4 , 3 , 508 ) ,
531 VLC_PACK( 4 , 3 , 509 ) ,
532 VLC_PACK( 4 , 3 , 506 ) ,
533 VLC_PACK( 4 , 3 , 507 ) ,
534 VLC_PACK( 5 , 0 , 190 ) ,
535 VLC_PACK( 5 , 0 , 158 ) ,
536 VLC_PACK( 5 , 0 , 126 ) ,
537 VLC_PACK( 5 , 0 , 94 ) ,
538 VLC_PACK( 0 , 0 , 2 ) ,
539 VLC_PACK( 0 , 1 , 3 ) ,
540 VLC_PACK( 5 , 0 , 62 ) ,
541 VLC_PACK( 5 , 0 , 30 ) ,
542 VLC_PACK( 5 , 0 , 439 ) ,
543 VLC_PACK( 5 , 0 , 438 ) ,
544 VLC_PACK( 0 , 0 , 2 ) ,
545 VLC_PACK( 0 , 1 , 3 ) ,
546 VLC_PACK( 5 , 0 , 437 ) ,
547 VLC_PACK( 5 , 0 , 93 ) ,
548 VLC_PACK( 5 , 0 , 436 ) ,
549 VLC_PACK( 5 , 0 , 435 ) ,
550 VLC_PACK( 0 , 0 , 2 ) ,
551 VLC_PACK( 0 , 1 , 3 ) ,
552 VLC_PACK( 5 , 0 , 434 ) ,
553 VLC_PACK( 5 , 0 , 374 ) ,
554 VLC_PACK( 5 , 0 , 373 ) ,
555 VLC_PACK( 5 , 0 , 123 ) ,
556 VLC_PACK( 0 , 0 , 2 ) ,
557 VLC_PACK( 0 , 1 , 3 ) ,
558 VLC_PACK( 5 , 0 , 433 ) ,
559 VLC_PACK( 5 , 0 , 432 ) ,
560 VLC_PACK( 5 , 0 , 431 ) ,
561 VLC_PACK( 5 , 0 , 430 ) ,
562 VLC_PACK( 0 , 0 , 2 ) ,
563 VLC_PACK( 3 , 1 , 0 ) ,
564 VLC_PACK( 5 , 0 , 228 ) ,
565 VLC_PACK( 5 , 0 , 150 ) ,
566 VLC_PACK( 5 , 0 , 221 ) ,
567 VLC_PACK( 5 , 0 , 251 ) ,
568 VLC_PACK( 5 , 0 , 250 ) ,
569 VLC_PACK( 5 , 0 , 249 ) ,
570 VLC_PACK( 0 , 0 , 2 ) ,
571 VLC_PACK( 0 , 1 , 3 ) ,
572 VLC_PACK( 5 , 0 , 189 ) ,
573 VLC_PACK( 5 , 0 , 220 ) ,
574 VLC_PACK( 5 , 0 , 157 ) ,
575 VLC_PACK( 5 , 0 , 125 ) ,
576 VLC_PACK( 0 , 0 , 2 ) ,
577 VLC_PACK( 0 , 1 , 3 ) ,
578 VLC_PACK( 5 , 0 , 188 ) ,
579 VLC_PACK( 5 , 0 , 156 ) ,
580 VLC_PACK( 5 , 0 , 61 ) ,
581 VLC_PACK( 5 , 0 , 29 ) ,
582 VLC_PACK( 0 , 0 , 2 ) ,
583 VLC_PACK( 0 , 1 , 3 ) ,
584 VLC_PACK( 5 , 0 , 92 ) ,
585 VLC_PACK( 5 , 0 , 60 ) ,
586 VLC_PACK( 5 , 0 , 91 ) ,
587 VLC_PACK( 5 , 0 , 59 ) ,
588 VLC_PACK( 0 , 0 , 2 ) ,
589 VLC_PACK( 0 , 1 , 3 ) ,
590 VLC_PACK( 5 , 0 , 372 ) ,
591 VLC_PACK( 5 , 0 , 311 ) ,
592 VLC_PACK( 5 , 0 , 429 ) ,
593 VLC_PACK( 5 , 0 , 503 ) ,
594 VLC_PACK( 0 , 0 , 2 ) ,
595 VLC_PACK( 3 , 1 , 0 ) ,
596 VLC_PACK( 5 , 0 , 58 ) ,
597 VLC_PACK( 5 , 0 , 26 ) ,
598 VLC_PACK( 7 , 0 , 158 ) ,
599 VLC_PACK( 7 , 0 , 126 ) ,
600 VLC_PACK( 0 , 0 , 2 ) ,
601 VLC_PACK( 0 , 1 , 3 ) ,
602 VLC_PACK( 5 , 0 , 248 ) ,
603 VLC_PACK( 7 , 0 , 30 ) ,
604 VLC_PACK( 5 , 0 , 219 ) ,
605 VLC_PACK( 5 , 0 , 218 ) ,
606 VLC_PACK( 0 , 0 , 2 ) ,
607 VLC_PACK( 0 , 1 , 3 ) ,
608 VLC_PACK( 5 , 0 , 217 ) ,
609 VLC_PACK( 5 , 0 , 245 ) ,
610 VLC_PACK( 5 , 0 , 375 ) ,
611 VLC_PACK( 5 , 0 , 124 ) ,
612 VLC_PACK( 0 , 0 , 2 ) ,
613 VLC_PACK( 0 , 1 , 3 ) ,
614 VLC_PACK( 5 , 0 , 28 ) ,
615 VLC_PACK( 5 , 0 , 155 ) ,
616 VLC_PACK( 5 , 0 , 154 ) ,
617 VLC_PACK( 5 , 0 , 122 ) ,
618 VLC_PACK( 0 , 0 , 2 ) ,
619 VLC_PACK( 0 , 1 , 3 ) ,
620 VLC_PACK( 5 , 0 , 310 ) ,
621 VLC_PACK( 5 , 0 , 27 ) ,
622 VLC_PACK( 5 , 0 , 90 ) ,
623 VLC_PACK( 5 , 0 , 121 ) ,
624 VLC_PACK( 0 , 0 , 2 ) ,
625 VLC_PACK( 3 , 1 , 0 ) ,
626 VLC_PACK( 5 , 0 , 502 ) ,
627 VLC_PACK( 5 , 0 , 371 ) ,
628 VLC_PACK( 7 , 0 , 439 ) ,
629 VLC_PACK( 7 , 0 , 438 ) ,
630 VLC_PACK( 0 , 0 , 6 ) ,
631 VLC_PACK( 0 , 1 , 7 ) ,
632 VLC_PACK( 0 , 0 , 27 ) ,
633 VLC_PACK( 0 , 1 , 28 ) ,
634 VLC_PACK( 0 , 1 , 48 ) ,
635 VLC_PACK( 0 , 2 , 68 ) ,
636 VLC_PACK( 5 , 0 , 247 ) ,
637 VLC_PACK( 5 , 0 , 246 ) ,
638 VLC_PACK( 5 , 0 , 244 ) ,
639 VLC_PACK( 7 , 0 , 221 ) ,
640 VLC_PACK( 0 , 0 , 2 ) ,
641 VLC_PACK( 0 , 1 , 3 ) ,
642 VLC_PACK( 5 , 0 , 187 ) ,
643 VLC_PACK( 5 , 0 , 216 ) ,
644 VLC_PACK( 5 , 0 , 186 ) ,
645 VLC_PACK( 5 , 0 , 185 ) ,
646 VLC_PACK( 0 , 0 , 2 ) ,
647 VLC_PACK( 0 , 1 , 3 ) ,
648 VLC_PACK( 5 , 0 , 213 ) ,
649 VLC_PACK( 5 , 0 , 237 ) ,
650 VLC_PACK( 5 , 0 , 153 ) ,
651 VLC_PACK( 5 , 0 , 184 ) ,
652 VLC_PACK( 0 , 0 , 2 ) ,
653 VLC_PACK( 2 , 1 , 3 ) ,
654 VLC_PACK( 5 , 0 , 89 ) ,
655 VLC_PACK( 5 , 0 , 152 ) ,
656 VLC_PACK( 3 , 1 , 0 ) ,
657 VLC_PACK( 7 , 0 , 218 ) ,
658 VLC_PACK( 5 , 0 , 428 ) ,
659 VLC_PACK( 7 , 0 , 253 ) ,
660 VLC_PACK( 7 , 0 , 435 ) ,
661 VLC_PACK( 7 , 0 , 432 ) ,
662 VLC_PACK( 7 , 0 , 431 ) ,
663 VLC_PACK( 0 , 0 , 2 ) ,
664 VLC_PACK( 0 , 1 , 3 ) ,
665 VLC_PACK( 5 , 0 , 243 ) ,
666 VLC_PACK( 5 , 0 , 242 ) ,
667 VLC_PACK( 5 , 0 , 215 ) ,
668 VLC_PACK( 5 , 0 , 214 ) ,
669 VLC_PACK( 0 , 0 , 2 ) ,
670 VLC_PACK( 0 , 1 , 3 ) ,
671 VLC_PACK( 5 , 0 , 236 ) ,
672 VLC_PACK( 5 , 0 , 233 ) ,
673 VLC_PACK( 5 , 0 , 183 ) ,
674 VLC_PACK( 5 , 0 , 182 ) ,
675 VLC_PACK( 0 , 0 , 2 ) ,
676 VLC_PACK( 2 , 1 , 3 ) ,
677 VLC_PACK( 5 , 0 , 151 ) ,
678 VLC_PACK( 5 , 0 , 181 ) ,
679 VLC_PACK( 3 , 1 , 0 ) ,
680 VLC_PACK( 7 , 0 , 370 ) ,
681 VLC_PACK( 7 , 0 , 188 ) ,
682 VLC_PACK( 7 , 0 , 430 ) ,
683 VLC_PACK( 7 , 0 , 429 ) ,
684 VLC_PACK( 0 , 0 , 2 ) ,
685 VLC_PACK( 0 , 1 , 3 ) ,
686 VLC_PACK( 5 , 0 , 241 ) ,
687 VLC_PACK( 7 , 0 , 426 ) ,
688 VLC_PACK( 5 , 0 , 240 ) ,
689 VLC_PACK( 5 , 0 , 239 ) ,
690 VLC_PACK( 0 , 0 , 2 ) ,
691 VLC_PACK( 0 , 1 , 3 ) ,
692 VLC_PACK( 7 , 0 , 220 ) ,
693 VLC_PACK( 7 , 0 , 157 ) ,
694 VLC_PACK( 5 , 0 , 212 ) ,
695 VLC_PACK( 5 , 0 , 235 ) ,
696 VLC_PACK( 0 , 0 , 2 ) ,
697 VLC_PACK( 2 , 1 , 3 ) ,
698 VLC_PACK( 5 , 0 , 180 ) ,
699 VLC_PACK( 5 , 0 , 211 ) ,
700 VLC_PACK( 3 , 1 , 0 ) ,
701 VLC_PACK( 7 , 0 , 405 ) ,
702 VLC_PACK( 7 , 0 , 406 ) ,
703 VLC_PACK( 7 , 0 , 425 ) ,
704 VLC_PACK( 7 , 0 , 424 ) ,
705 VLC_PACK( 0 , 0 , 6 ) ,
706 VLC_PACK( 0 , 1 , 7 ) ,
707 VLC_PACK( 0 , 0 , 18 ) ,
708 VLC_PACK( 0 , 1 , 19 ) ,
709 VLC_PACK( 0 , 1 , 27 ) ,
710 VLC_PACK( 2 , 2 , 35 ) ,
711 VLC_PACK( 5 , 0 , 238 ) ,
712 VLC_PACK( 7 , 0 , 252 ) ,
713 VLC_PACK( 7 , 0 , 125 ) ,
714 VLC_PACK( 7 , 0 , 418 ) ,
715 VLC_PACK( 0 , 0 , 2 ) ,
716 VLC_PACK( 0 , 1 , 3 ) ,
717 VLC_PACK( 5 , 0 , 234 ) ,
718 VLC_PACK( 5 , 0 , 232 ) ,
719 VLC_PACK( 5 , 0 , 210 ) ,
720 VLC_PACK( 5 , 0 , 231 ) ,
721 VLC_PACK( 0 , 0 , 2 ) ,
722 VLC_PACK( 3 , 1 , 0 ) ,
723 VLC_PACK( 7 , 0 , 404 ) ,
724 VLC_PACK( 7 , 0 , 403 ) ,
725 VLC_PACK( 7 , 0 , 189 ) ,
726 VLC_PACK( 7 , 0 , 421 ) ,
727 VLC_PACK( 7 , 0 , 417 ) ,
728 VLC_PACK( 7 , 0 , 416 ) ,
729 VLC_PACK( 0 , 0 , 2 ) ,
730 VLC_PACK( 2 , 1 , 3 ) ,
731 VLC_PACK( 7 , 0 , 251 ) ,
732 VLC_PACK( 7 , 0 , 93 ) ,
733 VLC_PACK( 3 , 1 , 0 ) ,
734 VLC_PACK( 5 , 0 , 229 ) ,
735 VLC_PACK( 5 , 0 , 230 ) ,
736 VLC_PACK( 7 , 0 , 415 ) ,
737 VLC_PACK( 7 , 0 , 414 ) ,
738 VLC_PACK( 0 , 0 , 2 ) ,
739 VLC_PACK( 2 , 1 , 3 ) ,
740 VLC_PACK( 7 , 0 , 61 ) ,
741 VLC_PACK( 7 , 0 , 29 ) ,
742 VLC_PACK( 3 , 1 , 0 ) ,
743 VLC_PACK( 7 , 0 , 219 ) ,
744 VLC_PACK( 7 , 0 , 250 ) ,
745 VLC_PACK( 2 , 2 , 4 ) ,
746 VLC_PACK( 2 , 1 , 7 ) ,
747 VLC_PACK( 7 , 0 , 374 ) ,
748 VLC_PACK( 7 , 0 , 375 ) ,
749 VLC_PACK( 3 , 2 , 0 ) ,
750 VLC_PACK( 3 , 2 , 0 ) ,
751 VLC_PACK( 7 , 0 , 409 ) ,
752 VLC_PACK( 7 , 0 , 371 ) ,
753 VLC_PACK( 3 , 1 , 0 ) ,
754 VLC_PACK( 7 , 0 , 372 ) ,
755 VLC_PACK( 7 , 0 , 373 ) ,
756 VLC_PACK( 0 , 1 , 4 ) ,
757 VLC_PACK( 0 , 0 , 24 ) ,
758 VLC_PACK( 7 , 0 , 94 ) ,
759 VLC_PACK( 7 , 0 , 62 ) ,
760 VLC_PACK( 0 , 1 , 4 ) ,
761 VLC_PACK( 0 , 0 , 18 ) ,
762 VLC_PACK( 7 , 0 , 434 ) ,
763 VLC_PACK( 7 , 0 , 433 ) ,
764 VLC_PACK( 0 , 1 , 4 ) ,
765 VLC_PACK( 0 , 0 , 12 ) ,
766 VLC_PACK( 7 , 0 , 423 ) ,
767 VLC_PACK( 7 , 0 , 422 ) ,
768 VLC_PACK( 1 , 1 , 4 ) ,
769 VLC_PACK( 0 , 0 , 6 ) ,
770 VLC_PACK( 7 , 0 , 413 ) ,
771 VLC_PACK( 7 , 0 , 412 ) ,
772 VLC_PACK( 3 , 1 , 0 ) ,
773 VLC_PACK( 7 , 0 , 408 ) ,
774 VLC_PACK( 7 , 0 , 407 ) ,
775 VLC_PACK( 7 , 0 , 411 ) ,
776 VLC_PACK( 7 , 0 , 410 ) ,
777 VLC_PACK( 7 , 0 , 420 ) ,
778 VLC_PACK( 7 , 0 , 419 ) ,
779 VLC_PACK( 7 , 0 , 428 ) ,
780 VLC_PACK( 7 , 0 , 427 ) ,
781 VLC_PACK( 7 , 0 , 437 ) ,
782 VLC_PACK( 7 , 0 , 436 ) ,
783 VLC_PACK( 7 , 0 , 222 ) ,
784 VLC_PACK( 7 , 0 , 190 ) ,
785 /* B23_rvlc_tcoeff_1.out */
786 VLC_PACK( 5 , 0 , 255 ) ,
787 VLC_PACK( 5 , 0 , 253 ) ,
788 VLC_PACK( 0 , 0 , 14 ) ,
789 VLC_PACK( 0 , 1 , 15 ) ,
790 VLC_PACK( 0 , 0 , 44 ) ,
791 VLC_PACK( 0 , 1 , 45 ) ,
792 VLC_PACK( 0 , 1 , 74 ) ,
793 VLC_PACK( 0 , 2 , 103 ) ,
794 VLC_PACK( 0 , 1 , 230 ) ,
795 VLC_PACK( 0 , 0 , 256 ) ,
796 VLC_PACK( 5 , 0 , 190 ) ,
797 VLC_PACK( 7 , 0 , 254 ) ,
798 VLC_PACK( 4 , 3 , 508 ) ,
799 VLC_PACK( 4 , 3 , 509 ) ,
800 VLC_PACK( 4 , 3 , 444 ) ,
801 VLC_PACK( 4 , 3 , 445 ) ,
802 VLC_PACK( 5 , 0 , 252 ) ,
803 VLC_PACK( 5 , 0 , 158 ) ,
804 VLC_PACK( 5 , 0 , 221 ) ,
805 VLC_PACK( 5 , 0 , 62 ) ,
806 VLC_PACK( 0 , 0 , 2 ) ,
807 VLC_PACK( 0 , 1 , 3 ) ,
808 VLC_PACK( 5 , 0 , 251 ) ,
809 VLC_PACK( 5 , 0 , 189 ) ,
810 VLC_PACK( 5 , 0 , 250 ) ,
811 VLC_PACK( 5 , 0 , 249 ) ,
812 VLC_PACK( 0 , 0 , 2 ) ,
813 VLC_PACK( 0 , 1 , 3 ) ,
814 VLC_PACK( 5 , 0 , 248 ) ,
815 VLC_PACK( 5 , 0 , 219 ) ,
816 VLC_PACK( 5 , 0 , 247 ) ,
817 VLC_PACK( 5 , 0 , 246 ) ,
818 VLC_PACK( 0 , 0 , 2 ) ,
819 VLC_PACK( 0 , 1 , 3 ) ,
820 VLC_PACK( 5 , 0 , 245 ) ,
821 VLC_PACK( 5 , 0 , 244 ) ,
822 VLC_PACK( 5 , 0 , 243 ) ,
823 VLC_PACK( 5 , 0 , 216 ) ,
824 VLC_PACK( 0 , 0 , 2 ) ,
825 VLC_PACK( 0 , 1 , 3 ) ,
826 VLC_PACK( 5 , 0 , 242 ) ,
827 VLC_PACK( 5 , 0 , 241 ) ,
828 VLC_PACK( 5 , 0 , 238 ) ,
829 VLC_PACK( 5 , 0 , 237 ) ,
830 VLC_PACK( 0 , 0 , 2 ) ,
831 VLC_PACK( 3 , 1 , 0 ) ,
832 VLC_PACK( 5 , 0 , 236 ) ,
833 VLC_PACK( 5 , 0 , 152 ) ,
834 VLC_PACK( 5 , 0 , 126 ) ,
835 VLC_PACK( 5 , 0 , 94 ) ,
836 VLC_PACK( 5 , 0 , 30 ) ,
837 VLC_PACK( 5 , 0 , 439 ) ,
838 VLC_PACK( 0 , 0 , 2 ) ,
839 VLC_PACK( 0 , 1 , 3 ) ,
840 VLC_PACK( 5 , 0 , 438 ) ,
841 VLC_PACK( 5 , 0 , 437 ) ,
842 VLC_PACK( 5 , 0 , 220 ) ,
843 VLC_PACK( 5 , 0 , 157 ) ,
844 VLC_PACK( 0 , 0 , 2 ) ,
845 VLC_PACK( 0 , 1 , 3 ) ,
846 VLC_PACK( 5 , 0 , 188 ) ,
847 VLC_PACK( 5 , 0 , 93 ) ,
848 VLC_PACK( 5 , 0 , 218 ) ,
849 VLC_PACK( 5 , 0 , 156 ) ,
850 VLC_PACK( 0 , 0 , 2 ) ,
851 VLC_PACK( 0 , 1 , 3 ) ,
852 VLC_PACK( 5 , 0 , 217 ) ,
853 VLC_PACK( 5 , 0 , 187 ) ,
854 VLC_PACK( 5 , 0 , 186 ) ,
855 VLC_PACK( 5 , 0 , 155 ) ,
856 VLC_PACK( 0 , 0 , 2 ) ,
857 VLC_PACK( 0 , 1 , 3 ) ,
858 VLC_PACK( 5 , 0 , 240 ) ,
859 VLC_PACK( 5 , 0 , 239 ) ,
860 VLC_PACK( 5 , 0 , 214 ) ,
861 VLC_PACK( 5 , 0 , 213 ) ,
862 VLC_PACK( 0 , 0 , 2 ) ,
863 VLC_PACK( 3 , 1 , 0 ) ,
864 VLC_PACK( 5 , 0 , 122 ) ,
865 VLC_PACK( 5 , 0 , 27 ) ,
866 VLC_PACK( 7 , 0 , 158 ) ,
867 VLC_PACK( 7 , 0 , 126 ) ,
868 VLC_PACK( 0 , 0 , 2 ) ,
869 VLC_PACK( 0 , 1 , 3 ) ,
870 VLC_PACK( 5 , 0 , 436 ) ,
871 VLC_PACK( 7 , 0 , 30 ) ,
872 VLC_PACK( 5 , 0 , 125 ) ,
873 VLC_PACK( 5 , 0 , 435 ) ,
874 VLC_PACK( 0 , 0 , 2 ) ,
875 VLC_PACK( 0 , 1 , 3 ) ,
876 VLC_PACK( 5 , 0 , 432 ) ,
877 VLC_PACK( 5 , 0 , 431 ) ,
878 VLC_PACK( 5 , 0 , 61 ) ,
879 VLC_PACK( 5 , 0 , 29 ) ,
880 VLC_PACK( 0 , 0 , 2 ) ,
881 VLC_PACK( 0 , 1 , 3 ) ,
882 VLC_PACK( 5 , 0 , 124 ) ,
883 VLC_PACK( 5 , 0 , 92 ) ,
884 VLC_PACK( 5 , 0 , 60 ) ,
885 VLC_PACK( 5 , 0 , 28 ) ,
886 VLC_PACK( 0 , 0 , 2 ) ,
887 VLC_PACK( 0 , 1 , 3 ) ,
888 VLC_PACK( 5 , 0 , 215 ) ,
889 VLC_PACK( 5 , 0 , 154 ) ,
890 VLC_PACK( 5 , 0 , 185 ) ,
891 VLC_PACK( 5 , 0 , 184 ) ,
892 VLC_PACK( 0 , 0 , 2 ) ,
893 VLC_PACK( 3 , 1 , 0 ) ,
894 VLC_PACK( 5 , 0 , 366 ) ,
895 VLC_PACK( 5 , 0 , 410 ) ,
896 VLC_PACK( 7 , 0 , 439 ) ,
897 VLC_PACK( 7 , 0 , 438 ) ,
898 VLC_PACK( 0 , 0 , 6 ) ,
899 VLC_PACK( 0 , 1 , 7 ) ,
900 VLC_PACK( 0 , 0 , 27 ) ,
901 VLC_PACK( 0 , 1 , 28 ) ,
902 VLC_PACK( 0 , 1 , 48 ) ,
903 VLC_PACK( 0 , 2 , 68 ) ,
904 VLC_PACK( 5 , 0 , 434 ) ,
905 VLC_PACK( 5 , 0 , 433 ) ,
906 VLC_PACK( 5 , 0 , 430 ) ,
907 VLC_PACK( 7 , 0 , 221 ) ,
908 VLC_PACK( 0 , 0 , 2 ) ,
909 VLC_PACK( 0 , 1 , 3 ) ,
910 VLC_PACK( 5 , 0 , 375 ) ,
911 VLC_PACK( 5 , 0 , 374 ) ,
912 VLC_PACK( 5 , 0 , 373 ) ,
913 VLC_PACK( 5 , 0 , 426 ) ,
914 VLC_PACK( 0 , 0 , 2 ) ,
915 VLC_PACK( 0 , 1 , 3 ) ,
916 VLC_PACK( 5 , 0 , 372 ) ,
917 VLC_PACK( 5 , 0 , 420 ) ,
918 VLC_PACK( 5 , 0 , 123 ) ,
919 VLC_PACK( 5 , 0 , 91 ) ,
920 VLC_PACK( 0 , 0 , 2 ) ,
921 VLC_PACK( 2 , 1 , 3 ) ,
922 VLC_PACK( 5 , 0 , 153 ) ,
923 VLC_PACK( 5 , 0 , 59 ) ,
924 VLC_PACK( 3 , 1 , 0 ) ,
925 VLC_PACK( 7 , 0 , 218 ) ,
926 VLC_PACK( 5 , 0 , 409 ) ,
927 VLC_PACK( 7 , 0 , 253 ) ,
928 VLC_PACK( 7 , 0 , 435 ) ,
929 VLC_PACK( 7 , 0 , 432 ) ,
930 VLC_PACK( 7 , 0 , 431 ) ,
931 VLC_PACK( 0 , 0 , 2 ) ,
932 VLC_PACK( 0 , 1 , 3 ) ,
933 VLC_PACK( 5 , 0 , 429 ) ,
934 VLC_PACK( 5 , 0 , 428 ) ,
935 VLC_PACK( 5 , 0 , 425 ) ,
936 VLC_PACK( 5 , 0 , 424 ) ,
937 VLC_PACK( 0 , 0 , 2 ) ,
938 VLC_PACK( 0 , 1 , 3 ) ,
939 VLC_PACK( 5 , 0 , 419 ) ,
940 VLC_PACK( 5 , 0 , 418 ) ,
941 VLC_PACK( 5 , 0 , 311 ) ,
942 VLC_PACK( 5 , 0 , 371 ) ,
943 VLC_PACK( 0 , 0 , 2 ) ,
944 VLC_PACK( 2 , 1 , 3 ) ,
945 VLC_PACK( 5 , 0 , 310 ) ,
946 VLC_PACK( 5 , 0 , 370 ) ,
947 VLC_PACK( 3 , 1 , 0 ) ,
948 VLC_PACK( 7 , 0 , 370 ) ,
949 VLC_PACK( 7 , 0 , 188 ) ,
950 VLC_PACK( 7 , 0 , 430 ) ,
951 VLC_PACK( 7 , 0 , 429 ) ,
952 VLC_PACK( 0 , 0 , 2 ) ,
953 VLC_PACK( 0 , 1 , 3 ) ,
954 VLC_PACK( 5 , 0 , 427 ) ,
955 VLC_PACK( 7 , 0 , 426 ) ,
956 VLC_PACK( 5 , 0 , 423 ) ,
957 VLC_PACK( 5 , 0 , 422 ) ,
958 VLC_PACK( 0 , 0 , 2 ) ,
959 VLC_PACK( 0 , 1 , 3 ) ,
960 VLC_PACK( 7 , 0 , 220 ) ,
961 VLC_PACK( 7 , 0 , 157 ) ,
962 VLC_PACK( 5 , 0 , 417 ) ,
963 VLC_PACK( 5 , 0 , 416 ) ,
964 VLC_PACK( 0 , 0 , 2 ) ,
965 VLC_PACK( 2 , 1 , 3 ) ,
966 VLC_PACK( 5 , 0 , 369 ) ,
967 VLC_PACK( 5 , 0 , 368 ) ,
968 VLC_PACK( 3 , 1 , 0 ) ,
969 VLC_PACK( 7 , 0 , 405 ) ,
970 VLC_PACK( 7 , 0 , 406 ) ,
971 VLC_PACK( 7 , 0 , 425 ) ,
972 VLC_PACK( 7 , 0 , 424 ) ,
973 VLC_PACK( 0 , 0 , 6 ) ,
974 VLC_PACK( 0 , 1 , 7 ) ,
975 VLC_PACK( 0 , 0 , 18 ) ,
976 VLC_PACK( 0 , 1 , 19 ) ,
977 VLC_PACK( 0 , 1 , 27 ) ,
978 VLC_PACK( 2 , 2 , 35 ) ,
979 VLC_PACK( 5 , 0 , 421 ) ,
980 VLC_PACK( 7 , 0 , 252 ) ,
981 VLC_PACK( 7 , 0 , 125 ) ,
982 VLC_PACK( 7 , 0 , 418 ) ,
983 VLC_PACK( 0 , 0 , 2 ) ,
984 VLC_PACK( 0 , 1 , 3 ) ,
985 VLC_PACK( 5 , 0 , 415 ) ,
986 VLC_PACK( 5 , 0 , 414 ) ,
987 VLC_PACK( 5 , 0 , 367 ) ,
988 VLC_PACK( 5 , 0 , 413 ) ,
989 VLC_PACK( 0 , 0 , 2 ) ,
990 VLC_PACK( 3 , 1 , 0 ) ,
991 VLC_PACK( 7 , 0 , 404 ) ,
992 VLC_PACK( 7 , 0 , 403 ) ,
993 VLC_PACK( 7 , 0 , 189 ) ,
994 VLC_PACK( 7 , 0 , 421 ) ,
995 VLC_PACK( 7 , 0 , 417 ) ,
996 VLC_PACK( 7 , 0 , 416 ) ,
997 VLC_PACK( 0 , 0 , 2 ) ,
998 VLC_PACK( 2 , 1 , 3 ) ,
999 VLC_PACK( 7 , 0 , 251 ) ,
1000 VLC_PACK( 7 , 0 , 93 ) ,
1001 VLC_PACK( 3 , 1 , 0 ) ,
1002 VLC_PACK( 5 , 0 , 411 ) ,
1003 VLC_PACK( 5 , 0 , 412 ) ,
1004 VLC_PACK( 7 , 0 , 415 ) ,
1005 VLC_PACK( 7 , 0 , 414 ) ,
1006 VLC_PACK( 0 , 0 , 2 ) ,
1007 VLC_PACK( 2 , 1 , 3 ) ,
1008 VLC_PACK( 7 , 0 , 61 ) ,
1009 VLC_PACK( 7 , 0 , 29 ) ,
1010 VLC_PACK( 3 , 1 , 0 ) ,
1011 VLC_PACK( 7 , 0 , 219 ) ,
1012 VLC_PACK( 7 , 0 , 250 ) ,
1013 VLC_PACK( 2 , 2 , 4 ) ,
1014 VLC_PACK( 2 , 1 , 7 ) ,
1015 VLC_PACK( 7 , 0 , 374 ) ,
1016 VLC_PACK( 7 , 0 , 375 ) ,
1017 VLC_PACK( 3 , 2 , 0 ) ,
1018 VLC_PACK( 3 , 2 , 0 ) ,
1019 VLC_PACK( 7 , 0 , 409 ) ,
1020 VLC_PACK( 7 , 0 , 371 ) ,
1021 VLC_PACK( 3 , 1 , 0 ) ,
1022 VLC_PACK( 7 , 0 , 372 ) ,
1023 VLC_PACK( 7 , 0 , 373 ) ,
1024 VLC_PACK( 0 , 1 , 4 ) ,
1025 VLC_PACK( 0 , 0 , 24 ) ,
1026 VLC_PACK( 7 , 0 , 94 ) ,
1027 VLC_PACK( 7 , 0 , 62 ) ,
1028 VLC_PACK( 0 , 1 , 4 ) ,
1029 VLC_PACK( 0 , 0 , 18 ) ,
1030 VLC_PACK( 7 , 0 , 434 ) ,
1031 VLC_PACK( 7 , 0 , 433 ) ,
1032 VLC_PACK( 0 , 1 , 4 ) ,
1033 VLC_PACK( 0 , 0 , 12 ) ,
1034 VLC_PACK( 7 , 0 , 423 ) ,
1035 VLC_PACK( 7 , 0 , 422 ) ,
1036 VLC_PACK( 1 , 1 , 4 ) ,
1037 VLC_PACK( 0 , 0 , 6 ) ,
1038 VLC_PACK( 7 , 0 , 413 ) ,
1039 VLC_PACK( 7 , 0 , 412 ) ,
1040 VLC_PACK( 3 , 1 , 0 ) ,
1041 VLC_PACK( 7 , 0 , 408 ) ,
1042 VLC_PACK( 7 , 0 , 407 ) ,
1043 VLC_PACK( 7 , 0 , 411 ) ,
1044 VLC_PACK( 7 , 0 , 410 ) ,
1045 VLC_PACK( 7 , 0 , 420 ) ,
1046 VLC_PACK( 7 , 0 , 419 ) ,
1047 VLC_PACK( 7 , 0 , 428 ) ,
1048 VLC_PACK( 7 , 0 , 427 ) ,
1049 VLC_PACK( 7 , 0 , 437 ) ,
1050 VLC_PACK( 7 , 0 , 436 ) ,
1051 VLC_PACK( 7 , 0 , 222 ) ,
1052 VLC_PACK( 7 , 0 , 190 ) ,
1053 /* B29_MVDs.out */
1054 VLC_PACK( 4 , 0 , 0 ) ,
1055 VLC_PACK( 5 , 0 , 1 ) ,
1056 VLC_PACK( 5 , 0 , 2 ) ,
1057 VLC_PACK( 5 , 0 , 3 ) ,
1058 VLC_PACK( 5 , 0 , 4 ) ,
1059 VLC_PACK( 5 , 0 , 5 ) ,
1060 VLC_PACK( 1 , 5 , 1 ) ,
1061 VLC_PACK( 5 , 0 , 6 ) ,
1062 VLC_PACK( 5 , 0 , 7 ) ,
1063 VLC_PACK( 5 , 0 , 8 ) ,
1064 VLC_PACK( 5 , 0 , 9 ) ,
1065 VLC_PACK( 5 , 0 , 10 ) ,
1066 VLC_PACK( 5 , 0 , 11 ) ,
1067 VLC_PACK( 1 , 3 , 1 ) ,
1068 VLC_PACK( 5 , 0 , 12 ) ,
1069 VLC_PACK( 5 , 0 , 13 ) ,
1070 VLC_PACK( 5 , 0 , 14 ) ,
1071 VLC_PACK( 5 , 0 , 15 ) ,
1072 VLC_PACK( 5 , 1 , 16 ) ,
1073 /* B30_MVDs.out */
1074 VLC_PACK( 5 , 0 , 1 ) ,
1075 VLC_PACK( 5 , 0 , 2 ) ,
1076 VLC_PACK( 5 , 0 , 3 ) ,
1077 VLC_PACK( 5 , 0 , 4 ) ,
1078 VLC_PACK( 5 , 0 , 5 ) ,
1079 VLC_PACK( 5 , 0 , 6 ) ,
1080 VLC_PACK( 1 , 5 , 1 ) ,
1081 VLC_PACK( 5 , 0 , 7 ) ,
1082 VLC_PACK( 5 , 0 , 8 ) ,
1083 VLC_PACK( 5 , 0 , 9 ) ,
1084 VLC_PACK( 5 , 0 , 10 ) ,
1085 VLC_PACK( 5 , 0 , 11 ) ,
1086 VLC_PACK( 5 , 0 , 12 ) ,
1087 VLC_PACK( 1 , 2 , 1 ) ,
1088 VLC_PACK( 5 , 0 , 13 ) ,
1089 VLC_PACK( 5 , 0 , 14 ) ,
1090 VLC_PACK( 5 , 0 , 15 ) ,
1091 VLC_PACK( 5 , 1 , 16 ) ,
1092 /* B31_conv_ratio.out */
1093 VLC_PACK( 4 , 0 , 1 ) ,
1094 VLC_PACK( 4 , 1 , 2 ) ,
1095 VLC_PACK( 4 , 1 , 4 ) ,
1096 };
1097
1098
1099 struct context_MPEG4_s {
1100 struct context_DEC_s dec_ctx;
1101 object_context_p obj_context; /* back reference */
1102
1103 uint32_t profile;
1104
1105 /* Picture parameters */
1106 VAPictureParameterBufferMPEG4 *pic_params;
1107 object_surface_p forward_ref_surface;
1108 object_surface_p backward_ref_surface;
1109
1110 uint32_t display_picture_width; /* in pixels */
1111 uint32_t display_picture_height; /* in pixels */
1112
1113 uint32_t coded_picture_width; /* in pixels */
1114 uint32_t coded_picture_height; /* in pixels */
1115
1116 uint32_t picture_width_mb; /* in macroblocks */
1117 uint32_t picture_height_mb; /* in macroblocks */
1118 uint32_t size_mb; /* in macroblocks */
1119
1120 uint32_t FEControl;
1121 uint32_t FE_SPS0;
1122 uint32_t FE_VOP_PPS0;
1123 uint32_t FE_VOP_SPS0;
1124 uint32_t FE_PICSH_PPS0;
1125
1126 uint32_t BE_SPS0;
1127 uint32_t BE_SPS1;
1128 uint32_t BE_VOP_PPS0;
1129 uint32_t BE_VOP_SPS0;
1130 uint32_t BE_VOP_SPS1;
1131 uint32_t BE_PICSH_PPS0;
1132
1133 /* IQ Matrix */
1134 uint32_t qmatrix_data[MAX_QUANT_TABLES][16];
1135 int load_non_intra_quant_mat;
1136 int load_intra_quant_mat;
1137
1138 /* VLC packed data */
1139 struct psb_buffer_s vlc_packed_table;
1140
1141 /* FE state buffer */
1142 struct psb_buffer_s preload_buffer;
1143
1144 struct psb_buffer_s *data_partition_buffer0;
1145 struct psb_buffer_s *data_partition_buffer1;
1146
1147 uint32_t field_type;
1148 };
1149
1150 typedef struct context_MPEG4_s *context_MPEG4_p;
1151
1152 #define INIT_CONTEXT_MPEG4 context_MPEG4_p ctx = (context_MPEG4_p) obj_context->format_data;
1153
1154 #define SURFACE(id) ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
1155
psb__debug_picture_coding_str(unsigned char vop_coding_type)1156 static const char *psb__debug_picture_coding_str(unsigned char vop_coding_type)
1157 {
1158 switch (vop_coding_type) {
1159 case PICTURE_CODING_I:
1160 return ("PICTURE_CODING_I");
1161 case PICTURE_CODING_P:
1162 return ("PICTURE_CODING_P");
1163 case PICTURE_CODING_B:
1164 return ("PICTURE_CODING_B");
1165 case PICTURE_CODING_S:
1166 return ("PICTURE_CODING_S");
1167 }
1168 return ("UNKNOWN!!!");
1169 }
1170
1171
pnw_MPEG4_QueryConfigAttributes(VAProfile profile,VAEntrypoint entrypoint,VAConfigAttrib * attrib_list,int num_attribs)1172 static void pnw_MPEG4_QueryConfigAttributes(
1173 VAProfile profile,
1174 VAEntrypoint entrypoint,
1175 VAConfigAttrib *attrib_list,
1176 int num_attribs)
1177 {
1178 int i;
1179 drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4_QueryConfigAttributes\n");
1180
1181 for (i = 0; i < num_attribs; i++) {
1182 switch (attrib_list[i].type) {
1183 case VAConfigAttribMaxPictureWidth:
1184 if (entrypoint == VAEntrypointVLD) {
1185 if (profile == VAProfileMPEG4AdvancedSimple)
1186 attrib_list[i].value = HW_SUPPORTED_MAX_PICTURE_WIDTH_MPEG4;
1187 else if(profile == VAProfileH263Baseline)
1188 attrib_list[i].value = HW_SUPPORTED_MAX_PICTURE_WIDTH_H263;
1189 else
1190 attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
1191 }
1192 else
1193 attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
1194 break;
1195 case VAConfigAttribMaxPictureHeight:
1196 if (entrypoint == VAEntrypointVLD) {
1197 if (profile == VAProfileMPEG4AdvancedSimple)
1198 attrib_list[i].value = HW_SUPPORTED_MAX_PICTURE_HEIGHT_MPEG4;
1199 else if(profile == VAProfileH263Baseline)
1200 attrib_list[i].value = HW_SUPPORTED_MAX_PICTURE_HEIGHT_H263;
1201 }
1202 else
1203 attrib_list[i].value = VA_ATTRIB_NOT_SUPPORTED;
1204 break;
1205 default:
1206 break;
1207 }
1208 }
1209 }
1210
pnw_MPEG4_ValidateConfig(object_config_p obj_config)1211 static VAStatus pnw_MPEG4_ValidateConfig(
1212 object_config_p obj_config)
1213 {
1214 int i;
1215 /* Check all attributes */
1216 for (i = 0; i < obj_config->attrib_count; i++) {
1217 switch (obj_config->attrib_list[i].type) {
1218 case VAConfigAttribRTFormat:
1219 /* Ignore */
1220 break;
1221
1222 default:
1223 return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1224 }
1225 }
1226
1227 return VA_STATUS_SUCCESS;
1228 }
1229
psb__MPEG4_check_legal_picture(object_context_p obj_context,object_config_p obj_config)1230 static VAStatus psb__MPEG4_check_legal_picture(object_context_p obj_context, object_config_p obj_config)
1231 {
1232 VAStatus vaStatus = VA_STATUS_SUCCESS;
1233
1234 CHECK_CONTEXT(obj_context);
1235
1236 CHECK_CONFIG(obj_config);
1237
1238 /* MSVDX decode capability for MPEG4:
1239 * SP@L3
1240 * ASP@L5
1241 *
1242 * Refer to the "MSVDX MPEG4 decode capability" table of "Poulsbo Media Software Overview".
1243 */
1244 switch (obj_config->profile) {
1245 case VAProfileMPEG4Simple:
1246 case VAProfileMPEG4AdvancedSimple:
1247 if ((obj_context->picture_width <= 0) || (obj_context->picture_height <= 0)) {
1248 vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
1249 }
1250 break;
1251
1252 default:
1253 vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
1254 break;
1255 }
1256
1257 return vaStatus;
1258 }
1259
1260 static void pnw_MPEG4_DestroyContext(object_context_p obj_context);
1261 static void psb__MPEG4_process_slice_data(context_DEC_p dec_ctx, VASliceParameterBufferBase *vld_slice_param);
1262 static void psb__MPEG4_end_slice(context_DEC_p dec_ctx);
1263 static void psb__MPEG4_begin_slice(context_DEC_p dec_ctx, VASliceParameterBufferBase *vld_slice_param);
1264 static VAStatus pnw_MPEG4_process_buffer(context_DEC_p dec_ctx, object_buffer_p buffer);
1265
pnw_MPEG4_CreateContext(object_context_p obj_context,object_config_p obj_config)1266 static VAStatus pnw_MPEG4_CreateContext(
1267 object_context_p obj_context,
1268 object_config_p obj_config)
1269 {
1270 VAStatus vaStatus = VA_STATUS_SUCCESS;
1271 context_MPEG4_p ctx;
1272 /* Validate flag */
1273 /* Validate picture dimensions */
1274 vaStatus = psb__MPEG4_check_legal_picture(obj_context, obj_config);
1275 CHECK_VASTATUS();
1276
1277 ctx = (context_MPEG4_p) calloc(1, sizeof(struct context_MPEG4_s));
1278 CHECK_ALLOCATION(ctx);
1279
1280 obj_context->format_data = (void*) ctx;
1281 ctx->obj_context = obj_context;
1282 ctx->pic_params = NULL;
1283 ctx->load_non_intra_quant_mat = FALSE;
1284 ctx->load_intra_quant_mat = FALSE;
1285
1286 ctx->dec_ctx.begin_slice = psb__MPEG4_begin_slice;
1287 ctx->dec_ctx.process_slice = psb__MPEG4_process_slice_data;
1288 ctx->dec_ctx.end_slice = psb__MPEG4_end_slice;
1289 ctx->dec_ctx.process_buffer = pnw_MPEG4_process_buffer;
1290
1291 ctx->data_partition_buffer0 = NULL;
1292 ctx->data_partition_buffer1 = NULL;
1293
1294 switch (obj_config->profile) {
1295 case VAProfileMPEG4Simple:
1296 drv_debug_msg(VIDEO_DEBUG_GENERAL, "MPEG4_PROFILE_SIMPLE\n");
1297 ctx->profile = MPEG4_PROFILE_SIMPLE;
1298 break;
1299
1300 case VAProfileMPEG4AdvancedSimple:
1301 drv_debug_msg(VIDEO_DEBUG_GENERAL, "MPEG4_PROFILE_ASP\n");
1302 ctx->profile = MPEG4_PROFILE_ASP;
1303 break;
1304
1305 default:
1306 ASSERT(0 == 1);
1307 vaStatus = VA_STATUS_ERROR_UNKNOWN;
1308 }
1309
1310 // TODO
1311
1312 if (vaStatus == VA_STATUS_SUCCESS) {
1313 vaStatus = psb_buffer_create(obj_context->driver_data,
1314 FE_STATE_BUFFER_SIZE,
1315 psb_bt_vpu_only,
1316 &ctx->preload_buffer);
1317 DEBUG_FAILURE;
1318 }
1319 ctx->dec_ctx.preload_buffer = &ctx->preload_buffer;
1320
1321 if (vaStatus == VA_STATUS_SUCCESS) {
1322 vaStatus = psb_buffer_create(obj_context->driver_data,
1323 sizeof(gaui16mpeg4VlcTableDataPacked),
1324 psb_bt_cpu_vpu,
1325 &ctx->vlc_packed_table);
1326 DEBUG_FAILURE;
1327 }
1328 if (vaStatus == VA_STATUS_SUCCESS) {
1329 unsigned char *vlc_packed_data_address;
1330 if (0 == psb_buffer_map(&ctx->vlc_packed_table, &vlc_packed_data_address)) {
1331 memcpy(vlc_packed_data_address, gaui16mpeg4VlcTableDataPacked, sizeof(gaui16mpeg4VlcTableDataPacked));
1332 psb_buffer_unmap(&ctx->vlc_packed_table);
1333 } else {
1334 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1335 DEBUG_FAILURE;
1336 }
1337 }
1338
1339 if (vaStatus == VA_STATUS_SUCCESS) {
1340 vaStatus = vld_dec_CreateContext(&ctx->dec_ctx, obj_context);
1341 DEBUG_FAILURE;
1342 }
1343
1344 ctx->field_type = 2;
1345
1346 if (vaStatus != VA_STATUS_SUCCESS) {
1347 pnw_MPEG4_DestroyContext(obj_context);
1348 }
1349
1350 return vaStatus;
1351 }
1352
pnw_MPEG4_DestroyContext(object_context_p obj_context)1353 static void pnw_MPEG4_DestroyContext(
1354 object_context_p obj_context)
1355 {
1356 INIT_CONTEXT_MPEG4
1357 int i;
1358
1359 vld_dec_DestroyContext(&ctx->dec_ctx);
1360
1361 psb_buffer_destroy(&ctx->vlc_packed_table);
1362 psb_buffer_destroy(&ctx->preload_buffer);
1363
1364 if(ctx->data_partition_buffer0)
1365 psb_buffer_destroy(ctx->data_partition_buffer0);
1366
1367 if(ctx->data_partition_buffer1)
1368 psb_buffer_destroy(ctx->data_partition_buffer1);
1369
1370 ctx->data_partition_buffer0 = NULL;
1371 ctx->data_partition_buffer1 = NULL;
1372
1373 if (ctx->pic_params) {
1374 free(ctx->pic_params);
1375 ctx->pic_params = NULL;
1376 }
1377
1378 free(obj_context->format_data);
1379 obj_context->format_data = NULL;
1380 }
1381
psb__MPEG4_process_picture_param(context_MPEG4_p ctx,object_buffer_p obj_buffer)1382 static VAStatus psb__MPEG4_process_picture_param(context_MPEG4_p ctx, object_buffer_p obj_buffer)
1383 {
1384 VAStatus vaStatus;
1385 object_surface_p obj_surface = ctx->obj_context->current_render_target;
1386
1387 ASSERT(obj_buffer->type == VAPictureParameterBufferType);
1388 ASSERT(obj_buffer->num_elements == 1);
1389 ASSERT(obj_buffer->size == sizeof(VAPictureParameterBufferMPEG4));
1390
1391 if ((obj_buffer->num_elements != 1) ||
1392 (obj_buffer->size != sizeof(VAPictureParameterBufferMPEG4))) {
1393 return VA_STATUS_ERROR_UNKNOWN;
1394 }
1395
1396 /* Transfer ownership of VAPictureParameterBufferMPEG4 data */
1397 if (ctx->pic_params) {
1398 free(ctx->pic_params);
1399 }
1400 ctx->pic_params = (VAPictureParameterBufferMPEG4 *) obj_buffer->buffer_data;
1401 obj_buffer->buffer_data = NULL;
1402 obj_buffer->size = 0;
1403
1404
1405 /* Lookup surfaces for backward/forward references */
1406 /* Lookup surfaces for backward/forward references */
1407 switch (ctx->pic_params->vop_fields.bits.vop_coding_type) {
1408 case PICTURE_CODING_I:
1409 ctx->forward_ref_surface = NULL;
1410 ctx->backward_ref_surface = NULL;
1411 drv_debug_msg(VIDEO_DEBUG_GENERAL, "PICTURE_CODING_I\nTarget surface = %08x (%08x)\n", ctx->obj_context->current_render_target->psb_surface, ctx->obj_context->current_render_target->base.id);
1412 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Forward ref = NULL\n");
1413 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Backward ref = NULL\n");
1414 break;
1415
1416 case PICTURE_CODING_P:
1417 ctx->forward_ref_surface = SURFACE(ctx->pic_params->forward_reference_picture);
1418 ctx->backward_ref_surface = NULL;
1419
1420 if (ctx->pic_params->forward_reference_picture == VA_INVALID_SURFACE)
1421 ctx->forward_ref_surface = NULL;
1422 if (NULL == ctx->forward_ref_surface && ctx->pic_params->forward_reference_picture != VA_INVALID_SURFACE) {
1423 return VA_STATUS_ERROR_INVALID_SURFACE;
1424 }
1425 drv_debug_msg(VIDEO_DEBUG_GENERAL, "PICTURE_CODING_P\nTarget surface = %08x (%08x)\n", ctx->obj_context->current_render_target->psb_surface, ctx->obj_context->current_render_target->base.id);
1426 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Forward ref = %08x (%08x)\n", (ctx->forward_ref_surface ? ctx->forward_ref_surface->psb_surface : 0), ctx->pic_params->forward_reference_picture);
1427 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Backward ref = NULL\n");
1428 break;
1429
1430 case PICTURE_CODING_B:
1431 ctx->forward_ref_surface = SURFACE(ctx->pic_params->forward_reference_picture);
1432 ctx->backward_ref_surface = SURFACE(ctx->pic_params->backward_reference_picture);
1433 if ((NULL == ctx->forward_ref_surface) ||
1434 (NULL == ctx->backward_ref_surface)) {
1435 return VA_STATUS_ERROR_INVALID_SURFACE;
1436 }
1437 drv_debug_msg(VIDEO_DEBUG_GENERAL, "PICTURE_CODING_B\nTarget surface = %08x (%08x)\n", ctx->obj_context->current_render_target->psb_surface, ctx->obj_context->current_render_target->base.id);
1438 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Forward ref = %08x (%08x)\n", ctx->forward_ref_surface->psb_surface, ctx->pic_params->forward_reference_picture);
1439 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Backward ref = %08x (%08x)\n", ctx->backward_ref_surface->psb_surface, ctx->pic_params->backward_reference_picture);
1440 break;
1441
1442 case PICTURE_CODING_S:
1443 ctx->forward_ref_surface = SURFACE(ctx->pic_params->forward_reference_picture);
1444 ctx->backward_ref_surface = SURFACE(ctx->pic_params->backward_reference_picture);
1445 drv_debug_msg(VIDEO_DEBUG_GENERAL, "PICTURE_CODING_S\nTarget surface = %08x (%08x)\n", ctx->obj_context->current_render_target->psb_surface, ctx->obj_context->current_render_target->base.id);
1446 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Forward ref = %08x (%08x)\n", ctx->forward_ref_surface ? ctx->forward_ref_surface->psb_surface : 0, ctx->pic_params->forward_reference_picture);
1447 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Backward ref = %08x (%08x)\n", ctx->backward_ref_surface ? ctx->backward_ref_surface->psb_surface : 0, ctx->pic_params->backward_reference_picture);
1448 break;
1449
1450 default:
1451 drv_debug_msg(VIDEO_DEBUG_ERROR, "Unhandled MPEG4 vop_coding_type '%d'\n", ctx->pic_params->vop_fields.bits.vop_coding_type);
1452 return VA_STATUS_ERROR_UNKNOWN;
1453 }
1454
1455 if (NULL == ctx->forward_ref_surface) {
1456 /* for mmu fault protection */
1457 ctx->forward_ref_surface = ctx->obj_context->current_render_target;
1458 }
1459 if (NULL == ctx->backward_ref_surface) {
1460 /* for mmu fault protection */
1461 ctx->backward_ref_surface = ctx->obj_context->current_render_target;
1462 }
1463
1464 ctx->display_picture_width = ctx->pic_params->vop_width;
1465 ctx->display_picture_height = ctx->pic_params->vop_height;
1466 ctx->picture_width_mb = PIXELS_TO_MB(ctx->display_picture_width);
1467 ctx->picture_height_mb = PIXELS_TO_MB(ctx->display_picture_height);
1468 ctx->coded_picture_width = ctx->picture_width_mb * 16;
1469 ctx->coded_picture_height = ctx->picture_height_mb * 16;
1470 ctx->size_mb = ctx->picture_width_mb * ctx->picture_height_mb;
1471
1472 if (obj_surface->share_info) {
1473 obj_surface->share_info->coded_width = ctx->coded_picture_width;
1474 obj_surface->share_info->coded_height = ctx->coded_picture_height;
1475 }
1476
1477 uint32_t mbInPic = ctx->picture_width_mb * ctx->picture_height_mb;
1478
1479 mbInPic += 4;
1480
1481 uint32_t colocated_size = ((mbInPic * 200) + 0xfff) & ~0xfff;
1482
1483 vaStatus = vld_dec_allocate_colocated_buffer(&ctx->dec_ctx, ctx->obj_context->current_render_target, colocated_size);
1484 CHECK_VASTATUS();
1485
1486 vaStatus = vld_dec_allocate_colocated_buffer(&ctx->dec_ctx, ctx->forward_ref_surface, colocated_size);
1487 CHECK_VASTATUS();
1488
1489 ctx->FEControl = 0;
1490 REGIO_WRITE_FIELD_LITE(ctx->FEControl ,
1491 MSVDX_VEC,
1492 CR_VEC_ENTDEC_FE_CONTROL,
1493 ENTDEC_FE_PROFILE,
1494 ctx->profile); /* MPEG4 SP / ASP profile */
1495
1496 REGIO_WRITE_FIELD_LITE(ctx->FEControl ,
1497 MSVDX_VEC,
1498 CR_VEC_ENTDEC_FE_CONTROL,
1499 ENTDEC_FE_MODE,
1500 4); /* Set MPEG4 mode */
1501
1502 /* FE_SPS0 */
1503 ctx->FE_SPS0 = 0;
1504 REGIO_WRITE_FIELD_LITE(ctx->FE_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SPS0, FE_VOP_WIDTH_IN_MBS_LESS_1, ctx->picture_width_mb - 1);
1505 REGIO_WRITE_FIELD_LITE(ctx->FE_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SPS0, FE_SHORT_HEADER_FLAG, ctx->pic_params->vol_fields.bits.short_video_header);
1506 REGIO_WRITE_FIELD_LITE(ctx->FE_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SPS0, FE_PROFILE, ctx->profile);
1507
1508 /* FE_VOP_SPS0 */
1509 ctx->FE_VOP_SPS0 = 0;
1510 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_SPS0, FE_VOP_HEIGHT_IN_MBS_LESS_1, ctx->picture_height_mb - 1);
1511 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_SPS0, QUANT_PRECISION, ctx->pic_params->quant_precision);
1512 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_SPS0, FE_NO_OF_GMC_WARPING_POINTS, ((ctx->pic_params->no_of_sprite_warping_points) ? 1 : 0));
1513 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_SPS0, FE_GMC_ENABLE, (ctx->pic_params->vol_fields.bits.sprite_enable == GMC));
1514 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_SPS0, REVERSIBLE_VLC, ctx->pic_params->vol_fields.bits.reversible_vlc);
1515 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_SPS0, FE_DATA_PARTITIONED, ctx->pic_params->vol_fields.bits.data_partitioned);
1516 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_SPS0, FE_INTERLACED, ctx->pic_params->vol_fields.bits.interlaced);
1517
1518 if (ctx->pic_params->vol_fields.bits.short_video_header) {
1519 /* FE_PICSH_PPS0 */
1520 ctx->FE_PICSH_PPS0 = 0;
1521 REGIO_WRITE_FIELD_LITE(ctx->FE_PICSH_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_PICSH_PPS0, NUM_MBS_IN_GOB, ctx->pic_params->num_macroblocks_in_gob);
1522 REGIO_WRITE_FIELD_LITE(ctx->FE_PICSH_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_PICSH_PPS0, NUM_GOBS_IN_VOP, ctx->pic_params->num_gobs_in_vop);
1523 REGIO_WRITE_FIELD_LITE(ctx->FE_PICSH_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_PICSH_PPS0, FE_PICSH_CODING_TYPE, ctx->pic_params->vop_fields.bits.vop_coding_type);
1524 }
1525
1526 /* FE_VOP_PPS0 */
1527 ctx->FE_VOP_PPS0 = 0;
1528 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_PPS0, BACKWARD_REF_VOP_CODING_TYPE, ctx->pic_params->vop_fields.bits.backward_reference_vop_coding_type);
1529 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_PPS0, FE_FCODE_BACKWARD, ctx->pic_params->vop_fcode_backward);
1530 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_PPS0, FE_FCODE_FORWARD, ctx->pic_params->vop_fcode_forward);
1531 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_PPS0, INTRA_DC_VLC_THR, ctx->pic_params->vop_fields.bits.intra_dc_vlc_thr);
1532 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_PPS0, FE_VOP_CODING_TYPE, ctx->pic_params->vop_fields.bits.vop_coding_type);
1533
1534 /* BE_SPS0 */
1535 /* Common for VOPs and pictures with short header */
1536 ctx->BE_SPS0 = 0;
1537 REGIO_WRITE_FIELD_LITE(ctx->BE_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_SPS0, BE_SHORT_HEADER_FLAG, ctx->pic_params->vol_fields.bits.short_video_header);
1538 REGIO_WRITE_FIELD_LITE(ctx->BE_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_SPS0, BE_PROFILE, ctx->profile);
1539
1540 /* BE_SPS1 */
1541 /* Common for VOPs and pictures with short header */
1542 ctx->BE_SPS1 = 0;
1543 REGIO_WRITE_FIELD_LITE(ctx->BE_SPS1, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_SPS1, BE_VOP_WIDTH_IN_MBS_LESS_1, ctx->picture_width_mb - 1);
1544 REGIO_WRITE_FIELD_LITE(ctx->BE_SPS1, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_SPS1, VOP_HEIGHT_IN_MBS_LESS_1, ctx->picture_height_mb - 1);
1545
1546 if (0 == ctx->pic_params->vol_fields.bits.short_video_header) {
1547 /* BE_VOP_SPS0 */
1548 ctx->BE_VOP_SPS0 = 0;
1549 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_SPS0, QUANT_TYPE, ctx->pic_params->vol_fields.bits.quant_type);
1550 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_SPS0, OBMC_DISABLE, ctx->pic_params->vol_fields.bits.obmc_disable);
1551 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_SPS0, QUARTER_SAMPLE, ctx->pic_params->vol_fields.bits.quarter_sample);
1552
1553 /* BE_VOP_SPS1 */
1554 ctx->BE_VOP_SPS1 = 0;
1555 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_SPS1, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_SPS1, GMC_WARPING_ACCURACY, ctx->pic_params->vol_fields.bits.sprite_warping_accuracy);
1556 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_SPS1, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_SPS1, BE_NO_OF_GMC_WARPING_POINTS, ((ctx->pic_params->no_of_sprite_warping_points) ? 1 : 0));
1557 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_SPS1, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_SPS1, BE_GMC_ENABLE, (ctx->pic_params->vol_fields.bits.sprite_enable == GMC));
1558 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_SPS1, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_SPS1, BE_DATA_PARTITIONED, ctx->pic_params->vol_fields.bits.data_partitioned);
1559 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_SPS1, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_SPS1, BE_INTERLACED, ctx->pic_params->vol_fields.bits.interlaced);
1560
1561 /* BE_VOP_PPS0 */
1562 ctx->BE_VOP_PPS0 = 0;
1563 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_PPS0, BE_FCODE_BACKWARD, ctx->pic_params->vop_fcode_backward);
1564 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_PPS0, BE_FCODE_FORWARD, ctx->pic_params->vop_fcode_forward);
1565 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_PPS0, ALTERNATE_VERTICAL_SCAN_FLAG, ctx->pic_params->vop_fields.bits.alternate_vertical_scan_flag);
1566 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_PPS0, TOP_FIELD_FIRST, ctx->pic_params->vop_fields.bits.top_field_first);
1567 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0,
1568 MSVDX_VEC_MPEG4,
1569 CR_VEC_MPEG4_BE_VOP_PPS0,
1570 ROUNDING_TYPE,
1571 ((PICTURE_CODING_I == ctx->pic_params->vop_fields.bits.vop_coding_type ||
1572 PICTURE_CODING_B == ctx->pic_params->vop_fields.bits.vop_coding_type) ?
1573 0 : ctx->pic_params->vop_fields.bits.vop_rounding_type));
1574 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_PPS0, BE_VOP_CODING_TYPE, ctx->pic_params->vop_fields.bits.vop_coding_type);
1575 } else {
1576 /* BE_VOP_PPS0 */
1577 ctx->BE_VOP_PPS0 = 0;
1578 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_PPS0, BE_FCODE_FORWARD, 1); // Always 1 in short header mode 6.3.5.2
1579 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_PPS0, ALTERNATE_VERTICAL_SCAN_FLAG, ctx->pic_params->vop_fields.bits.alternate_vertical_scan_flag);
1580 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_PPS0, TOP_FIELD_FIRST, ctx->pic_params->vop_fields.bits.top_field_first);
1581 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_PPS0, ROUNDING_TYPE, 0); // Always 0 in short header mode 6.3.5.2
1582 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_PPS0, BE_VOP_CODING_TYPE, ctx->pic_params->vop_fields.bits.vop_coding_type);
1583
1584 /* BE_PICSH_PPS0 */
1585 ctx->BE_PICSH_PPS0 = 0;
1586 REGIO_WRITE_FIELD_LITE(ctx->BE_PICSH_PPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_PICSH_PPS0, BE_PICSH_CODING_TYPE, ctx->pic_params->vop_fields.bits.vop_coding_type);
1587 }
1588
1589 if(ctx->pic_params->vol_fields.bits.data_partitioned) {
1590 if(!ctx->data_partition_buffer0) {
1591 int size = 16 * ctx->size_mb;
1592 ctx->data_partition_buffer0 = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s));
1593 CHECK_ALLOCATION(ctx->data_partition_buffer0);
1594 size = (size + 0xfff) & (~0xfff);
1595 vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, ctx->data_partition_buffer0);
1596 CHECK_VASTATUS();
1597 }
1598 if(!ctx->data_partition_buffer1) {
1599 int size = 16 * ctx->size_mb;
1600 ctx->data_partition_buffer1 = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s));
1601 CHECK_ALLOCATION(ctx->data_partition_buffer1);
1602 size = (size + 0xfff) & (~0xfff);
1603 vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, ctx->data_partition_buffer1);
1604 CHECK_VASTATUS();
1605 }
1606 }
1607
1608 return VA_STATUS_SUCCESS;
1609 }
1610
psb__MPEG4_convert_iq_matrix(uint32_t * dest32,unsigned char * src)1611 static void psb__MPEG4_convert_iq_matrix(uint32_t *dest32, unsigned char *src)
1612 {
1613 int i;
1614 int *idx = scan0;
1615 uint8_t *dest8 = (uint8_t*) dest32;
1616
1617 for (i = 0; i < 64; i++) {
1618 *dest8++ = src[*idx++];
1619 }
1620 }
1621
psb__MPEG4_process_iq_matrix(context_MPEG4_p ctx,object_buffer_p obj_buffer)1622 static VAStatus psb__MPEG4_process_iq_matrix(context_MPEG4_p ctx, object_buffer_p obj_buffer)
1623 {
1624 VAIQMatrixBufferMPEG4 *iq_matrix = (VAIQMatrixBufferMPEG4 *) obj_buffer->buffer_data;
1625 ASSERT(obj_buffer->type == VAIQMatrixBufferType);
1626 ASSERT(obj_buffer->num_elements == 1);
1627 ASSERT(obj_buffer->size == sizeof(VAIQMatrixBufferMPEG4));
1628
1629 if ((obj_buffer->num_elements != 1) ||
1630 (obj_buffer->size != sizeof(VAIQMatrixBufferMPEG4))) {
1631 return VA_STATUS_ERROR_UNKNOWN;
1632 }
1633
1634 if (iq_matrix->load_non_intra_quant_mat) {
1635 psb__MPEG4_convert_iq_matrix(ctx->qmatrix_data[NONINTRA_LUMA_Q], iq_matrix->non_intra_quant_mat);
1636 }
1637 if (iq_matrix->load_intra_quant_mat) {
1638 psb__MPEG4_convert_iq_matrix(ctx->qmatrix_data[INTRA_LUMA_Q], iq_matrix->intra_quant_mat);
1639 }
1640 ctx->load_non_intra_quant_mat = iq_matrix->load_non_intra_quant_mat;
1641 ctx->load_intra_quant_mat = iq_matrix->load_intra_quant_mat;
1642
1643 return VA_STATUS_SUCCESS;
1644 }
1645
psb__MPEG4_write_qmatrices(context_MPEG4_p ctx)1646 static void psb__MPEG4_write_qmatrices(context_MPEG4_p ctx)
1647 {
1648 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1649 int i;
1650
1651 // TODO: Verify that this is indeed the same as MPEG2
1652
1653 /* Since we only decode 4:2:0 We only need to the Intra tables.
1654 Chroma quant tables are only used in Mpeg 4:2:2 and 4:4:4.
1655 The hardware wants non-intra followed by intra */
1656 /* psb_cmdbuf_rendec_start_block( cmdbuf ); */
1657 psb_cmdbuf_rendec_start(cmdbuf, REG_MSVDX_VEC_IQRAM_OFFSET);
1658
1659 /* todo : optimisation here is to only load the need table */
1660 if (ctx->load_non_intra_quant_mat) {
1661 /* NONINTRA_LUMA_Q --> REG_MSVDX_VEC_IQRAM_OFFSET + 0 */
1662 for (i = 0; i < 16; i++) {
1663 psb_cmdbuf_rendec_write(cmdbuf, ctx->qmatrix_data[NONINTRA_LUMA_Q][i]);
1664 }
1665 } else {
1666 for (i = 0; i < 16; i++) {
1667 psb_cmdbuf_rendec_write(cmdbuf, 0);
1668 }
1669 }
1670 if (ctx->load_intra_quant_mat) {
1671 /* INTRA_LUMA_Q --> REG_MSVDX_VEC_IQRAM_OFFSET + (16*4) */
1672 for (i = 0; i < 16; i++) {
1673 psb_cmdbuf_rendec_write(cmdbuf, ctx->qmatrix_data[INTRA_LUMA_Q][i]);
1674 }
1675 } else {
1676 for (i = 0; i < 16; i++) {
1677 psb_cmdbuf_rendec_write(cmdbuf, 0);
1678 }
1679 }
1680
1681 psb_cmdbuf_rendec_end(cmdbuf);
1682 /* psb_cmdbuf_rendec_end_block( cmdbuf ); */
1683 }
1684
1685 /* Precalculated values */
1686 #define ADDR0 (0x00005800)
1687 #define ADDR1 (0x0001f828)
1688 #define ADDR2 (0x0002b854)
1689 #define ADDR3 (0x0002f85c)
1690 #define ADDR4 (0x0004d089)
1691 #define ADDR5 (0x0008f0aa)
1692 #define ADDR6 (0x00149988)
1693 #define ADDR7 (0x001d8b9e)
1694 #define ADDR8 (0x000003c3)
1695 #define WIDTH0 (0x09a596ed)
1696 #define WIDTH1 (0x0006d6db)
1697 #define OPCODE0 (0x50009a0a)
1698 #define OPCODE1 (0x00000001)
1699
psb__MPEG4_write_VLC_tables(context_MPEG4_p ctx)1700 static void psb__MPEG4_write_VLC_tables(context_MPEG4_p ctx)
1701 {
1702 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1703
1704 psb_cmdbuf_skip_start_block(cmdbuf, SKIP_ON_CONTEXT_SWITCH);
1705 /* VLC Table */
1706 /* Write a LLDMA Cmd to transfer VLD Table data */
1707 psb_cmdbuf_dma_write_cmdbuf(cmdbuf, &ctx->vlc_packed_table, 0,
1708 sizeof(gaui16mpeg4VlcTableDataPacked), 0,
1709 DMA_TYPE_VLC_TABLE);
1710
1711 /* Write the vec registers with the index data for each of the tables and then write */
1712 /* the actual table data. */
1713 psb_cmdbuf_reg_start_block(cmdbuf, 0);
1714 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR0), ADDR0);
1715 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR1), ADDR1);
1716 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR2), ADDR2);
1717 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR3), ADDR3);
1718 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR4), ADDR4);
1719 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR5), ADDR5);
1720 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR6), ADDR6);
1721 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR7), ADDR7);
1722 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR8), ADDR8);
1723 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0), WIDTH0);
1724 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH1), WIDTH1);
1725 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0), OPCODE0);
1726 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE1), OPCODE1);
1727 psb_cmdbuf_reg_end_block(cmdbuf);
1728
1729 psb_cmdbuf_skip_end_block(cmdbuf);
1730 }
1731
psb__MPEG4_set_picture_params(context_MPEG4_p ctx,VASliceParameterBufferMPEG4 __maybe_unused * slice_param)1732 static void psb__MPEG4_set_picture_params(context_MPEG4_p ctx, VASliceParameterBufferMPEG4 __maybe_unused * slice_param)
1733 {
1734 uint32_t cmd;
1735 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1736 psb_surface_p target_surface = ctx->obj_context->current_render_target->psb_surface;
1737
1738 psb_buffer_p colocated_target_buffer = vld_dec_lookup_colocated_buffer(&ctx->dec_ctx, target_surface);
1739 psb_buffer_p colocated_ref_buffer = vld_dec_lookup_colocated_buffer(&ctx->dec_ctx, ctx->forward_ref_surface->psb_surface); /* FIXME DE2.0 use backward ref surface */
1740 ASSERT(colocated_target_buffer);
1741 ASSERT(colocated_ref_buffer);
1742
1743 /* psb_cmdbuf_rendec_start_block( cmdbuf ); */
1744
1745 /* BE_PARAM_BASE_ADDR */
1746 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_PARAM_BASE_ADDR));
1747 if (colocated_target_buffer) {
1748 psb_cmdbuf_rendec_write_address(cmdbuf, colocated_target_buffer, 0);
1749 } else {
1750 /* This is an error */
1751 psb_cmdbuf_rendec_write(cmdbuf, 0);
1752 }
1753 psb_cmdbuf_rendec_end(cmdbuf);
1754
1755 /* PARAM_BASE_ADDRESS */
1756 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_COLPARAM_BASE_ADDR));
1757 if (colocated_ref_buffer) {
1758 psb_cmdbuf_rendec_write_address(cmdbuf, colocated_ref_buffer, 0);
1759 } else {
1760 /* This is an error */
1761 psb_cmdbuf_rendec_write(cmdbuf, 0);
1762 }
1763 psb_cmdbuf_rendec_end(cmdbuf);
1764
1765 vld_dec_setup_alternative_frame(ctx->obj_context);
1766
1767 /* Send VDMC and VDEB commands */
1768 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, DISPLAY_PICTURE_SIZE));
1769
1770 /* Display picture size cmd */
1771 cmd = 0;
1772 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_HEIGHT, ctx->coded_picture_height - 1);
1773 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_WIDTH, ctx->coded_picture_width - 1);
1774 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1775
1776 /* Coded picture size cmd */
1777 cmd = 0;
1778 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_HEIGHT, ctx->coded_picture_height - 1);
1779 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_WIDTH, ctx->coded_picture_width - 1);
1780 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1781
1782 /* Operating mode cmd */
1783 cmd = 0;
1784 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, CHROMA_INTERLEAVED, 0); /* 0 = CbCr, 1 = CrCb */
1785 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, ROW_STRIDE, ctx->obj_context->current_render_target->psb_surface->stride_mode);
1786 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, CODEC_PROFILE, ctx->profile); /* MPEG4 SP / ASP profile */
1787 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, CODEC_MODE, 4); /* MPEG4 */
1788 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, ASYNC_MODE, 1); /* VDMC only */
1789 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, CHROMA_FORMAT, 1);
1790 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, INTERLACED, ctx->pic_params->vol_fields.bits.interlaced);
1791 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1792 ctx->obj_context->operating_mode = cmd;
1793
1794 drv_debug_msg(VIDEO_DEBUG_GENERAL, " vop_coding_type = %s\n", psb__debug_picture_coding_str(ctx->pic_params->vop_fields.bits.vop_coding_type));
1795 drv_debug_msg(VIDEO_DEBUG_GENERAL, " backward ref vop_coding_type = %s\n", psb__debug_picture_coding_str(ctx->pic_params->vop_fields.bits.backward_reference_vop_coding_type));
1796
1797 /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1798 psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs);
1799 /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1800 psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
1801
1802 psb_cmdbuf_rendec_end(cmdbuf);
1803
1804 /* Reference pictures base addresses */
1805 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES));
1806
1807 //drv_debug_msg(VIDEO_DEBUG_GENERAL, "Target surface = %08x\n", target_surface);
1808 //drv_debug_msg(VIDEO_DEBUG_GENERAL, "Forward ref = %08x\n", ctx->forward_ref_surface->psb_surface);
1809 //drv_debug_msg(VIDEO_DEBUG_GENERAL, "Backward ref = %08x\n", ctx->backward_ref_surface->psb_surface);
1810
1811 /* forward reference picture */
1812 /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1813 psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->buf.buffer_ofs);
1814 /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1815 psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->buf.buffer_ofs + ctx->forward_ref_surface->psb_surface->chroma_offset);
1816
1817 /* backward reference picture */
1818 /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1819 psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->backward_ref_surface->psb_surface->buf, ctx->backward_ref_surface->psb_surface->buf.buffer_ofs);
1820 /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1821 psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->backward_ref_surface->psb_surface->buf, ctx->backward_ref_surface->psb_surface->buf.buffer_ofs + ctx->backward_ref_surface->psb_surface->chroma_offset);
1822
1823 psb_cmdbuf_rendec_end(cmdbuf);
1824 /* psb_cmdbuf_rendec_end_block( cmdbuf ); */
1825 }
1826
psb__MPEG4_set_backend_registers(context_MPEG4_p ctx,VASliceParameterBufferMPEG4 * slice_param)1827 static void psb__MPEG4_set_backend_registers(context_MPEG4_p ctx, VASliceParameterBufferMPEG4 *slice_param)
1828 {
1829 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1830 uint32_t cmd;
1831 unsigned short width_mb = PIXELS_TO_MB(ctx->pic_params->vop_width);
1832
1833 /* psb_cmdbuf_rendec_start_block( cmdbuf ); */
1834
1835 /* Write Back-End EntDec registers */
1836 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_SPS0));
1837 /* BE_SPS0 */
1838 /* Common for VOPs and pictures with short header */
1839 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_SPS0);
1840 /* BE_SPS1 */
1841 /* Common for VOPs and pictures with short header */
1842 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_SPS1);
1843 psb_cmdbuf_rendec_end(cmdbuf);
1844
1845 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_VOP_SPS0));
1846 if (0 == ctx->pic_params->vol_fields.bits.short_video_header) {
1847 /* BE_VOP_SPS0 */
1848 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_VOP_SPS0);
1849 /* BE_VOP_SPS1 */
1850 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_VOP_SPS1);
1851 /* BE_VOP_PPS0 */
1852 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_VOP_PPS0);
1853 } else { /* Short-header mode */
1854 /* BE_VOP_SPS0 */
1855 psb_cmdbuf_rendec_write(cmdbuf, 0);
1856 /* BE_VOP_SPS1 */
1857 psb_cmdbuf_rendec_write(cmdbuf, 0);
1858 /* BE_VOP_PPS0 */
1859 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_VOP_PPS0);
1860 /* BE_PICSH_PPS0 */
1861 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_PICSH_PPS0);
1862 }
1863 psb_cmdbuf_rendec_end(cmdbuf);
1864
1865 if (0 == ctx->pic_params->vol_fields.bits.short_video_header) {
1866 if ((GMC == ctx->pic_params->vol_fields.bits.sprite_enable) &&
1867 (PICTURE_CODING_S == ctx->pic_params->vop_fields.bits.vop_coding_type)) {
1868 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_GMC_X));
1869
1870 /* TODO: GMC Motion Vectors */
1871 /* It is still needed to specify the precision of the motion vectors (should they be in */
1872 /* half-sample, quarter-sample...?) and how much processing is done on the firmware on */
1873 /* the values of the warping points. */
1874
1875 // TODO: Which index to use?
1876 int sprite_index = 0;
1877 while (sprite_index < 3) {
1878 if (ctx->pic_params->sprite_trajectory_du[sprite_index] || ctx->pic_params->sprite_trajectory_dv[sprite_index])
1879 break;
1880 sprite_index++;
1881 }
1882 if (sprite_index >= 3)
1883 sprite_index = 0;
1884
1885 /* BE_GMC_X */
1886 cmd = 0;
1887 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_GMC_X, GMC_X, ctx->pic_params->sprite_trajectory_du[sprite_index] & 0x3FFF);
1888 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1889
1890 /* BE_GMC_Y */
1891 cmd = 0;
1892 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_GMC_Y, GMC_Y, ctx->pic_params->sprite_trajectory_dv[sprite_index] & 0x3FFF);
1893 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1894
1895 psb_cmdbuf_rendec_end(cmdbuf);
1896 }
1897 }
1898
1899 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_SLICE0));
1900
1901 /* BE_SLICE0 */
1902 cmd = 0;
1903 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_SLICE0, BE_FIRST_MB_IN_SLICE_Y, slice_param->macroblock_number / width_mb);
1904 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_SLICE0, BE_FIRST_MB_IN_SLICE_X, slice_param->macroblock_number % width_mb);
1905 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1906
1907 /* CR_VEC_MPEG4_BE_VOP_TR */
1908 cmd = 0;
1909 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_TRB, BE_TRB, ctx->pic_params->TRB);
1910 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1911
1912 cmd = 0;
1913 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_TRD, BE_TRD, ctx->pic_params->TRD);
1914 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1915
1916 psb_cmdbuf_rendec_end(cmdbuf);
1917
1918
1919 /* Send Slice Data for every slice */
1920 /* MUST be the last slice sent */
1921 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, SLICE_PARAMS));
1922
1923 /* Slice params command */
1924 cmd = 0;
1925 REGIO_WRITE_FIELD_LITE(cmd,
1926 MSVDX_CMDS,
1927 SLICE_PARAMS,
1928 RND_CTL_BIT,
1929 ((PICTURE_CODING_I == ctx->pic_params->vop_fields.bits.vop_coding_type ||
1930 PICTURE_CODING_B == ctx->pic_params->vop_fields.bits.vop_coding_type) ?
1931 0 : ctx->pic_params->vop_fields.bits.vop_rounding_type));
1932 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, SLICE_PARAMS, MODE_CONFIG, ctx->pic_params->vol_fields.bits.sprite_warping_accuracy);
1933 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, SLICE_PARAMS, SUBPEL_FILTER_MODE, ctx->pic_params->vol_fields.bits.quarter_sample);
1934 /* SP and ASP profiles don't support field coding in different VOPs */
1935 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, SLICE_PARAMS, SLICE_FIELD_TYPE, 2);
1936 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, SLICE_PARAMS, SLICE_CODE_TYPE, ctx->pic_params->vop_fields.bits.vop_coding_type);
1937 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1938
1939 psb_cmdbuf_rendec_end(cmdbuf);
1940
1941 *ctx->dec_ctx.p_slice_params = cmd;
1942
1943 /* CHUNK: Entdec back-end profile and level */
1944 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL));
1945
1946 cmd = 0;
1947 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL, ENTDEC_BE_PROFILE, ctx->profile); /* MPEG4 SP / ASP profile*/
1948 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL, ENTDEC_BE_MODE, 4); /* 4 - MPEG4 */
1949 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1950
1951 psb_cmdbuf_rendec_end(cmdbuf);
1952 /* psb_cmdbuf_rendec_end_block( cmdbuf ); */
1953 if (ctx->pic_params->vol_fields.bits.data_partitioned)
1954 {
1955 /*set buffer pointer to store the parsed data-partition data */
1956 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_DATAPARTITION0_BASE_ADDR));
1957 psb_cmdbuf_rendec_write_address(cmdbuf, ctx->data_partition_buffer0, ctx->data_partition_buffer0->buffer_ofs);
1958 psb_cmdbuf_rendec_end(cmdbuf);
1959
1960 psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_DATAPARTITION1_BASE_ADDR));
1961 psb_cmdbuf_rendec_write_address(cmdbuf, ctx->data_partition_buffer1, ctx->data_partition_buffer1->buffer_ofs);
1962 psb_cmdbuf_rendec_end(cmdbuf);
1963 }
1964
1965 /* Send IQ matrices to Rendec */
1966 psb__MPEG4_write_qmatrices(ctx);
1967 }
1968
psb__MPEG4_set_frontend_registers(context_MPEG4_p ctx,VASliceParameterBufferMPEG4 * slice_param)1969 static void psb__MPEG4_set_frontend_registers(context_MPEG4_p ctx, VASliceParameterBufferMPEG4 *slice_param)
1970 {
1971 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1972 uint32_t FE_slice0;
1973 unsigned short width_mb = PIXELS_TO_MB(ctx->pic_params->vop_width);
1974
1975 psb_cmdbuf_reg_start_block(cmdbuf, 0);
1976
1977 /* FE_SLICE0 */
1978 FE_slice0 = 0;
1979 REGIO_WRITE_FIELD_LITE(FE_slice0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SLICE0, FE_VOP_QUANT, slice_param->quant_scale);
1980 REGIO_WRITE_FIELD_LITE(FE_slice0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SLICE0, FE_FIRST_MB_IN_SLICE_Y, slice_param->macroblock_number / width_mb);
1981 REGIO_WRITE_FIELD_LITE(FE_slice0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SLICE0, FE_FIRST_MB_IN_SLICE_X, slice_param->macroblock_number % width_mb);
1982
1983 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SLICE0) , FE_slice0);
1984
1985 /* Entdec Front-End controls*/
1986 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_ENTDEC_FE_CONTROL) , ctx->FEControl);
1987
1988 /* FE_SPS0 */
1989 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SPS0) , ctx->FE_SPS0);
1990
1991 /* FE_VOP_SPS0 */
1992 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_SPS0) , ctx->FE_VOP_SPS0);
1993
1994
1995 if (ctx->pic_params->vol_fields.bits.short_video_header) {
1996 /* FE_PICSH_PPS0 */
1997 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_PICSH_PPS0) , ctx->FE_PICSH_PPS0);
1998 }
1999
2000 /* FE_VOP_PPS0 */
2001 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_PPS0) , ctx->FE_VOP_PPS0);
2002
2003 psb_cmdbuf_reg_end_block(cmdbuf);
2004
2005 if (ctx->pic_params->vol_fields.bits.data_partitioned)
2006 {
2007 /*set buffer pointer to store the parsed data-partition data */
2008 psb_cmdbuf_reg_start_block(cmdbuf, 0);
2009 psb_cmdbuf_reg_set_address(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_DATAPARTITION0_BASE_ADDR),
2010 ctx->data_partition_buffer0, ctx->data_partition_buffer0->buffer_ofs);
2011 psb_cmdbuf_reg_end_block(cmdbuf);
2012
2013 psb_cmdbuf_reg_start_block(cmdbuf, 0);
2014 psb_cmdbuf_reg_set_address(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_DATAPARTITION1_BASE_ADDR),
2015 ctx->data_partition_buffer1, ctx->data_partition_buffer1->buffer_ofs);
2016 psb_cmdbuf_reg_end_block(cmdbuf);
2017 }
2018 }
2019
psb__MPEG4_begin_slice(context_DEC_p dec_ctx,VASliceParameterBufferBase * vld_slice_param)2020 static void psb__MPEG4_begin_slice(context_DEC_p dec_ctx, VASliceParameterBufferBase *vld_slice_param)
2021 {
2022 VASliceParameterBufferMPEG4 *slice_param = (VASliceParameterBufferMPEG4 *) vld_slice_param;
2023
2024 dec_ctx->bits_offset = slice_param->macroblock_offset;
2025 /* dec_ctx->SR_flags = 0; */
2026 }
2027
psb__MPEG4_process_slice_data(context_DEC_p dec_ctx,VASliceParameterBufferBase * vld_slice_param)2028 static void psb__MPEG4_process_slice_data(context_DEC_p dec_ctx, VASliceParameterBufferBase *vld_slice_param)
2029 {
2030 VASliceParameterBufferMPEG4 *slice_param = (VASliceParameterBufferMPEG4 *) vld_slice_param;
2031 context_MPEG4_p ctx = (context_MPEG4_p)dec_ctx;
2032
2033 psb__MPEG4_write_VLC_tables(ctx);
2034 psb__MPEG4_set_picture_params(ctx, slice_param);
2035 psb__MPEG4_set_frontend_registers(ctx, slice_param);
2036 psb__MPEG4_set_backend_registers(ctx, slice_param);
2037 }
2038
psb__MPEG4_end_slice(context_DEC_p dec_ctx)2039 static void psb__MPEG4_end_slice(context_DEC_p dec_ctx)
2040 {
2041 context_MPEG4_p ctx = (context_MPEG4_p)dec_ctx;
2042
2043 #ifdef PSBVIDEO_MSVDX_EC
2044 if (ctx->obj_context->driver_data->ec_enabled)
2045 ctx->obj_context->flags |= (FW_ERROR_DETECTION_AND_RECOVERY); /* FW_ERROR_DETECTION_AND_RECOVERY */
2046 #endif
2047
2048 ctx->obj_context->first_mb = 0;
2049 ctx->obj_context->last_mb = ((ctx->picture_height_mb - 1) << 8) | (ctx->picture_width_mb - 1);
2050 *(ctx->dec_ctx.slice_first_pic_last) = (ctx->obj_context->first_mb << 16) | (ctx->obj_context->last_mb);
2051 }
2052
2053 #ifdef PSBVIDEO_MSVDX_EC
psb__MPEG4_choose_ec_frames(context_MPEG4_p ctx)2054 static void psb__MPEG4_choose_ec_frames(context_MPEG4_p ctx)
2055 {
2056 if (ctx->pic_params == NULL)
2057 return;
2058 int is_inter = (ctx->pic_params->vop_fields.bits.vop_coding_type == PICTURE_CODING_P ||
2059 ctx->pic_params->vop_fields.bits.vop_coding_type == PICTURE_CODING_B);
2060
2061 ctx->obj_context->ec_target = NULL;
2062
2063 /* choose forward ref frame as possible */
2064 if (is_inter && ctx->forward_ref_surface)
2065 ctx->obj_context->ec_target = ctx->forward_ref_surface;
2066
2067 /* Otherwise we conceal from the previous I or P frame*/
2068 if (!ctx->obj_context->ec_target)
2069 {
2070 ctx->obj_context->ec_target = ctx->obj_context->ec_candidate;
2071 }
2072
2073 if (ctx->pic_params->vop_fields.bits.vop_coding_type != PICTURE_CODING_B)
2074 {
2075 ctx->obj_context->ec_candidate = ctx->obj_context->current_render_target; /* in case the next frame is an I frame we will need this */
2076 }
2077 if (!ctx->obj_context->ec_target) {
2078 ctx->obj_context->ec_target = ctx->obj_context->current_render_target;
2079 }
2080 }
2081 #endif
2082
pnw_MPEG4_BeginPicture(object_context_p obj_context)2083 static VAStatus pnw_MPEG4_BeginPicture(
2084 object_context_p obj_context)
2085 {
2086 INIT_CONTEXT_MPEG4
2087
2088 if (ctx->pic_params) {
2089 free(ctx->pic_params);
2090 ctx->pic_params = NULL;
2091 }
2092 ctx->load_non_intra_quant_mat = FALSE;
2093 ctx->load_intra_quant_mat = FALSE;
2094
2095 return VA_STATUS_SUCCESS;
2096 }
2097
pnw_MPEG4_process_buffer(context_DEC_p dec_ctx,object_buffer_p buffer)2098 static VAStatus pnw_MPEG4_process_buffer(
2099 context_DEC_p dec_ctx,
2100 object_buffer_p buffer)
2101 {
2102 VAStatus vaStatus = VA_STATUS_SUCCESS;
2103 context_MPEG4_p ctx = (context_MPEG4_p)dec_ctx;
2104 object_buffer_p obj_buffer = buffer;
2105
2106 switch (obj_buffer->type) {
2107 case VAPictureParameterBufferType:
2108 drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4_RenderPicture got VAPictureParameterBuffer\n");
2109 vaStatus = psb__MPEG4_process_picture_param(ctx, obj_buffer);
2110 DEBUG_FAILURE;
2111 break;
2112
2113 case VAIQMatrixBufferType:
2114 drv_debug_msg(VIDEO_DEBUG_GENERAL, "pnw_MPEG4_RenderPicture got VAIQMatrixBufferType\n");
2115 vaStatus = psb__MPEG4_process_iq_matrix(ctx, obj_buffer);
2116 DEBUG_FAILURE;
2117 break;
2118
2119 default:
2120 vaStatus = VA_STATUS_ERROR_UNKNOWN;
2121 DEBUG_FAILURE;
2122 }
2123
2124 return vaStatus;
2125 }
2126
pnw_MPEG4_EndPicture(object_context_p obj_context)2127 static VAStatus pnw_MPEG4_EndPicture(
2128 object_context_p obj_context)
2129 {
2130 INIT_CONTEXT_MPEG4
2131 psb_surface_p target_surface = ctx->obj_context->current_render_target->psb_surface;
2132 psb_driver_data_p driver_data = obj_context->driver_data;
2133 VAStatus vaStatus = VA_STATUS_SUCCESS;
2134
2135 #ifdef PSBVIDEO_MSVDX_EC
2136 /* Sent the HOST_BE_OPP command to detect slice error */
2137 if (ctx->pic_params && ctx->pic_params->vol_fields.bits.interlaced)
2138 driver_data->ec_enabled = 0;
2139
2140 if (driver_data->ec_enabled) {
2141 uint32_t rotation_flags = 0;
2142 uint32_t ext_stride_a = 0;
2143 object_surface_p ec_target;
2144
2145 psb__MPEG4_choose_ec_frames(ctx);
2146 ec_target = ctx->obj_context->ec_target;
2147 REGIO_WRITE_FIELD_LITE(ext_stride_a, MSVDX_CMDS, EXTENDED_ROW_STRIDE, EXT_ROW_STRIDE, target_surface->stride / 64);
2148
2149 /* FIXME ec ignor rotate condition */
2150 if(ec_target) {
2151 if (psb_context_get_next_cmdbuf(ctx->obj_context)) {
2152 vaStatus = VA_STATUS_ERROR_UNKNOWN;
2153 DEBUG_FAILURE;
2154 return vaStatus;
2155 }
2156
2157 if (psb_context_submit_host_be_opp(ctx->obj_context,
2158 &target_surface->buf,
2159 &ec_target->psb_surface->buf,
2160 NULL,
2161 ctx->picture_width_mb,
2162 ctx->picture_height_mb,
2163 rotation_flags,
2164 ctx->field_type,
2165 ext_stride_a,
2166 target_surface->chroma_offset + target_surface->buf.buffer_ofs,
2167 ec_target->psb_surface->chroma_offset + ec_target->psb_surface->buf.buffer_ofs)) {
2168 return VA_STATUS_ERROR_UNKNOWN;
2169 }
2170 }
2171 }
2172 #endif
2173
2174 if (psb_context_flush_cmdbuf(ctx->obj_context)) {
2175 return VA_STATUS_ERROR_UNKNOWN;
2176 }
2177
2178 if (ctx->pic_params) {
2179 free(ctx->pic_params);
2180 ctx->pic_params = NULL;
2181 }
2182
2183 return VA_STATUS_SUCCESS;
2184 }
2185
2186 struct format_vtable_s pnw_MPEG4_vtable = {
2187 queryConfigAttributes:
2188 pnw_MPEG4_QueryConfigAttributes,
2189 validateConfig:
2190 pnw_MPEG4_ValidateConfig,
2191 createContext:
2192 pnw_MPEG4_CreateContext,
2193 destroyContext:
2194 pnw_MPEG4_DestroyContext,
2195 beginPicture:
2196 pnw_MPEG4_BeginPicture,
2197 renderPicture:
2198 vld_dec_RenderPicture,
2199 endPicture:
2200 pnw_MPEG4_EndPicture
2201 };
2202