comparison 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
comparison
equal deleted inserted replaced
2309:3128b9d8b4ea 2310:9e059416eea6
1 //=================== MPEG-ES VIDEO PARSER =========================
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6
7 extern int verbose; // defined in mplayer.c
8
9 #include "config.h"
10 #include "mp_msg.h"
11 #include "help_mp.h"
12
13 #include "stream.h"
14 #include "demuxer.h"
15
16 #include "parse_es.h"
17
18 //static unsigned char videobuffer[MAX_VIDEO_PACKET_SIZE];
19 unsigned char* videobuffer=NULL;
20 int videobuf_len=0;
21 unsigned char videobuf_code[4];
22 int videobuf_code_len=0;
23
24 // sync video stream, and returns next packet code
25 int sync_video_packet(demux_stream_t *ds){
26 int skipped=0;
27 // we need enough bytes in the buffer:
28 while(videobuf_code_len<4){
29 #if 0
30 int c;
31 c=demux_getc(ds);if(c<0){ return 0;} // EOF
32 videobuf_code[videobuf_code_len++]=c;
33 #else
34 videobuf_code[videobuf_code_len++]=demux_getc(ds);
35 #endif
36 }
37 // sync packet:
38 while(1){
39 int c;
40 if(videobuf_code[0]==0 &&
41 videobuf_code[1]==0 &&
42 videobuf_code[2]==1) break; // synced
43 // shift buffer, drop first byte
44 ++skipped;
45 videobuf_code[0]=videobuf_code[1];
46 videobuf_code[1]=videobuf_code[2];
47 videobuf_code[2]=videobuf_code[3];
48 c=demux_getc(ds);if(c<0){ return 0;} // EOF
49 videobuf_code[3]=c;
50 }
51 if(skipped) mp_dbg(MSGT_PARSEES,MSGL_DBG2,"videobuf: %d bytes skipped (next: 0x1%02X)\n",skipped,videobuf_code[3]);
52 return 0x100|videobuf_code[3];
53 }
54
55 // return: packet length
56 int read_video_packet(demux_stream_t *ds){
57 int packet_start;
58
59 // SYNC STREAM
60 // if(!sync_video_packet(ds)) return 0; // cannot sync (EOF)
61
62 // COPY STARTCODE:
63 packet_start=videobuf_len;
64 videobuffer[videobuf_len+0]=videobuf_code[0];
65 videobuffer[videobuf_len+1]=videobuf_code[1];
66 videobuffer[videobuf_len+2]=videobuf_code[2];
67 videobuffer[videobuf_len+3]=videobuf_code[3];
68 videobuf_len+=4;
69
70 // READ PACKET:
71 { unsigned int head=-1;
72 while(videobuf_len<VIDEOBUFFER_SIZE){
73 int c=demux_getc(ds);
74 if(c<0) break; // EOF
75 videobuffer[videobuf_len++]=c;
76 #if 1
77 head<<=8;
78 if(head==0x100) break; // synced
79 head|=c;
80 #else
81 if(videobuffer[videobuf_len-4]==0 &&
82 videobuffer[videobuf_len-3]==0 &&
83 videobuffer[videobuf_len-2]==1) break; // synced
84 #endif
85 }
86 }
87
88 if(ds->eof){
89 videobuf_code_len=0; // EOF, no next code
90 return videobuf_len-packet_start;
91 }
92
93 videobuf_len-=4;
94
95 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);
96
97 // Save next packet code:
98 videobuf_code[0]=videobuffer[videobuf_len];
99 videobuf_code[1]=videobuffer[videobuf_len+1];
100 videobuf_code[2]=videobuffer[videobuf_len+2];
101 videobuf_code[3]=videobuffer[videobuf_len+3];
102 videobuf_code_len=4;
103
104 return videobuf_len-packet_start;
105 }
106
107 // return: next packet code
108 int skip_video_packet(demux_stream_t *ds){
109
110 // SYNC STREAM
111 // if(!sync_video_packet(ds)) return 0; // cannot sync (EOF)
112
113 videobuf_code_len=0; // force resync
114
115 // SYNC AGAIN:
116 return sync_video_packet(ds);
117 }