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