Mercurial > mplayer.hg
diff libmpdemux/parse_es.c @ 2310:9e059416eea6
libdemuxer...
author | arpi |
---|---|
date | Sat, 20 Oct 2001 18:49:08 +0000 |
parents | parse_es.c@5216f108cb4f |
children | d0e1c32ad432 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpdemux/parse_es.c Sat Oct 20 18:49:08 2001 +0000 @@ -0,0 +1,117 @@ +//=================== MPEG-ES VIDEO PARSER ========================= + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +extern int verbose; // defined in mplayer.c + +#include "config.h" +#include "mp_msg.h" +#include "help_mp.h" + +#include "stream.h" +#include "demuxer.h" + +#include "parse_es.h" + +//static unsigned char videobuffer[MAX_VIDEO_PACKET_SIZE]; +unsigned char* videobuffer=NULL; +int videobuf_len=0; +unsigned char videobuf_code[4]; +int videobuf_code_len=0; + +// sync video stream, and returns next packet code +int sync_video_packet(demux_stream_t *ds){ + int skipped=0; + // we need enough bytes in the buffer: + while(videobuf_code_len<4){ +#if 0 + int c; + c=demux_getc(ds);if(c<0){ return 0;} // EOF + videobuf_code[videobuf_code_len++]=c; +#else + videobuf_code[videobuf_code_len++]=demux_getc(ds); +#endif + } + // sync packet: + while(1){ + int c; + if(videobuf_code[0]==0 && + videobuf_code[1]==0 && + videobuf_code[2]==1) break; // synced + // shift buffer, drop first byte + ++skipped; + videobuf_code[0]=videobuf_code[1]; + videobuf_code[1]=videobuf_code[2]; + videobuf_code[2]=videobuf_code[3]; + c=demux_getc(ds);if(c<0){ return 0;} // EOF + videobuf_code[3]=c; + } + if(skipped) mp_dbg(MSGT_PARSEES,MSGL_DBG2,"videobuf: %d bytes skipped (next: 0x1%02X)\n",skipped,videobuf_code[3]); + return 0x100|videobuf_code[3]; +} + +// return: packet length +int read_video_packet(demux_stream_t *ds){ +int packet_start; + + // SYNC STREAM +// if(!sync_video_packet(ds)) return 0; // cannot sync (EOF) + + // COPY STARTCODE: + packet_start=videobuf_len; + videobuffer[videobuf_len+0]=videobuf_code[0]; + videobuffer[videobuf_len+1]=videobuf_code[1]; + videobuffer[videobuf_len+2]=videobuf_code[2]; + videobuffer[videobuf_len+3]=videobuf_code[3]; + videobuf_len+=4; + + // READ PACKET: + { unsigned int head=-1; + while(videobuf_len<VIDEOBUFFER_SIZE){ + int c=demux_getc(ds); + if(c<0) break; // EOF + videobuffer[videobuf_len++]=c; +#if 1 + head<<=8; + if(head==0x100) break; // synced + head|=c; +#else + if(videobuffer[videobuf_len-4]==0 && + videobuffer[videobuf_len-3]==0 && + videobuffer[videobuf_len-2]==1) break; // synced +#endif + } + } + + if(ds->eof){ + videobuf_code_len=0; // EOF, no next code + return videobuf_len-packet_start; + } + + videobuf_len-=4; + + mp_dbg(MSGT_PARSEES,MSGL_DBG2,"videobuf: packet 0x1%02X len=%d (total=%d)\n",videobuffer[packet_start+3],videobuf_len-packet_start,videobuf_len); + + // Save next packet code: + videobuf_code[0]=videobuffer[videobuf_len]; + videobuf_code[1]=videobuffer[videobuf_len+1]; + videobuf_code[2]=videobuffer[videobuf_len+2]; + videobuf_code[3]=videobuffer[videobuf_len+3]; + videobuf_code_len=4; + + return videobuf_len-packet_start; +} + +// return: next packet code +int skip_video_packet(demux_stream_t *ds){ + + // SYNC STREAM +// if(!sync_video_packet(ds)) return 0; // cannot sync (EOF) + + videobuf_code_len=0; // force resync + + // SYNC AGAIN: + return sync_video_packet(ds); +}