summaryrefslogtreecommitdiff
path: root/apps/plugins/mpegplayer/decode.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/mpegplayer/decode.c')
-rw-r--r--apps/plugins/mpegplayer/decode.c35
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
161mpeg2_state_t mpeg2_seek_header (mpeg2dec_t * mpeg2dec) 165mpeg2_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
267mpeg2_state_t mpeg2_parse_header (mpeg2dec_t * mpeg2dec) 264mpeg2_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):