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 *
28 */
29
30 #include "psb_MPEG4.h"
31 #include "psb_def.h"
32 #include "psb_surface.h"
33 #include "psb_cmdbuf.h"
34 #include "pnw_rotate.h"
35 #include "psb_drv_debug.h"
36
37 #include "hwdefs/reg_io2.h"
38 #include "hwdefs/msvdx_offsets.h"
39 #include "hwdefs/msvdx_cmds_io2.h"
40 #include "hwdefs/msvdx_vec_reg_io2.h"
41 #include "hwdefs/msvdx_vec_mpeg4_reg_io2.h"
42 #include "hwdefs/dxva_fw_ctrl.h"
43
44 #include <stdlib.h>
45 #include <stdint.h>
46 #include <string.h>
47
48 #define GET_SURFACE_INFO_is_defined(psb_surface) ((int) (psb_surface->extra_info[0]))
49 #define SET_SURFACE_INFO_is_defined(psb_surface, val) psb_surface->extra_info[0] = (uint32_t) val;
50 #define GET_SURFACE_INFO_picture_structure(psb_surface) (psb_surface->extra_info[1])
51 #define SET_SURFACE_INFO_picture_structure(psb_surface, val) psb_surface->extra_info[1] = val;
52 #define GET_SURFACE_INFO_picture_coding_type(psb_surface) ((int) (psb_surface->extra_info[2]))
53 #define SET_SURFACE_INFO_picture_coding_type(psb_surface, val) psb_surface->extra_info[2] = (uint32_t) val;
54 #define GET_SURFACE_INFO_colocated_index(psb_surface) ((int) (psb_surface->extra_info[3]))
55 #define SET_SURFACE_INFO_colocated_index(psb_surface, val) psb_surface->extra_info[3] = (uint32_t) val;
56
57 #define SLICEDATA_BUFFER_TYPE(type) ((type==VASliceDataBufferType)?"VASliceDataBufferType":"VAProtectedSliceDataBufferType")
58
59 #define PIXELS_TO_MB(x) ((x + 15) / 16)
60
61 /*
62 * Frame types - format dependant!
63 */
64 #define PICTURE_CODING_I 0x00
65 #define PICTURE_CODING_P 0x01
66 #define PICTURE_CODING_B 0x02
67 #define PICTURE_CODING_S 0x03
68
69
70 #define FE_STATE_BUFFER_SIZE 4096
71 #define FE_STATE_SAVE_SIZE ( 0xB40 - 0x700 )
72
73 #define MPEG4_PROFILE_SIMPLE 0
74 #define MPEG4_PROFILE_ASP 2
75
76 /* Table V2-2 ISO/IEC 14496-2:2001(E) - sprite enable codewords */
77 typedef enum {
78 SPRITE_NOT_USED = 0,
79 STATIC,
80 GMC,
81 } MPEG4_eSpriteEnable;
82
83
84 #define MAX_QUANT_TABLES (2) /* only 2 tables for 4:2:0 decode */
85
86 static int scan0[64] = { // spec, fig 7-2
87 /*u 0 ..... 7*/
88 0, 1, 5, 6, 14, 15, 27, 28, /* v = 0 */
89 2, 4, 7, 13, 16, 26, 29, 42,
90 3, 8, 12, 17, 25, 30, 41, 43,
91 9, 11, 18, 24, 31, 40, 44, 53,
92 10, 19, 23, 32, 39, 45, 52, 54,
93 20, 22, 33, 38, 46, 51, 55, 60,
94 21, 34, 37, 47, 50, 56, 59, 61,
95 35, 36, 48, 49, 57, 58, 62, 63 /* v = 7 */
96 };
97
98 typedef enum {
99 NONINTRA_LUMA_Q = 0,
100 INTRA_LUMA_Q = 1
101 } QUANT_IDX;
102
103 /************************************************************************************/
104 /* Variable length codes in 'packed' format */
105 /************************************************************************************/
106
107 /* Format is: opcode, width, symbol. All VLC tables are concatenated. */
108 #define VLC_PACK(a,b,c) ( ( (a) << 12 ) | ( (b) << 9 ) | (c) )
109 static const IMG_UINT16 gaui16mpeg4VlcTableDataPacked[] = {
110 VLC_PACK(4 , 0 , 12), VLC_PACK(5 , 0 , 7), VLC_PACK(4 , 2 , 13), VLC_PACK(4 , 3 , 16), VLC_PACK(5 , 0 , 9), VLC_PACK(4 , 5 , 17),
111 VLC_PACK(2 , 2 , 1), VLC_PACK(3 , 2 , 0), VLC_PACK(3 , 2 , 0), VLC_PACK(4 , 2 , 36), VLC_PACK(3 , 2 , 0), VLC_PACK(4 , 0 , 0),
112 VLC_PACK(0 , 0 , 6), VLC_PACK(0 , 0 , 7), VLC_PACK(2 , 1 , 8), VLC_PACK(0 , 1 , 10), VLC_PACK(2 , 1 , 13), VLC_PACK(0 , 2 , 15),
113 VLC_PACK(4 , 0 , 8), VLC_PACK(4 , 0 , 4), VLC_PACK(4 , 0 , 2), VLC_PACK(4 , 0 , 1), VLC_PACK(4 , 0 , 12), VLC_PACK(4 , 1 , 3),
114 VLC_PACK(4 , 1 , 16), VLC_PACK(4 , 1 , 10), VLC_PACK(4 , 1 , 9), VLC_PACK(4 , 1 , 6), VLC_PACK(4 , 1 , 5), VLC_PACK(4 , 0 , 15),
115 VLC_PACK(4 , 1 , 11), VLC_PACK(4 , 1 , 13), VLC_PACK(3 , 2 , 0), VLC_PACK(4 , 2 , 36), VLC_PACK(4 , 2 , 19), VLC_PACK(4 , 2 , 18),
116 VLC_PACK(4 , 2 , 17), VLC_PACK(4 , 2 , 7), VLC_PACK(4 , 1 , 14), VLC_PACK(4 , 1 , 14), VLC_PACK(1 , 1 , 16), VLC_PACK(0 , 0 , 18),
117 VLC_PACK(0 , 0 , 19), VLC_PACK(4 , 3 , 0), VLC_PACK(4 , 3 , 12), VLC_PACK(4 , 3 , 10), VLC_PACK(4 , 3 , 14), VLC_PACK(4 , 3 , 5),
118 VLC_PACK(4 , 3 , 13), VLC_PACK(4 , 3 , 3), VLC_PACK(4 , 3 , 11), VLC_PACK(4 , 3 , 7), VLC_PACK(4 , 1 , 15), VLC_PACK(4 , 1 , 15),
119 VLC_PACK(4 , 1 , 15), VLC_PACK(4 , 1 , 15), VLC_PACK(3 , 1 , 0), VLC_PACK(4 , 1 , 6), VLC_PACK(4 , 1 , 9), VLC_PACK(4 , 0 , 8),
120 VLC_PACK(4 , 0 , 4), VLC_PACK(4 , 0 , 2), VLC_PACK(4 , 0 , 1), VLC_PACK(1 , 1 , 16), VLC_PACK(0 , 0 , 18), VLC_PACK(6 , 0 , 6),
121 VLC_PACK(4 , 3 , 15), VLC_PACK(4 , 3 , 3), VLC_PACK(4 , 3 , 5), VLC_PACK(4 , 3 , 1), VLC_PACK(4 , 3 , 10), VLC_PACK(4 , 3 , 2),
122 VLC_PACK(4 , 3 , 12), VLC_PACK(4 , 3 , 4), VLC_PACK(4 , 3 , 8), VLC_PACK(4 , 1 , 0), VLC_PACK(4 , 1 , 0), VLC_PACK(4 , 1 , 0),
123 VLC_PACK(4 , 1 , 0), VLC_PACK(3 , 1 , 0), VLC_PACK(4 , 1 , 9), VLC_PACK(4 , 1 , 6), VLC_PACK(4 , 0 , 7), VLC_PACK(4 , 0 , 11),
124 VLC_PACK(4 , 0 , 0), VLC_PACK(4 , 1 , 1), VLC_PACK(4 , 1 , 2), VLC_PACK(4 , 0 , 0), VLC_PACK(4 , 1 , 1), VLC_PACK(4 , 2 , 2),
125 VLC_PACK(4 , 3 , 3), VLC_PACK(3 , 3 , 0), VLC_PACK(4 , 0 , 0), VLC_PACK(4 , 1 , 4), VLC_PACK(4 , 1 , 2), VLC_PACK(4 , 0 , 0),
126 VLC_PACK(5 , 0 , 1), VLC_PACK(5 , 0 , 2), VLC_PACK(5 , 0 , 3), VLC_PACK(2 , 1 , 3), VLC_PACK(2 , 3 , 5), VLC_PACK(0 , 3 , 11),
127 VLC_PACK(5 , 0 , 4), VLC_PACK(5 , 0 , 5), VLC_PACK(5 , 0 , 6), VLC_PACK(5 , 0 , 7), VLC_PACK(0 , 0 , 4), VLC_PACK(5 , 0 , 10),
128 VLC_PACK(5 , 0 , 11), VLC_PACK(5 , 0 , 12), VLC_PACK(5 , 0 , 9), VLC_PACK(5 , 0 , 8), VLC_PACK(1 , 1 , 16), VLC_PACK(0 , 0 , 18),
129 VLC_PACK(0 , 0 , 19), VLC_PACK(0 , 0 , 20), VLC_PACK(5 , 0 , 24), VLC_PACK(5 , 0 , 23), VLC_PACK(5 , 0 , 22), VLC_PACK(5 , 0 , 21),
130 VLC_PACK(5 , 0 , 20), VLC_PACK(5 , 0 , 19), VLC_PACK(5 , 0 , 18), VLC_PACK(5 , 0 , 17), VLC_PACK(5 , 0 , 16), VLC_PACK(5 , 0 , 15),
131 VLC_PACK(5 , 0 , 14), VLC_PACK(5 , 0 , 13), VLC_PACK(3 , 1 , 0), VLC_PACK(5 , 0 , 32), VLC_PACK(5 , 0 , 31), VLC_PACK(5 , 0 , 30),
132 VLC_PACK(5 , 0 , 29), VLC_PACK(5 , 0 , 28), VLC_PACK(5 , 0 , 27), VLC_PACK(5 , 0 , 26), VLC_PACK(5 , 0 , 25), VLC_PACK(2 , 5 , 4),
133 VLC_PACK(0 , 0 , 14), VLC_PACK(4 , 1 , 2), VLC_PACK(4 , 1 , 1), VLC_PACK(4 , 0 , 4), VLC_PACK(4 , 1 , 5), VLC_PACK(4 , 2 , 6),
134 VLC_PACK(4 , 3 , 7), VLC_PACK(4 , 4 , 8), VLC_PACK(4 , 5 , 9), VLC_PACK(2 , 2 , 1), VLC_PACK(4 , 0 , 10), VLC_PACK(4 , 1 , 11),
135 VLC_PACK(4 , 2 , 12), VLC_PACK(3 , 2 , 0), VLC_PACK(4 , 0 , 3), VLC_PACK(4 , 0 , 0), VLC_PACK(2 , 5 , 4), VLC_PACK(4 , 1 , 2),
136 VLC_PACK(4 , 1 , 1), VLC_PACK(4 , 1 , 0), VLC_PACK(4 , 0 , 3), VLC_PACK(4 , 1 , 4), VLC_PACK(4 , 2 , 5), VLC_PACK(4 , 3 , 6),
137 VLC_PACK(4 , 4 , 7), VLC_PACK(4 , 5 , 8), VLC_PACK(2 , 3 , 1), VLC_PACK(4 , 0 , 9), VLC_PACK(4 , 1 , 10), VLC_PACK(4 , 2 , 11),
138 VLC_PACK(4 , 3 , 12), VLC_PACK(3 , 3 , 0), VLC_PACK(2 , 1 , 16), VLC_PACK(0 , 3 , 77), VLC_PACK(0 , 2 , 96), VLC_PACK(0 , 1 , 103),
139 VLC_PACK(2 , 1 , 106), VLC_PACK(2 , 1 , 108), VLC_PACK(5 , 1 , 250), VLC_PACK(7 , 0 , 254), VLC_PACK(4 , 2 , 508), VLC_PACK(4 , 2 , 508),
140 VLC_PACK(4 , 2 , 509), VLC_PACK(4 , 2 , 509), VLC_PACK(4 , 3 , 506), VLC_PACK(4 , 3 , 507), VLC_PACK(5 , 0 , 222), VLC_PACK(5 , 0 , 252),
141 VLC_PACK(0 , 3 , 3), VLC_PACK(2 , 1 , 18), VLC_PACK(0 , 3 , 44), VLC_PACK(5 , 1 , 237), VLC_PACK(7 , 0 , 433), VLC_PACK(7 , 0 , 434),
142 VLC_PACK(7 , 0 , 435), VLC_PACK(7 , 0 , 436), VLC_PACK(7 , 0 , 437), VLC_PACK(7 , 0 , 221), VLC_PACK(7 , 0 , 251), VLC_PACK(5 , 0 , 435),
143 VLC_PACK(5 , 0 , 436), VLC_PACK(5 , 0 , 29), VLC_PACK(5 , 0 , 61), VLC_PACK(5 , 0 , 93), VLC_PACK(5 , 0 , 156), VLC_PACK(5 , 0 , 188),
144 VLC_PACK(5 , 0 , 217), VLC_PACK(4 , 0 , 255), VLC_PACK(0 , 3 , 2), VLC_PACK(0 , 2 , 17), VLC_PACK(5 , 0 , 230), VLC_PACK(5 , 0 , 229),
145 VLC_PACK(5 , 0 , 228), VLC_PACK(5 , 0 , 214), VLC_PACK(5 , 0 , 60), VLC_PACK(5 , 0 , 213), VLC_PACK(5 , 0 , 186), VLC_PACK(5 , 0 , 28),
146 VLC_PACK(5 , 0 , 433), VLC_PACK(7 , 0 , 247), VLC_PACK(7 , 0 , 93), VLC_PACK(7 , 0 , 61), VLC_PACK(7 , 0 , 430), VLC_PACK(7 , 0 , 429),
147 VLC_PACK(7 , 0 , 428), VLC_PACK(7 , 0 , 427), VLC_PACK(5 , 0 , 232), VLC_PACK(5 , 0 , 231), VLC_PACK(5 , 0 , 215), VLC_PACK(5 , 0 , 374),
148 VLC_PACK(7 , 0 , 157), VLC_PACK(7 , 0 , 125), VLC_PACK(7 , 0 , 432), VLC_PACK(7 , 0 , 431), VLC_PACK(3 , 3 , 0), VLC_PACK(3 , 3 , 0),
149 VLC_PACK(7 , 1 , 248), VLC_PACK(5 , 1 , 233), VLC_PACK(7 , 0 , 189), VLC_PACK(7 , 0 , 220), VLC_PACK(7 , 0 , 250), VLC_PACK(5 , 0 , 434),
150 VLC_PACK(5 , 0 , 92), VLC_PACK(5 , 0 , 375), VLC_PACK(5 , 0 , 124), VLC_PACK(5 , 0 , 155), VLC_PACK(5 , 0 , 187), VLC_PACK(5 , 0 , 216),
151 VLC_PACK(5 , 0 , 235), VLC_PACK(5 , 0 , 236), VLC_PACK(0 , 0 , 16), VLC_PACK(0 , 0 , 17), VLC_PACK(5 , 1 , 241), VLC_PACK(7 , 0 , 439),
152 VLC_PACK(7 , 0 , 30), VLC_PACK(7 , 0 , 62), VLC_PACK(7 , 0 , 252), VLC_PACK(5 , 0 , 437), VLC_PACK(5 , 0 , 438), VLC_PACK(5 , 0 , 439),
153 VLC_PACK(7 , 0 , 438), VLC_PACK(5 , 0 , 157), VLC_PACK(5 , 0 , 219), VLC_PACK(5 , 0 , 243), VLC_PACK(5 , 0 , 244), VLC_PACK(5 , 0 , 245),
154 VLC_PACK(5 , 0 , 218), VLC_PACK(5 , 0 , 239), VLC_PACK(5 , 0 , 125), VLC_PACK(5 , 0 , 240), VLC_PACK(7 , 0 , 126), VLC_PACK(7 , 0 , 158),
155 VLC_PACK(5 , 0 , 62), VLC_PACK(7 , 0 , 94), VLC_PACK(5 , 0 , 30), VLC_PACK(5 , 0 , 189), VLC_PACK(5 , 0 , 220), VLC_PACK(5 , 0 , 246),
156 VLC_PACK(7 , 0 , 253), VLC_PACK(5 , 0 , 94), VLC_PACK(7 , 0 , 190), VLC_PACK(7 , 0 , 222), VLC_PACK(5 , 1 , 247), VLC_PACK(5 , 0 , 158),
157 VLC_PACK(5 , 0 , 126), VLC_PACK(5 , 0 , 190), VLC_PACK(5 , 0 , 249), VLC_PACK(5 , 0 , 221), VLC_PACK(2 , 4 , 16), VLC_PACK(2 , 3 , 68),
158 VLC_PACK(0 , 2 , 84), VLC_PACK(0 , 1 , 91), VLC_PACK(1 , 1 , 94), VLC_PACK(2 , 1 , 96), VLC_PACK(0 , 0 , 98), VLC_PACK(7 , 0 , 254),
159 VLC_PACK(4 , 2 , 508), VLC_PACK(4 , 2 , 508), VLC_PACK(4 , 2 , 509), VLC_PACK(4 , 2 , 509), VLC_PACK(4 , 3 , 444), VLC_PACK(4 , 3 , 445),
160 VLC_PACK(5 , 0 , 190), VLC_PACK(5 , 0 , 253), VLC_PACK(2 , 3 , 6), VLC_PACK(2 , 1 , 14), VLC_PACK(0 , 2 , 40), VLC_PACK(7 , 2 , 419),
161 VLC_PACK(2 , 1 , 46), VLC_PACK(3 , 4 , 0), VLC_PACK(2 , 2 , 5), VLC_PACK(7 , 2 , 426), VLC_PACK(7 , 1 , 424), VLC_PACK(7 , 0 , 423),
162 VLC_PACK(5 , 1 , 246), VLC_PACK(5 , 2 , 427), VLC_PACK(5 , 1 , 425), VLC_PACK(7 , 0 , 253), VLC_PACK(7 , 0 , 430), VLC_PACK(4 , 0 , 255),
163 VLC_PACK(0 , 3 , 2), VLC_PACK(0 , 2 , 17), VLC_PACK(5 , 0 , 217), VLC_PACK(5 , 0 , 187), VLC_PACK(5 , 0 , 124), VLC_PACK(5 , 0 , 92),
164 VLC_PACK(5 , 0 , 60), VLC_PACK(5 , 0 , 373), VLC_PACK(5 , 0 , 422), VLC_PACK(5 , 0 , 421), VLC_PACK(7 , 0 , 414), VLC_PACK(7 , 0 , 413),
165 VLC_PACK(7 , 0 , 412), VLC_PACK(7 , 0 , 411), VLC_PACK(7 , 0 , 410), VLC_PACK(7 , 0 , 409), VLC_PACK(7 , 0 , 408), VLC_PACK(7 , 0 , 407),
166 VLC_PACK(5 , 0 , 243), VLC_PACK(5 , 0 , 218), VLC_PACK(5 , 0 , 424), VLC_PACK(5 , 0 , 423), VLC_PACK(7 , 0 , 418), VLC_PACK(7 , 0 , 417),
167 VLC_PACK(7 , 0 , 416), VLC_PACK(7 , 0 , 415), VLC_PACK(5 , 0 , 374), VLC_PACK(5 , 0 , 375), VLC_PACK(5 , 0 , 29), VLC_PACK(5 , 0 , 61),
168 VLC_PACK(5 , 0 , 93), VLC_PACK(5 , 0 , 156), VLC_PACK(5 , 0 , 188), VLC_PACK(5 , 0 , 219), VLC_PACK(5 , 1 , 244), VLC_PACK(7 , 0 , 252),
169 VLC_PACK(7 , 0 , 221), VLC_PACK(0 , 2 , 5), VLC_PACK(7 , 2 , 432), VLC_PACK(0 , 0 , 11), VLC_PACK(0 , 0 , 12), VLC_PACK(5 , 1 , 431),
170 VLC_PACK(7 , 0 , 436), VLC_PACK(7 , 0 , 437), VLC_PACK(7 , 0 , 438), VLC_PACK(5 , 0 , 433), VLC_PACK(5 , 0 , 434), VLC_PACK(5 , 0 , 189),
171 VLC_PACK(5 , 0 , 220), VLC_PACK(5 , 0 , 250), VLC_PACK(5 , 1 , 248), VLC_PACK(7 , 0 , 431), VLC_PACK(5 , 0 , 125), VLC_PACK(5 , 0 , 157),
172 VLC_PACK(7 , 0 , 439), VLC_PACK(7 , 0 , 30), VLC_PACK(7 , 0 , 62), VLC_PACK(7 , 0 , 94), VLC_PACK(5 , 0 , 435), VLC_PACK(5 , 0 , 436),
173 VLC_PACK(5 , 0 , 437), VLC_PACK(5 , 0 , 251), VLC_PACK(7 , 0 , 126), VLC_PACK(7 , 0 , 158), VLC_PACK(7 , 0 , 190), VLC_PACK(7 , 0 , 222),
174 VLC_PACK(5 , 1 , 438), VLC_PACK(5 , 0 , 30), VLC_PACK(5 , 0 , 62), VLC_PACK(5 , 0 , 94), VLC_PACK(5 , 0 , 252), VLC_PACK(5 , 0 , 221),
175 VLC_PACK(5 , 0 , 126), VLC_PACK(5 , 0 , 158), VLC_PACK(5 , 0 , 255), VLC_PACK(5 , 0 , 222), VLC_PACK(0 , 0 , 14), VLC_PACK(0 , 1 , 15),
176 VLC_PACK(0 , 0 , 44), VLC_PACK(0 , 1 , 45), VLC_PACK(0 , 1 , 74), VLC_PACK(0 , 2 , 103), VLC_PACK(0 , 1 , 230), VLC_PACK(0 , 0 , 256),
177 VLC_PACK(5 , 0 , 252), VLC_PACK(7 , 0 , 254), VLC_PACK(4 , 3 , 508), VLC_PACK(4 , 3 , 509), VLC_PACK(4 , 3 , 506), VLC_PACK(4 , 3 , 507),
178 VLC_PACK(5 , 0 , 190), VLC_PACK(5 , 0 , 158), VLC_PACK(5 , 0 , 126), VLC_PACK(5 , 0 , 94), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3),
179 VLC_PACK(5 , 0 , 62), VLC_PACK(5 , 0 , 30), VLC_PACK(5 , 0 , 439), VLC_PACK(5 , 0 , 438), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3),
180 VLC_PACK(5 , 0 , 437), VLC_PACK(5 , 0 , 93), VLC_PACK(5 , 0 , 436), VLC_PACK(5 , 0 , 435), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3),
181 VLC_PACK(5 , 0 , 434), VLC_PACK(5 , 0 , 374), VLC_PACK(5 , 0 , 373), VLC_PACK(5 , 0 , 123), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3),
182 VLC_PACK(5 , 0 , 433), VLC_PACK(5 , 0 , 432), VLC_PACK(5 , 0 , 431), VLC_PACK(5 , 0 , 430), VLC_PACK(0 , 0 , 2), VLC_PACK(3 , 1 , 0),
183 VLC_PACK(5 , 0 , 228), VLC_PACK(5 , 0 , 150), VLC_PACK(5 , 0 , 221), VLC_PACK(5 , 0 , 251), VLC_PACK(5 , 0 , 250), VLC_PACK(5 , 0 , 249),
184 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 189), VLC_PACK(5 , 0 , 220), VLC_PACK(5 , 0 , 157), VLC_PACK(5 , 0 , 125),
185 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 188), VLC_PACK(5 , 0 , 156), VLC_PACK(5 , 0 , 61), VLC_PACK(5 , 0 , 29),
186 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 92), VLC_PACK(5 , 0 , 60), VLC_PACK(5 , 0 , 91), VLC_PACK(5 , 0 , 59),
187 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 372), VLC_PACK(5 , 0 , 311), VLC_PACK(5 , 0 , 429), VLC_PACK(5 , 0 , 503),
188 VLC_PACK(0 , 0 , 2), VLC_PACK(3 , 1 , 0), VLC_PACK(5 , 0 , 58), VLC_PACK(5 , 0 , 26), VLC_PACK(7 , 0 , 158), VLC_PACK(7 , 0 , 126),
189 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 248), VLC_PACK(7 , 0 , 30), VLC_PACK(5 , 0 , 219), VLC_PACK(5 , 0 , 218),
190 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 217), VLC_PACK(5 , 0 , 245), VLC_PACK(5 , 0 , 375), VLC_PACK(5 , 0 , 124),
191 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 28), VLC_PACK(5 , 0 , 155), VLC_PACK(5 , 0 , 154), VLC_PACK(5 , 0 , 122),
192 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 310), VLC_PACK(5 , 0 , 27), VLC_PACK(5 , 0 , 90), VLC_PACK(5 , 0 , 121),
193 VLC_PACK(0 , 0 , 2), VLC_PACK(3 , 1 , 0), VLC_PACK(5 , 0 , 502), VLC_PACK(5 , 0 , 371), VLC_PACK(7 , 0 , 439), VLC_PACK(7 , 0 , 438),
194 VLC_PACK(0 , 0 , 6), VLC_PACK(0 , 1 , 7), VLC_PACK(0 , 0 , 27), VLC_PACK(0 , 1 , 28), VLC_PACK(0 , 1 , 48), VLC_PACK(0 , 2 , 68),
195 VLC_PACK(5 , 0 , 247), VLC_PACK(5 , 0 , 246), VLC_PACK(5 , 0 , 244), VLC_PACK(7 , 0 , 221), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3),
196 VLC_PACK(5 , 0 , 187), VLC_PACK(5 , 0 , 216), VLC_PACK(5 , 0 , 186), VLC_PACK(5 , 0 , 185), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3),
197 VLC_PACK(5 , 0 , 213), VLC_PACK(5 , 0 , 237), VLC_PACK(5 , 0 , 153), VLC_PACK(5 , 0 , 184), VLC_PACK(0 , 0 , 2), VLC_PACK(2 , 1 , 3),
198 VLC_PACK(5 , 0 , 89), VLC_PACK(5 , 0 , 152), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 218), VLC_PACK(5 , 0 , 428), VLC_PACK(7 , 0 , 253),
199 VLC_PACK(7 , 0 , 435), VLC_PACK(7 , 0 , 432), VLC_PACK(7 , 0 , 431), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 243),
200 VLC_PACK(5 , 0 , 242), VLC_PACK(5 , 0 , 215), VLC_PACK(5 , 0 , 214), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 236),
201 VLC_PACK(5 , 0 , 233), VLC_PACK(5 , 0 , 183), VLC_PACK(5 , 0 , 182), VLC_PACK(0 , 0 , 2), VLC_PACK(2 , 1 , 3), VLC_PACK(5 , 0 , 151),
202 VLC_PACK(5 , 0 , 181), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 370), VLC_PACK(7 , 0 , 188), VLC_PACK(7 , 0 , 430), VLC_PACK(7 , 0 , 429),
203 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 241), VLC_PACK(7 , 0 , 426), VLC_PACK(5 , 0 , 240), VLC_PACK(5 , 0 , 239),
204 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(7 , 0 , 220), VLC_PACK(7 , 0 , 157), VLC_PACK(5 , 0 , 212), VLC_PACK(5 , 0 , 235),
205 VLC_PACK(0 , 0 , 2), VLC_PACK(2 , 1 , 3), VLC_PACK(5 , 0 , 180), VLC_PACK(5 , 0 , 211), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 405),
206 VLC_PACK(7 , 0 , 406), VLC_PACK(7 , 0 , 425), VLC_PACK(7 , 0 , 424), VLC_PACK(0 , 0 , 6), VLC_PACK(0 , 1 , 7), VLC_PACK(0 , 0 , 18),
207 VLC_PACK(0 , 1 , 19), VLC_PACK(0 , 1 , 27), VLC_PACK(2 , 2 , 35), VLC_PACK(5 , 0 , 238), VLC_PACK(7 , 0 , 252), VLC_PACK(7 , 0 , 125),
208 VLC_PACK(7 , 0 , 418), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 234), VLC_PACK(5 , 0 , 232), VLC_PACK(5 , 0 , 210),
209 VLC_PACK(5 , 0 , 231), VLC_PACK(0 , 0 , 2), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 404), VLC_PACK(7 , 0 , 403), VLC_PACK(7 , 0 , 189),
210 VLC_PACK(7 , 0 , 421), VLC_PACK(7 , 0 , 417), VLC_PACK(7 , 0 , 416), VLC_PACK(0 , 0 , 2), VLC_PACK(2 , 1 , 3), VLC_PACK(7 , 0 , 251),
211 VLC_PACK(7 , 0 , 93), VLC_PACK(3 , 1 , 0), VLC_PACK(5 , 0 , 229), VLC_PACK(5 , 0 , 230), VLC_PACK(7 , 0 , 415), VLC_PACK(7 , 0 , 414),
212 VLC_PACK(0 , 0 , 2), VLC_PACK(2 , 1 , 3), VLC_PACK(7 , 0 , 61), VLC_PACK(7 , 0 , 29), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 219),
213 VLC_PACK(7 , 0 , 250), VLC_PACK(2 , 2 , 4), VLC_PACK(2 , 1 , 7), VLC_PACK(7 , 0 , 374), VLC_PACK(7 , 0 , 375), VLC_PACK(3 , 2 , 0),
214 VLC_PACK(3 , 2 , 0), VLC_PACK(7 , 0 , 409), VLC_PACK(7 , 0 , 371), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 372), VLC_PACK(7 , 0 , 373),
215 VLC_PACK(0 , 1 , 4), VLC_PACK(0 , 0 , 24), VLC_PACK(7 , 0 , 94), VLC_PACK(7 , 0 , 62), VLC_PACK(0 , 1 , 4), VLC_PACK(0 , 0 , 18),
216 VLC_PACK(7 , 0 , 434), VLC_PACK(7 , 0 , 433), VLC_PACK(0 , 1 , 4), VLC_PACK(0 , 0 , 12), VLC_PACK(7 , 0 , 423), VLC_PACK(7 , 0 , 422),
217 VLC_PACK(1 , 1 , 4), VLC_PACK(0 , 0 , 6), VLC_PACK(7 , 0 , 413), VLC_PACK(7 , 0 , 412), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 408),
218 VLC_PACK(7 , 0 , 407), VLC_PACK(7 , 0 , 411), VLC_PACK(7 , 0 , 410), VLC_PACK(7 , 0 , 420), VLC_PACK(7 , 0 , 419), VLC_PACK(7 , 0 , 428),
219 VLC_PACK(7 , 0 , 427), VLC_PACK(7 , 0 , 437), VLC_PACK(7 , 0 , 436), VLC_PACK(7 , 0 , 222), VLC_PACK(7 , 0 , 190), VLC_PACK(5 , 0 , 255),
220 VLC_PACK(5 , 0 , 253), VLC_PACK(0 , 0 , 14), VLC_PACK(0 , 1 , 15), VLC_PACK(0 , 0 , 44), VLC_PACK(0 , 1 , 45), VLC_PACK(0 , 1 , 74),
221 VLC_PACK(0 , 2 , 103), VLC_PACK(0 , 1 , 230), VLC_PACK(0 , 0 , 256), VLC_PACK(5 , 0 , 190), VLC_PACK(7 , 0 , 254), VLC_PACK(4 , 3 , 508),
222 VLC_PACK(4 , 3 , 509), VLC_PACK(4 , 3 , 444), VLC_PACK(4 , 3 , 445), VLC_PACK(5 , 0 , 252), VLC_PACK(5 , 0 , 158), VLC_PACK(5 , 0 , 221),
223 VLC_PACK(5 , 0 , 62), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 251), VLC_PACK(5 , 0 , 189), VLC_PACK(5 , 0 , 250),
224 VLC_PACK(5 , 0 , 249), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 248), VLC_PACK(5 , 0 , 219), VLC_PACK(5 , 0 , 247),
225 VLC_PACK(5 , 0 , 246), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 245), VLC_PACK(5 , 0 , 244), VLC_PACK(5 , 0 , 243),
226 VLC_PACK(5 , 0 , 216), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 242), VLC_PACK(5 , 0 , 241), VLC_PACK(5 , 0 , 238),
227 VLC_PACK(5 , 0 , 237), VLC_PACK(0 , 0 , 2), VLC_PACK(3 , 1 , 0), VLC_PACK(5 , 0 , 236), VLC_PACK(5 , 0 , 152), VLC_PACK(5 , 0 , 126),
228 VLC_PACK(5 , 0 , 94), VLC_PACK(5 , 0 , 30), VLC_PACK(5 , 0 , 439), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 438),
229 VLC_PACK(5 , 0 , 437), VLC_PACK(5 , 0 , 220), VLC_PACK(5 , 0 , 157), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 188),
230 VLC_PACK(5 , 0 , 93), VLC_PACK(5 , 0 , 218), VLC_PACK(5 , 0 , 156), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 217),
231 VLC_PACK(5 , 0 , 187), VLC_PACK(5 , 0 , 186), VLC_PACK(5 , 0 , 155), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 240),
232 VLC_PACK(5 , 0 , 239), VLC_PACK(5 , 0 , 214), VLC_PACK(5 , 0 , 213), VLC_PACK(0 , 0 , 2), VLC_PACK(3 , 1 , 0), VLC_PACK(5 , 0 , 122),
233 VLC_PACK(5 , 0 , 27), VLC_PACK(7 , 0 , 158), VLC_PACK(7 , 0 , 126), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 436),
234 VLC_PACK(7 , 0 , 30), VLC_PACK(5 , 0 , 125), VLC_PACK(5 , 0 , 435), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 432),
235 VLC_PACK(5 , 0 , 431), VLC_PACK(5 , 0 , 61), VLC_PACK(5 , 0 , 29), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 124),
236 VLC_PACK(5 , 0 , 92), VLC_PACK(5 , 0 , 60), VLC_PACK(5 , 0 , 28), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 215),
237 VLC_PACK(5 , 0 , 154), VLC_PACK(5 , 0 , 185), VLC_PACK(5 , 0 , 184), VLC_PACK(0 , 0 , 2), VLC_PACK(3 , 1 , 0), VLC_PACK(5 , 0 , 366),
238 VLC_PACK(5 , 0 , 410), VLC_PACK(7 , 0 , 439), VLC_PACK(7 , 0 , 438), VLC_PACK(0 , 0 , 6), VLC_PACK(0 , 1 , 7), VLC_PACK(0 , 0 , 27),
239 VLC_PACK(0 , 1 , 28), VLC_PACK(0 , 1 , 48), VLC_PACK(0 , 2 , 68), VLC_PACK(5 , 0 , 434), VLC_PACK(5 , 0 , 433), VLC_PACK(5 , 0 , 430),
240 VLC_PACK(7 , 0 , 221), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 375), VLC_PACK(5 , 0 , 374), VLC_PACK(5 , 0 , 373),
241 VLC_PACK(5 , 0 , 426), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 372), VLC_PACK(5 , 0 , 420), VLC_PACK(5 , 0 , 123),
242 VLC_PACK(5 , 0 , 91), VLC_PACK(0 , 0 , 2), VLC_PACK(2 , 1 , 3), VLC_PACK(5 , 0 , 153), VLC_PACK(5 , 0 , 59), VLC_PACK(3 , 1 , 0),
243 VLC_PACK(7 , 0 , 218), VLC_PACK(5 , 0 , 409), VLC_PACK(7 , 0 , 253), VLC_PACK(7 , 0 , 435), VLC_PACK(7 , 0 , 432), VLC_PACK(7 , 0 , 431),
244 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 429), VLC_PACK(5 , 0 , 428), VLC_PACK(5 , 0 , 425), VLC_PACK(5 , 0 , 424),
245 VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 419), VLC_PACK(5 , 0 , 418), VLC_PACK(5 , 0 , 311), VLC_PACK(5 , 0 , 371),
246 VLC_PACK(0 , 0 , 2), VLC_PACK(2 , 1 , 3), VLC_PACK(5 , 0 , 310), VLC_PACK(5 , 0 , 370), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 370),
247 VLC_PACK(7 , 0 , 188), VLC_PACK(7 , 0 , 430), VLC_PACK(7 , 0 , 429), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(5 , 0 , 427),
248 VLC_PACK(7 , 0 , 426), VLC_PACK(5 , 0 , 423), VLC_PACK(5 , 0 , 422), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3), VLC_PACK(7 , 0 , 220),
249 VLC_PACK(7 , 0 , 157), VLC_PACK(5 , 0 , 417), VLC_PACK(5 , 0 , 416), VLC_PACK(0 , 0 , 2), VLC_PACK(2 , 1 , 3), VLC_PACK(5 , 0 , 369),
250 VLC_PACK(5 , 0 , 368), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 405), VLC_PACK(7 , 0 , 406), VLC_PACK(7 , 0 , 425), VLC_PACK(7 , 0 , 424),
251 VLC_PACK(0 , 0 , 6), VLC_PACK(0 , 1 , 7), VLC_PACK(0 , 0 , 18), VLC_PACK(0 , 1 , 19), VLC_PACK(0 , 1 , 27), VLC_PACK(2 , 2 , 35),
252 VLC_PACK(5 , 0 , 421), VLC_PACK(7 , 0 , 252), VLC_PACK(7 , 0 , 125), VLC_PACK(7 , 0 , 418), VLC_PACK(0 , 0 , 2), VLC_PACK(0 , 1 , 3),
253 VLC_PACK(5 , 0 , 415), VLC_PACK(5 , 0 , 414), VLC_PACK(5 , 0 , 367), VLC_PACK(5 , 0 , 413), VLC_PACK(0 , 0 , 2), VLC_PACK(3 , 1 , 0),
254 VLC_PACK(7 , 0 , 404), VLC_PACK(7 , 0 , 403), VLC_PACK(7 , 0 , 189), VLC_PACK(7 , 0 , 421), VLC_PACK(7 , 0 , 417), VLC_PACK(7 , 0 , 416),
255 VLC_PACK(0 , 0 , 2), VLC_PACK(2 , 1 , 3), VLC_PACK(7 , 0 , 251), VLC_PACK(7 , 0 , 93), VLC_PACK(3 , 1 , 0), VLC_PACK(5 , 0 , 411),
256 VLC_PACK(5 , 0 , 412), VLC_PACK(7 , 0 , 415), VLC_PACK(7 , 0 , 414), VLC_PACK(0 , 0 , 2), VLC_PACK(2 , 1 , 3), VLC_PACK(7 , 0 , 61),
257 VLC_PACK(7 , 0 , 29), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 219), VLC_PACK(7 , 0 , 250), VLC_PACK(2 , 2 , 4), VLC_PACK(2 , 1 , 7),
258 VLC_PACK(7 , 0 , 374), VLC_PACK(7 , 0 , 375), VLC_PACK(3 , 2 , 0), VLC_PACK(3 , 2 , 0), VLC_PACK(7 , 0 , 409), VLC_PACK(7 , 0 , 371),
259 VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 372), VLC_PACK(7 , 0 , 373), VLC_PACK(0 , 1 , 4), VLC_PACK(0 , 0 , 24), VLC_PACK(7 , 0 , 94),
260 VLC_PACK(7 , 0 , 62), VLC_PACK(0 , 1 , 4), VLC_PACK(0 , 0 , 18), VLC_PACK(7 , 0 , 434), VLC_PACK(7 , 0 , 433), VLC_PACK(0 , 1 , 4),
261 VLC_PACK(0 , 0 , 12), VLC_PACK(7 , 0 , 423), VLC_PACK(7 , 0 , 422), VLC_PACK(1 , 1 , 4), VLC_PACK(0 , 0 , 6), VLC_PACK(7 , 0 , 413),
262 VLC_PACK(7 , 0 , 412), VLC_PACK(3 , 1 , 0), VLC_PACK(7 , 0 , 408), VLC_PACK(7 , 0 , 407), VLC_PACK(7 , 0 , 411), VLC_PACK(7 , 0 , 410),
263 VLC_PACK(7 , 0 , 420), VLC_PACK(7 , 0 , 419), VLC_PACK(7 , 0 , 428), VLC_PACK(7 , 0 , 427), VLC_PACK(7 , 0 , 437), VLC_PACK(7 , 0 , 436),
264 VLC_PACK(7 , 0 , 222), VLC_PACK(7 , 0 , 190), VLC_PACK(4 , 0 , 0), VLC_PACK(5 , 0 , 1), VLC_PACK(5 , 0 , 2), VLC_PACK(5 , 0 , 3),
265 VLC_PACK(5 , 0 , 4), VLC_PACK(5 , 0 , 5), VLC_PACK(1 , 5 , 1), VLC_PACK(5 , 0 , 6), VLC_PACK(5 , 0 , 7), VLC_PACK(5 , 0 , 8),
266 VLC_PACK(5 , 0 , 9), VLC_PACK(5 , 0 , 10), VLC_PACK(5 , 0 , 11), VLC_PACK(1 , 3 , 1), VLC_PACK(5 , 0 , 12), VLC_PACK(5 , 0 , 13),
267 VLC_PACK(5 , 0 , 14), VLC_PACK(5 , 0 , 15), VLC_PACK(5 , 1 , 16), VLC_PACK(5 , 0 , 1), VLC_PACK(5 , 0 , 2), VLC_PACK(5 , 0 , 3),
268 VLC_PACK(5 , 0 , 4), VLC_PACK(5 , 0 , 5), VLC_PACK(5 , 0 , 6), VLC_PACK(1 , 5 , 1), VLC_PACK(5 , 0 , 7), VLC_PACK(5 , 0 , 8),
269 VLC_PACK(5 , 0 , 9), VLC_PACK(5 , 0 , 10), VLC_PACK(5 , 0 , 11), VLC_PACK(5 , 0 , 12), VLC_PACK(1 , 2 , 1), VLC_PACK(5 , 0 , 13),
270 VLC_PACK(5 , 0 , 14), VLC_PACK(5 , 0 , 15), VLC_PACK(5 , 1 , 16), VLC_PACK(4 , 0 , 1), VLC_PACK(4 , 1 , 2), VLC_PACK(4 , 1 , 4),
271 VLC_PACK(0 , 0 , 2),
272 };
273
274
275 struct context_MPEG4_s {
276 object_context_p obj_context; /* back reference */
277
278 uint32_t profile;
279
280 /* Picture parameters */
281 VAPictureParameterBufferMPEG4 *pic_params;
282 object_surface_p forward_ref_surface;
283 object_surface_p backward_ref_surface;
284
285 uint32_t display_picture_width; /* in pixels */
286 uint32_t display_picture_height; /* in pixels */
287
288 uint32_t coded_picture_width; /* in pixels */
289 uint32_t coded_picture_height; /* in pixels */
290
291 uint32_t picture_width_mb; /* in macroblocks */
292 uint32_t picture_height_mb; /* in macroblocks */
293 uint32_t size_mb; /* in macroblocks */
294
295 uint32_t FEControl;
296 uint32_t FE_SPS0;
297 uint32_t FE_VOP_PPS0;
298 uint32_t FE_VOP_SPS0;
299 uint32_t FE_PICSH_PPS0;
300
301 uint32_t BE_SPS0;
302 uint32_t BE_SPS1;
303 uint32_t BE_VOP_PPS0;
304 uint32_t BE_VOP_SPS0;
305 uint32_t BE_VOP_SPS1;
306 uint32_t BE_PICSH_PPS0;
307
308 /* IQ Matrix */
309 uint32_t qmatrix_data[MAX_QUANT_TABLES][16];
310 int load_non_intra_quant_mat;
311 int load_intra_quant_mat;
312
313 /* Split buffers */
314 int split_buffer_pending;
315
316 /* List of VASliceParameterBuffers */
317 object_buffer_p *slice_param_list;
318 int slice_param_list_size;
319 int slice_param_list_idx;
320
321 /* VLC packed data */
322 struct psb_buffer_s vlc_packed_table;
323
324 /* FE state buffer */
325 struct psb_buffer_s FE_state_buffer;
326
327 /* CoLocated buffers */
328 struct psb_buffer_s *colocated_buffers;
329 int colocated_buffers_size;
330 int colocated_buffers_idx;
331
332 uint32_t *p_slice_params; /* pointer to ui32SliceParams in CMD_HEADER */
333 };
334
335 typedef struct context_MPEG4_s *context_MPEG4_p;
336
337 #define INIT_CONTEXT_MPEG4 context_MPEG4_p ctx = (context_MPEG4_p) obj_context->format_data;
338
339 #define SURFACE(id) ((object_surface_p) object_heap_lookup( &ctx->obj_context->driver_data->surface_heap, id ))
340
psb__debug_picture_coding_str(unsigned char vop_coding_type)341 static const char *psb__debug_picture_coding_str(unsigned char vop_coding_type)
342 {
343 switch (vop_coding_type) {
344 case PICTURE_CODING_I:
345 return ("PICTURE_CODING_I");
346 case PICTURE_CODING_P:
347 return ("PICTURE_CODING_P");
348 case PICTURE_CODING_B:
349 return ("PICTURE_CODING_B");
350 case PICTURE_CODING_S:
351 return ("PICTURE_CODING_S");
352 }
353 return ("UNKNOWN!!!");
354 }
355
356
psb_MPEG4_QueryConfigAttributes(VAProfile profile,VAEntrypoint entrypoint,VAConfigAttrib * attrib_list,int num_attribs)357 static void psb_MPEG4_QueryConfigAttributes(
358 VAProfile profile,
359 VAEntrypoint entrypoint,
360 VAConfigAttrib *attrib_list,
361 int num_attribs)
362 {
363 /* No MPEG4 specific attributes */
364 }
365
psb_MPEG4_ValidateConfig(object_config_p obj_config)366 static VAStatus psb_MPEG4_ValidateConfig(
367 object_config_p obj_config)
368 {
369 int i;
370 /* Check all attributes */
371 for (i = 0; i < obj_config->attrib_count; i++) {
372 switch (obj_config->attrib_list[i].type) {
373 case VAConfigAttribRTFormat:
374 /* Ignore */
375 break;
376
377 default:
378 return VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
379 }
380 }
381
382 return VA_STATUS_SUCCESS;
383 }
384
psb__MPEG4_check_legal_picture(object_context_p obj_context,object_config_p obj_config)385 static VAStatus psb__MPEG4_check_legal_picture(object_context_p obj_context, object_config_p obj_config)
386 {
387 VAStatus vaStatus = VA_STATUS_SUCCESS;
388
389 if (NULL == obj_context) {
390 vaStatus = VA_STATUS_ERROR_INVALID_CONTEXT;
391 DEBUG_FAILURE;
392 return vaStatus;
393 }
394
395 if (NULL == obj_config) {
396 vaStatus = VA_STATUS_ERROR_INVALID_CONFIG;
397 DEBUG_FAILURE;
398 return vaStatus;
399 }
400
401 /* MSVDX decode capability for MPEG4:
402 * SP@L3
403 * ASP@L5
404 *
405 * Refer to the "MSVDX MPEG4 decode capability" table of "Poulsbo Media Software Overview".
406 */
407 switch (obj_config->profile) {
408 case VAProfileMPEG4Simple:
409 case VAProfileMPEG4AdvancedSimple:
410 if ((obj_context->picture_width <= 0) || (obj_context->picture_height <= 0)) {
411 vaStatus = VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED;
412 }
413 break;
414
415 default:
416 vaStatus = VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
417 break;
418 }
419
420 return vaStatus;
421 }
422
423 static void psb_MPEG4_DestroyContext(object_context_p obj_context);
424
psb_MPEG4_CreateContext(object_context_p obj_context,object_config_p obj_config)425 static VAStatus psb_MPEG4_CreateContext(
426 object_context_p obj_context,
427 object_config_p obj_config)
428 {
429 VAStatus vaStatus = VA_STATUS_SUCCESS;
430 context_MPEG4_p ctx;
431 /* Validate flag */
432 /* Validate picture dimensions */
433 vaStatus = psb__MPEG4_check_legal_picture(obj_context, obj_config);
434 if (VA_STATUS_SUCCESS != vaStatus) {
435 DEBUG_FAILURE;
436 return vaStatus;
437 }
438
439 ctx = (context_MPEG4_p) calloc(1, sizeof(struct context_MPEG4_s));
440 if (NULL == ctx) {
441 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
442 DEBUG_FAILURE;
443 return vaStatus;
444 }
445
446 obj_context->format_data = (void*) ctx;
447 ctx->obj_context = obj_context;
448 ctx->pic_params = NULL;
449 ctx->load_non_intra_quant_mat = FALSE;
450 ctx->load_intra_quant_mat = FALSE;
451
452 ctx->split_buffer_pending = FALSE;
453
454 ctx->slice_param_list_size = 8;
455 ctx->slice_param_list = (object_buffer_p*) calloc(1, sizeof(object_buffer_p) * ctx->slice_param_list_size);
456 ctx->slice_param_list_idx = 0;
457
458 if (NULL == ctx->slice_param_list) {
459 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
460 DEBUG_FAILURE;
461 }
462
463 ctx->colocated_buffers_size = obj_context->num_render_targets;
464 ctx->colocated_buffers_idx = 0;
465 ctx->colocated_buffers = (psb_buffer_p) calloc(1, sizeof(struct psb_buffer_s) * ctx->colocated_buffers_size);
466 if (NULL == ctx->colocated_buffers) {
467 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
468 DEBUG_FAILURE;
469 }
470
471 switch (obj_config->profile) {
472 case VAProfileMPEG4Simple:
473 drv_debug_msg(VIDEO_DEBUG_GENERAL, "MPEG4_PROFILE_SIMPLE\n");
474 ctx->profile = MPEG4_PROFILE_SIMPLE;
475 break;
476
477 case VAProfileMPEG4AdvancedSimple:
478 drv_debug_msg(VIDEO_DEBUG_GENERAL, "MPEG4_PROFILE_ASP\n");
479 ctx->profile = MPEG4_PROFILE_ASP;
480 break;
481
482 default:
483 ASSERT(0 == 1);
484 vaStatus = VA_STATUS_ERROR_UNKNOWN;
485 }
486
487 // TODO
488
489 if (vaStatus == VA_STATUS_SUCCESS) {
490 vaStatus = psb_buffer_create(obj_context->driver_data,
491 FE_STATE_BUFFER_SIZE,
492 psb_bt_vpu_only,
493 &ctx->FE_state_buffer);
494 DEBUG_FAILURE;
495 }
496
497 if (vaStatus == VA_STATUS_SUCCESS) {
498 vaStatus = psb_buffer_create(obj_context->driver_data,
499 sizeof(gaui16mpeg4VlcTableDataPacked),
500 psb_bt_cpu_vpu,
501 &ctx->vlc_packed_table);
502 DEBUG_FAILURE;
503 }
504 if (vaStatus == VA_STATUS_SUCCESS) {
505 unsigned char *vlc_packed_data_address;
506 if (0 == psb_buffer_map(&ctx->vlc_packed_table, &vlc_packed_data_address)) {
507 memcpy(vlc_packed_data_address, gaui16mpeg4VlcTableDataPacked, sizeof(gaui16mpeg4VlcTableDataPacked));
508 psb_buffer_unmap(&ctx->vlc_packed_table);
509 } else {
510 vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
511 DEBUG_FAILURE;
512 }
513 }
514
515 if (vaStatus != VA_STATUS_SUCCESS) {
516 psb_MPEG4_DestroyContext(obj_context);
517 }
518
519 return vaStatus;
520 }
521
psb_MPEG4_DestroyContext(object_context_p obj_context)522 static void psb_MPEG4_DestroyContext(
523 object_context_p obj_context)
524 {
525 INIT_CONTEXT_MPEG4
526 int i;
527
528 psb_buffer_destroy(&ctx->vlc_packed_table);
529 psb_buffer_destroy(&ctx->FE_state_buffer);
530
531 if (ctx->pic_params) {
532 free(ctx->pic_params);
533 ctx->pic_params = NULL;
534 }
535
536 if (ctx->colocated_buffers) {
537 for (i = 0; i < ctx->colocated_buffers_idx; ++i)
538 psb_buffer_destroy(&(ctx->colocated_buffers[i]));
539
540 free(ctx->colocated_buffers);
541 ctx->colocated_buffers = NULL;
542 }
543 if (ctx->slice_param_list) {
544 free(ctx->slice_param_list);
545 ctx->slice_param_list = NULL;
546 }
547
548 free(obj_context->format_data);
549 obj_context->format_data = NULL;
550 }
551
psb__MPEG4_allocate_colocated_buffer(context_MPEG4_p ctx,object_surface_p obj_surface,uint32_t size)552 static VAStatus psb__MPEG4_allocate_colocated_buffer(context_MPEG4_p ctx, object_surface_p obj_surface, uint32_t size)
553 {
554 psb_surface_p surface = obj_surface->psb_surface;
555
556 if (!GET_SURFACE_INFO_colocated_index(surface)) {
557 VAStatus vaStatus;
558 psb_buffer_p buf;
559 int index = ctx->colocated_buffers_idx;
560 if (index >= ctx->colocated_buffers_size) {
561 return VA_STATUS_ERROR_UNKNOWN;
562 }
563 buf = &(ctx->colocated_buffers[index]);
564 vaStatus = psb_buffer_create(ctx->obj_context->driver_data, size, psb_bt_vpu_only, buf);
565 if (VA_STATUS_SUCCESS != vaStatus) {
566 return vaStatus;
567 }
568 ctx->colocated_buffers_idx++;
569 SET_SURFACE_INFO_colocated_index(surface, index + 1); /* 0 means unset, index is offset by 1 */
570 }
571 return VA_STATUS_SUCCESS;
572 }
573
psb__MPEG4_lookup_colocated_buffer(context_MPEG4_p ctx,psb_surface_p surface)574 static psb_buffer_p psb__MPEG4_lookup_colocated_buffer(context_MPEG4_p ctx, psb_surface_p surface)
575 {
576 int index = GET_SURFACE_INFO_colocated_index(surface);
577 if (!index) {
578 return NULL;
579 }
580 return &(ctx->colocated_buffers[index-1]); /* 0 means unset, index is offset by 1 */
581 }
582
psb__MPEG4_process_picture_param(context_MPEG4_p ctx,object_buffer_p obj_buffer)583 static VAStatus psb__MPEG4_process_picture_param(context_MPEG4_p ctx, object_buffer_p obj_buffer)
584 {
585 VAStatus vaStatus;
586 ASSERT(obj_buffer->type == VAPictureParameterBufferType);
587 ASSERT(obj_buffer->num_elements == 1);
588 ASSERT(obj_buffer->size == sizeof(VAPictureParameterBufferMPEG4));
589
590 if ((obj_buffer->num_elements != 1) ||
591 (obj_buffer->size != sizeof(VAPictureParameterBufferMPEG4))) {
592 return VA_STATUS_ERROR_UNKNOWN;
593 }
594
595 /* Transfer ownership of VAPictureParameterBufferMPEG4 data */
596 if (ctx->pic_params) {
597 free(ctx->pic_params);
598 }
599 ctx->pic_params = (VAPictureParameterBufferMPEG4 *) obj_buffer->buffer_data;
600 obj_buffer->buffer_data = NULL;
601 obj_buffer->size = 0;
602
603
604 /* Lookup surfaces for backward/forward references */
605 /* Lookup surfaces for backward/forward references */
606 switch (ctx->pic_params->vop_fields.bits.vop_coding_type) {
607 case PICTURE_CODING_I:
608 ctx->forward_ref_surface = NULL;
609 ctx->backward_ref_surface = NULL;
610 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);
611 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Forward ref = NULL\n");
612 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Backward ref = NULL\n");
613 break;
614
615 case PICTURE_CODING_P:
616 ctx->forward_ref_surface = SURFACE(ctx->pic_params->forward_reference_picture);
617 ctx->backward_ref_surface = NULL;
618 if (NULL == ctx->forward_ref_surface) {
619 return VA_STATUS_ERROR_INVALID_SURFACE;
620 }
621 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);
622 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Forward ref = %08x (%08x)\n", ctx->forward_ref_surface->psb_surface, ctx->pic_params->forward_reference_picture);
623 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Backward ref = NULL\n");
624 break;
625
626 case PICTURE_CODING_B:
627 ctx->forward_ref_surface = SURFACE(ctx->pic_params->forward_reference_picture);
628 ctx->backward_ref_surface = SURFACE(ctx->pic_params->backward_reference_picture);
629 if ((NULL == ctx->forward_ref_surface) ||
630 (NULL == ctx->backward_ref_surface)) {
631 return VA_STATUS_ERROR_INVALID_SURFACE;
632 }
633 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);
634 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Forward ref = %08x (%08x)\n", ctx->forward_ref_surface->psb_surface, ctx->pic_params->forward_reference_picture);
635 drv_debug_msg(VIDEO_DEBUG_GENERAL, "Backward ref = %08x (%08x)\n", ctx->backward_ref_surface->psb_surface, ctx->pic_params->backward_reference_picture);
636 break;
637
638 case PICTURE_CODING_S:
639 ctx->forward_ref_surface = SURFACE(ctx->pic_params->forward_reference_picture);
640 ctx->backward_ref_surface = SURFACE(ctx->pic_params->backward_reference_picture);
641 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);
642 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);
643 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);
644 break;
645
646 default:
647 drv_debug_msg(VIDEO_DEBUG_ERROR, "Unhandled MPEG4 vop_coding_type '%d'\n", ctx->pic_params->vop_fields.bits.vop_coding_type);
648 return VA_STATUS_ERROR_UNKNOWN;
649 }
650
651 if (NULL == ctx->forward_ref_surface) {
652 /* for mmu fault protection */
653 ctx->forward_ref_surface = ctx->obj_context->current_render_target;
654 }
655 if (NULL == ctx->backward_ref_surface) {
656 /* for mmu fault protection */
657 ctx->backward_ref_surface = ctx->obj_context->current_render_target;
658 }
659
660 ctx->display_picture_width = ctx->pic_params->vop_width;
661 ctx->display_picture_height = ctx->pic_params->vop_height;
662 ctx->picture_width_mb = PIXELS_TO_MB(ctx->display_picture_width);
663 ctx->picture_height_mb = PIXELS_TO_MB(ctx->display_picture_height);
664 ctx->coded_picture_width = ctx->picture_width_mb * 16;
665 ctx->coded_picture_height = ctx->picture_height_mb * 16;
666 ctx->size_mb = ctx->picture_width_mb * ctx->picture_height_mb;
667
668 uint32_t mbInPic = ctx->picture_width_mb * ctx->picture_height_mb;
669
670 mbInPic += 4;
671
672 uint32_t colocated_size = ((mbInPic * 200) + 0xfff) & ~0xfff;
673
674 vaStatus = psb__MPEG4_allocate_colocated_buffer(ctx, ctx->obj_context->current_render_target, colocated_size);
675 if (VA_STATUS_SUCCESS != vaStatus) {
676 DEBUG_FAILURE;
677 return vaStatus;
678 }
679 vaStatus = psb__MPEG4_allocate_colocated_buffer(ctx, ctx->forward_ref_surface, colocated_size);
680 if (VA_STATUS_SUCCESS != vaStatus) {
681 DEBUG_FAILURE;
682 return vaStatus;
683 }
684
685 ctx->FEControl = 0;
686 REGIO_WRITE_FIELD_LITE(ctx->FEControl ,
687 MSVDX_VEC,
688 CR_VEC_ENTDEC_FE_CONTROL,
689 ENTDEC_FE_PROFILE,
690 ctx->profile); /* MPEG4 SP / ASP profile */
691
692 REGIO_WRITE_FIELD_LITE(ctx->FEControl ,
693 MSVDX_VEC,
694 CR_VEC_ENTDEC_FE_CONTROL,
695 ENTDEC_FE_MODE,
696 4); /* Set MPEG4 mode */
697
698 /* FE_SPS0 */
699 ctx->FE_SPS0 = 0;
700 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);
701 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);
702 REGIO_WRITE_FIELD_LITE(ctx->FE_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SPS0, FE_PROFILE, ctx->profile);
703
704 /* FE_VOP_SPS0 */
705 ctx->FE_VOP_SPS0 = 0;
706 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);
707 REGIO_WRITE_FIELD_LITE(ctx->FE_VOP_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_SPS0, QUANT_PRECISION, ctx->pic_params->quant_precision);
708 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);
709 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));
710 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);
711 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);
712 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);
713
714 if (ctx->pic_params->vol_fields.bits.short_video_header) {
715 /* FE_PICSH_PPS0 */
716 ctx->FE_PICSH_PPS0 = 0;
717 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);
718 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);
719 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);
720 }
721
722 /* FE_VOP_PPS0 */
723 ctx->FE_VOP_PPS0 = 0;
724 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);
725 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);
726 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);
727 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);
728 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);
729
730 /* BE_SPS0 */
731 /* Common for VOPs and pictures with short header */
732 ctx->BE_SPS0 = 0;
733 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);
734 REGIO_WRITE_FIELD_LITE(ctx->BE_SPS0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_SPS0, BE_PROFILE, ctx->profile);
735
736 /* BE_SPS1 */
737 /* Common for VOPs and pictures with short header */
738 ctx->BE_SPS1 = 0;
739 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);
740 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);
741
742 if (0 == ctx->pic_params->vol_fields.bits.short_video_header) {
743 /* BE_VOP_SPS0 */
744 ctx->BE_VOP_SPS0 = 0;
745 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);
746 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);
747 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);
748
749 /* BE_VOP_SPS1 */
750 ctx->BE_VOP_SPS1 = 0;
751 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);
752 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);
753 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));
754 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);
755 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);
756
757 /* BE_VOP_PPS0 */
758 ctx->BE_VOP_PPS0 = 0;
759 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);
760 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);
761 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);
762 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);
763 REGIO_WRITE_FIELD_LITE(ctx->BE_VOP_PPS0,
764 MSVDX_VEC_MPEG4,
765 CR_VEC_MPEG4_BE_VOP_PPS0,
766 ROUNDING_TYPE,
767 ((PICTURE_CODING_I == ctx->pic_params->vop_fields.bits.vop_coding_type ||
768 PICTURE_CODING_B == ctx->pic_params->vop_fields.bits.vop_coding_type) ?
769 0 : ctx->pic_params->vop_fields.bits.vop_rounding_type));
770 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);
771 } else {
772 /* BE_VOP_PPS0 */
773 ctx->BE_VOP_PPS0 = 0;
774 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
775 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);
776 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);
777 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
778 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);
779
780 /* BE_PICSH_PPS0 */
781 ctx->BE_PICSH_PPS0 = 0;
782 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);
783 }
784
785 psb_CheckInterlaceRotate(ctx->obj_context, (unsigned char *)ctx->pic_params);
786
787 return VA_STATUS_SUCCESS;
788 }
789
psb__MPEG4_convert_iq_matrix(uint32_t * dest32,unsigned char * src)790 static void psb__MPEG4_convert_iq_matrix(uint32_t *dest32, unsigned char *src)
791 {
792 int i;
793 int *idx = scan0;
794 uint8_t *dest8 = (uint8_t*) dest32;
795
796 for (i = 0; i < 64; i++) {
797 *dest8++ = src[*idx++];
798 }
799 }
800
psb__MPEG4_process_iq_matrix(context_MPEG4_p ctx,object_buffer_p obj_buffer)801 static VAStatus psb__MPEG4_process_iq_matrix(context_MPEG4_p ctx, object_buffer_p obj_buffer)
802 {
803 VAIQMatrixBufferMPEG4 *iq_matrix = (VAIQMatrixBufferMPEG4 *) obj_buffer->buffer_data;
804 ASSERT(obj_buffer->type == VAIQMatrixBufferType);
805 ASSERT(obj_buffer->num_elements == 1);
806 ASSERT(obj_buffer->size == sizeof(VAIQMatrixBufferMPEG4));
807
808 if ((obj_buffer->num_elements != 1) ||
809 (obj_buffer->size != sizeof(VAIQMatrixBufferMPEG4))) {
810 return VA_STATUS_ERROR_UNKNOWN;
811 }
812
813 if (iq_matrix->load_non_intra_quant_mat) {
814 psb__MPEG4_convert_iq_matrix(ctx->qmatrix_data[NONINTRA_LUMA_Q], iq_matrix->non_intra_quant_mat);
815 }
816 if (iq_matrix->load_intra_quant_mat) {
817 psb__MPEG4_convert_iq_matrix(ctx->qmatrix_data[INTRA_LUMA_Q], iq_matrix->intra_quant_mat);
818 }
819 ctx->load_non_intra_quant_mat = iq_matrix->load_non_intra_quant_mat;
820 ctx->load_intra_quant_mat = iq_matrix->load_intra_quant_mat;
821
822 return VA_STATUS_SUCCESS;
823 }
824
psb__MPEG4_write_qmatrices(context_MPEG4_p ctx)825 static void psb__MPEG4_write_qmatrices(context_MPEG4_p ctx)
826 {
827 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
828 int i;
829
830 // TODO: Verify that this is indeed the same as MPEG2
831
832 /* Since we only decode 4:2:0 We only need to the Intra tables.
833 Chroma quant tables are only used in Mpeg 4:2:2 and 4:4:4.
834 The hardware wants non-intra followed by intra */
835 psb_cmdbuf_rendec_start_block(cmdbuf);
836 psb_cmdbuf_rendec_start_chunk(cmdbuf, REG_MSVDX_VEC_IQRAM_OFFSET);
837
838 /* todo : optimisation here is to only load the need table */
839 if (ctx->load_non_intra_quant_mat) {
840 /* NONINTRA_LUMA_Q --> REG_MSVDX_VEC_IQRAM_OFFSET + 0 */
841 for (i = 0; i < 16; i++) {
842 psb_cmdbuf_rendec_write(cmdbuf, ctx->qmatrix_data[NONINTRA_LUMA_Q][i]);
843 }
844 } else {
845 for (i = 0; i < 16; i++) {
846 psb_cmdbuf_rendec_write(cmdbuf, 0);
847 }
848 }
849 if (ctx->load_intra_quant_mat) {
850 /* INTRA_LUMA_Q --> REG_MSVDX_VEC_IQRAM_OFFSET + (16*4) */
851 for (i = 0; i < 16; i++) {
852 psb_cmdbuf_rendec_write(cmdbuf, ctx->qmatrix_data[INTRA_LUMA_Q][i]);
853 }
854 } else {
855 for (i = 0; i < 16; i++) {
856 psb_cmdbuf_rendec_write(cmdbuf, 0);
857 }
858 }
859
860 psb_cmdbuf_rendec_end_chunk(cmdbuf);
861 psb_cmdbuf_rendec_end_block(cmdbuf);
862 }
863
864
865 /*
866 * Adds a VASliceParameterBuffer to the list of slice params
867 */
psb__MPEG4_add_slice_param(context_MPEG4_p ctx,object_buffer_p obj_buffer)868 static VAStatus psb__MPEG4_add_slice_param(context_MPEG4_p ctx, object_buffer_p obj_buffer)
869 {
870 ASSERT(obj_buffer->type == VASliceParameterBufferType);
871 if (ctx->slice_param_list_idx >= ctx->slice_param_list_size) {
872 unsigned char *new_list;
873 ctx->slice_param_list_size += 8;
874 new_list = realloc(ctx->slice_param_list,
875 sizeof(object_buffer_p) * ctx->slice_param_list_size);
876 if (NULL == new_list) {
877 return VA_STATUS_ERROR_ALLOCATION_FAILED;
878 }
879 ctx->slice_param_list = (object_buffer_p*) new_list;
880 }
881 ctx->slice_param_list[ctx->slice_param_list_idx] = obj_buffer;
882 ctx->slice_param_list_idx++;
883 return VA_STATUS_SUCCESS;
884 }
885
886 /* Precalculated values */
887 #define ADDR0 (0x00005800)
888 #define ADDR1 (0x0001f828)
889 #define ADDR2 (0x0002b854)
890 #define ADDR3 (0x0002f85c)
891 #define ADDR4 (0x0004d089)
892 #define ADDR5 (0x0008f0aa)
893 #define ADDR6 (0x00149988)
894 #define ADDR7 (0x001d8b9e)
895 #define ADDR8 (0x000003c3)
896 #define WIDTH0 (0x09a596ed)
897 #define WIDTH1 (0x0006d6db)
898 #define OPCODE0 (0x50009a0a)
899 #define OPCODE1 (0x00000001)
900
psb__MPEG4_write_VLC_tables(context_MPEG4_p ctx)901 static void psb__MPEG4_write_VLC_tables(context_MPEG4_p ctx)
902 {
903 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
904
905 /* Write the vec registers with the index data for each of the tables and then write */
906 /* the actual table data. */
907 psb_cmdbuf_reg_start_block(cmdbuf, 0);
908 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR0), ADDR0);
909 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR1), ADDR1);
910 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR2), ADDR2);
911 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR3), ADDR3);
912 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR4), ADDR4);
913 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR5), ADDR5);
914 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR6), ADDR6);
915 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR7), ADDR7);
916 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_ADDR8), ADDR8);
917 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH0), WIDTH0);
918 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_WIDTH1), WIDTH1);
919 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE0), OPCODE0);
920 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_VLC_TABLE_INITIAL_OPCODE1), OPCODE1);
921 psb_cmdbuf_reg_end_block(cmdbuf);
922
923 /* VLC Table */
924 /* Write a LLDMA Cmd to transfer VLD Table data */
925 psb_cmdbuf_lldma_write_cmdbuf(cmdbuf, &ctx->vlc_packed_table, 0,
926 sizeof(gaui16mpeg4VlcTableDataPacked),
927 0, LLDMA_TYPE_VLC_TABLE);
928 }
929
930
psb__MPEG4_write_kick(context_MPEG4_p ctx,VASliceParameterBufferMPEG4 * slice_param)931 static void psb__MPEG4_write_kick(context_MPEG4_p ctx, VASliceParameterBufferMPEG4 *slice_param)
932 {
933 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
934
935 (void) slice_param; /* Unused for now */
936
937 *cmdbuf->cmd_idx++ = CMD_COMPLETION;
938 }
939
940 /* Programme the Alt output if there is a rotation*/
psb__MPEG4_setup_alternative_frame(context_MPEG4_p ctx)941 static void psb__MPEG4_setup_alternative_frame(context_MPEG4_p ctx)
942 {
943 uint32_t cmd;
944 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
945 psb_surface_p rotate_surface = ctx->obj_context->current_render_target->out_loop_surface;
946 object_context_p obj_context = ctx->obj_context;
947
948 if (GET_SURFACE_INFO_rotate(rotate_surface) != obj_context->msvdx_rotate)
949 drv_debug_msg(VIDEO_DEBUG_ERROR, "Display rotate mode does not match surface rotate mode!\n");
950
951
952 /* CRendecBlock RendecBlk( mCtrlAlloc , RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS) ); */
953 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, VC1_LUMA_RANGE_MAPPING_BASE_ADDRESS));
954
955 psb_cmdbuf_rendec_write_address(cmdbuf, &rotate_surface->buf, rotate_surface->buf.buffer_ofs);
956 psb_cmdbuf_rendec_write_address(cmdbuf, &rotate_surface->buf, rotate_surface->buf.buffer_ofs + rotate_surface->chroma_offset);
957
958 psb_cmdbuf_rendec_end_chunk(cmdbuf);
959
960 /* Set the rotation registers */
961 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION));
962 cmd = 0;
963 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ALT_PICTURE_ENABLE, 1);
964 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_ROW_STRIDE, rotate_surface->stride_mode);
965 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , RECON_WRITE_DISABLE, 0); /* FIXME Always generate Rec */
966 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, ALTERNATIVE_OUTPUT_PICTURE_ROTATION , ROTATION_MODE, GET_SURFACE_INFO_rotate(rotate_surface));
967
968 psb_cmdbuf_rendec_write(cmdbuf, cmd);
969
970 psb_cmdbuf_rendec_end_chunk(cmdbuf);
971 }
972
psb__MPEG4_set_picture_params(context_MPEG4_p ctx,VASliceParameterBufferMPEG4 * slice_param)973 static void psb__MPEG4_set_picture_params(context_MPEG4_p ctx, VASliceParameterBufferMPEG4 *slice_param)
974 {
975 uint32_t cmd;
976 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
977 psb_surface_p target_surface = ctx->obj_context->current_render_target->psb_surface;
978
979 psb_buffer_p colocated_target_buffer = psb__MPEG4_lookup_colocated_buffer(ctx, target_surface);
980 psb_buffer_p colocated_ref_buffer = psb__MPEG4_lookup_colocated_buffer(ctx, ctx->forward_ref_surface->psb_surface); /* FIXME DE2.0 use backward ref surface */
981 ASSERT(colocated_target_buffer);
982 ASSERT(colocated_ref_buffer);
983
984 psb_cmdbuf_rendec_start_block(cmdbuf);
985
986 /* BE_PARAM_BASE_ADDR */
987 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_PARAM_BASE_ADDR));
988 if (colocated_target_buffer) {
989 psb_cmdbuf_rendec_write_address(cmdbuf, colocated_target_buffer, 0);
990 } else {
991 /* This is an error */
992 psb_cmdbuf_rendec_write(cmdbuf, 0);
993 }
994 psb_cmdbuf_rendec_end_chunk(cmdbuf);
995
996 /* PARAM_BASE_ADDRESS */
997 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_COLPARAM_BASE_ADDR));
998 if (colocated_ref_buffer) {
999 psb_cmdbuf_rendec_write_address(cmdbuf, colocated_ref_buffer, 0);
1000 } else {
1001 /* This is an error */
1002 psb_cmdbuf_rendec_write(cmdbuf, 0);
1003 }
1004 psb_cmdbuf_rendec_end_chunk(cmdbuf);
1005
1006 if (CONTEXT_ROTATE(ctx->obj_context))
1007 psb__MPEG4_setup_alternative_frame(ctx);
1008
1009 /* Send VDMC and VDEB commands */
1010 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, DISPLAY_PICTURE_SIZE));
1011
1012 /* Display picture size cmd */
1013 cmd = 0;
1014 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_HEIGHT, ctx->coded_picture_height - 1);
1015 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, DISPLAY_PICTURE_SIZE, DISPLAY_PICTURE_WIDTH, ctx->coded_picture_width - 1);
1016 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1017
1018 /* Coded picture size cmd */
1019 cmd = 0;
1020 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_HEIGHT, ctx->coded_picture_height - 1);
1021 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, CODED_PICTURE_SIZE, CODED_PICTURE_WIDTH, ctx->coded_picture_width - 1);
1022 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1023
1024 /* Operating mode cmd */
1025 cmd = 0;
1026 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, CHROMA_INTERLEAVED, 0); /* 0 = CbCr, 1 = CrCb */
1027 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, ROW_STRIDE, ctx->obj_context->current_render_target->psb_surface->stride_mode);
1028 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, CODEC_PROFILE, ctx->profile); /* MPEG4 SP / ASP profile */
1029 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, CODEC_MODE, 4); /* MPEG4 */
1030 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, ASYNC_MODE, 1); /* VDMC only */
1031 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, CHROMA_FORMAT, 1);
1032 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, OPERATING_MODE, INTERLACED, ctx->pic_params->vol_fields.bits.interlaced);
1033 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1034 ctx->obj_context->operating_mode = cmd;
1035
1036 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));
1037 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));
1038
1039 /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1040 psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs);
1041 /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1042 psb_cmdbuf_rendec_write_address(cmdbuf, &target_surface->buf, target_surface->buf.buffer_ofs + target_surface->chroma_offset);
1043
1044 psb_cmdbuf_rendec_end_chunk(cmdbuf);
1045
1046 /* Reference pictures base addresses */
1047 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, REFERENCE_PICTURE_BASE_ADDRESSES));
1048
1049 //drv_debug_msg(VIDEO_DEBUG_GENERAL, "Target surface = %08x\n", target_surface);
1050 //drv_debug_msg(VIDEO_DEBUG_GENERAL, "Forward ref = %08x\n", ctx->forward_ref_surface->psb_surface);
1051 //drv_debug_msg(VIDEO_DEBUG_GENERAL, "Backward ref = %08x\n", ctx->backward_ref_surface->psb_surface);
1052
1053 /* forward reference picture */
1054 /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1055 psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->forward_ref_surface->psb_surface->buf, ctx->forward_ref_surface->psb_surface->buf.buffer_ofs);
1056 /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1057 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);
1058
1059 /* backward reference picture */
1060 /* LUMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1061 psb_cmdbuf_rendec_write_address(cmdbuf, &ctx->backward_ref_surface->psb_surface->buf, ctx->backward_ref_surface->psb_surface->buf.buffer_ofs);
1062 /* CHROMA_RECONSTRUCTED_PICTURE_BASE_ADDRESSES */
1063 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);
1064
1065 psb_cmdbuf_rendec_end_chunk(cmdbuf);
1066 psb_cmdbuf_rendec_end_block(cmdbuf);
1067 }
1068
psb__MPEG4_set_backend_registers(context_MPEG4_p ctx,VASliceParameterBufferMPEG4 * slice_param)1069 static void psb__MPEG4_set_backend_registers(context_MPEG4_p ctx, VASliceParameterBufferMPEG4 *slice_param)
1070 {
1071 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1072 uint32_t cmd;
1073 unsigned short width_mb = PIXELS_TO_MB(ctx->pic_params->vop_width);
1074
1075 psb_cmdbuf_rendec_start_block(cmdbuf);
1076
1077 /* Write Back-End EntDec registers */
1078 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_SPS0));
1079 /* BE_SPS0 */
1080 /* Common for VOPs and pictures with short header */
1081 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_SPS0);
1082 /* BE_SPS1 */
1083 /* Common for VOPs and pictures with short header */
1084 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_SPS1);
1085 psb_cmdbuf_rendec_end_chunk(cmdbuf);
1086
1087 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_VOP_SPS0));
1088 if (0 == ctx->pic_params->vol_fields.bits.short_video_header) {
1089 /* BE_VOP_SPS0 */
1090 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_VOP_SPS0);
1091 /* BE_VOP_SPS1 */
1092 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_VOP_SPS1);
1093 /* BE_VOP_PPS0 */
1094 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_VOP_PPS0);
1095 } else { /* Short-header mode */
1096 /* BE_VOP_SPS0 */
1097 psb_cmdbuf_rendec_write(cmdbuf, 0);
1098 /* BE_VOP_SPS1 */
1099 psb_cmdbuf_rendec_write(cmdbuf, 0);
1100 /* BE_VOP_PPS0 */
1101 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_VOP_PPS0);
1102 /* BE_PICSH_PPS0 */
1103 psb_cmdbuf_rendec_write(cmdbuf, ctx->BE_PICSH_PPS0);
1104 }
1105 psb_cmdbuf_rendec_end_chunk(cmdbuf);
1106
1107 if (0 == ctx->pic_params->vol_fields.bits.short_video_header) {
1108 if ((GMC == ctx->pic_params->vol_fields.bits.sprite_enable) &&
1109 (PICTURE_CODING_S == ctx->pic_params->vop_fields.bits.vop_coding_type)) {
1110 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_GMC_X));
1111
1112 /* TODO: GMC Motion Vectors */
1113 /* It is still needed to specify the precision of the motion vectors (should they be in */
1114 /* half-sample, quarter-sample...?) and how much processing is done on the firmware on */
1115 /* the values of the warping points. */
1116
1117 // TODO: Which index to use?
1118 int sprite_index = (ctx->pic_params->sprite_trajectory_du[0] || ctx->pic_params->sprite_trajectory_dv[0]) ? 0 : 1;
1119
1120 /* BE_GMC_X */
1121 cmd = 0;
1122 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);
1123 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1124
1125 /* BE_GMC_Y */
1126 cmd = 0;
1127 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);
1128 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1129
1130 psb_cmdbuf_rendec_end_chunk(cmdbuf);
1131 }
1132 }
1133
1134 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, MPEG4_CR_VEC_MPEG4_BE_SLICE0));
1135
1136 /* BE_SLICE0 */
1137 cmd = 0;
1138 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);
1139 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);
1140 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1141
1142 /* CR_VEC_MPEG4_BE_VOP_TR */
1143 cmd = 0;
1144 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_TRB, BE_TRB, ctx->pic_params->TRB);
1145 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1146
1147 cmd = 0;
1148 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_BE_VOP_TRD, BE_TRD, ctx->pic_params->TRD);
1149 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1150
1151 psb_cmdbuf_rendec_end_chunk(cmdbuf);
1152
1153
1154 /* Send Slice Data for every slice */
1155 /* MUST be the last slice sent */
1156 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, SLICE_PARAMS));
1157
1158 /* Slice params command */
1159 cmd = 0;
1160 REGIO_WRITE_FIELD_LITE(cmd,
1161 MSVDX_CMDS,
1162 SLICE_PARAMS,
1163 RND_CTL_BIT,
1164 ((PICTURE_CODING_I == ctx->pic_params->vop_fields.bits.vop_coding_type ||
1165 PICTURE_CODING_B == ctx->pic_params->vop_fields.bits.vop_coding_type) ?
1166 0 : ctx->pic_params->vop_fields.bits.vop_rounding_type));
1167 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, SLICE_PARAMS, MODE_CONFIG, ctx->pic_params->vol_fields.bits.sprite_warping_accuracy);
1168 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, SLICE_PARAMS, SUBPEL_FILTER_MODE, ctx->pic_params->vol_fields.bits.quarter_sample);
1169 /* SP and ASP profiles don't support field coding in different VOPs */
1170 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, SLICE_PARAMS, SLICE_FIELD_TYPE, 2);
1171 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, SLICE_PARAMS, SLICE_CODE_TYPE, ctx->pic_params->vop_fields.bits.vop_coding_type);
1172 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1173
1174 psb_cmdbuf_rendec_end_chunk(cmdbuf);
1175
1176 *ctx->p_slice_params = cmd;
1177
1178 /* CHUNK: Entdec back-end profile and level */
1179 psb_cmdbuf_rendec_start_chunk(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL));
1180
1181 cmd = 0;
1182 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL, ENTDEC_BE_PROFILE, ctx->profile); /* MPEG4 SP / ASP profile*/
1183 REGIO_WRITE_FIELD_LITE(cmd, MSVDX_VEC, CR_VEC_ENTDEC_BE_CONTROL, ENTDEC_BE_MODE, 4); /* 4 - MPEG4 */
1184 psb_cmdbuf_rendec_write(cmdbuf, cmd);
1185
1186 psb_cmdbuf_rendec_end_chunk(cmdbuf);
1187 psb_cmdbuf_rendec_end_block(cmdbuf);
1188
1189 /* Send IQ matrices to Rendec */
1190 psb__MPEG4_write_qmatrices(ctx);
1191 }
1192
psb__MPEG4_set_frontend_registers(context_MPEG4_p ctx,VASliceParameterBufferMPEG4 * slice_param)1193 static void psb__MPEG4_set_frontend_registers(context_MPEG4_p ctx, VASliceParameterBufferMPEG4 *slice_param)
1194 {
1195 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1196 uint32_t FE_slice0;
1197 unsigned short width_mb = PIXELS_TO_MB(ctx->pic_params->vop_width);
1198
1199 psb_cmdbuf_reg_start_block(cmdbuf, 0);
1200
1201 /* FE_SLICE0 */
1202 FE_slice0 = 0;
1203 REGIO_WRITE_FIELD_LITE(FE_slice0, MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SLICE0, FE_VOP_QUANT, slice_param->quant_scale);
1204 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);
1205 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);
1206
1207 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SLICE0) , FE_slice0);
1208
1209 /* Entdec Front-End controls*/
1210 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC, CR_VEC_ENTDEC_FE_CONTROL) , ctx->FEControl);
1211
1212 /* FE_SPS0 */
1213 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_SPS0) , ctx->FE_SPS0);
1214
1215 /* FE_VOP_SPS0 */
1216 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_SPS0) , ctx->FE_VOP_SPS0);
1217
1218
1219 if (ctx->pic_params->vol_fields.bits.short_video_header) {
1220 /* FE_PICSH_PPS0 */
1221 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_PICSH_PPS0) , ctx->FE_PICSH_PPS0);
1222 }
1223
1224 /* FE_VOP_PPS0 */
1225 psb_cmdbuf_reg_set(cmdbuf, REGISTER_OFFSET(MSVDX_VEC_MPEG4, CR_VEC_MPEG4_FE_VOP_PPS0) , ctx->FE_VOP_PPS0);
1226
1227 psb_cmdbuf_reg_end_block(cmdbuf);
1228 }
1229
psb__MPEG4_FE_state(context_MPEG4_p ctx)1230 static void psb__MPEG4_FE_state(context_MPEG4_p ctx)
1231 {
1232 uint32_t lldma_record_offset;
1233 psb_cmdbuf_p cmdbuf = ctx->obj_context->cmdbuf;
1234
1235 /* See RENDER_BUFFER_HEADER */
1236 *cmdbuf->cmd_idx++ = CMD_HEADER;
1237
1238 ctx->p_slice_params = cmdbuf->cmd_idx;
1239 *cmdbuf->cmd_idx++ = 0; /* ui32SliceParams */
1240
1241 lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, &(ctx->FE_state_buffer), 0,
1242 FE_STATE_SAVE_SIZE, 0, LLDMA_TYPE_MPEG4_FESTATE_SAVE);
1243 RELOC(*cmdbuf->cmd_idx, lldma_record_offset, &(cmdbuf->buf));
1244 cmdbuf->cmd_idx++;
1245
1246 lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, &(ctx->FE_state_buffer), 0,
1247 FE_STATE_SAVE_SIZE, 0, LLDMA_TYPE_MPEG4_FESTATE_RESTORE);
1248 RELOC(*cmdbuf->cmd_idx, lldma_record_offset, &(cmdbuf->buf));
1249 cmdbuf->cmd_idx++;
1250 }
1251
psb__MPEG4_process_slice(context_MPEG4_p ctx,VASliceParameterBufferMPEG4 * slice_param,object_buffer_p obj_buffer)1252 static VAStatus psb__MPEG4_process_slice(context_MPEG4_p ctx,
1253 VASliceParameterBufferMPEG4 *slice_param,
1254 object_buffer_p obj_buffer)
1255 {
1256 VAStatus vaStatus = VA_STATUS_SUCCESS;
1257
1258 ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType));
1259
1260 drv_debug_msg(VIDEO_DEBUG_GENERAL, "MPEG4 process slice\n");
1261 drv_debug_msg(VIDEO_DEBUG_GENERAL, " size = %08x offset = %08x\n", slice_param->slice_data_size, slice_param->slice_data_offset);
1262 drv_debug_msg(VIDEO_DEBUG_GENERAL, " macroblock nr = %d offset = %d\n", slice_param->macroblock_number, slice_param->macroblock_offset);
1263 drv_debug_msg(VIDEO_DEBUG_GENERAL, " slice_data_flag = %d\n", slice_param->slice_data_flag);
1264 drv_debug_msg(VIDEO_DEBUG_GENERAL, " interlaced = %d\n", ctx->pic_params->vol_fields.bits.interlaced);
1265 drv_debug_msg(VIDEO_DEBUG_GENERAL, " coded size = %dx%d\n", ctx->picture_width_mb, ctx->picture_height_mb);
1266
1267 if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) ||
1268 (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL)) {
1269 if (0 == slice_param->slice_data_size) {
1270 vaStatus = VA_STATUS_ERROR_UNKNOWN;
1271 DEBUG_FAILURE;
1272 return vaStatus;
1273 }
1274 ASSERT(!ctx->split_buffer_pending);
1275
1276 /* Initialise the command buffer */
1277 /* TODO: Reuse current command buffer until full */
1278 psb_context_get_next_cmdbuf(ctx->obj_context);
1279
1280 psb_cmdbuf_lldma_write_bitstream(ctx->obj_context->cmdbuf,
1281 obj_buffer->psb_buffer,
1282 obj_buffer->psb_buffer->buffer_ofs + slice_param->slice_data_offset,
1283 slice_param->slice_data_size,
1284 slice_param->macroblock_offset,
1285 0);
1286
1287 if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_BEGIN) {
1288 ctx->split_buffer_pending = TRUE;
1289 }
1290 } else {
1291 ASSERT(ctx->split_buffer_pending);
1292 ASSERT(0 == slice_param->slice_data_offset);
1293 /* Create LLDMA chain to continue buffer */
1294 if (slice_param->slice_data_size) {
1295 psb_cmdbuf_lldma_write_bitstream_chained(ctx->obj_context->cmdbuf,
1296 obj_buffer->psb_buffer,
1297 slice_param->slice_data_size);
1298 }
1299 }
1300
1301 if ((slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL) ||
1302 (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END)) {
1303 if (slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_END) {
1304 ASSERT(ctx->split_buffer_pending);
1305 }
1306
1307 psb__MPEG4_FE_state(ctx);
1308
1309 psb__MPEG4_write_VLC_tables(ctx);
1310
1311 psb__MPEG4_set_picture_params(ctx, slice_param);
1312
1313 psb__MPEG4_set_frontend_registers(ctx, slice_param);
1314
1315 psb__MPEG4_set_backend_registers(ctx, slice_param);
1316
1317 psb__MPEG4_write_kick(ctx, slice_param);
1318
1319 ctx->split_buffer_pending = FALSE;
1320 ctx->obj_context->video_op = psb_video_vld;
1321 ctx->obj_context->flags = 0;
1322 ctx->obj_context->first_mb = 0;
1323 ctx->obj_context->last_mb = ((ctx->picture_height_mb - 1) << 8) | (ctx->picture_width_mb - 1);
1324 if (psb_context_submit_cmdbuf(ctx->obj_context)) {
1325 vaStatus = VA_STATUS_ERROR_UNKNOWN;
1326 }
1327 }
1328 return vaStatus;
1329 }
1330
psb__MPEG4_process_slice_data(context_MPEG4_p ctx,object_buffer_p obj_buffer)1331 static VAStatus psb__MPEG4_process_slice_data(context_MPEG4_p ctx, object_buffer_p obj_buffer)
1332 {
1333 VAStatus vaStatus = VA_STATUS_SUCCESS;
1334 VASliceParameterBufferMPEG4 *slice_param;
1335 int buffer_idx = 0;
1336 unsigned int element_idx = 0;
1337
1338
1339 ASSERT((obj_buffer->type == VASliceDataBufferType) || (obj_buffer->type == VAProtectedSliceDataBufferType));
1340
1341 ASSERT(ctx->pic_params);
1342 ASSERT(ctx->slice_param_list_idx);
1343
1344 if (!ctx->pic_params) {
1345 /* Picture params missing */
1346 return VA_STATUS_ERROR_UNKNOWN;
1347 }
1348 if ((NULL == obj_buffer->psb_buffer) ||
1349 (0 == obj_buffer->size)) {
1350 /* We need to have data in the bitstream buffer */
1351 return VA_STATUS_ERROR_UNKNOWN;
1352 }
1353
1354 while (buffer_idx < ctx->slice_param_list_idx) {
1355 object_buffer_p slice_buf = ctx->slice_param_list[buffer_idx];
1356 if (element_idx >= slice_buf->num_elements) {
1357 /* Move to next buffer */
1358 element_idx = 0;
1359 buffer_idx++;
1360 continue;
1361 }
1362
1363 slice_param = (VASliceParameterBufferMPEG4 *) slice_buf->buffer_data;
1364 slice_param += element_idx;
1365 element_idx++;
1366 vaStatus = psb__MPEG4_process_slice(ctx, slice_param, obj_buffer);
1367 if (vaStatus != VA_STATUS_SUCCESS) {
1368 DEBUG_FAILURE;
1369 break;
1370 }
1371 }
1372 ctx->slice_param_list_idx = 0;
1373
1374 return vaStatus;
1375 }
1376
psb_MPEG4_BeginPicture(object_context_p obj_context)1377 static VAStatus psb_MPEG4_BeginPicture(
1378 object_context_p obj_context)
1379 {
1380 INIT_CONTEXT_MPEG4
1381
1382 if (ctx->pic_params) {
1383 free(ctx->pic_params);
1384 ctx->pic_params = NULL;
1385 }
1386 ctx->load_non_intra_quant_mat = FALSE;
1387 ctx->load_intra_quant_mat = FALSE;
1388
1389 return VA_STATUS_SUCCESS;
1390 }
1391
psb_MPEG4_RenderPicture(object_context_p obj_context,object_buffer_p * buffers,int num_buffers)1392 static VAStatus psb_MPEG4_RenderPicture(
1393 object_context_p obj_context,
1394 object_buffer_p *buffers,
1395 int num_buffers)
1396 {
1397 int i;
1398 INIT_CONTEXT_MPEG4
1399 VAStatus vaStatus = VA_STATUS_SUCCESS;
1400
1401 for (i = 0; i < num_buffers; i++) {
1402 object_buffer_p obj_buffer = buffers[i];
1403
1404 switch (obj_buffer->type) {
1405 case VAPictureParameterBufferType:
1406 drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_MPEG4_RenderPicture got VAPictureParameterBuffer\n");
1407 vaStatus = psb__MPEG4_process_picture_param(ctx, obj_buffer);
1408 DEBUG_FAILURE;
1409 break;
1410
1411 case VAIQMatrixBufferType:
1412 drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_MPEG4_RenderPicture got VAIQMatrixBufferType\n");
1413 vaStatus = psb__MPEG4_process_iq_matrix(ctx, obj_buffer);
1414 DEBUG_FAILURE;
1415 break;
1416
1417 case VASliceParameterBufferType:
1418 drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_MPEG4_RenderPicture got VASliceParameterBufferType\n");
1419 vaStatus = psb__MPEG4_add_slice_param(ctx, obj_buffer);
1420 DEBUG_FAILURE;
1421 break;
1422
1423 case VASliceDataBufferType:
1424 case VAProtectedSliceDataBufferType:
1425
1426 drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_MPEG4_RenderPicture got %s\n", SLICEDATA_BUFFER_TYPE(obj_buffer->type));
1427 vaStatus = psb__MPEG4_process_slice_data(ctx, obj_buffer);
1428 DEBUG_FAILURE;
1429 break;
1430
1431 default:
1432 vaStatus = VA_STATUS_ERROR_UNKNOWN;
1433 DEBUG_FAILURE;
1434 }
1435 if (vaStatus != VA_STATUS_SUCCESS) {
1436 break;
1437 }
1438 }
1439
1440 return vaStatus;
1441 }
1442
psb_MPEG4_EndPicture(object_context_p obj_context)1443 static VAStatus psb_MPEG4_EndPicture(
1444 object_context_p obj_context)
1445 {
1446 INIT_CONTEXT_MPEG4
1447
1448 if (psb_context_flush_cmdbuf(ctx->obj_context)) {
1449 return VA_STATUS_ERROR_UNKNOWN;
1450 }
1451
1452 if (ctx->pic_params) {
1453 free(ctx->pic_params);
1454 ctx->pic_params = NULL;
1455 }
1456
1457 return VA_STATUS_SUCCESS;
1458 }
1459
1460 struct format_vtable_s psb_MPEG4_vtable = {
1461 queryConfigAttributes:
1462 psb_MPEG4_QueryConfigAttributes,
1463 validateConfig:
1464 psb_MPEG4_ValidateConfig,
1465 createContext:
1466 psb_MPEG4_CreateContext,
1467 destroyContext:
1468 psb_MPEG4_DestroyContext,
1469 beginPicture:
1470 psb_MPEG4_BeginPicture,
1471 renderPicture:
1472 psb_MPEG4_RenderPicture,
1473 endPicture:
1474 psb_MPEG4_EndPicture
1475 };
1476