1 /*
2 * MPEG-1/2 decoder
3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 /**
24 * @file
25 * MPEG-1/2 decoder
26 */
27
28 #define UNCHECKED_BITSTREAM_READER 1
29
33
43
45
47 { 3, 5 }, // 0x01 MB_INTRA
48 { 1, 2 }, // 0x02 MB_PAT
49 { 1, 3 }, // 0x08 MB_FOR
50 { 1, 1 }, // 0x0A MB_FOR|MB_PAT
51 { 1, 6 }, // 0x11 MB_QUANT|MB_INTRA
52 { 1, 5 }, // 0x12 MB_QUANT|MB_PAT
53 { 2, 5 }, // 0x1A MB_QUANT|MB_FOR|MB_PAT
54 };
55
57 { 3, 5 }, // 0x01 MB_INTRA
58 { 2, 3 }, // 0x04 MB_BACK
59 { 3, 3 }, // 0x06 MB_BACK|MB_PAT
60 { 2, 4 }, // 0x08 MB_FOR
61 { 3, 4 }, // 0x0A MB_FOR|MB_PAT
62 { 2, 2 }, // 0x0C MB_FOR|MB_BACK
63 { 3, 2 }, // 0x0E MB_FOR|MB_BACK|MB_PAT
64 { 1, 6 }, // 0x11 MB_QUANT|MB_INTRA
65 { 2, 6 }, // 0x16 MB_QUANT|MB_BACK|MB_PAT
66 { 3, 6 }, // 0x1A MB_QUANT|MB_FOR|MB_PAT
67 { 2, 5 }, // 0x1E MB_QUANT|MB_FOR|MB_BACK|MB_PAT
68 };
69
70 #define INIT_2D_VLC_RL(rl, static_size)\
71 {\
72 static RL_VLC_ELEM rl_vlc_table[static_size];\
73 rl.rl_vlc[0] = rl_vlc_table;\
74 init_2d_vlc_rl(&rl, static_size);\
75 }
76
78 {
79 int i;
84
86 int code = vlc.
table[i][0];
89
90 if (len == 0) { // illegal code
91 run = 65;
93 } else if (len<0) { //more bits needed
94 run = 0;
95 level = code;
96 } else {
97 if (code == rl->
n) {
//esc
98 run = 65;
99 level = 0;
100 }
else if (code == rl->
n+1) {
//eob
101 run = 0;
102 level = 127;
103 } else {
106 }
107 }
111 }
112 }
113
115 {
116
119
120 }
121
123 {
128 }
129
130
131 /******************************************/
132 /* decoding */
133
135
138
143
145 {
146 static int done = 0;
147
148 if (!done) {
149 done = 1;
150
166
175
178 }
179 }
180
181 /**
182 * Find the end of the current frame in the bitstream.
183 * @return the position of the first byte of the next frame, or -1
184 */
186 {
187 int i;
189
190 /* EOF considered as end of frame */
191 if (buf_size == 0)
192 return 0;
193
194 /*
195 0 frame start -> 1/4
196 1 first_SEQEXT -> 0/2
197 2 first field start -> 3/0
198 3 second_SEQEXT -> 2/0
199 4 searching end
200 */
201
202 for (i = 0; i < buf_size; i++) {
208 if ((buf[i] & 3) == 3)
210 else
212 }
213 state++;
214 } else {
217 i++;
219 }
223 return i+1;
224 }
233 return i - 3;
234 }
235 }
238 }
239 }
240 }
243 }
244