|
From: Keith W. <ke...@mi...> - 2011-06-15 21:49:00
|
Daniel,
It's hard to help you debug this without knowing what you are feeding
in. To be clear -- you are using a valid MPEG-2 video elementary
stream that plays perfectly fine with mpeg2dec and the other sample
decoders distributed with libmpeg2? Maybe if you can post a sample of
your file, I can help you debug why your code gives STATE_INVALID
while the sample decoders don't, if that's what's happening.
Best,
Keith
On Mon, Jun 13, 2011 at 3:27 AM, Daniel Tang <dt....@gm...> wrote:
> 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,
> ------------------------------------------------------------------------------
> EditLive Enterprise is the world's most technically advanced content
> authoring tool. Experience the power of Track Changes, Inline Image
> Editing and ensure content is compliant with Accessibility Checking.
> http://p.sf.net/sfu/ephox-dev2dev
> _______________________________________________
> Libmpeg2-devel mailing list
> Lib...@li...
> https://lists.sourceforge.net/lists/listinfo/libmpeg2-devel
>
|