Mercurial > mplayer.hg
annotate libmpdemux/demux_mpg.c @ 7492:5465cbd5c5ef
Modern versions of OpenSSH listen on localhost to forward the X11 connection
(X11UseLocalhost defaults to yes). The following patch permits to consider
as non local any DISPLAY environment which port is greater or equal to 10
else mplayer tries a local optimization on a distant X server which doesn't
work.
patch by Denis.Ducamp@groar.org
author | arpi |
---|---|
date | Mon, 23 Sep 2002 21:17:30 +0000 |
parents | 3a8d8c51355a |
children | b645204ea527 |
rev | line source |
---|---|
1 | 1 // MPG/VOB file parser for DEMUXER v2.5 by A'rpi/ESP-team |
2 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
3 #include <stdio.h> |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
4 #include <stdlib.h> |
1430 | 5 #include <unistd.h> |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
6 |
1567 | 7 #include "config.h" |
8 #include "mp_msg.h" | |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1735
diff
changeset
|
9 #include "help_mp.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
10 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
11 #include "stream.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
12 #include "demuxer.h" |
1466 | 13 #include "parse_es.h" |
2338 | 14 #include "stheader.h" |
4711 | 15 #include "mp3_hdr.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
16 |
2555
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2338
diff
changeset
|
17 #include "dvdauth.h" |
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2338
diff
changeset
|
18 |
524
9105fc95636c
A fast'n'ugly hack to correct DVD VOB playback problems
lgb
parents:
501
diff
changeset
|
19 //#define MAX_PS_PACKETSIZE 2048 |
501 | 20 #define MAX_PS_PACKETSIZE (224*1024) |
21 | |
547 | 22 static int mpeg_pts_error=0; |
23 | |
1 | 24 static unsigned int read_mpeg_timestamp(stream_t *s,int c){ |
25 int d,e; | |
26 unsigned int pts; | |
27 d=stream_read_word(s); | |
28 e=stream_read_word(s); | |
547 | 29 if( ((c&1)!=1) || ((d&1)!=1) || ((e&1)!=1) ){ |
30 ++mpeg_pts_error; | |
31 return 0; // invalid pts | |
32 } | |
1 | 33 pts=(((c>>1)&7)<<30)|((d>>1)<<15)|(e>>1); |
1567 | 34 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"{%d}",pts); |
1 | 35 return pts; |
36 } | |
37 | |
38 static int demux_mpg_read_packet(demuxer_t *demux,int id){ | |
39 int d; | |
40 int len; | |
492 | 41 #ifdef HAVE_LIBCSS |
42 int css=0; | |
43 #endif | |
1 | 44 unsigned char c=0; |
45 unsigned int pts=0; | |
46 unsigned int dts=0; | |
47 demux_stream_t *ds=NULL; | |
48 | |
1567 | 49 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"demux_read_packet: %X\n",id); |
1 | 50 |
536 | 51 // if(id==0x1F0){ |
52 // demux->synced=0; // force resync after 0x1F0 | |
53 // return -1; | |
54 //} | |
501 | 55 |
1 | 56 // if(id==0x1BA) packet_start_pos=stream_tell(demux->stream); |
501 | 57 if(id<0x1BC || id>=0x1F0) return -1; |
1 | 58 if(id==0x1BE) return -1; // padding stream |
59 if(id==0x1BF) return -1; // private2 | |
60 | |
61 len=stream_read_word(demux->stream); | |
1567 | 62 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"PACKET len=%d",len); |
536 | 63 // if(len==62480){ demux->synced=0;return -1;} /* :) */ |
501 | 64 if(len==0 || len>MAX_PS_PACKETSIZE){ |
1567 | 65 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Invalid PS packet len: %d\n",len); |
501 | 66 return -2; // invalid packet !!!!!! |
67 } | |
1 | 68 |
547 | 69 mpeg_pts_error=0; |
70 | |
1 | 71 while(len>0){ // Skip stuFFing bytes |
72 c=stream_read_char(demux->stream);--len; | |
73 if(c!=0xFF)break; | |
74 } | |
75 if((c>>6)==1){ // Read (skip) STD scale & size value | |
76 // printf(" STD_scale=%d",(c>>5)&1); | |
77 d=((c&0x1F)<<8)|stream_read_char(demux->stream); | |
78 len-=2; | |
79 // printf(" STD_size=%d",d); | |
80 c=stream_read_char(demux->stream); | |
81 } | |
82 // Read System-1 stream timestamps: | |
83 if((c>>4)==2){ | |
84 pts=read_mpeg_timestamp(demux->stream,c); | |
85 len-=4; | |
86 } else | |
87 if((c>>4)==3){ | |
88 pts=read_mpeg_timestamp(demux->stream,c); | |
89 c=stream_read_char(demux->stream); | |
90 if((c>>4)!=1) pts=0; //printf("{ERROR4}"); | |
91 dts=read_mpeg_timestamp(demux->stream,c); | |
92 len-=4+1+4; | |
93 } else | |
94 if((c>>6)==2){ | |
95 int pts_flags; | |
96 int hdrlen; | |
97 // System-2 (.VOB) stream: | |
492 | 98 if((c>>4)&3) { |
99 #ifdef HAVE_LIBCSS | |
100 css=1; | |
101 #else | |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1735
diff
changeset
|
102 mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_EncryptedVOB); |
492 | 103 #endif |
104 } | |
1 | 105 c=stream_read_char(demux->stream); pts_flags=c>>6; |
106 c=stream_read_char(demux->stream); hdrlen=c; | |
107 len-=2; | |
1567 | 108 mp_dbg(MSGT_DEMUX,MSGL_DBG3," hdrlen=%d (len=%d)",hdrlen,len); |
109 if(hdrlen>len){ mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: invalid header length \n"); return -1;} | |
1 | 110 if(pts_flags==2){ |
111 c=stream_read_char(demux->stream); | |
112 pts=read_mpeg_timestamp(demux->stream,c); | |
113 len-=5;hdrlen-=5; | |
114 } else | |
115 if(pts_flags==3){ | |
116 c=stream_read_char(demux->stream); | |
117 pts=read_mpeg_timestamp(demux->stream,c); | |
118 c=stream_read_char(demux->stream); | |
119 dts=read_mpeg_timestamp(demux->stream,c); | |
120 len-=10;hdrlen-=10; | |
121 } | |
122 len-=hdrlen; | |
123 if(hdrlen>0) stream_skip(demux->stream,hdrlen); // skip header bytes | |
124 | |
125 //============== DVD Audio sub-stream ====================== | |
126 if(id==0x1BD){ | |
552 | 127 int aid=stream_read_char(demux->stream);--len; |
1 | 128 if(len<3) return -1; // invalid audio packet |
552 | 129 |
130 // AID: | |
131 // 0x20..0x3F subtitle | |
132 // 0x80..0x9F AC3 audio | |
133 // 0xA0..0xBF PCM audio | |
134 | |
135 if((aid & 0xE0) == 0x20){ | |
136 // subtitle: | |
137 aid&=0x1F; | |
426 | 138 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
139 if(!demux->s_streams[aid]){ |
1567 | 140 mp_msg(MSGT_DEMUX,MSGL_V,"==> Found subtitle: %d\n",aid); |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
141 demux->s_streams[aid]=1; |
552 | 142 } |
143 | |
144 if(demux->sub->id==aid){ | |
145 ds=demux->sub; | |
146 } | |
147 | |
3955 | 148 } else if((aid & 0xC0) == 0x80 || (aid & 0xE0) == 0x00) { |
552 | 149 |
150 // aid=128+(aid&0x7F); | |
151 // aid=0x80..0xBF | |
152 | |
1289 | 153 if(!demux->a_streams[aid]) new_sh_audio(demux,aid); |
552 | 154 if(demux->audio->id==-1) demux->audio->id=aid; |
426 | 155 |
156 if(demux->audio->id==aid){ | |
536 | 157 // int type; |
426 | 158 ds=demux->audio; |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
159 if(!ds->sh) ds->sh=demux->a_streams[aid]; |
1 | 160 // READ Packet: Skip additional audio header data: |
536 | 161 c=stream_read_char(demux->stream);//type=c; |
162 c=stream_read_char(demux->stream);//type|=c<<8; | |
163 c=stream_read_char(demux->stream);//type|=c<<16; | |
164 // printf("[%06X]",type); | |
1 | 165 len-=3; |
1331
b4457de47804
ds->type removed - using id-based audio format detection in mplayer.c
arpi
parents:
1289
diff
changeset
|
166 if((aid&0xE0)==0xA0 && len>=2){ |
1 | 167 // read PCM header |
168 int head; | |
169 head=stream_read_char(demux->stream); head=c<<8; | |
170 c=stream_read_char(demux->stream); head|=c; len-=2; | |
171 while(len>0 && head!=0x180){ | |
172 head=c<<8; | |
173 c=stream_read_char(demux->stream); | |
174 head|=c;--len; | |
175 } | |
1567 | 176 if(!len) mp_msg(MSGT_DEMUX,MSGL_V,"End of packet while searching for PCM header\n"); |
1 | 177 } |
552 | 178 } // if(demux->audio->id==aid) |
179 | |
1567 | 180 } else mp_msg(MSGT_DEMUX,MSGL_V,"Unknown 0x1BD substream: 0x%02X \n",aid); |
552 | 181 |
182 } //if(id==0x1BD) | |
1 | 183 |
184 } else { | |
539 | 185 if(c!=0x0f){ |
1567 | 186 mp_msg(MSGT_DEMUX,MSGL_V," {ERROR5,c=%d} \n",c); |
539 | 187 return -1; // invalid packet !!!!!! |
188 } | |
1 | 189 } |
1567 | 190 if(mpeg_pts_error) mp_msg(MSGT_DEMUX,MSGL_V," {PTS_err:%d} \n",mpeg_pts_error); |
191 mp_dbg(MSGT_DEMUX,MSGL_DBG3," => len=%d\n",len); | |
1 | 192 |
501 | 193 // if(len<=0 || len>MAX_PS_PACKETSIZE) return -1; // Invalid packet size |
194 if(len<=0 || len>MAX_PS_PACKETSIZE){ | |
1567 | 195 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Invalid PS data len: %d\n",len); |
501 | 196 return -1; // invalid packet !!!!!! |
197 } | |
1 | 198 |
199 if(id>=0x1C0 && id<=0x1DF){ | |
200 // mpeg audio | |
201 int aid=id-0x1C0; | |
1289 | 202 if(!demux->a_streams[aid]) new_sh_audio(demux,aid); |
1 | 203 if(demux->audio->id==-1) demux->audio->id=aid; |
204 if(demux->audio->id==aid){ | |
205 ds=demux->audio; | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
206 if(!ds->sh) ds->sh=demux->a_streams[aid]; |
1 | 207 } |
208 } else | |
209 if(id>=0x1E0 && id<=0x1EF){ | |
210 // mpeg video | |
211 int aid=id-0x1E0; | |
1289 | 212 if(!demux->v_streams[aid]) new_sh_video(demux,aid); |
1 | 213 if(demux->video->id==-1) demux->video->id=aid; |
426 | 214 if(demux->video->id==aid){ |
215 ds=demux->video; | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
216 if(!ds->sh) ds->sh=demux->v_streams[aid]; |
426 | 217 } |
1 | 218 } |
219 | |
220 if(ds){ | |
1567 | 221 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Read %d data bytes from packet %04X\n",len,id); |
1 | 222 // printf("packet start = 0x%X \n",stream_tell(demux->stream)-packet_start_pos); |
492 | 223 #ifdef HAVE_LIBCSS |
546 | 224 if (css) { |
3975
04b2227ab75a
Return of the 'Old-style-DVD-support', with dynamic loading (using libdl) so
lgb
parents:
3955
diff
changeset
|
225 if (descrambling) dvd_css_descramble(demux->stream->buffer,key_title); else |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1735
diff
changeset
|
226 mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_EncryptedVOBauth); |
546 | 227 } |
492 | 228 #endif |
1735 | 229 ds_read_packet(ds,demux->stream,len,pts/90000.0f,demux->filepos,0); |
554 | 230 // if(ds==demux->sub) parse_dvdsub(ds->last->buffer,ds->last->len); |
1 | 231 return 1; |
232 } | |
1567 | 233 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Skipping %d data bytes from packet %04X\n",len,id); |
536 | 234 if(len<=2356) stream_skip(demux->stream,len); |
1 | 235 return 0; |
236 } | |
237 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
238 int num_elementary_packets100=0; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
239 int num_elementary_packets101=0; |
1162 | 240 int num_elementary_packets1B6=0; |
1338
345585097137
mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents:
1331
diff
changeset
|
241 int num_elementary_packetsPES=0; |
4711 | 242 int num_mp3audio_packets=0; |
1 | 243 |
244 int demux_mpg_es_fill_buffer(demuxer_t *demux){ | |
245 // Elementary video stream | |
246 if(demux->stream->eof) return 0; | |
247 demux->filepos=stream_tell(demux->stream); | |
1735 | 248 ds_read_packet(demux->video,demux->stream,STREAM_BUFFER_SIZE,0,demux->filepos,0); |
1 | 249 return 1; |
250 } | |
251 | |
252 int demux_mpg_fill_buffer(demuxer_t *demux){ | |
253 unsigned int head=0; | |
254 int skipped=0; | |
5570
3a8d8c51355a
max_packs increased for some dvd with too many audio/sub
arpi
parents:
4711
diff
changeset
|
255 int max_packs=256; // 512kbyte |
1 | 256 int ret=0; |
257 | |
258 // System stream | |
259 do{ | |
260 demux->filepos=stream_tell(demux->stream); | |
261 head=stream_read_dword(demux->stream); | |
547 | 262 if((head&0xFFFFFF00)!=0x100){ |
263 // sync... | |
264 demux->filepos-=skipped; | |
265 while(1){ | |
536 | 266 int c=stream_read_char(demux->stream); |
267 if(c<0) break; //EOF | |
268 head<<=8; | |
269 if(head!=0x100){ | |
270 head|=c; | |
4711 | 271 if(mp_check_mp3_header(head)) ++num_mp3audio_packets; |
536 | 272 ++skipped; //++demux->filepos; |
273 continue; | |
274 } | |
275 head|=c; | |
276 break; | |
547 | 277 } |
278 demux->filepos+=skipped; | |
1 | 279 } |
280 if(stream_eof(demux->stream)) break; | |
281 // sure: head=0x000001XX | |
1567 | 282 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"*** head=0x%X\n",head); |
1 | 283 if(demux->synced==0){ |
3770 | 284 if(head==0x1BA) demux->synced=1; //else |
285 // if(head==0x1BD || (head>=0x1C0 && head<=0x1EF)) demux->synced=3; // PES? | |
1 | 286 } else |
287 if(demux->synced==1){ | |
929 | 288 if(head==0x1BB || head==0x1BD || (head>=0x1C0 && head<=0x1EF)){ |
1 | 289 demux->synced=2; |
1567 | 290 mp_msg(MSGT_DEMUX,MSGL_V,"system stream synced at 0x%X (%d)!\n",demux->filepos,demux->filepos); |
536 | 291 num_elementary_packets100=0; // requires for re-sync! |
292 num_elementary_packets101=0; // requires for re-sync! | |
1 | 293 } else demux->synced=0; |
294 } // else | |
3255
ee28577dad02
combined PS/PES sync to allow .VDR playback from stdin
arpi
parents:
2555
diff
changeset
|
295 if(demux->synced>=2){ |
1 | 296 ret=demux_mpg_read_packet(demux,head); |
297 if(!ret) | |
298 if(--max_packs==0){ | |
299 demux->stream->eof=1; | |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1735
diff
changeset
|
300 mp_msg(MSGT_DEMUX,MSGL_ERR,MSGTR_DoesntContainSelectedStream); |
1 | 301 return 0; |
302 } | |
3255
ee28577dad02
combined PS/PES sync to allow .VDR playback from stdin
arpi
parents:
2555
diff
changeset
|
303 if(demux->synced==3) demux->synced=(ret==1)?2:0; // PES detect |
1 | 304 } else { |
305 if(head>=0x100 && head<0x1B0){ | |
1162 | 306 if(head==0x100) ++num_elementary_packets100; else |
307 if(head==0x101) ++num_elementary_packets101; | |
1567 | 308 mp_msg(MSGT_DEMUX,MSGL_DBG3,"Opps... elementary video packet found: %03X\n",head); |
1162 | 309 } else |
4711 | 310 if((head>=0x1C0 && head<0x1F0) || head==0x1BD){ |
1338
345585097137
mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents:
1331
diff
changeset
|
311 ++num_elementary_packetsPES; |
1567 | 312 mp_msg(MSGT_DEMUX,MSGL_DBG3,"Opps... PES packet found: %03X\n",head); |
1338
345585097137
mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents:
1331
diff
changeset
|
313 } else |
1162 | 314 if(head==0x1B6) ++num_elementary_packets1B6; |
1 | 315 #if 1 |
1338
345585097137
mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents:
1331
diff
changeset
|
316 if( ( (num_elementary_packets100>50 && num_elementary_packets101>50) || |
345585097137
mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents:
1331
diff
changeset
|
317 (num_elementary_packetsPES>50) ) && skipped>4000000){ |
1567 | 318 mp_msg(MSGT_DEMUX,MSGL_V,"sync_mpeg_ps: seems to be ES/PES stream...\n"); |
1 | 319 demux->stream->eof=1; |
320 break; | |
321 } | |
4711 | 322 if(num_mp3audio_packets>100 && num_elementary_packets100<10){ |
323 mp_msg(MSGT_DEMUX,MSGL_V,"sync_mpeg_ps: seems to be MP3 stream...\n"); | |
324 demux->stream->eof=1; | |
325 break; | |
326 } | |
1 | 327 #endif |
328 } | |
329 } while(ret!=1); | |
1567 | 330 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"demux: %d bad bytes skipped\n",skipped); |
1 | 331 if(demux->stream->eof){ |
1567 | 332 mp_msg(MSGT_DEMUX,MSGL_V,"MPEG Stream reached EOF\n"); |
1 | 333 return 0; |
334 } | |
335 return 1; | |
336 } | |
337 | |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1466
diff
changeset
|
338 //extern off_t seek_to_byte; |
1466 | 339 |
340 void demux_seek_mpg(demuxer_t *demuxer,float rel_seek_secs,int flags){ | |
341 demux_stream_t *d_audio=demuxer->audio; | |
342 demux_stream_t *d_video=demuxer->video; | |
343 sh_audio_t *sh_audio=d_audio->sh; | |
344 sh_video_t *sh_video=d_video->sh; | |
345 | |
346 //================= seek in MPEG ========================== | |
1628
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
347 off_t newpos=(flags&1)?demuxer->movi_start:demuxer->filepos; |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
348 |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
349 if(flags&2){ |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
350 // float seek 0..1 |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
351 newpos+=(demuxer->movi_end-demuxer->movi_start)*rel_seek_secs; |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
352 } else { |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
353 // time seek (secs) |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
354 if(!sh_video->i_bps) // unspecified or VBR |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
355 newpos+=2324*75*rel_seek_secs; // 174.3 kbyte/sec |
1466 | 356 else |
1628
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
357 newpos+=sh_video->i_bps*rel_seek_secs; |
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
358 } |
1466 | 359 |
4391
6394c1e9e770
DVD start position handling changed (progbar/eta fix)
arpi
parents:
3975
diff
changeset
|
360 if(newpos<demuxer->movi_start){ |
6394c1e9e770
DVD start position handling changed (progbar/eta fix)
arpi
parents:
3975
diff
changeset
|
361 if(demuxer->stream->type!=STREAMTYPE_VCD) demuxer->movi_start=0; // for VCD |
6394c1e9e770
DVD start position handling changed (progbar/eta fix)
arpi
parents:
3975
diff
changeset
|
362 if(newpos<demuxer->movi_start) newpos=demuxer->movi_start; |
6394c1e9e770
DVD start position handling changed (progbar/eta fix)
arpi
parents:
3975
diff
changeset
|
363 } |
1628
bd1ef18cdf33
seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents:
1597
diff
changeset
|
364 |
1466 | 365 #ifdef _LARGEFILE_SOURCE |
366 newpos&=~((long long)STREAM_BUFFER_SIZE-1); /* sector boundary */ | |
367 #else | |
368 newpos&=~(STREAM_BUFFER_SIZE-1); /* sector boundary */ | |
369 #endif | |
370 stream_seek(demuxer->stream,newpos); | |
371 | |
372 // re-sync video: | |
373 videobuf_code_len=0; // reset ES stream buffer | |
374 | |
375 ds_fill_buffer(d_video); | |
376 if(sh_audio){ | |
377 ds_fill_buffer(d_audio); | |
378 resync_audio_stream(sh_audio); | |
379 } | |
380 | |
381 while(1){ | |
382 int i; | |
383 if(sh_audio && !d_audio->eof && d_video->pts && d_audio->pts){ | |
384 float a_pts=d_audio->pts; | |
385 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; | |
386 if(d_video->pts>a_pts){ | |
387 skip_audio_frame(sh_audio); // sync audio | |
388 continue; | |
389 } | |
390 } | |
391 i=sync_video_packet(d_video); | |
392 if(i==0x1B3 || i==0x1B8) break; // found it! | |
393 if(!i || !skip_video_packet(d_video)) break; // EOF? | |
394 } | |
395 | |
396 | |
397 } | |
398 |