diff options
author | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-02-24 20:28:24 +0000 |
---|---|---|
committer | arpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-02-24 20:28:24 +0000 |
commit | d34041569e71fc9bd772354e94dc9d16061072a5 (patch) | |
tree | 8f481cae1c70f32d1756fbe5f39000577b73042d /parse_es.c | |
parent | e95a95ece09bac96bdfd37322f96c6f57ef79ebc (diff) | |
download | mpv-d34041569e71fc9bd772354e94dc9d16061072a5.tar.bz2 mpv-d34041569e71fc9bd772354e94dc9d16061072a5.tar.xz |
Initial revision
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'parse_es.c')
-rw-r--r-- | parse_es.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/parse_es.c b/parse_es.c new file mode 100644 index 0000000000..be2facb99e --- /dev/null +++ b/parse_es.c @@ -0,0 +1,106 @@ +//=================== VIDEO PARSER ========================= + +#define MAX_VIDEO_PACKET_SIZE (224*1024+4) +#define VIDEOBUFFER_SIZE 0x100000 + +//static unsigned char videobuffer[MAX_VIDEO_PACKET_SIZE]; +static unsigned char* videobuffer=NULL; +static int videobuf_len=0; + +static unsigned char videobuf_code[4]; +static 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(verbose>=2) if(skipped) printf("videobuf: %d bytes skipped\n",skipped); + 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; + + if(verbose>=2) printf("videobuf: packet 0x1%02X len=%d\n",videobuffer[3],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); +} |