2 * copyright (c) 2000,2001 Fabrice Bellard
4 * copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #define BIN_ONLY_SHAPE 2
32 #define SIMPLE_VO_TYPE 1
33 #define CORE_VO_TYPE 3
34 #define MAIN_VO_TYPE 4
35 #define NBIT_VO_TYPE 5
36 #define ARTS_VO_TYPE 10
37 #define ACE_VO_TYPE 12
38 #define ADV_SIMPLE_VO_TYPE 17
41 #define EXTENDED_PAR 15
43 //vol_sprite_usage / sprite_enable
44 #define STATIC_SPRITE 1
47 #define MOTION_MARKER 0x1F001
48 #define DC_MARKER 0x6B001
50 static const int mb_type_b_map[4]= {
51 MB_TYPE_DIRECT2 | MB_TYPE_L0L1,
52 MB_TYPE_L0L1 | MB_TYPE_16x16,
53 MB_TYPE_L1 | MB_TYPE_16x16,
54 MB_TYPE_L0 | MB_TYPE_16x16,
57 #define VOS_STARTCODE 0x1B0
58 #define USER_DATA_STARTCODE 0x1B2
59 #define GOP_STARTCODE 0x1B3
60 #define VISUAL_OBJ_STARTCODE 0x1B5
61 #define VOP_STARTCODE 0x1B6
63 /* dc encoding for mpeg4 */
64 const uint8_t DCtab_lum[13][2] =
66 {3,3}, {3,2}, {2,2}, {2,3}, {1,3}, {1,4}, {1,5}, {1,6}, {1,7},
67 {1,8}, {1,9}, {1,10}, {1,11},
70 const uint8_t DCtab_chrom[13][2] =
72 {3,2}, {2,2}, {1,2}, {1,3}, {1,4}, {1,5}, {1,6}, {1,7}, {1,8},
73 {1,9}, {1,10}, {1,11}, {1,12},
76 const uint16_t intra_vlc[103][2] = {
78 { 0x6, 3 },{ 0xf, 4 },{ 0xd, 5 },{ 0xc, 5 },
79 { 0x15, 6 },{ 0x13, 6 },{ 0x12, 6 },{ 0x17, 7 },
80 { 0x1f, 8 },{ 0x1e, 8 },{ 0x1d, 8 },{ 0x25, 9 },
81 { 0x24, 9 },{ 0x23, 9 },{ 0x21, 9 },{ 0x21, 10 },
82 { 0x20, 10 },{ 0xf, 10 },{ 0xe, 10 },{ 0x7, 11 },
83 { 0x6, 11 },{ 0x20, 11 },{ 0x21, 11 },{ 0x50, 12 },
84 { 0x51, 12 },{ 0x52, 12 },{ 0xe, 4 },{ 0x14, 6 },
85 { 0x16, 7 },{ 0x1c, 8 },{ 0x20, 9 },{ 0x1f, 9 },
86 { 0xd, 10 },{ 0x22, 11 },{ 0x53, 12 },{ 0x55, 12 },
87 { 0xb, 5 },{ 0x15, 7 },{ 0x1e, 9 },{ 0xc, 10 },
88 { 0x56, 12 },{ 0x11, 6 },{ 0x1b, 8 },{ 0x1d, 9 },
89 { 0xb, 10 },{ 0x10, 6 },{ 0x22, 9 },{ 0xa, 10 },
90 { 0xd, 6 },{ 0x1c, 9 },{ 0x8, 10 },{ 0x12, 7 },
91 { 0x1b, 9 },{ 0x54, 12 },{ 0x14, 7 },{ 0x1a, 9 },
92 { 0x57, 12 },{ 0x19, 8 },{ 0x9, 10 },{ 0x18, 8 },
93 { 0x23, 11 },{ 0x17, 8 },{ 0x19, 9 },{ 0x18, 9 },
94 { 0x7, 10 },{ 0x58, 12 },{ 0x7, 4 },{ 0xc, 6 },
95 { 0x16, 8 },{ 0x17, 9 },{ 0x6, 10 },{ 0x5, 11 },
96 { 0x4, 11 },{ 0x59, 12 },{ 0xf, 6 },{ 0x16, 9 },
97 { 0x5, 10 },{ 0xe, 6 },{ 0x4, 10 },{ 0x11, 7 },
98 { 0x24, 11 },{ 0x10, 7 },{ 0x25, 11 },{ 0x13, 7 },
99 { 0x5a, 12 },{ 0x15, 8 },{ 0x5b, 12 },{ 0x14, 8 },
100 { 0x13, 8 },{ 0x1a, 8 },{ 0x15, 9 },{ 0x14, 9 },
101 { 0x13, 9 },{ 0x12, 9 },{ 0x11, 9 },{ 0x26, 11 },
102 { 0x27, 11 },{ 0x5c, 12 },{ 0x5d, 12 },{ 0x5e, 12 },
103 { 0x5f, 12 },{ 0x3, 7 },
106 const int8_t intra_level[102] = {
107 1, 2, 3, 4, 5, 6, 7, 8,
108 9, 10, 11, 12, 13, 14, 15, 16,
109 17, 18, 19, 20, 21, 22, 23, 24,
110 25, 26, 27, 1, 2, 3, 4, 5,
111 6, 7, 8, 9, 10, 1, 2, 3,
112 4, 5, 1, 2, 3, 4, 1, 2,
113 3, 1, 2, 3, 1, 2, 3, 1,
114 2, 3, 1, 2, 1, 2, 1, 1,
115 1, 1, 1, 1, 2, 3, 4, 5,
116 6, 7, 8, 1, 2, 3, 1, 2,
117 1, 2, 1, 2, 1, 2, 1, 2,
118 1, 1, 1, 1, 1, 1, 1, 1,
122 const int8_t intra_run[102] = {
123 0, 0, 0, 0, 0, 0, 0, 0,
124 0, 0, 0, 0, 0, 0, 0, 0,
125 0, 0, 0, 0, 0, 0, 0, 0,
126 0, 0, 0, 1, 1, 1, 1, 1,
127 1, 1, 1, 1, 1, 2, 2, 2,
128 2, 2, 3, 3, 3, 3, 4, 4,
129 4, 5, 5, 5, 6, 6, 6, 7,
130 7, 7, 8, 8, 9, 9, 10, 11,
131 12, 13, 14, 0, 0, 0, 0, 0,
132 0, 0, 0, 1, 1, 1, 2, 2,
133 3, 3, 4, 4, 5, 5, 6, 6,
134 7, 8, 9, 10, 11, 12, 13, 14,
135 15, 16, 17, 18, 19, 20,
138 static RLTable rl_intra = {
146 static const uint16_t inter_rvlc[170][2]={ //note this is identical to the intra rvlc except that its reordered
147 {0x0006, 3},{0x0001, 4},{0x0004, 5},{0x001C, 7},
148 {0x003C, 8},{0x003D, 8},{0x007C, 9},{0x00FC, 10},
149 {0x00FD, 10},{0x01FC, 11},{0x01FD, 11},{0x03FC, 12},
150 {0x07FC, 13},{0x07FD, 13},{0x0BFC, 13},{0x0BFD, 13},
151 {0x0FFC, 14},{0x0FFD, 14},{0x1FFC, 15},{0x0007, 3},
152 {0x000C, 6},{0x005C, 8},{0x007D, 9},{0x017C, 10},
153 {0x02FC, 11},{0x03FD, 12},{0x0DFC, 13},{0x17FC, 14},
154 {0x17FD, 14},{0x000A, 4},{0x001D, 7},{0x00BC, 9},
155 {0x02FD, 11},{0x05FC, 12},{0x1BFC, 14},{0x1BFD, 14},
156 {0x0005, 5},{0x005D, 8},{0x017D, 10},{0x05FD, 12},
157 {0x0DFD, 13},{0x1DFC, 14},{0x1FFD, 15},{0x0008, 5},
158 {0x006C, 8},{0x037C, 11},{0x0EFC, 13},{0x2FFC, 15},
159 {0x0009, 5},{0x00BD, 9},{0x037D, 11},{0x0EFD, 13},
160 {0x000D, 6},{0x01BC, 10},{0x06FC, 12},{0x1DFD, 14},
161 {0x0014, 6},{0x01BD, 10},{0x06FD, 12},{0x2FFD, 15},
162 {0x0015, 6},{0x01DC, 10},{0x0F7C, 13},{0x002C, 7},
163 {0x01DD, 10},{0x1EFC, 14},{0x002D, 7},{0x03BC, 11},
164 {0x0034, 7},{0x077C, 12},{0x006D, 8},{0x0F7D, 13},
165 {0x0074, 8},{0x1EFD, 14},{0x0075, 8},{0x1F7C, 14},
166 {0x00DC, 9},{0x1F7D, 14},{0x00DD, 9},{0x1FBC, 14},
167 {0x00EC, 9},{0x37FC, 15},{0x01EC, 10},{0x01ED, 10},
168 {0x01F4, 10},{0x03BD, 11},{0x03DC, 11},{0x03DD, 11},
169 {0x03EC, 11},{0x03ED, 11},{0x03F4, 11},{0x077D, 12},
170 {0x07BC, 12},{0x07BD, 12},{0x0FBC, 13},{0x0FBD, 13},
171 {0x0FDC, 13},{0x0FDD, 13},{0x1FBD, 14},{0x1FDC, 14},
172 {0x1FDD, 14},{0x37FD, 15},{0x3BFC, 15},
173 {0x000B, 4},{0x0078, 8},{0x03F5, 11},{0x0FEC, 13},
174 {0x1FEC, 14},{0x0012, 5},{0x00ED, 9},{0x07DC, 12},
175 {0x1FED, 14},{0x3BFD, 15},{0x0013, 5},{0x03F8, 11},
176 {0x3DFC, 15},{0x0018, 6},{0x07DD, 12},{0x0019, 6},
177 {0x07EC, 12},{0x0022, 6},{0x0FED, 13},{0x0023, 6},
178 {0x0FF4, 13},{0x0035, 7},{0x0FF5, 13},{0x0038, 7},
179 {0x0FF8, 13},{0x0039, 7},{0x0FF9, 13},{0x0042, 7},
180 {0x1FF4, 14},{0x0043, 7},{0x1FF5, 14},{0x0079, 8},
181 {0x1FF8, 14},{0x0082, 8},{0x3DFD, 15},{0x0083, 8},
182 {0x00F4, 9},{0x00F5, 9},{0x00F8, 9},{0x00F9, 9},
183 {0x0102, 9},{0x0103, 9},{0x01F5, 10},{0x01F8, 10},
184 {0x01F9, 10},{0x0202, 10},{0x0203, 10},{0x03F9, 11},
185 {0x0402, 11},{0x0403, 11},{0x07ED, 12},{0x07F4, 12},
186 {0x07F5, 12},{0x07F8, 12},{0x07F9, 12},{0x0802, 12},
187 {0x0803, 12},{0x1002, 13},{0x1003, 13},{0x1FF9, 14},
188 {0x2002, 14},{0x2003, 14},{0x3EFC, 15},{0x3EFD, 15},
189 {0x3F7C, 15},{0x3F7D, 15},{0x0000, 4}
192 static const int8_t inter_rvlc_run[169]={
193 0, 0, 0, 0, 0, 0, 0, 0,
194 0, 0, 0, 0, 0, 0, 0, 0,
195 0, 0, 0, 1, 1, 1, 1, 1,
196 1, 1, 1, 1, 1, 2, 2, 2,
197 2, 2, 2, 2, 3, 3, 3, 3,
198 3, 3, 3, 4, 4, 4, 4, 4,
199 5, 5, 5, 5, 6, 6, 6, 6,
200 7, 7, 7, 7, 8, 8, 8, 9,
201 9, 9, 10, 10, 11, 11, 12, 12,
202 13, 13, 14, 14, 15, 15, 16, 16,
203 17, 17, 18, 19, 20, 21, 22, 23,
204 24, 25, 26, 27, 28, 29, 30, 31,
205 32, 33, 34, 35, 36, 37, 38,
206 0, 0, 0, 0, 0, 1, 1, 1,
207 1, 1, 2, 2, 2, 3, 3, 4,
208 4, 5, 5, 6, 6, 7, 7, 8,
209 8, 9, 9, 10, 10, 11, 11, 12,
210 12, 13, 13, 14, 15, 16, 17, 18,
211 19, 20, 21, 22, 23, 24, 25, 26,
212 27, 28, 29, 30, 31, 32, 33, 34,
213 35, 36, 37, 38, 39, 40, 41, 42,
217 static const int8_t inter_rvlc_level[169]={
218 1, 2, 3, 4, 5, 6, 7, 8,
219 9, 10, 11, 12, 13, 14, 15, 16,
220 17, 18, 19, 1, 2, 3, 4, 5,
221 6, 7, 8, 9, 10, 1, 2, 3,
222 4, 5, 6, 7, 1, 2, 3, 4,
223 5, 6, 7, 1, 2, 3, 4, 5,
224 1, 2, 3, 4, 1, 2, 3, 4,
225 1, 2, 3, 4, 1, 2, 3, 1,
226 2, 3, 1, 2, 1, 2, 1, 2,
227 1, 2, 1, 2, 1, 2, 1, 2,
228 1, 2, 1, 1, 1, 1, 1, 1,
229 1, 1, 1, 1, 1, 1, 1, 1,
231 1, 2, 3, 4, 5, 1, 2, 3,
232 4, 5, 1, 2, 3, 1, 2, 1,
233 2, 1, 2, 1, 2, 1, 2, 1,
234 2, 1, 2, 1, 2, 1, 2, 1,
235 2, 1, 2, 1, 1, 1, 1, 1,
236 1, 1, 1, 1, 1, 1, 1, 1,
237 1, 1, 1, 1, 1, 1, 1, 1,
238 1, 1, 1, 1, 1, 1, 1, 1,
242 static RLTable rvlc_rl_inter = {
250 static const uint16_t intra_rvlc[170][2]={
251 {0x0006, 3},{0x0007, 3},{0x000A, 4},{0x0009, 5},
252 {0x0014, 6},{0x0015, 6},{0x0034, 7},{0x0074, 8},
253 {0x0075, 8},{0x00DD, 9},{0x00EC, 9},{0x01EC, 10},
254 {0x01ED, 10},{0x01F4, 10},{0x03EC, 11},{0x03ED, 11},
255 {0x03F4, 11},{0x077D, 12},{0x07BC, 12},{0x0FBD, 13},
256 {0x0FDC, 13},{0x07BD, 12},{0x0FDD, 13},{0x1FBD, 14},
257 {0x1FDC, 14},{0x1FDD, 14},{0x1FFC, 15},{0x0001, 4},
258 {0x0008, 5},{0x002D, 7},{0x006C, 8},{0x006D, 8},
259 {0x00DC, 9},{0x01DD, 10},{0x03DC, 11},{0x03DD, 11},
260 {0x077C, 12},{0x0FBC, 13},{0x1F7D, 14},{0x1FBC, 14},
261 {0x0004, 5},{0x002C, 7},{0x00BC, 9},{0x01DC, 10},
262 {0x03BC, 11},{0x03BD, 11},{0x0EFD, 13},{0x0F7C, 13},
263 {0x0F7D, 13},{0x1EFD, 14},{0x1F7C, 14},{0x0005, 5},
264 {0x005C, 8},{0x00BD, 9},{0x037D, 11},{0x06FC, 12},
265 {0x0EFC, 13},{0x1DFD, 14},{0x1EFC, 14},{0x1FFD, 15},
266 {0x000C, 6},{0x005D, 8},{0x01BD, 10},{0x03FD, 12},
267 {0x06FD, 12},{0x1BFD, 14},{0x000D, 6},{0x007D, 9},
268 {0x02FC, 11},{0x05FC, 12},{0x1BFC, 14},{0x1DFC, 14},
269 {0x001C, 7},{0x017C, 10},{0x02FD, 11},{0x05FD, 12},
270 {0x2FFC, 15},{0x001D, 7},{0x017D, 10},{0x037C, 11},
271 {0x0DFD, 13},{0x2FFD, 15},{0x003C, 8},{0x01BC, 10},
272 {0x0BFD, 13},{0x17FD, 14},{0x003D, 8},{0x01FD, 11},
273 {0x0DFC, 13},{0x37FC, 15},{0x007C, 9},{0x03FC, 12},
274 {0x00FC, 10},{0x0BFC, 13},{0x00FD, 10},{0x37FD, 15},
275 {0x01FC, 11},{0x07FC, 13},{0x07FD, 13},{0x0FFC, 14},
276 {0x0FFD, 14},{0x17FC, 14},{0x3BFC, 15},
277 {0x000B, 4},{0x0078, 8},{0x03F5, 11},{0x0FEC, 13},
278 {0x1FEC, 14},{0x0012, 5},{0x00ED, 9},{0x07DC, 12},
279 {0x1FED, 14},{0x3BFD, 15},{0x0013, 5},{0x03F8, 11},
280 {0x3DFC, 15},{0x0018, 6},{0x07DD, 12},{0x0019, 6},
281 {0x07EC, 12},{0x0022, 6},{0x0FED, 13},{0x0023, 6},
282 {0x0FF4, 13},{0x0035, 7},{0x0FF5, 13},{0x0038, 7},
283 {0x0FF8, 13},{0x0039, 7},{0x0FF9, 13},{0x0042, 7},
284 {0x1FF4, 14},{0x0043, 7},{0x1FF5, 14},{0x0079, 8},
285 {0x1FF8, 14},{0x0082, 8},{0x3DFD, 15},{0x0083, 8},
286 {0x00F4, 9},{0x00F5, 9},{0x00F8, 9},{0x00F9, 9},
287 {0x0102, 9},{0x0103, 9},{0x01F5, 10},{0x01F8, 10},
288 {0x01F9, 10},{0x0202, 10},{0x0203, 10},{0x03F9, 11},
289 {0x0402, 11},{0x0403, 11},{0x07ED, 12},{0x07F4, 12},
290 {0x07F5, 12},{0x07F8, 12},{0x07F9, 12},{0x0802, 12},
291 {0x0803, 12},{0x1002, 13},{0x1003, 13},{0x1FF9, 14},
292 {0x2002, 14},{0x2003, 14},{0x3EFC, 15},{0x3EFD, 15},
293 {0x3F7C, 15},{0x3F7D, 15},{0x0000, 4}
296 static const int8_t intra_rvlc_run[169]={
297 0, 0, 0, 0, 0, 0, 0, 0,
298 0, 0, 0, 0, 0, 0, 0, 0,
299 0, 0, 0, 0, 0, 0, 0, 0,
300 0, 0, 0, 1, 1, 1, 1, 1,
301 1, 1, 1, 1, 1, 1, 1, 1,
302 2, 2, 2, 2, 2, 2, 2, 2,
303 2, 2, 2, 3, 3, 3, 3, 3,
304 3, 3, 3, 3, 4, 4, 4, 4,
305 4, 4, 5, 5, 5, 5, 5, 5,
306 6, 6, 6, 6, 6, 7, 7, 7,
307 7, 7, 8, 8, 8, 8, 9, 9,
308 9, 9, 10, 10, 11, 11, 12, 12,
309 13, 14, 15, 16, 17, 18, 19,
310 0, 0, 0, 0, 0, 1, 1, 1,
311 1, 1, 2, 2, 2, 3, 3, 4,
312 4, 5, 5, 6, 6, 7, 7, 8,
313 8, 9, 9, 10, 10, 11, 11, 12,
314 12, 13, 13, 14, 15, 16, 17, 18,
315 19, 20, 21, 22, 23, 24, 25, 26,
316 27, 28, 29, 30, 31, 32, 33, 34,
317 35, 36, 37, 38, 39, 40, 41, 42,
321 static const int8_t intra_rvlc_level[169]={
322 1, 2, 3, 4, 5, 6, 7, 8,
323 9, 10, 11, 12, 13, 14, 15, 16,
324 17, 18, 19, 20, 21, 22, 23, 24,
325 25, 26, 27, 1, 2, 3, 4, 5,
326 6, 7, 8, 9, 10, 11, 12, 13,
327 1, 2, 3, 4, 5, 6, 7, 8,
328 9, 10, 11, 1, 2, 3, 4, 5,
329 6, 7, 8, 9, 1, 2, 3, 4,
330 5, 6, 1, 2, 3, 4, 5, 6,
331 1, 2, 3, 4, 5, 1, 2, 3,
332 4, 5, 1, 2, 3, 4, 1, 2,
333 3, 4, 1, 2, 1, 2, 1, 2,
335 1, 2, 3, 4, 5, 1, 2, 3,
336 4, 5, 1, 2, 3, 1, 2, 1,
337 2, 1, 2, 1, 2, 1, 2, 1,
338 2, 1, 2, 1, 2, 1, 2, 1,
339 2, 1, 2, 1, 1, 1, 1, 1,
340 1, 1, 1, 1, 1, 1, 1, 1,
341 1, 1, 1, 1, 1, 1, 1, 1,
342 1, 1, 1, 1, 1, 1, 1, 1,
346 static RLTable rvlc_rl_intra = {
354 static const uint16_t sprite_trajectory_tab[15][2] = {
355 {0x00, 2}, {0x02, 3}, {0x03, 3}, {0x04, 3}, {0x05, 3}, {0x06, 3},
356 {0x0E, 4}, {0x1E, 5}, {0x3E, 6}, {0x7E, 7}, {0xFE, 8},
357 {0x1FE, 9},{0x3FE, 10},{0x7FE, 11},{0xFFE, 12},
360 static const uint8_t mb_type_b_tab[4][2] = {
361 {1, 1}, {1, 2}, {1, 3}, {1, 4},
364 static const AVRational pixel_aspect[16]={
383 /* these matrixes will be permuted for the idct */
384 const int16_t ff_mpeg4_default_intra_matrix[64] = {
385 8, 17, 18, 19, 21, 23, 25, 27,
386 17, 18, 19, 21, 23, 25, 27, 28,
387 20, 21, 22, 23, 24, 26, 28, 30,
388 21, 22, 23, 24, 26, 28, 30, 32,
389 22, 23, 24, 26, 28, 30, 32, 35,
390 23, 24, 26, 28, 30, 32, 35, 38,
391 25, 26, 28, 30, 32, 35, 38, 41,
392 27, 28, 30, 32, 35, 38, 41, 45,
395 const int16_t ff_mpeg4_default_non_intra_matrix[64] = {
396 16, 17, 18, 19, 20, 21, 22, 23,
397 17, 18, 19, 20, 21, 22, 23, 24,
398 18, 19, 20, 21, 22, 23, 24, 25,
399 19, 20, 21, 22, 23, 24, 26, 27,
400 20, 21, 22, 23, 25, 26, 27, 28,
401 21, 22, 23, 24, 26, 27, 28, 30,
402 22, 23, 24, 26, 27, 28, 30, 31,
403 23, 24, 25, 27, 28, 30, 31, 33,
406 const uint8_t ff_mpeg4_y_dc_scale_table[32]={
407 // 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
408 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
410 const uint8_t ff_mpeg4_c_dc_scale_table[32]={
411 // 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
412 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
415 const uint16_t ff_mpeg4_resync_prefix[8]={
416 0x7F00, 0x7E00, 0x7C00, 0x7800, 0x7000, 0x6000, 0x4000, 0x0000
419 static const uint8_t mpeg4_dc_threshold[8]={
420 99, 13, 15, 17, 19, 21, 23, 0