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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 // MPG/VOB file parser for DEMUXER v2.5 by A'rpi/ESP-team
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1338
diff changeset
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
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
7 #include "config.h"
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
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
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
13 #include "parse_es.h"
2338
4f3e8c8ea32f includes cleanup
arpi
parents: 2310
diff changeset
14 #include "stheader.h"
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
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
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
20 #define MAX_PS_PACKETSIZE (224*1024)
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
21
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
22 static int mpeg_pts_error=0;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
23
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
24 static unsigned int read_mpeg_timestamp(stream_t *s,int c){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
25 int d,e;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
26 unsigned int pts;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
27 d=stream_read_word(s);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
28 e=stream_read_word(s);
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
29 if( ((c&1)!=1) || ((d&1)!=1) || ((e&1)!=1) ){
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
30 ++mpeg_pts_error;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
31 return 0; // invalid pts
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
32 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33 pts=(((c>>1)&7)<<30)|((d>>1)<<15)|(e>>1);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
34 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"{%d}",pts);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35 return pts;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 static int demux_mpg_read_packet(demuxer_t *demux,int id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39 int d;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40 int len;
492
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
41 #ifdef HAVE_LIBCSS
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
42 int css=0;
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
43 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 unsigned char c=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 unsigned int pts=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46 unsigned int dts=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47 demux_stream_t *ds=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
49 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"demux_read_packet: %X\n",id);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
51 // if(id==0x1F0){
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
52 // demux->synced=0; // force resync after 0x1F0
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
53 // return -1;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
54 //}
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
55
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 // if(id==0x1BA) packet_start_pos=stream_tell(demux->stream);
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
57 if(id<0x1BC || id>=0x1F0) return -1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58 if(id==0x1BE) return -1; // padding stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 if(id==0x1BF) return -1; // private2
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 len=stream_read_word(demux->stream);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
62 mp_dbg(MSGT_DEMUX,MSGL_DBG3,"PACKET len=%d",len);
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
63 // if(len==62480){ demux->synced=0;return -1;} /* :) */
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
64 if(len==0 || len>MAX_PS_PACKETSIZE){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
65 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Invalid PS packet len: %d\n",len);
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
66 return -2; // invalid packet !!!!!!
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
67 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
69 mpeg_pts_error=0;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
70
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 while(len>0){ // Skip stuFFing bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 c=stream_read_char(demux->stream);--len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 if(c!=0xFF)break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 if((c>>6)==1){ // Read (skip) STD scale & size value
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 // printf(" STD_scale=%d",(c>>5)&1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 d=((c&0x1F)<<8)|stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 len-=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79 // printf(" STD_size=%d",d);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 // Read System-1 stream timestamps:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 if((c>>4)==2){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 pts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 len-=4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 if((c>>4)==3){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88 pts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 if((c>>4)!=1) pts=0; //printf("{ERROR4}");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91 dts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 len-=4+1+4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 if((c>>6)==2){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 int pts_flags;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 int hdrlen;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 // System-2 (.VOB) stream:
492
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
98 if((c>>4)&3) {
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
99 #ifdef HAVE_LIBCSS
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
100 css=1;
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
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
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
103 #endif
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
104 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 c=stream_read_char(demux->stream); pts_flags=c>>6;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 c=stream_read_char(demux->stream); hdrlen=c;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 len-=2;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
108 mp_dbg(MSGT_DEMUX,MSGL_DBG3," hdrlen=%d (len=%d)",hdrlen,len);
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
109 if(hdrlen>len){ mp_msg(MSGT_DEMUX,MSGL_V,"demux_mpg: invalid header length \n"); return -1;}
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 if(pts_flags==2){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 pts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 len-=5;hdrlen-=5;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 if(pts_flags==3){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 pts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 dts=read_mpeg_timestamp(demux->stream,c);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 len-=10;hdrlen-=10;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 len-=hdrlen;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 if(hdrlen>0) stream_skip(demux->stream,hdrlen); // skip header bytes
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125 //============== DVD Audio sub-stream ======================
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 if(id==0x1BD){
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
127 int aid=stream_read_char(demux->stream);--len;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 if(len<3) return -1; // invalid audio packet
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
129
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
130 // AID:
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
131 // 0x20..0x3F subtitle
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
132 // 0x80..0x9F AC3 audio
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
133 // 0xA0..0xBF PCM audio
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
134
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
135 if((aid & 0xE0) == 0x20){
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
136 // subtitle:
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
137 aid&=0x1F;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
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
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
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
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
142 }
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
143
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
144 if(demux->sub->id==aid){
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
145 ds=demux->sub;
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
146 }
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
147
3955
ceab3c2f261e hotfix for ac3 aid<0x20 (VDR)
arpi
parents: 3770
diff changeset
148 } else if((aid & 0xC0) == 0x80 || (aid & 0xE0) == 0x00) {
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
149
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
150 // aid=128+(aid&0x7F);
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
151 // aid=0x80..0xBF
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
152
1289
3f490fad9bdf some code clanup (first step to libdemuxer)
arpi
parents: 1162
diff changeset
153 if(!demux->a_streams[aid]) new_sh_audio(demux,aid);
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
154 if(demux->audio->id==-1) demux->audio->id=aid;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
155
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
156 if(demux->audio->id==aid){
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
157 // int type;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 // READ Packet: Skip additional audio header data:
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
161 c=stream_read_char(demux->stream);//type=c;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
162 c=stream_read_char(demux->stream);//type|=c<<8;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
163 c=stream_read_char(demux->stream);//type|=c<<16;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
164 // printf("[%06X]",type);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 // read PCM header
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 int head;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 head=stream_read_char(demux->stream); head=c<<8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 c=stream_read_char(demux->stream); head|=c; len-=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171 while(len>0 && head!=0x180){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172 head=c<<8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 c=stream_read_char(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 head|=c;--len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
176 if(!len) mp_msg(MSGT_DEMUX,MSGL_V,"End of packet while searching for PCM header\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 }
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
178 } // if(demux->audio->id==aid)
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
179
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
180 } else mp_msg(MSGT_DEMUX,MSGL_V,"Unknown 0x1BD substream: 0x%02X \n",aid);
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
181
c2a449f90087 dvd sub support reading
arpi_esp
parents: 547
diff changeset
182 } //if(id==0x1BD)
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184 } else {
539
48f0c6f0519f dumb bug here too :)
arpi_esp
parents: 536
diff changeset
185 if(c!=0x0f){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
186 mp_msg(MSGT_DEMUX,MSGL_V," {ERROR5,c=%d} \n",c);
539
48f0c6f0519f dumb bug here too :)
arpi_esp
parents: 536
diff changeset
187 return -1; // invalid packet !!!!!!
48f0c6f0519f dumb bug here too :)
arpi_esp
parents: 536
diff changeset
188 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
190 if(mpeg_pts_error) mp_msg(MSGT_DEMUX,MSGL_V," {PTS_err:%d} \n",mpeg_pts_error);
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
191 mp_dbg(MSGT_DEMUX,MSGL_DBG3," => len=%d\n",len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
193 // if(len<=0 || len>MAX_PS_PACKETSIZE) return -1; // Invalid packet size
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
194 if(len<=0 || len>MAX_PS_PACKETSIZE){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
195 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Invalid PS data len: %d\n",len);
501
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
196 return -1; // invalid packet !!!!!!
bfc86f5a5ba7 PES supported again, VOB 0x1F0 problems fixed
arpi_esp
parents: 494
diff changeset
197 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 if(id>=0x1C0 && id<=0x1DF){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200 // mpeg audio
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 int aid=id-0x1C0;
1289
3f490fad9bdf some code clanup (first step to libdemuxer)
arpi
parents: 1162
diff changeset
202 if(!demux->a_streams[aid]) new_sh_audio(demux,aid);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 if(demux->audio->id==-1) demux->audio->id=aid;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 if(demux->audio->id==aid){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 if(id>=0x1E0 && id<=0x1EF){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 // mpeg video
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 int aid=id-0x1E0;
1289
3f490fad9bdf some code clanup (first step to libdemuxer)
arpi
parents: 1162
diff changeset
212 if(!demux->v_streams[aid]) new_sh_video(demux,aid);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 if(demux->video->id==-1) demux->video->id=aid;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
214 if(demux->video->id==aid){
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
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
26e513f392b2 new stream selection code
arpi_esp
parents: 397
diff changeset
217 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 if(ds){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
221 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Read %d data bytes from packet %04X\n",len,id);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 // printf("packet start = 0x%X \n",stream_tell(demux->stream)-packet_start_pos);
492
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
223 #ifdef HAVE_LIBCSS
546
22ed5f5821e2 command line requested DVD key support for Arpi :)
lgb
parents: 541
diff changeset
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
22ed5f5821e2 command line requested DVD key support for Arpi :)
lgb
parents: 541
diff changeset
227 }
492
888a85621f50 preliminary DVD support using libcss
lgb
parents: 426
diff changeset
228 #endif
1735
bdc1ec6fe668 gui seekbar position fixed
arpi
parents: 1628
diff changeset
229 ds_read_packet(ds,demux->stream,len,pts/90000.0f,demux->filepos,0);
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
230 // if(ds==demux->sub) parse_dvdsub(ds->last->buffer,ds->last->len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
233 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_MPG: Skipping %d data bytes from packet %04X\n",len,id);
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
234 if(len<=2356) stream_skip(demux->stream,len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
11e49d541f11 packet 0x1B6 (mpeg4 stream) detection
arpi_esp
parents: 979
diff changeset
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
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
242 int num_mp3audio_packets=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244 int demux_mpg_es_fill_buffer(demuxer_t *demux){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245 // Elementary video stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
246 if(demux->stream->eof) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
247 demux->filepos=stream_tell(demux->stream);
1735
bdc1ec6fe668 gui seekbar position fixed
arpi
parents: 1628
diff changeset
248 ds_read_packet(demux->video,demux->stream,STREAM_BUFFER_SIZE,0,demux->filepos,0);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252 int demux_mpg_fill_buffer(demuxer_t *demux){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
253 unsigned int head=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 int ret=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 // System stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 do{
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260 demux->filepos=stream_tell(demux->stream);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261 head=stream_read_dword(demux->stream);
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
262 if((head&0xFFFFFF00)!=0x100){
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
263 // sync...
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
264 demux->filepos-=skipped;
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
265 while(1){
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
266 int c=stream_read_char(demux->stream);
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
267 if(c<0) break; //EOF
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
268 head<<=8;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
269 if(head!=0x100){
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
270 head|=c;
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
271 if(mp_check_mp3_header(head)) ++num_mp3audio_packets;
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
272 ++skipped; //++demux->filepos;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
273 continue;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
274 }
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
275 head|=c;
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
276 break;
547
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
277 }
3e46eab9f782 small bugfix in the new optimized head sync code
arpi_esp
parents: 546
diff changeset
278 demux->filepos+=skipped;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 if(stream_eof(demux->stream)) break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 // sure: head=0x000001XX
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
282 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"*** head=0x%X\n",head);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
283 if(demux->synced==0){
3770
4f1a99fb9d9a mpeg VDR vs. BIN fixed?
arpi
parents: 3255
diff changeset
284 if(head==0x1BA) demux->synced=1; //else
4f1a99fb9d9a mpeg VDR vs. BIN fixed?
arpi
parents: 3255
diff changeset
285 // if(head==0x1BD || (head>=0x1C0 && head<=0x1EF)) demux->synced=3; // PES?
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
287 if(demux->synced==1){
929
6dedc7cb0146 accept 1BD packets for PS stream sync
arpi_esp
parents: 605
diff changeset
288 if(head==0x1BB || head==0x1BD || (head>=0x1C0 && head<=0x1EF)){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289 demux->synced=2;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
290 mp_msg(MSGT_DEMUX,MSGL_V,"system stream synced at 0x%X (%d)!\n",demux->filepos,demux->filepos);
536
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
291 num_elementary_packets100=0; // requires for re-sync!
3c9b3ce721f0 PES vs. VOB problem... yet another solution
arpi_esp
parents: 524
diff changeset
292 num_elementary_packets101=0; // requires for re-sync!
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 } else demux->synced=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 ret=demux_mpg_read_packet(demux,head);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 if(!ret)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298 if(--max_packs==0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
301 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
304 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
305 if(head>=0x100 && head<0x1B0){
1162
11e49d541f11 packet 0x1B6 (mpeg4 stream) detection
arpi_esp
parents: 979
diff changeset
306 if(head==0x100) ++num_elementary_packets100; else
11e49d541f11 packet 0x1B6 (mpeg4 stream) detection
arpi_esp
parents: 979
diff changeset
307 if(head==0x101) ++num_elementary_packets101;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
308 mp_msg(MSGT_DEMUX,MSGL_DBG3,"Opps... elementary video packet found: %03X\n",head);
1162
11e49d541f11 packet 0x1B6 (mpeg4 stream) detection
arpi_esp
parents: 979
diff changeset
309 } else
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
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
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
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
11e49d541f11 packet 0x1B6 (mpeg4 stream) detection
arpi_esp
parents: 979
diff changeset
314 if(head==0x1B6) ++num_elementary_packets1B6;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
318 mp_msg(MSGT_DEMUX,MSGL_V,"sync_mpeg_ps: seems to be ES/PES stream...\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
319 demux->stream->eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
320 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
321 }
4711
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
322 if(num_mp3audio_packets>100 && num_elementary_packets100<10){
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
323 mp_msg(MSGT_DEMUX,MSGL_V,"sync_mpeg_ps: seems to be MP3 stream...\n");
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
324 demux->stream->eof=1;
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
325 break;
39f5eccd54c2 added mp3 detection
arpi
parents: 4391
diff changeset
326 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
327 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
328 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
329 } while(ret!=1);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
330 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"demux: %d bad bytes skipped\n",skipped);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
331 if(demux->stream->eof){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
332 mp_msg(MSGT_DEMUX,MSGL_V,"MPEG Stream reached EOF\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
333 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
339
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
340 void demux_seek_mpg(demuxer_t *demuxer,float rel_seek_secs,int flags){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
341 demux_stream_t *d_audio=demuxer->audio;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
342 demux_stream_t *d_video=demuxer->video;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
343 sh_audio_t *sh_audio=d_audio->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
344 sh_video_t *sh_video=d_video->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
345
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
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
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
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
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
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
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
365 #ifdef _LARGEFILE_SOURCE
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
366 newpos&=~((long long)STREAM_BUFFER_SIZE-1); /* sector boundary */
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
367 #else
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
368 newpos&=~(STREAM_BUFFER_SIZE-1); /* sector boundary */
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
369 #endif
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
370 stream_seek(demuxer->stream,newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
371
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
372 // re-sync video:
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
373 videobuf_code_len=0; // reset ES stream buffer
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
374
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
375 ds_fill_buffer(d_video);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
376 if(sh_audio){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
377 ds_fill_buffer(d_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
378 resync_audio_stream(sh_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
379 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
380
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
381 while(1){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
382 int i;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
383 if(sh_audio && !d_audio->eof && d_video->pts && d_audio->pts){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
384 float a_pts=d_audio->pts;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
385 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
386 if(d_video->pts>a_pts){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
387 skip_audio_frame(sh_audio); // sync audio
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
388 continue;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
389 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
390 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
391 i=sync_video_packet(d_video);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
392 if(i==0x1B3 || i==0x1B8) break; // found it!
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
393 if(!i || !skip_video_packet(d_video)) break; // EOF?
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
394 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
395
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
396
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
397 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
398