diff options
Diffstat (limited to 'apps/plugins/mpegplayer/decode.c')
-rw-r--r-- | apps/plugins/mpegplayer/decode.c | 35 |
1 files changed, 15 insertions, 20 deletions
diff --git a/apps/plugins/mpegplayer/decode.c b/apps/plugins/mpegplayer/decode.c index 1c85fa7a92..80a396d15b 100644 --- a/apps/plugins/mpegplayer/decode.c +++ b/apps/plugins/mpegplayer/decode.c | |||
@@ -19,6 +19,10 @@ | |||
19 | * You should have received a copy of the GNU General Public License | 19 | * You should have received a copy of the GNU General Public License |
20 | * along with this program; if not, write to the Free Software | 20 | * along with this program; if not, write to the Free Software |
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 | * | ||
23 | * $Id$ | ||
24 | * libmpeg2 sync history: | ||
25 | * 2008-07-01 - CVS revision 1.114 | ||
22 | */ | 26 | */ |
23 | 27 | ||
24 | #include "plugin.h" | 28 | #include "plugin.h" |
@@ -155,16 +159,14 @@ static inline mpeg2_state_t seek_chunk (mpeg2dec_t * mpeg2dec) | |||
155 | mpeg2dec->bytes_since_tag += skipped; | 159 | mpeg2dec->bytes_since_tag += skipped; |
156 | mpeg2dec->code = mpeg2dec->buf_start[-1]; | 160 | mpeg2dec->code = mpeg2dec->buf_start[-1]; |
157 | 161 | ||
158 | return (mpeg2_state_t)-1; | 162 | return STATE_INTERNAL_NORETURN; |
159 | } | 163 | } |
160 | 164 | ||
161 | mpeg2_state_t mpeg2_seek_header (mpeg2dec_t * mpeg2dec) | 165 | mpeg2_state_t mpeg2_seek_header (mpeg2dec_t * mpeg2dec) |
162 | { | 166 | { |
163 | while (mpeg2dec->code != 0xb3 && | 167 | while (!(mpeg2dec->code == 0xb3 || |
164 | ((mpeg2dec->code != 0xb7 && | 168 | ((mpeg2dec->code == 0xb7 || mpeg2dec->code == 0xb8 || |
165 | mpeg2dec->code != 0xb8 && | 169 | !mpeg2dec->code) && mpeg2dec->sequence.width != (unsigned)-1))) |
166 | mpeg2dec->code) || | ||
167 | mpeg2dec->sequence.width == (unsigned)-1)) | ||
168 | { | 170 | { |
169 | if (seek_chunk (mpeg2dec) == STATE_BUFFER) | 171 | if (seek_chunk (mpeg2dec) == STATE_BUFFER) |
170 | return STATE_BUFFER; | 172 | return STATE_BUFFER; |
@@ -175,9 +177,8 @@ mpeg2_state_t mpeg2_seek_header (mpeg2dec_t * mpeg2dec) | |||
175 | 177 | ||
176 | mpeg2dec->user_data_len = 0; | 178 | mpeg2dec->user_data_len = 0; |
177 | 179 | ||
178 | return mpeg2dec->code ? | 180 | return ((mpeg2dec->code == 0xb7) ? |
179 | mpeg2_parse_header(mpeg2dec) : | 181 | mpeg2_header_end(mpeg2dec) : mpeg2_parse_header(mpeg2dec)); |
180 | mpeg2_header_picture_start(mpeg2dec); | ||
181 | } | 182 | } |
182 | 183 | ||
183 | #define RECEIVED(code,state) (((state) << 8) + (code)) | 184 | #define RECEIVED(code,state) (((state) << 8) + (code)) |
@@ -192,7 +193,7 @@ mpeg2_state_t mpeg2_parse (mpeg2dec_t * mpeg2dec) | |||
192 | 193 | ||
193 | state = mpeg2dec->action (mpeg2dec); | 194 | state = mpeg2dec->action (mpeg2dec); |
194 | 195 | ||
195 | if ((int)state >= 0) | 196 | if ((int)state > (int)STATE_INTERNAL_NORETURN) |
196 | return state; | 197 | return state; |
197 | } | 198 | } |
198 | 199 | ||
@@ -244,24 +245,20 @@ mpeg2_state_t mpeg2_parse (mpeg2dec_t * mpeg2dec) | |||
244 | return STATE_BUFFER; | 245 | return STATE_BUFFER; |
245 | } | 246 | } |
246 | 247 | ||
248 | mpeg2dec->action = mpeg2_seek_header; | ||
249 | |||
247 | switch (mpeg2dec->code) | 250 | switch (mpeg2dec->code) |
248 | { | 251 | { |
249 | case 0x00: | 252 | case 0x00: |
250 | mpeg2dec->action = mpeg2_header_picture_start; | ||
251 | return mpeg2dec->state; | 253 | return mpeg2dec->state; |
252 | case 0xb7: | ||
253 | mpeg2dec->action = mpeg2_header_end; | ||
254 | break; | ||
255 | case 0xb3: | 254 | case 0xb3: |
255 | case 0xb7: | ||
256 | case 0xb8: | 256 | case 0xb8: |
257 | mpeg2dec->action = mpeg2_parse_header; | 257 | return (mpeg2dec->state == STATE_SLICE) ? STATE_SLICE : STATE_INVALID; |
258 | break; | ||
259 | default: | 258 | default: |
260 | mpeg2dec->action = seek_chunk; | 259 | mpeg2dec->action = seek_chunk; |
261 | return STATE_INVALID; | 260 | return STATE_INVALID; |
262 | } | 261 | } |
263 | |||
264 | return (mpeg2dec->state == STATE_SLICE) ? STATE_SLICE : STATE_INVALID; | ||
265 | } | 262 | } |
266 | 263 | ||
267 | mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) | 264 | mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) |
@@ -331,7 +328,6 @@ mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) | |||
331 | { | 328 | { |
332 | /* state transition after a sequence header */ | 329 | /* state transition after a sequence header */ |
333 | case RECEIVED (0x00, STATE_SEQUENCE): | 330 | case RECEIVED (0x00, STATE_SEQUENCE): |
334 | mpeg2dec->action = mpeg2_header_picture_start; | ||
335 | case RECEIVED (0xb8, STATE_SEQUENCE): | 331 | case RECEIVED (0xb8, STATE_SEQUENCE): |
336 | mpeg2_header_sequence_finalize (mpeg2dec); | 332 | mpeg2_header_sequence_finalize (mpeg2dec); |
337 | break; | 333 | break; |
@@ -339,7 +335,6 @@ mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) | |||
339 | /* other legal state transitions */ | 335 | /* other legal state transitions */ |
340 | case RECEIVED (0x00, STATE_GOP): | 336 | case RECEIVED (0x00, STATE_GOP): |
341 | mpeg2_header_gop_finalize (mpeg2dec); | 337 | mpeg2_header_gop_finalize (mpeg2dec); |
342 | mpeg2dec->action = mpeg2_header_picture_start; | ||
343 | break; | 338 | break; |
344 | case RECEIVED (0x01, STATE_PICTURE): | 339 | case RECEIVED (0x01, STATE_PICTURE): |
345 | case RECEIVED (0x01, STATE_PICTURE_2ND): | 340 | case RECEIVED (0x01, STATE_PICTURE_2ND): |