9 #define BIN_ONLY_SHAPE 2
12 #define SIMPLE_VO_TYPE 1
13 #define CORE_VO_TYPE 3
14 #define MAIN_VO_TYPE 4
15 #define NBIT_VO_TYPE 5
16 #define ARTS_VO_TYPE 10
17 #define ACE_VO_TYPE 12
18 #define ADV_SIMPLE_VO_TYPE 17
21 #define EXTENDED_PAR 15
23 //vol_sprite_usage / sprite_enable
24 #define STATIC_SPRITE 1
27 #define MOTION_MARKER 0x1F001
28 #define DC_MARKER 0x6B001
30 static const int mb_type_b_map
[4]= {
31 MB_TYPE_DIRECT2
| MB_TYPE_L0L1
,
32 MB_TYPE_L0L1
| MB_TYPE_16x16
,
33 MB_TYPE_L1
| MB_TYPE_16x16
,
34 MB_TYPE_L0
| MB_TYPE_16x16
,
37 #define VOS_STARTCODE 0x1B0
38 #define USER_DATA_STARTCODE 0x1B2
39 #define GOP_STARTCODE 0x1B3
40 #define VISUAL_OBJ_STARTCODE 0x1B5
41 #define VOP_STARTCODE 0x1B6
43 /* dc encoding for mpeg4 */
44 const uint8_t DCtab_lum
[13][2] =
46 {3,3}, {3,2}, {2,2}, {2,3}, {1,3}, {1,4}, {1,5}, {1,6}, {1,7},
47 {1,8}, {1,9}, {1,10}, {1,11},
50 const uint8_t DCtab_chrom
[13][2] =
52 {3,2}, {2,2}, {1,2}, {1,3}, {1,4}, {1,5}, {1,6}, {1,7}, {1,8},
53 {1,9}, {1,10}, {1,11}, {1,12},
56 const uint16_t intra_vlc
[103][2] = {
58 { 0x6, 3 },{ 0xf, 4 },{ 0xd, 5 },{ 0xc, 5 },
59 { 0x15, 6 },{ 0x13, 6 },{ 0x12, 6 },{ 0x17, 7 },
60 { 0x1f, 8 },{ 0x1e, 8 },{ 0x1d, 8 },{ 0x25, 9 },
61 { 0x24, 9 },{ 0x23, 9 },{ 0x21, 9 },{ 0x21, 10 },
62 { 0x20, 10 },{ 0xf, 10 },{ 0xe, 10 },{ 0x7, 11 },
63 { 0x6, 11 },{ 0x20, 11 },{ 0x21, 11 },{ 0x50, 12 },
64 { 0x51, 12 },{ 0x52, 12 },{ 0xe, 4 },{ 0x14, 6 },
65 { 0x16, 7 },{ 0x1c, 8 },{ 0x20, 9 },{ 0x1f, 9 },
66 { 0xd, 10 },{ 0x22, 11 },{ 0x53, 12 },{ 0x55, 12 },
67 { 0xb, 5 },{ 0x15, 7 },{ 0x1e, 9 },{ 0xc, 10 },
68 { 0x56, 12 },{ 0x11, 6 },{ 0x1b, 8 },{ 0x1d, 9 },
69 { 0xb, 10 },{ 0x10, 6 },{ 0x22, 9 },{ 0xa, 10 },
70 { 0xd, 6 },{ 0x1c, 9 },{ 0x8, 10 },{ 0x12, 7 },
71 { 0x1b, 9 },{ 0x54, 12 },{ 0x14, 7 },{ 0x1a, 9 },
72 { 0x57, 12 },{ 0x19, 8 },{ 0x9, 10 },{ 0x18, 8 },
73 { 0x23, 11 },{ 0x17, 8 },{ 0x19, 9 },{ 0x18, 9 },
74 { 0x7, 10 },{ 0x58, 12 },{ 0x7, 4 },{ 0xc, 6 },
75 { 0x16, 8 },{ 0x17, 9 },{ 0x6, 10 },{ 0x5, 11 },
76 { 0x4, 11 },{ 0x59, 12 },{ 0xf, 6 },{ 0x16, 9 },
77 { 0x5, 10 },{ 0xe, 6 },{ 0x4, 10 },{ 0x11, 7 },
78 { 0x24, 11 },{ 0x10, 7 },{ 0x25, 11 },{ 0x13, 7 },
79 { 0x5a, 12 },{ 0x15, 8 },{ 0x5b, 12 },{ 0x14, 8 },
80 { 0x13, 8 },{ 0x1a, 8 },{ 0x15, 9 },{ 0x14, 9 },
81 { 0x13, 9 },{ 0x12, 9 },{ 0x11, 9 },{ 0x26, 11 },
82 { 0x27, 11 },{ 0x5c, 12 },{ 0x5d, 12 },{ 0x5e, 12 },
83 { 0x5f, 12 },{ 0x3, 7 },
86 const int8_t intra_level
[102] = {
87 1, 2, 3, 4, 5, 6, 7, 8,
88 9, 10, 11, 12, 13, 14, 15, 16,
89 17, 18, 19, 20, 21, 22, 23, 24,
90 25, 26, 27, 1, 2, 3, 4, 5,
91 6, 7, 8, 9, 10, 1, 2, 3,
92 4, 5, 1, 2, 3, 4, 1, 2,
93 3, 1, 2, 3, 1, 2, 3, 1,
94 2, 3, 1, 2, 1, 2, 1, 1,
95 1, 1, 1, 1, 2, 3, 4, 5,
96 6, 7, 8, 1, 2, 3, 1, 2,
97 1, 2, 1, 2, 1, 2, 1, 2,
98 1, 1, 1, 1, 1, 1, 1, 1,
102 const int8_t intra_run
[102] = {
103 0, 0, 0, 0, 0, 0, 0, 0,
104 0, 0, 0, 0, 0, 0, 0, 0,
105 0, 0, 0, 0, 0, 0, 0, 0,
106 0, 0, 0, 1, 1, 1, 1, 1,
107 1, 1, 1, 1, 1, 2, 2, 2,
108 2, 2, 3, 3, 3, 3, 4, 4,
109 4, 5, 5, 5, 6, 6, 6, 7,
110 7, 7, 8, 8, 9, 9, 10, 11,
111 12, 13, 14, 0, 0, 0, 0, 0,
112 0, 0, 0, 1, 1, 1, 2, 2,
113 3, 3, 4, 4, 5, 5, 6, 6,
114 7, 8, 9, 10, 11, 12, 13, 14,
115 15, 16, 17, 18, 19, 20,
118 static RLTable rl_intra
= {
126 static const uint16_t inter_rvlc
[170][2]={ //note this is identical to the intra rvlc except that its reordered
127 {0x0006, 3},{0x0001, 4},{0x0004, 5},{0x001C, 7},
128 {0x003C, 8},{0x003D, 8},{0x007C, 9},{0x00FC, 10},
129 {0x00FD, 10},{0x01FC, 11},{0x01FD, 11},{0x03FC, 12},
130 {0x07FC, 13},{0x07FD, 13},{0x0BFC, 13},{0x0BFD, 13},
131 {0x0FFC, 14},{0x0FFD, 14},{0x1FFC, 15},{0x0007, 3},
132 {0x000C, 6},{0x005C, 8},{0x007D, 9},{0x017C, 10},
133 {0x02FC, 11},{0x03FD, 12},{0x0DFC, 13},{0x17FC, 14},
134 {0x17FD, 14},{0x000A, 4},{0x001D, 7},{0x00BC, 9},
135 {0x02FD, 11},{0x05FC, 12},{0x1BFC, 14},{0x1BFD, 14},
136 {0x0005, 5},{0x005D, 8},{0x017D, 10},{0x05FD, 12},
137 {0x0DFD, 13},{0x1DFC, 14},{0x1FFD, 15},{0x0008, 5},
138 {0x006C, 8},{0x037C, 11},{0x0EFC, 13},{0x2FFC, 15},
139 {0x0009, 5},{0x00BD, 9},{0x037D, 11},{0x0EFD, 13},
140 {0x000D, 6},{0x01BC, 10},{0x06FC, 12},{0x1DFD, 14},
141 {0x0014, 6},{0x01BD, 10},{0x06FD, 12},{0x2FFD, 15},
142 {0x0015, 6},{0x01DC, 10},{0x0F7C, 13},{0x002C, 7},
143 {0x01DD, 10},{0x1EFC, 14},{0x002D, 7},{0x03BC, 11},
144 {0x0034, 7},{0x077C, 12},{0x006D, 8},{0x0F7D, 13},
145 {0x0074, 8},{0x1EFD, 14},{0x0075, 8},{0x1F7C, 14},
146 {0x00DC, 9},{0x1F7D, 14},{0x00DD, 9},{0x1FBC, 14},
147 {0x00EC, 9},{0x37FC, 15},{0x01EC, 10},{0x01ED, 10},
148 {0x01F4, 10},{0x03BD, 11},{0x03DC, 11},{0x03DD, 11},
149 {0x03EC, 11},{0x03ED, 11},{0x03F4, 11},{0x077D, 12},
150 {0x07BC, 12},{0x07BD, 12},{0x0FBC, 13},{0x0FBD, 13},
151 {0x0FDC, 13},{0x0FDD, 13},{0x1FBD, 14},{0x1FDC, 14},
152 {0x1FDD, 14},{0x37FD, 15},{0x3BFC, 15},
153 {0x000B, 4},{0x0078, 8},{0x03F5, 11},{0x0FEC, 13},
154 {0x1FEC, 14},{0x0012, 5},{0x00ED, 9},{0x07DC, 12},
155 {0x1FED, 14},{0x3BFD, 15},{0x0013, 5},{0x03F8, 11},
156 {0x3DFC, 15},{0x0018, 6},{0x07DD, 12},{0x0019, 6},
157 {0x07EC, 12},{0x0022, 6},{0x0FED, 13},{0x0023, 6},
158 {0x0FF4, 13},{0x0035, 7},{0x0FF5, 13},{0x0038, 7},
159 {0x0FF8, 13},{0x0039, 7},{0x0FF9, 13},{0x0042, 7},
160 {0x1FF4, 14},{0x0043, 7},{0x1FF5, 14},{0x0079, 8},
161 {0x1FF8, 14},{0x0082, 8},{0x3DFD, 15},{0x0083, 8},
162 {0x00F4, 9},{0x00F5, 9},{0x00F8, 9},{0x00F9, 9},
163 {0x0102, 9},{0x0103, 9},{0x01F5, 10},{0x01F8, 10},
164 {0x01F9, 10},{0x0202, 10},{0x0203, 10},{0x03F9, 11},
165 {0x0402, 11},{0x0403, 11},{0x07ED, 12},{0x07F4, 12},
166 {0x07F5, 12},{0x07F8, 12},{0x07F9, 12},{0x0802, 12},
167 {0x0803, 12},{0x1002, 13},{0x1003, 13},{0x1FF9, 14},
168 {0x2002, 14},{0x2003, 14},{0x3EFC, 15},{0x3EFD, 15},
169 {0x3F7C, 15},{0x3F7D, 15},{0x0000, 4}
172 static const uint8_t inter_rvlc_run
[169]={
173 0, 0, 0, 0, 0, 0, 0, 0,
174 0, 0, 0, 0, 0, 0, 0, 0,
175 0, 0, 0, 1, 1, 1, 1, 1,
176 1, 1, 1, 1, 1, 2, 2, 2,
177 2, 2, 2, 2, 3, 3, 3, 3,
178 3, 3, 3, 4, 4, 4, 4, 4,
179 5, 5, 5, 5, 6, 6, 6, 6,
180 7, 7, 7, 7, 8, 8, 8, 9,
181 9, 9, 10, 10, 11, 11, 12, 12,
182 13, 13, 14, 14, 15, 15, 16, 16,
183 17, 17, 18, 19, 20, 21, 22, 23,
184 24, 25, 26, 27, 28, 29, 30, 31,
185 32, 33, 34, 35, 36, 37, 38,
186 0, 0, 0, 0, 0, 1, 1, 1,
187 1, 1, 2, 2, 2, 3, 3, 4,
188 4, 5, 5, 6, 6, 7, 7, 8,
189 8, 9, 9, 10, 10, 11, 11, 12,
190 12, 13, 13, 14, 15, 16, 17, 18,
191 19, 20, 21, 22, 23, 24, 25, 26,
192 27, 28, 29, 30, 31, 32, 33, 34,
193 35, 36, 37, 38, 39, 40, 41, 42,
197 static const uint8_t inter_rvlc_level
[169]={
198 1, 2, 3, 4, 5, 6, 7, 8,
199 9, 10, 11, 12, 13, 14, 15, 16,
200 17, 18, 19, 1, 2, 3, 4, 5,
201 6, 7, 8, 9, 10, 1, 2, 3,
202 4, 5, 6, 7, 1, 2, 3, 4,
203 5, 6, 7, 1, 2, 3, 4, 5,
204 1, 2, 3, 4, 1, 2, 3, 4,
205 1, 2, 3, 4, 1, 2, 3, 1,
206 2, 3, 1, 2, 1, 2, 1, 2,
207 1, 2, 1, 2, 1, 2, 1, 2,
208 1, 2, 1, 1, 1, 1, 1, 1,
209 1, 1, 1, 1, 1, 1, 1, 1,
211 1, 2, 3, 4, 5, 1, 2, 3,
212 4, 5, 1, 2, 3, 1, 2, 1,
213 2, 1, 2, 1, 2, 1, 2, 1,
214 2, 1, 2, 1, 2, 1, 2, 1,
215 2, 1, 2, 1, 1, 1, 1, 1,
216 1, 1, 1, 1, 1, 1, 1, 1,
217 1, 1, 1, 1, 1, 1, 1, 1,
218 1, 1, 1, 1, 1, 1, 1, 1,
222 static RLTable rvlc_rl_inter
= {
230 static const uint16_t intra_rvlc
[170][2]={
231 {0x0006, 3},{0x0007, 3},{0x000A, 4},{0x0009, 5},
232 {0x0014, 6},{0x0015, 6},{0x0034, 7},{0x0074, 8},
233 {0x0075, 8},{0x00DD, 9},{0x00EC, 9},{0x01EC, 10},
234 {0x01ED, 10},{0x01F4, 10},{0x03EC, 11},{0x03ED, 11},
235 {0x03F4, 11},{0x077D, 12},{0x07BC, 12},{0x0FBD, 13},
236 {0x0FDC, 13},{0x07BD, 12},{0x0FDD, 13},{0x1FBD, 14},
237 {0x1FDC, 14},{0x1FDD, 14},{0x1FFC, 15},{0x0001, 4},
238 {0x0008, 5},{0x002D, 7},{0x006C, 8},{0x006D, 8},
239 {0x00DC, 9},{0x01DD, 10},{0x03DC, 11},{0x03DD, 11},
240 {0x077C, 12},{0x0FBC, 13},{0x1F7D, 14},{0x1FBC, 14},
241 {0x0004, 5},{0x002C, 7},{0x00BC, 9},{0x01DC, 10},
242 {0x03BC, 11},{0x03BD, 11},{0x0EFD, 13},{0x0F7C, 13},
243 {0x0F7D, 13},{0x1EFD, 14},{0x1F7C, 14},{0x0005, 5},
244 {0x005C, 8},{0x00BD, 9},{0x037D, 11},{0x06FC, 12},
245 {0x0EFC, 13},{0x1DFD, 14},{0x1EFC, 14},{0x1FFD, 15},
246 {0x000C, 6},{0x005D, 8},{0x01BD, 10},{0x03FD, 12},
247 {0x06FD, 12},{0x1BFD, 14},{0x000D, 6},{0x007D, 9},
248 {0x02FC, 11},{0x05FC, 12},{0x1BFC, 14},{0x1DFC, 14},
249 {0x001C, 7},{0x017C, 10},{0x02FD, 11},{0x05FD, 12},
250 {0x2FFC, 15},{0x001D, 7},{0x017D, 10},{0x037C, 11},
251 {0x0DFD, 13},{0x2FFD, 15},{0x003C, 8},{0x01BC, 10},
252 {0x0BFD, 13},{0x17FD, 14},{0x003D, 8},{0x01FD, 11},
253 {0x0DFC, 13},{0x37FC, 15},{0x007C, 9},{0x03FC, 12},
254 {0x00FC, 10},{0x0BFC, 13},{0x00FD, 10},{0x37FD, 15},
255 {0x01FC, 11},{0x07FC, 13},{0x07FD, 13},{0x0FFC, 14},
256 {0x0FFD, 14},{0x17FC, 14},{0x3BFC, 15},
257 {0x000B, 4},{0x0078, 8},{0x03F5, 11},{0x0FEC, 13},
258 {0x1FEC, 14},{0x0012, 5},{0x00ED, 9},{0x07DC, 12},
259 {0x1FED, 14},{0x3BFD, 15},{0x0013, 5},{0x03F8, 11},
260 {0x3DFC, 15},{0x0018, 6},{0x07DD, 12},{0x0019, 6},
261 {0x07EC, 12},{0x0022, 6},{0x0FED, 13},{0x0023, 6},
262 {0x0FF4, 13},{0x0035, 7},{0x0FF5, 13},{0x0038, 7},
263 {0x0FF8, 13},{0x0039, 7},{0x0FF9, 13},{0x0042, 7},
264 {0x1FF4, 14},{0x0043, 7},{0x1FF5, 14},{0x0079, 8},
265 {0x1FF8, 14},{0x0082, 8},{0x3DFD, 15},{0x0083, 8},
266 {0x00F4, 9},{0x00F5, 9},{0x00F8, 9},{0x00F9, 9},
267 {0x0102, 9},{0x0103, 9},{0x01F5, 10},{0x01F8, 10},
268 {0x01F9, 10},{0x0202, 10},{0x0203, 10},{0x03F9, 11},
269 {0x0402, 11},{0x0403, 11},{0x07ED, 12},{0x07F4, 12},
270 {0x07F5, 12},{0x07F8, 12},{0x07F9, 12},{0x0802, 12},
271 {0x0803, 12},{0x1002, 13},{0x1003, 13},{0x1FF9, 14},
272 {0x2002, 14},{0x2003, 14},{0x3EFC, 15},{0x3EFD, 15},
273 {0x3F7C, 15},{0x3F7D, 15},{0x0000, 4}
276 static const uint8_t intra_rvlc_run
[169]={
277 0, 0, 0, 0, 0, 0, 0, 0,
278 0, 0, 0, 0, 0, 0, 0, 0,
279 0, 0, 0, 0, 0, 0, 0, 0,
280 0, 0, 0, 1, 1, 1, 1, 1,
281 1, 1, 1, 1, 1, 1, 1, 1,
282 2, 2, 2, 2, 2, 2, 2, 2,
283 2, 2, 2, 3, 3, 3, 3, 3,
284 3, 3, 3, 3, 4, 4, 4, 4,
285 4, 4, 5, 5, 5, 5, 5, 5,
286 6, 6, 6, 6, 6, 7, 7, 7,
287 7, 7, 8, 8, 8, 8, 9, 9,
288 9, 9, 10, 10, 11, 11, 12, 12,
289 13, 14, 15, 16, 17, 18, 19,
290 0, 0, 0, 0, 0, 1, 1, 1,
291 1, 1, 2, 2, 2, 3, 3, 4,
292 4, 5, 5, 6, 6, 7, 7, 8,
293 8, 9, 9, 10, 10, 11, 11, 12,
294 12, 13, 13, 14, 15, 16, 17, 18,
295 19, 20, 21, 22, 23, 24, 25, 26,
296 27, 28, 29, 30, 31, 32, 33, 34,
297 35, 36, 37, 38, 39, 40, 41, 42,
301 static const uint8_t intra_rvlc_level
[169]={
302 1, 2, 3, 4, 5, 6, 7, 8,
303 9, 10, 11, 12, 13, 14, 15, 16,
304 17, 18, 19, 20, 21, 22, 23, 24,
305 25, 26, 27, 1, 2, 3, 4, 5,
306 6, 7, 8, 9, 10, 11, 12, 13,
307 1, 2, 3, 4, 5, 6, 7, 8,
308 9, 10, 11, 1, 2, 3, 4, 5,
309 6, 7, 8, 9, 1, 2, 3, 4,
310 5, 6, 1, 2, 3, 4, 5, 6,
311 1, 2, 3, 4, 5, 1, 2, 3,
312 4, 5, 1, 2, 3, 4, 1, 2,
313 3, 4, 1, 2, 1, 2, 1, 2,
315 1, 2, 3, 4, 5, 1, 2, 3,
316 4, 5, 1, 2, 3, 1, 2, 1,
317 2, 1, 2, 1, 2, 1, 2, 1,
318 2, 1, 2, 1, 2, 1, 2, 1,
319 2, 1, 2, 1, 1, 1, 1, 1,
320 1, 1, 1, 1, 1, 1, 1, 1,
321 1, 1, 1, 1, 1, 1, 1, 1,
322 1, 1, 1, 1, 1, 1, 1, 1,
326 static RLTable rvlc_rl_intra
= {
334 static const uint16_t sprite_trajectory_tab
[15][2] = {
335 {0x00, 2}, {0x02, 3}, {0x03, 3}, {0x04, 3}, {0x05, 3}, {0x06, 3},
336 {0x0E, 4}, {0x1E, 5}, {0x3E, 6}, {0x7E, 7}, {0xFE, 8},
337 {0x1FE, 9},{0x3FE, 10},{0x7FE, 11},{0xFFE, 12},
340 static const uint8_t mb_type_b_tab
[4][2] = {
341 {1, 1}, {1, 2}, {1, 3}, {1, 4},
344 static const AVRational pixel_aspect
[16]={
363 /* these matrixes will be permuted for the idct */
364 const int16_t ff_mpeg4_default_intra_matrix
[64] = {
365 8, 17, 18, 19, 21, 23, 25, 27,
366 17, 18, 19, 21, 23, 25, 27, 28,
367 20, 21, 22, 23, 24, 26, 28, 30,
368 21, 22, 23, 24, 26, 28, 30, 32,
369 22, 23, 24, 26, 28, 30, 32, 35,
370 23, 24, 26, 28, 30, 32, 35, 38,
371 25, 26, 28, 30, 32, 35, 38, 41,
372 27, 28, 30, 32, 35, 38, 41, 45,
375 const int16_t ff_mpeg4_default_non_intra_matrix
[64] = {
376 16, 17, 18, 19, 20, 21, 22, 23,
377 17, 18, 19, 20, 21, 22, 23, 24,
378 18, 19, 20, 21, 22, 23, 24, 25,
379 19, 20, 21, 22, 23, 24, 26, 27,
380 20, 21, 22, 23, 25, 26, 27, 28,
381 21, 22, 23, 24, 26, 27, 28, 30,
382 22, 23, 24, 26, 27, 28, 30, 31,
383 23, 24, 25, 27, 28, 30, 31, 33,
386 const uint8_t ff_mpeg4_y_dc_scale_table
[32]={
387 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
388 0, 8, 8, 8, 8,10,12,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,34,36,38,40,42,44,46
390 const uint8_t ff_mpeg4_c_dc_scale_table
[32]={
391 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
392 0, 8, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,20,21,22,23,24,25
395 const uint16_t ff_mpeg4_resync_prefix
[8]={
396 0x7F00, 0x7E00, 0x7C00, 0x7800, 0x7000, 0x6000, 0x4000, 0x0000
399 static const uint8_t mpeg4_dc_threshold
[8]={
400 99, 13, 15, 17, 19, 21, 23, 0