summaryrefslogtreecommitdiffstats
path: root/libmpdemux/parse_es.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-10-20 18:49:08 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-10-20 18:49:08 +0000
commit881e5d0783d66de0d3efe4b633aa413a277c5b18 (patch)
tree998f3cdd340f82a73f54b1cdc4e22c19dabff4ad /libmpdemux/parse_es.c
parentdaab5f2480c62bbe684e09e0ae979958b447124b (diff)
downloadmpv-881e5d0783d66de0d3efe4b633aa413a277c5b18.tar.bz2
mpv-881e5d0783d66de0d3efe4b633aa413a277c5b18.tar.xz
libdemuxer...
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2311 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/parse_es.c')
-rw-r--r--libmpdemux/parse_es.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/libmpdemux/parse_es.c b/libmpdemux/parse_es.c
new file mode 100644
index 0000000000..310b1c976d
--- /dev/null
+++ b/libmpdemux/parse_es.c
@@ -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);
+}