From: Daniel T. <dt....@gm...> - 2011-06-15 06:39:13
|
Hi, I've just compiled libmpeg2 for an embedded platform and have written some code for decoding. But the call to mpeg2_parse in this code seems to always return STATE_INVALID. int play(FILE * mpgfile) { mpeg2dec_t * decoder; const mpeg2_info_t * info; mpeg2_state_t state; size_t size = 1; unsigned char *buffer = malloc(BUFFER_SIZE); char debug[20]; if (!buffer) { show_msgbox("NspireMoviePlayer","NULL ptr from Malloc"); return 1; } decoder = mpeg2_init (); if (!decoder) { show_msgbox("NspireMoviePlayer","Could not init mpeg2"); return 1; } info = mpeg2_info (decoder); do { state = mpeg2_parse (decoder); switch (state) { case STATE_BUFFER: size = fread (buffer, 1, BUFFER_SIZE, mpgfile); mpeg2_buffer (decoder, buffer, buffer + size); break; case STATE_SEQUENCE: mpeg2_convert (decoder, mpeg2convert_rgb24, NULL); settimerperiod(info->sequence->frame_period); break; case STATE_SLICE: case STATE_END: if (info->sequence->width != SCREEN_WIDTH || info->sequence->height != SCREEN_HEIGHT) { show_msgbox("NspireMoviePlayer","Screen size mismatch"); goto die; } else { waittimerperiod(); renderframe(info->display_fbuf->buf[0]); } break; case STATE_INVALID: goto die; break; default: break; } } while(size); mpeg2_close(decoder); return 0; die: mpeg2_close(decoder); return 1; } I dug around decode.c and added some debugging messages and it seems it's conking out in this piece of code at the bottom of mpeg2_parse: mpeg2dec->action = mpeg2_seek_header; switch (mpeg2dec->code) { case 0x00: show_msgbox("libmpeg2","case 0 mpeg2dec->code"); return mpeg2dec->state; case 0xb3: case 0xb7: case 0xb8: show_msgbox("libmpeg2","case b8 mpeg2dec->code"); return (mpeg2dec->state == STATE_SLICE) ? STATE_SLICE : STATE_INVALID; default: mpeg2dec->action = seek_chunk; show_msgbox("libmpeg2","default mpeg2dec->code"); // This is where it returns return STATE_INVALID; } Does anyone have any ideas on what could be causing this? The code isn't very well documented and it's hard to follow. Cheers, |