Mercurial > mplayer.hg
annotate libmpdemux/demuxer.c @ 24787:02535b3216c5
Avoid text deformation and subtitles moving outside the screen in pan-and-scan
mode.
For this, crop amounts are passed from vo_gl as negative margins sizes. They
are used to calculate aspect ratio. They are ignored when calculating subtitle
positions, so subtitles will stay on screen most of the time.
Based on a patch by Jindrich Makovicka [makovick gmail com].
author | eugeni |
---|---|
date | Fri, 19 Oct 2007 18:16:23 +0000 |
parents | 9aab9d7b51f0 |
children | ac881f93b661 |
rev | line source |
---|---|
1 | 1 //=================== DEMUXER v2.5 ========================= |
2 | |
1430 | 3 #include <stdio.h> |
4 #include <stdlib.h> | |
3150 | 5 #include <string.h> |
1430 | 6 #include <unistd.h> |
7 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1421
diff
changeset
|
8 #include <sys/types.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1421
diff
changeset
|
9 #include <sys/stat.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1421
diff
changeset
|
10 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
11 #include "config.h" |
1567 | 12 #include "mp_msg.h" |
1584 | 13 #include "help_mp.h" |
17012 | 14 #include "m_config.h" |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
15 |
17200
a1b8eeffdfcd
include fastmemcpy.h before stream.h, so it is used for the stream_read
reimar
parents:
17012
diff
changeset
|
16 #include "libvo/fastmemcpy.h" |
a1b8eeffdfcd
include fastmemcpy.h before stream.h, so it is used for the stream_read
reimar
parents:
17012
diff
changeset
|
17 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22488
diff
changeset
|
18 #include "stream/stream.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
19 #include "demuxer.h" |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
20 #include "stheader.h" |
4551 | 21 #include "mf.h" |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
22 |
17012 | 23 #include "libaf/af_format.h" |
5084 | 24 |
22142
84f95595f31f
Fix a few gcc warnings, approved by Diego and Reimar.
rathann
parents:
21809
diff
changeset
|
25 extern void resync_video_stream(sh_video_t *sh_video); |
16877
9081ae3a702c
move resync_audio_stream after seeking to demuxer.c
reimar
parents:
16572
diff
changeset
|
26 extern void resync_audio_stream(sh_audio_t *sh_audio); |
16175 | 27 |
28 // Demuxer list | |
29 extern demuxer_desc_t demuxer_desc_rawaudio; | |
30 extern demuxer_desc_t demuxer_desc_rawvideo; | |
31 extern demuxer_desc_t demuxer_desc_tv; | |
32 extern demuxer_desc_t demuxer_desc_mf; | |
33 extern demuxer_desc_t demuxer_desc_avi; | |
34 extern demuxer_desc_t demuxer_desc_y4m; | |
35 extern demuxer_desc_t demuxer_desc_asf; | |
36 extern demuxer_desc_t demuxer_desc_nuv; | |
37 extern demuxer_desc_t demuxer_desc_real; | |
38 extern demuxer_desc_t demuxer_desc_smjpeg; | |
39 extern demuxer_desc_t demuxer_desc_matroska; | |
40 extern demuxer_desc_t demuxer_desc_realaudio; | |
41 extern demuxer_desc_t demuxer_desc_vqf; | |
42 extern demuxer_desc_t demuxer_desc_mov; | |
43 extern demuxer_desc_t demuxer_desc_vivo; | |
44 extern demuxer_desc_t demuxer_desc_fli; | |
45 extern demuxer_desc_t demuxer_desc_film; | |
46 extern demuxer_desc_t demuxer_desc_roq; | |
47 extern demuxer_desc_t demuxer_desc_gif; | |
48 extern demuxer_desc_t demuxer_desc_ogg; | |
49 extern demuxer_desc_t demuxer_desc_avs; | |
50 extern demuxer_desc_t demuxer_desc_pva; | |
18128
a1006db4fe43
fixes decoding demoscene.tv nsv at http://213.186.36.129:8000
gpoirier
parents:
17932
diff
changeset
|
51 extern demuxer_desc_t demuxer_desc_nsv; |
16175 | 52 extern demuxer_desc_t demuxer_desc_mpeg_ts; |
53 extern demuxer_desc_t demuxer_desc_lmlm4; | |
54 extern demuxer_desc_t demuxer_desc_mpeg_ps; | |
55 extern demuxer_desc_t demuxer_desc_mpeg_pes; | |
56 extern demuxer_desc_t demuxer_desc_mpeg_es; | |
16310
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16291
diff
changeset
|
57 extern demuxer_desc_t demuxer_desc_mpeg_gxf; |
16175 | 58 extern demuxer_desc_t demuxer_desc_mpeg4_es; |
59 extern demuxer_desc_t demuxer_desc_h264_es; | |
60 extern demuxer_desc_t demuxer_desc_rawdv; | |
16412 | 61 extern demuxer_desc_t demuxer_desc_mpc; |
16175 | 62 extern demuxer_desc_t demuxer_desc_audio; |
63 extern demuxer_desc_t demuxer_desc_xmms; | |
64 extern demuxer_desc_t demuxer_desc_mpeg_ty; | |
65 extern demuxer_desc_t demuxer_desc_rtp; | |
66 extern demuxer_desc_t demuxer_desc_lavf; | |
22971
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22605
diff
changeset
|
67 extern demuxer_desc_t demuxer_desc_lavf_preferred; |
16175 | 68 extern demuxer_desc_t demuxer_desc_aac; |
19861 | 69 extern demuxer_desc_t demuxer_desc_nut; |
16175 | 70 |
71 demuxer_desc_t* demuxer_list[] = { | |
72 &demuxer_desc_rawaudio, | |
73 &demuxer_desc_rawvideo, | |
74 #ifdef USE_TV | |
75 &demuxer_desc_tv, | |
76 #endif | |
77 &demuxer_desc_mf, | |
23121
a257dd426da5
Simplify preprocessor directives: There is a general variable for
diego
parents:
23072
diff
changeset
|
78 #ifdef USE_LIBAVFORMAT |
22971
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22605
diff
changeset
|
79 &demuxer_desc_lavf_preferred, |
23069
93948eb0280f
demuxer_desc_lavf_preferred depends on USE_LIBAVFORMAT or USE_LIBAVFORMAT_SO
nicodvb
parents:
22971
diff
changeset
|
80 #endif |
16175 | 81 &demuxer_desc_avi, |
82 &demuxer_desc_y4m, | |
83 &demuxer_desc_asf, | |
84 &demuxer_desc_nsv, | |
85 &demuxer_desc_nuv, | |
86 &demuxer_desc_real, | |
87 &demuxer_desc_smjpeg, | |
88 &demuxer_desc_matroska, | |
89 &demuxer_desc_realaudio, | |
90 &demuxer_desc_vqf, | |
91 &demuxer_desc_mov, | |
92 &demuxer_desc_vivo, | |
93 &demuxer_desc_fli, | |
94 &demuxer_desc_film, | |
95 &demuxer_desc_roq, | |
96 #ifdef HAVE_GIF | |
97 &demuxer_desc_gif, | |
98 #endif | |
99 #ifdef HAVE_OGGVORBIS | |
100 &demuxer_desc_ogg, | |
101 #endif | |
102 #ifdef USE_WIN32DLL | |
103 &demuxer_desc_avs, | |
104 #endif | |
105 &demuxer_desc_pva, | |
106 &demuxer_desc_mpeg_ts, | |
107 &demuxer_desc_lmlm4, | |
108 &demuxer_desc_mpeg_ps, | |
109 &demuxer_desc_mpeg_pes, | |
110 &demuxer_desc_mpeg_es, | |
16310
fb95057e370e
support MPEG in GXF container with extension-based detection.
reimar
parents:
16291
diff
changeset
|
111 &demuxer_desc_mpeg_gxf, |
16175 | 112 &demuxer_desc_mpeg4_es, |
113 &demuxer_desc_h264_es, | |
21767
ff8dbfde335e
don't compile demux_mpc.c when libmpcdec is disabled
aurel
parents:
20948
diff
changeset
|
114 #ifdef MUSEPACK |
16412 | 115 &demuxer_desc_mpc, |
21767
ff8dbfde335e
don't compile demux_mpc.c when libmpcdec is disabled
aurel
parents:
20948
diff
changeset
|
116 #endif |
16175 | 117 &demuxer_desc_audio, |
118 &demuxer_desc_mpeg_ty, | |
24564
e4a38a7cdb81
libnemesi support, yet another rtsp/rtp library...
lu_zero
parents:
24257
diff
changeset
|
119 #if defined(STREAMING_LIVE555) || defined(LIBNEMESI) |
16175 | 120 &demuxer_desc_rtp, |
121 #endif | |
23121
a257dd426da5
Simplify preprocessor directives: There is a general variable for
diego
parents:
23072
diff
changeset
|
122 #ifdef USE_LIBAVFORMAT |
16175 | 123 &demuxer_desc_lavf, |
124 #endif | |
18900
0b53e6d1b27f
move some ill-behaving demuxers further down the list
reimar
parents:
18708
diff
changeset
|
125 #ifdef HAVE_LIBDV095 |
0b53e6d1b27f
move some ill-behaving demuxers further down the list
reimar
parents:
18708
diff
changeset
|
126 &demuxer_desc_rawdv, |
0b53e6d1b27f
move some ill-behaving demuxers further down the list
reimar
parents:
18708
diff
changeset
|
127 #endif |
16175 | 128 &demuxer_desc_aac, |
19861 | 129 #ifdef HAVE_LIBNUT |
130 &demuxer_desc_nut, | |
131 #endif | |
18900
0b53e6d1b27f
move some ill-behaving demuxers further down the list
reimar
parents:
18708
diff
changeset
|
132 #ifdef HAVE_XMMS |
0b53e6d1b27f
move some ill-behaving demuxers further down the list
reimar
parents:
18708
diff
changeset
|
133 &demuxer_desc_xmms, |
0b53e6d1b27f
move some ill-behaving demuxers further down the list
reimar
parents:
18708
diff
changeset
|
134 #endif |
16175 | 135 NULL |
136 }; | |
137 | |
1643 | 138 void free_demuxer_stream(demux_stream_t *ds){ |
139 ds_free_packs(ds); | |
140 free(ds); | |
141 } | |
142 | |
1 | 143 demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){ |
144 demux_stream_t* ds=malloc(sizeof(demux_stream_t)); | |
145 ds->buffer_pos=ds->buffer_size=0; | |
146 ds->buffer=NULL; | |
147 ds->pts=0; | |
746 | 148 ds->pts_bytes=0; |
1 | 149 ds->eof=0; |
150 ds->pos=0; | |
151 ds->dpos=0; | |
889 | 152 ds->pack_no=0; |
1 | 153 //--------------- |
154 ds->packs=0; | |
155 ds->bytes=0; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
156 ds->first=ds->last=ds->current=NULL; |
1 | 157 ds->id=id; |
158 ds->demuxer=demuxer; | |
159 //---------------- | |
160 ds->asf_seq=-1; | |
161 ds->asf_packet=NULL; | |
291 | 162 //---------------- |
7754 | 163 ds->ss_mul=ds->ss_div=0; |
2419 | 164 //---------------- |
291 | 165 ds->sh=NULL; |
1 | 166 return ds; |
167 } | |
168 | |
16175 | 169 |
170 /** | |
171 * Get demuxer description structure for a given demuxer type | |
172 * | |
173 * @param file_format type of the demuxer | |
174 * @return structure for the demuxer, NULL if not found | |
175 */ | |
176 static demuxer_desc_t* get_demuxer_desc_from_type(int file_format) | |
177 { | |
178 int i; | |
179 | |
180 for (i = 0; demuxer_list[i]; i++) | |
181 if (file_format == demuxer_list[i]->type) | |
182 return demuxer_list[i]; | |
183 | |
184 return NULL; | |
185 } | |
186 | |
187 | |
188 demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id,char *filename){ | |
1 | 189 demuxer_t *d=malloc(sizeof(demuxer_t)); |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
190 memset(d,0,sizeof(demuxer_t)); |
1 | 191 d->stream=stream; |
21780
c9795699c414
added stream_pts to demuxer_t and demux_packet_t to hold the time value reported by the stream layer
nicodvb
parents:
21767
diff
changeset
|
192 d->stream_pts = MP_NOPTS_VALUE; |
598 | 193 d->movi_start=stream->start_pos; |
194 d->movi_end=stream->end_pos; | |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
195 d->seekable=1; |
1 | 196 d->synced=0; |
197 d->filepos=0; | |
198 d->audio=new_demuxer_stream(d,a_id); | |
199 d->video=new_demuxer_stream(d,v_id); | |
552 | 200 d->sub=new_demuxer_stream(d,s_id); |
1 | 201 d->type=type; |
16175 | 202 if(type) |
203 if (!(d->desc = get_demuxer_desc_from_type(type))) | |
204 mp_msg(MSGT_DEMUXER,MSGL_ERR,"BUG! Invalid demuxer type in new_demuxer(), big troubles ahead."); | |
205 if(filename) // Filename hack for avs_check_file | |
206 d->filename=strdup(filename); | |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
207 stream_reset(stream); |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
208 stream_seek(stream,stream->start_pos); |
1 | 209 return d; |
210 } | |
211 | |
24022
4d576e0ed40b
When a new subtitle stream becomes available check if it is the one that
reimar
parents:
23865
diff
changeset
|
212 extern int dvdsub_id; |
4d576e0ed40b
When a new subtitle stream becomes available check if it is the one that
reimar
parents:
23865
diff
changeset
|
213 |
20872
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
214 sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) { |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
215 if (id > MAX_S_STREAMS - 1 || id < 0) { |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
216 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested sub stream id overflow (%d > %d)\n", |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
217 id, MAX_S_STREAMS); |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
218 return NULL; |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
219 } |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
220 if (demuxer->s_streams[id]) |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
221 mp_msg(MSGT_DEMUXER, MSGL_WARN, "Sub stream %i redefined\n", id); |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
222 else { |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
223 sh_sub_t *sh = calloc(1, sizeof(sh_sub_t)); |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
224 demuxer->s_streams[id] = sh; |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
225 sh->sid = sid; |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
226 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid); |
24022
4d576e0ed40b
When a new subtitle stream becomes available check if it is the one that
reimar
parents:
23865
diff
changeset
|
227 if (dvdsub_id == id) { |
4d576e0ed40b
When a new subtitle stream becomes available check if it is the one that
reimar
parents:
23865
diff
changeset
|
228 demuxer->sub->id = id; |
4d576e0ed40b
When a new subtitle stream becomes available check if it is the one that
reimar
parents:
23865
diff
changeset
|
229 demuxer->sub->sh = sh; |
4d576e0ed40b
When a new subtitle stream becomes available check if it is the one that
reimar
parents:
23865
diff
changeset
|
230 } |
20872
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
231 } |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
232 return demuxer->s_streams[id]; |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
233 } |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
234 |
23592 | 235 void free_sh_sub(sh_sub_t *sh) { |
236 mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_sub at %p\n", sh); | |
237 free(sh); | |
238 } | |
239 | |
19540 | 240 sh_audio_t* new_sh_audio_aid(demuxer_t *demuxer,int id,int aid){ |
5084 | 241 if(id > MAX_A_STREAMS-1 || id < 0) |
4642 | 242 { |
243 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested audio stream id overflow (%d > %d)\n", | |
244 id, MAX_A_STREAMS); | |
245 return NULL; | |
246 } | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
247 if(demuxer->a_streams[id]){ |
1584 | 248 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_AudioStreamRedefined,id); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
249 } else { |
13357
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
250 sh_audio_t *sh; |
6951 | 251 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundAudioStream,id); |
20072 | 252 demuxer->a_streams[id]=calloc(1, sizeof(sh_audio_t)); |
13357
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
253 sh = demuxer->a_streams[id]; |
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
254 // set some defaults |
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
255 sh->samplesize=2; |
14245 | 256 sh->sample_format=AF_FORMAT_S16_NE; |
13357
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
257 sh->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/ |
18242
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
258 sh->pts=MP_NOPTS_VALUE; |
19540 | 259 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_ID=%d\n", aid); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
260 } |
19540 | 261 ((sh_audio_t *)demuxer->a_streams[id])->aid = aid; |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
262 return demuxer->a_streams[id]; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
263 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
264 |
18708
9e2b300db17b
Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents:
18404
diff
changeset
|
265 void free_sh_audio(demuxer_t *demuxer, int id) { |
9e2b300db17b
Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents:
18404
diff
changeset
|
266 sh_audio_t *sh = demuxer->a_streams[id]; |
9e2b300db17b
Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents:
18404
diff
changeset
|
267 demuxer->a_streams[id] = NULL; |
13946 | 268 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_audio at %p\n",sh); |
1643 | 269 if(sh->wf) free(sh->wf); |
270 free(sh); | |
271 } | |
272 | |
19540 | 273 sh_video_t* new_sh_video_vid(demuxer_t *demuxer,int id,int vid){ |
5084 | 274 if(id > MAX_V_STREAMS-1 || id < 0) |
4642 | 275 { |
276 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested video stream id overflow (%d > %d)\n", | |
277 id, MAX_V_STREAMS); | |
278 return NULL; | |
279 } | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
280 if(demuxer->v_streams[id]){ |
1584 | 281 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_VideoStreamRedefined,id); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
282 } else { |
6951 | 283 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundVideoStream,id); |
20072 | 284 demuxer->v_streams[id]=calloc(1, sizeof(sh_video_t)); |
19540 | 285 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ID=%d\n", vid); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
286 } |
19540 | 287 ((sh_video_t *)demuxer->v_streams[id])->vid = vid; |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
288 return demuxer->v_streams[id]; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
289 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
290 |
1643 | 291 void free_sh_video(sh_video_t* sh){ |
13946 | 292 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_video at %p\n",sh); |
1657 | 293 if(sh->bih) free(sh->bih); |
1643 | 294 free(sh); |
295 } | |
296 | |
297 void free_demuxer(demuxer_t *demuxer){ | |
298 int i; | |
13946 | 299 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing demuxer at %p\n",demuxer); |
16175 | 300 if(demuxer->desc->close) |
301 demuxer->desc->close(demuxer); | |
302 // Very ugly hack to make it behave like old implementation | |
303 if (demuxer->desc->type == DEMUXER_TYPE_DEMUXERS) | |
16291
f443f849531b
Do not free demuxer before using demuxer->desc->type (happened when using -audiofile).
reimar
parents:
16198
diff
changeset
|
304 goto skip_streamfree; |
1643 | 305 // free streams: |
14666
91bbfcb66883
Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents:
14502
diff
changeset
|
306 for(i = 0; i < MAX_A_STREAMS; i++) |
18708
9e2b300db17b
Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents:
18404
diff
changeset
|
307 if(demuxer->a_streams[i]) free_sh_audio(demuxer, i); |
14666
91bbfcb66883
Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents:
14502
diff
changeset
|
308 for(i = 0; i < MAX_V_STREAMS; i++) |
1643 | 309 if(demuxer->v_streams[i]) free_sh_video(demuxer->v_streams[i]); |
23592 | 310 for(i = 0; i < MAX_S_STREAMS; i++) |
311 if(demuxer->s_streams[i]) free_sh_sub(demuxer->s_streams[i]); | |
1643 | 312 // free demuxers: |
313 free_demuxer_stream(demuxer->audio); | |
314 free_demuxer_stream(demuxer->video); | |
5412 | 315 free_demuxer_stream(demuxer->sub); |
16291
f443f849531b
Do not free demuxer before using demuxer->desc->type (happened when using -audiofile).
reimar
parents:
16198
diff
changeset
|
316 skip_streamfree: |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
317 if(demuxer->info) { |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
318 for(i=0;demuxer->info[i] != NULL; i++) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
319 free(demuxer->info[i]); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
320 free(demuxer->info); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
321 } |
16175 | 322 if(demuxer->filename) |
323 free(demuxer->filename); | |
19342 | 324 if (demuxer->chapters) { |
325 for (i=0; i<demuxer->num_chapters; i++) | |
326 if (demuxer->chapters[i].name) | |
327 free(demuxer->chapters[i].name); | |
328 free(demuxer->chapters); | |
329 } | |
1643 | 330 free(demuxer); |
331 } | |
332 | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
333 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
334 void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){ |
1 | 335 // demux_packet_t* dp=new_demux_packet(len); |
336 // stream_read(stream,dp->buffer,len); | |
337 // dp->pts=pts; //(float)pts/90000.0f; | |
338 // dp->pos=pos; | |
339 // append packet to DS stream: | |
340 ++ds->packs; | |
341 ds->bytes+=dp->len; | |
342 if(ds->last){ | |
343 // next packet in stream | |
344 ds->last->next=dp; | |
345 ds->last=dp; | |
346 } else { | |
347 // first packet in stream | |
348 ds->first=ds->last=dp; | |
349 } | |
1567 | 350 mp_dbg(MSGT_DEMUXER,MSGL_DBG2,"DEMUX: Append packet to %s, len=%d pts=%5.3f pos=%u [packs: A=%d V=%d]\n", |
1 | 351 (ds==ds->demuxer->audio)?"d_audio":"d_video", |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1421
diff
changeset
|
352 dp->len,dp->pts,(unsigned int)dp->pos,ds->demuxer->audio->packs,ds->demuxer->video->packs); |
1 | 353 } |
354 | |
18309
87161f96fa66
Change common pts variables from floats to doubles. Individual demuxers
uau
parents:
18242
diff
changeset
|
355 void ds_read_packet(demux_stream_t *ds, stream_t *stream, int len, double pts, off_t pos, int flags) { |
1 | 356 demux_packet_t* dp=new_demux_packet(len); |
10891
65ed62e138fa
Fixed 'reading after EOF'. demuxers didn't check, how many they've read!
lumag
parents:
10882
diff
changeset
|
357 len = stream_read(stream,dp->buffer,len); |
65ed62e138fa
Fixed 'reading after EOF'. demuxers didn't check, how many they've read!
lumag
parents:
10882
diff
changeset
|
358 resize_demux_packet(dp, len); |
1 | 359 dp->pts=pts; //(float)pts/90000.0f; |
360 dp->pos=pos; | |
979 | 361 dp->flags=flags; |
1 | 362 // append packet to DS stream: |
363 ds_add_packet(ds,dp); | |
364 } | |
365 | |
366 // return value: | |
367 // 0 = EOF or no stream found or invalid type | |
368 // 1 = successfully read a packet | |
369 | |
370 int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){ | |
371 // Note: parameter 'ds' can be NULL! | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
372 // printf("demux->type=%d\n",demux->type); |
16175 | 373 return demux->desc->fill_buffer(demux, ds); |
1 | 374 } |
375 | |
376 // return value: | |
377 // 0 = EOF | |
378 // 1 = succesfull | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
379 int ds_fill_buffer(demux_stream_t *ds){ |
1 | 380 demuxer_t *demux=ds->demuxer; |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
381 if(ds->current) free_demux_packet(ds->current); |
17932 | 382 if( mp_msg_test(MSGT_DEMUXER,MSGL_DBG3) ){ |
1567 | 383 if(ds==demux->audio) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_audio) called\n");else |
384 if(ds==demux->video) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_video) called\n");else | |
5470
e80d66b5e4a7
added debug printf for dvdsub - from dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents:
5469
diff
changeset
|
385 if(ds==demux->sub) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_sub) called\n");else |
1567 | 386 mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(unknown 0x%X) called\n",(unsigned int)ds); |
1 | 387 } |
388 while(1){ | |
389 if(ds->packs){ | |
390 demux_packet_t *p=ds->first; | |
391 // copy useful data: | |
392 ds->buffer=p->buffer; | |
393 ds->buffer_pos=0; | |
394 ds->buffer_size=p->len; | |
395 ds->pos=p->pos; | |
396 ds->dpos+=p->len; // !!! | |
889 | 397 ++ds->pack_no; |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
398 if (p->pts != (correct_pts ? MP_NOPTS_VALUE : 0)) { |
746 | 399 ds->pts=p->pts; |
400 ds->pts_bytes=0; | |
401 } | |
402 ds->pts_bytes+=p->len; // !!! | |
21780
c9795699c414
added stream_pts to demuxer_t and demux_packet_t to hold the time value reported by the stream layer
nicodvb
parents:
21767
diff
changeset
|
403 if(p->stream_pts != MP_NOPTS_VALUE) demux->stream_pts=p->stream_pts; |
979 | 404 ds->flags=p->flags; |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
405 // unlink packet: |
1 | 406 ds->bytes-=p->len; |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
407 ds->current=p; |
1 | 408 ds->first=p->next; |
409 if(!ds->first) ds->last=NULL; | |
410 --ds->packs; | |
411 return 1; //ds->buffer_size; | |
412 } | |
413 if(demux->audio->packs>=MAX_PACKS || demux->audio->bytes>=MAX_PACK_BYTES){ | |
1584 | 414 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyAudioInBuffer,demux->audio->packs,demux->audio->bytes); |
415 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); | |
1 | 416 break; |
417 } | |
418 if(demux->video->packs>=MAX_PACKS || demux->video->bytes>=MAX_PACK_BYTES){ | |
1584 | 419 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyVideoInBuffer,demux->video->packs,demux->video->bytes); |
420 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); | |
1 | 421 break; |
422 } | |
1421 | 423 if(!demux_fill_buffer(demux,ds)){ |
1567 | 424 mp_dbg(MSGT_DEMUXER,MSGL_DBG2,"ds_fill_buffer()->demux_fill_buffer() failed\n"); |
1421 | 425 break; // EOF |
426 } | |
1 | 427 } |
428 ds->buffer_pos=ds->buffer_size=0; | |
429 ds->buffer=NULL; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
430 ds->current=NULL; |
1567 | 431 mp_msg(MSGT_DEMUXER,MSGL_V,"ds_fill_buffer: EOF reached (stream: %s) \n",ds==demux->audio?"audio":"video"); |
1 | 432 ds->eof=1; |
433 return 0; | |
434 } | |
435 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
436 int demux_read_data(demux_stream_t *ds,unsigned char* mem,int len){ |
1 | 437 int x; |
438 int bytes=0; | |
439 while(len>0){ | |
440 x=ds->buffer_size-ds->buffer_pos; | |
441 if(x==0){ | |
442 if(!ds_fill_buffer(ds)) return bytes; | |
443 } else { | |
444 if(x>len) x=len; | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
23121
diff
changeset
|
445 if(mem) fast_memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x); |
1 | 446 bytes+=x;len-=x;ds->buffer_pos+=x; |
447 } | |
448 } | |
449 return bytes; | |
450 } | |
451 | |
746 | 452 int demux_read_data_pack(demux_stream_t *ds,unsigned char* mem,int len){ |
453 int x; | |
454 int bytes=0; | |
455 while(len>0){ | |
456 x=ds->buffer_size-ds->buffer_pos; | |
457 if(x==0){ | |
458 if(!ds_fill_buffer(ds)) return bytes; | |
459 } else { | |
460 if(x>len) x=len; | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
23121
diff
changeset
|
461 if(mem) fast_memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x); |
746 | 462 bytes+=x;len-=x;ds->buffer_pos+=x; |
463 return bytes; // stop at end of package! (for correct timestamping) | |
464 } | |
465 } | |
466 return bytes; | |
467 } | |
468 | |
17417
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
469 /** |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
470 * \brief read data until the given 3-byte pattern is encountered, up to maxlen |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
471 * \param mem memory to read data into, may be NULL to discard data |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
472 * \param maxlen maximum number of bytes to read |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
473 * \param read number of bytes actually read |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
474 * \param pattern pattern to search for (lowest 8 bits are ignored) |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
475 * \return whether pattern was found |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
476 */ |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
477 int demux_pattern_3(demux_stream_t *ds, unsigned char *mem, int maxlen, |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
478 int *read, uint32_t pattern) { |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
479 register uint32_t head = 0xffffff00; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
480 register uint32_t pat = pattern & 0xffffff00; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
481 int total_len = 0; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
482 do { |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
483 register unsigned char *ds_buf = &ds->buffer[ds->buffer_size]; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
484 int len = ds->buffer_size - ds->buffer_pos; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
485 register long pos = -len; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
486 if (unlikely(pos >= 0)) { // buffer is empty |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
487 ds_fill_buffer(ds); |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
488 continue; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
489 } |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
490 do { |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
491 head |= ds_buf[pos]; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
492 head <<= 8; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
493 } while (++pos && head != pat); |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
494 len += pos; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
495 if (total_len + len > maxlen) |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
496 len = maxlen - total_len; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
497 len = demux_read_data(ds, mem ? &mem[total_len] : NULL, len); |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
498 total_len += len; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
499 } while ((head != pat || total_len < 3) && total_len < maxlen && !ds->eof); |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
500 if (read) |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
501 *read = total_len; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
502 return total_len >= 3 && head == pat; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
503 } |
746 | 504 |
1 | 505 void ds_free_packs(demux_stream_t *ds){ |
506 demux_packet_t *dp=ds->first; | |
507 while(dp){ | |
508 demux_packet_t *dn=dp->next; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
509 free_demux_packet(dp); |
1 | 510 dp=dn; |
511 } | |
512 if(ds->asf_packet){ | |
513 // free unfinished .asf fragments: | |
514 free(ds->asf_packet->buffer); | |
515 free(ds->asf_packet); | |
516 ds->asf_packet=NULL; | |
517 } | |
518 ds->first=ds->last=NULL; | |
519 ds->packs=0; // !!!!! | |
520 ds->bytes=0; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
521 if(ds->current) free_demux_packet(ds->current); |
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
522 ds->current=NULL; |
1 | 523 ds->buffer=NULL; |
524 ds->buffer_pos=ds->buffer_size; | |
828 | 525 ds->pts=0; ds->pts_bytes=0; |
1 | 526 } |
527 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
528 int ds_get_packet(demux_stream_t *ds,unsigned char **start){ |
1 | 529 while(1){ |
530 int len; | |
531 if(ds->buffer_pos>=ds->buffer_size){ | |
532 if(!ds_fill_buffer(ds)){ | |
533 // EOF | |
534 *start = NULL; | |
535 return -1; | |
536 } | |
537 } | |
538 len=ds->buffer_size-ds->buffer_pos; | |
539 *start = &ds->buffer[ds->buffer_pos]; | |
540 ds->buffer_pos+=len; | |
541 return len; | |
542 } | |
543 } | |
554 | 544 |
18242
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
545 int ds_get_packet_pts(demux_stream_t *ds,unsigned char **start, double *pts) |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
546 { |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
547 int len; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
548 *pts = MP_NOPTS_VALUE; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
549 if(ds->buffer_pos>=ds->buffer_size){ |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
550 if (!ds_fill_buffer(ds)) { |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
551 // EOF |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
552 *start = NULL; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
553 return -1; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
554 } |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
555 } |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
556 // Should use MP_NOPTS_VALUE for "unknown pts" in the packets too |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
557 // Return pts unless this read starts from the middle of a packet |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
558 if (!ds->buffer_pos && (correct_pts || ds->current->pts)) |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
559 *pts = ds->current->pts; |
18242
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
560 len=ds->buffer_size-ds->buffer_pos; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
561 *start = &ds->buffer[ds->buffer_pos]; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
562 ds->buffer_pos+=len; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
563 return len; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
564 } |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
565 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
566 int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start){ |
554 | 567 while(1){ |
568 int len; | |
569 if(ds->buffer_pos>=ds->buffer_size){ | |
570 *start = NULL; | |
571 if(!ds->packs) return -1; // no sub | |
572 if(!ds_fill_buffer(ds)) return -1; // EOF | |
573 } | |
574 len=ds->buffer_size-ds->buffer_pos; | |
575 *start = &ds->buffer[ds->buffer_pos]; | |
576 ds->buffer_pos+=len; | |
577 return len; | |
578 } | |
579 } | |
580 | |
18309
87161f96fa66
Change common pts variables from floats to doubles. Individual demuxers
uau
parents:
18242
diff
changeset
|
581 double ds_get_next_pts(demux_stream_t *ds) |
87161f96fa66
Change common pts variables from floats to doubles. Individual demuxers
uau
parents:
18242
diff
changeset
|
582 { |
5930
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
583 demuxer_t* demux = ds->demuxer; |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
584 while(!ds->first) { |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
585 if(demux->audio->packs>=MAX_PACKS || demux->audio->bytes>=MAX_PACK_BYTES){ |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
586 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyAudioInBuffer,demux->audio->packs,demux->audio->bytes); |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
587 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); |
21809
2c473e083c70
Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents:
21785
diff
changeset
|
588 return MP_NOPTS_VALUE; |
5930
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
589 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
590 if(demux->video->packs>=MAX_PACKS || demux->video->bytes>=MAX_PACK_BYTES){ |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
591 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyVideoInBuffer,demux->video->packs,demux->video->bytes); |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
592 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); |
21809
2c473e083c70
Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents:
21785
diff
changeset
|
593 return MP_NOPTS_VALUE; |
5930
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
594 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
595 if(!demux_fill_buffer(demux,ds)) |
21809
2c473e083c70
Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents:
21785
diff
changeset
|
596 return MP_NOPTS_VALUE; |
5930
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
597 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
598 return ds->first->pts; |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
599 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
600 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
601 // ==================================================================== |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
602 |
16175 | 603 void demuxer_help(void) |
604 { | |
605 int i; | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
606 |
16175 | 607 mp_msg(MSGT_DEMUXER, MSGL_INFO, "Available demuxers:\n"); |
608 mp_msg(MSGT_DEMUXER, MSGL_INFO, " demuxer: type info: (comment)\n"); | |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18128
diff
changeset
|
609 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DEMUXERS\n"); |
16175 | 610 for (i = 0; demuxer_list[i]; i++) { |
611 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Don't display special demuxers | |
612 continue; | |
613 if (demuxer_list[i]->comment && strlen(demuxer_list[i]->comment)) | |
614 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s (%s)\n", | |
615 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info, demuxer_list[i]->comment); | |
616 else | |
617 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s\n", | |
618 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info); | |
619 } | |
620 } | |
621 | |
14693
37116118ab6a
avisynth demuxer patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents:
14666
diff
changeset
|
622 |
16175 | 623 /** |
624 * Get demuxer type for a given demuxer name | |
625 * | |
626 * @param demuxer_name string with demuxer name of demuxer number | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
627 * @param force will be set if demuxer should be forced. |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
628 * May be NULL. |
16175 | 629 * @return DEMUXER_TYPE_xxx, -1 if error or not found |
630 */ | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
631 int get_demuxer_type_from_name(char *demuxer_name, int *force) |
16175 | 632 { |
633 int i; | |
634 long type_int; | |
635 char *endptr; | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
5107
diff
changeset
|
636 |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
637 if (!demuxer_name || !demuxer_name[0]) |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
638 return DEMUXER_TYPE_UNKNOWN; |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
639 if (force) *force = demuxer_name[0] == '+'; |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
640 if (demuxer_name[0] == '+') |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
641 demuxer_name = &demuxer_name[1]; |
16175 | 642 for (i = 0; demuxer_list[i]; i++) { |
643 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Can't select special demuxers from commandline | |
644 continue; | |
645 if (strcmp(demuxer_name, demuxer_list[i]->name) == 0) | |
646 return demuxer_list[i]->type; | |
647 } | |
648 | |
649 // No match found, try to parse name as an integer (demuxer number) | |
650 type_int = strtol(demuxer_name, &endptr, 0); | |
651 if (*endptr) // Conversion failed | |
652 return -1; | |
653 if ((type_int > 0) && (type_int <= DEMUXER_TYPE_MAX)) | |
654 return (int)type_int; | |
655 | |
656 return -1; | |
657 } | |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
3786
diff
changeset
|
658 |
9751
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
659 int extension_parsing=1; // 0=off 1=mixed (used only for unstable formats) |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
6192
diff
changeset
|
660 |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
661 int correct_pts=0; |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
662 |
9751
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
663 /* |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
664 NOTE : Several demuxers may be opened at the same time so |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
665 demuxers should NEVER rely on an external var to enable them |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
666 self. If a demuxer can't do any autodection it should only use |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
667 file_format. The user can explictly set file_format with the -demuxer |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
668 option so there is really no need for another extra var. |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
669 For conivence an option can be added to set file_format directly |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
670 to the right type (ex: rawaudio,rawvideo). |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
671 Also the stream can override the file_format so a demuxer wich rely |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
672 on a special stream type can set file_format at the stream level |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
673 (ex: tv,mf). |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
674 */ |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
675 |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
676 static demuxer_t* demux_open_stream(stream_t *stream, int file_format, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
677 int force, int audio_id, int video_id, int dvdsub_id, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
678 char* filename) { |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
679 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
680 //int file_format=(*file_format_ptr); |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
681 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
682 demuxer_t *demuxer=NULL; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
683 |
16175 | 684 sh_video_t *sh_video=NULL; |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
685 |
16175 | 686 demuxer_desc_t *demuxer_desc; |
23865 | 687 int fformat = 0; |
16175 | 688 int i; |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
689 |
1659 | 690 //printf("demux_open(%p,%d,%d,%d,%d) \n",stream,file_format,audio_id,video_id,dvdsub_id); |
691 | |
16175 | 692 // If somebody requested a demuxer check it |
693 if (file_format) { | |
694 if ((demuxer_desc = get_demuxer_desc_from_type(file_format))) { | |
695 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename); | |
20318
d8d2bc754413
Fix opening of demuxers without check_file function, broken by r20309.
reimar
parents:
20303
diff
changeset
|
696 if (demuxer_desc->check_file) |
16413
a07354861027
execute the check function even when a demuxer is forced, to avoid crashes.
reimar
parents:
16412
diff
changeset
|
697 fformat = demuxer_desc->check_file(demuxer); |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
698 if (force || !demuxer_desc->check_file) |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
699 fformat = demuxer_desc->type; |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
700 if (fformat != 0) { |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
701 if (fformat == demuxer_desc->type) { |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
702 demuxer_t *demux2 = demuxer; |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
703 // Move messages to demuxer detection code? |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
704 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc); |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
705 file_format = demuxer_desc->type = fformat; |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
706 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) { |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
707 demuxer = demux2; |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
708 goto dmx_open; |
16175 | 709 } |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
710 } else { |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
711 // Format changed after check, recurse |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
712 free_demuxer(demuxer); |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
713 return demux_open_stream(stream, fformat, force, |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
714 audio_id, video_id, dvdsub_id, filename); |
20303 | 715 } |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
716 } |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
717 // Check failed for forced demuxer, quit |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
718 free_demuxer(demuxer); |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
719 return NULL; |
16175 | 720 } |
9065 | 721 } |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
6192
diff
changeset
|
722 |
16175 | 723 // Test demuxers with safe file checks |
724 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) { | |
725 if (demuxer_desc->safe_check) { | |
726 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename); | |
727 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) { | |
728 if (fformat == demuxer_desc->type) { | |
20303 | 729 demuxer_t *demux2 = demuxer; |
16175 | 730 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc); |
731 file_format = fformat; | |
20303 | 732 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) { |
733 demuxer = demux2; | |
734 goto dmx_open; | |
735 } | |
16175 | 736 } else { |
16326
88b9c7b0e773
Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents:
16321
diff
changeset
|
737 if (fformat == DEMUXER_TYPE_PLAYLIST) |
88b9c7b0e773
Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents:
16321
diff
changeset
|
738 return demuxer; // handled in mplayer.c |
16175 | 739 // Format changed after check, recurse |
740 free_demuxer(demuxer); | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
741 demuxer=demux_open_stream(stream, fformat, force, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
742 audio_id, video_id, dvdsub_id, filename); |
16175 | 743 if(demuxer) return demuxer; // done! |
744 file_format = DEMUXER_TYPE_UNKNOWN; | |
745 } | |
20303 | 746 } |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
747 free_demuxer(demuxer); |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
748 demuxer = NULL; |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
749 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
750 } |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
751 |
16175 | 752 // If no forced demuxer perform file extension based detection |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
753 // Ok. We're over the stable detectable fileformats, the next ones are a bit |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
754 // fuzzy. So by default (extension_parsing==1) try extension-based detection |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
755 // first: |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
756 if(file_format==DEMUXER_TYPE_UNKNOWN && filename && extension_parsing==1){ |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
757 file_format=demuxer_type_by_filename(filename); |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
758 if(file_format!=DEMUXER_TYPE_UNKNOWN){ |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
759 // we like recursion :) |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
760 demuxer=demux_open_stream(stream, file_format, force, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
761 audio_id, video_id, dvdsub_id, filename); |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
762 if(demuxer) return demuxer; // done! |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
763 file_format=DEMUXER_TYPE_UNKNOWN; // continue fuzzy guessing... |
10379
296064e1baf0
fixed mpeg-ps ext-based detection sig11 bug reporetd by Raindel Shachar
arpi
parents:
10310
diff
changeset
|
764 mp_msg(MSGT_DEMUXER,MSGL_V,"demuxer: continue fuzzy content-based format guessing...\n"); |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
765 } |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
766 } |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
767 |
16175 | 768 // Try detection for all other demuxers |
769 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) { | |
770 if (!demuxer_desc->safe_check && demuxer_desc->check_file) { | |
771 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename); | |
772 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) { | |
773 if (fformat == demuxer_desc->type) { | |
20303 | 774 demuxer_t *demux2 = demuxer; |
16175 | 775 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc); |
776 file_format = fformat; | |
20303 | 777 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) { |
778 demuxer = demux2; | |
779 goto dmx_open; | |
780 } | |
16175 | 781 } else { |
16326
88b9c7b0e773
Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents:
16321
diff
changeset
|
782 if (fformat == DEMUXER_TYPE_PLAYLIST) |
88b9c7b0e773
Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents:
16321
diff
changeset
|
783 return demuxer; // handled in mplayer.c |
16175 | 784 // Format changed after check, recurse |
785 free_demuxer(demuxer); | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
786 demuxer=demux_open_stream(stream, fformat, force, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
787 audio_id, video_id, dvdsub_id, filename); |
16175 | 788 if(demuxer) return demuxer; // done! |
789 file_format = DEMUXER_TYPE_UNKNOWN; | |
790 } | |
20303 | 791 } |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
792 free_demuxer(demuxer); |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
793 demuxer = NULL; |
4189 | 794 } |
795 } | |
15670 | 796 |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
797 return NULL; |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
798 //====== File format recognized, set up these for compatibility: ========= |
16175 | 799 dmx_open: |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
800 |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
801 demuxer->file_format=file_format; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
802 |
16477 | 803 if ((sh_video=demuxer->video->sh) && sh_video->bih){ |
804 int biComp=le2me_32(sh_video->bih->biCompression); | |
17366 | 805 mp_msg(MSGT_DEMUX,MSGL_INFO,"VIDEO: [%.4s] %dx%d %dbpp %5.3f fps %5.1f kbps (%4.1f kbyte/s)\n", |
16477 | 806 (char *)&biComp, |
13301
638673d1f83a
show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents:
13006
diff
changeset
|
807 sh_video->bih->biWidth, |
638673d1f83a
show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents:
13006
diff
changeset
|
808 sh_video->bih->biHeight, |
638673d1f83a
show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents:
13006
diff
changeset
|
809 sh_video->bih->biBitCount, |
638673d1f83a
show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents:
13006
diff
changeset
|
810 sh_video->fps, |
638673d1f83a
show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents:
13006
diff
changeset
|
811 sh_video->i_bps*0.008f, |
638673d1f83a
show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents:
13006
diff
changeset
|
812 sh_video->i_bps/1024.0f ); |
16477 | 813 } |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
814 return demuxer; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
815 } |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
816 |
6623 | 817 char* audio_stream = NULL; |
7867 | 818 char* sub_stream = NULL; |
16175 | 819 int demuxer_type = 0; // used by rawaudio and rawvideo |
9709 | 820 int audio_stream_cache = 0; |
7867 | 821 |
16175 | 822 char *demuxer_name = NULL; // parameter from -demuxer |
823 char *audio_demuxer_name = NULL; // parameter from -audio-demuxer | |
824 char *sub_demuxer_name = NULL; // parameter from -sub-demuxer | |
825 | |
7867 | 826 extern int hr_mp3_seek; |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
827 |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
12434
diff
changeset
|
828 extern float stream_cache_min_percent; |
16152
10a69a812eff
remove unused cache-prefill and create cache-seek-min that controls when seek_long is prefered over waiting for cache to fill
iive
parents:
15958
diff
changeset
|
829 extern float stream_cache_seek_min_percent; |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
12434
diff
changeset
|
830 |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
831 demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int dvdsub_id,char* filename){ |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
832 stream_t *as = NULL,*ss = NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
833 demuxer_t *vd,*ad = NULL,*sd = NULL; |
12223 | 834 int afmt =DEMUXER_TYPE_UNKNOWN,sfmt = DEMUXER_TYPE_UNKNOWN ; |
16175 | 835 int audio_demuxer_type = 0, sub_demuxer_type = 0; |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
836 int demuxer_force = 0, audio_demuxer_force = 0, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
837 sub_demuxer_force = 0; |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
838 |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
839 if ((demuxer_type = get_demuxer_type_from_name(demuxer_name, &demuxer_force)) < 0) { |
16175 | 840 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-demuxer %s does not exist.\n",demuxer_name); |
841 } | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
842 if ((audio_demuxer_type = get_demuxer_type_from_name(audio_demuxer_name, &audio_demuxer_force)) < 0) { |
16175 | 843 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-audio-demuxer %s does not exist.\n",audio_demuxer_name); |
844 } | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
845 if ((sub_demuxer_type = get_demuxer_type_from_name(sub_demuxer_name, &sub_demuxer_force)) < 0) { |
16175 | 846 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-sub-demuxer %s does not exist.\n",sub_demuxer_name); |
847 } | |
848 | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
849 if(audio_stream) { |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
850 as = open_stream(audio_stream,0,&afmt); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
851 if(!as) { |
6951 | 852 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_CannotOpenAudioStream,audio_stream); |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
853 return NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
854 } |
9709 | 855 if(audio_stream_cache) { |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
12434
diff
changeset
|
856 if(!stream_enable_cache(as,audio_stream_cache*1024,audio_stream_cache*1024*(stream_cache_min_percent / 100.0), |
16152
10a69a812eff
remove unused cache-prefill and create cache-seek-min that controls when seek_long is prefered over waiting for cache to fill
iive
parents:
15958
diff
changeset
|
857 audio_stream_cache*1024*(stream_cache_seek_min_percent / 100.0))) { |
9709 | 858 free_stream(as); |
859 mp_msg(MSGT_DEMUXER,MSGL_ERR,"Can't enable audio stream cache\n"); | |
860 return NULL; | |
861 } | |
862 } | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
863 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
864 if(sub_stream) { |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
865 ss = open_stream(sub_stream,0,&sfmt); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
866 if(!ss) { |
6951 | 867 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_CannotOpenSubtitlesStream,sub_stream); |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
868 return NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
869 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
870 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
871 |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
872 vd = demux_open_stream(vs, demuxer_type ? demuxer_type : file_format, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
873 demuxer_force, audio_stream ? -2 : audio_id, video_id, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
874 sub_stream ? -2 : dvdsub_id, filename); |
9709 | 875 if(!vd) { |
876 if(as) free_stream(as); | |
877 if(ss) free_stream(ss); | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
878 return NULL; |
9709 | 879 } |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
880 if(as) { |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
881 ad = demux_open_stream(as, audio_demuxer_type ? audio_demuxer_type : afmt, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
882 audio_demuxer_force, audio_id, -2, -2, audio_stream); |
9709 | 883 if(!ad) { |
6951 | 884 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningAudioDemuxerFailed,audio_stream); |
9709 | 885 free_stream(as); |
886 } | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
887 else if(ad->audio->sh && ((sh_audio_t*)ad->audio->sh)->format == 0x55) // MP3 |
7867 | 888 hr_mp3_seek=1; // Enable high res seeking |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
889 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
890 if(ss) { |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
891 sd = demux_open_stream(ss, sub_demuxer_type ? sub_demuxer_type : sfmt, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
892 sub_demuxer_force, -2, -2, dvdsub_id, sub_stream); |
9709 | 893 if(!sd) { |
6951 | 894 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningSubtitlesDemuxerFailed,sub_stream); |
9709 | 895 free_stream(ss); |
896 } | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
897 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
898 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
899 if(ad && sd) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
900 return new_demuxers_demuxer(vd,ad,sd); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
901 else if(ad) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
902 return new_demuxers_demuxer(vd,ad,vd); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
903 else if(sd) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
904 return new_demuxers_demuxer(vd,vd,sd); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
905 else |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
906 return vd; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
907 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
908 |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
909 |
17636 | 910 int demux_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
911 demux_stream_t *d_audio=demuxer->audio; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
912 demux_stream_t *d_video=demuxer->video; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
913 sh_audio_t *sh_audio=d_audio->sh; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
914 sh_video_t *sh_video=d_video->sh; |
20851
6602a90a06ec
consistency fix: STREAM_CTRL_GET_TIME_LENGTH and STREAM_CTRL_GET_CURRENT_TIME now return time in (double) seconds
nicodvb
parents:
20841
diff
changeset
|
915 double tmp = 0; |
20748
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
916 double pts; |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
917 |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
918 if(!demuxer->seekable){ |
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
919 if(demuxer->file_format==DEMUXER_TYPE_AVI) |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1659
diff
changeset
|
920 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekRawAVI); |
2790 | 921 #ifdef USE_TV |
922 else if (demuxer->file_format==DEMUXER_TYPE_TV) | |
6951 | 923 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_TVInputNotSeekable); |
2790 | 924 #endif |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
925 else |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1659
diff
changeset
|
926 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekFile); |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
927 return 0; |
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
928 } |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
929 |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
930 // clear demux buffers: |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
931 if(sh_audio){ ds_free_packs(d_audio);sh_audio->a_buffer_len=0;} |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
932 ds_free_packs(d_video); |
24678 | 933 ds_free_packs(demuxer->sub); |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
934 |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
935 demuxer->stream->eof=0; // clear eof flag |
3542
465329581ad8
reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents:
3411
diff
changeset
|
936 demuxer->video->eof=0; |
465329581ad8
reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents:
3411
diff
changeset
|
937 demuxer->audio->eof=0; |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
938 |
4203 | 939 #if 0 |
3824 | 940 if(sh_audio) sh_audio->timer=sh_video->timer; |
941 #else | |
4587
886bf5274992
Audio only support. Include a fix in the asf demuxer opening.
albeu
parents:
4565
diff
changeset
|
942 if(sh_video) sh_video->timer=0; // !!!!!! |
3824 | 943 #endif |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
944 |
20748
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
945 if(flags & 1) // absolute seek |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
946 pts = 0.0f; |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
947 else { |
21780
c9795699c414
added stream_pts to demuxer_t and demux_packet_t to hold the time value reported by the stream layer
nicodvb
parents:
21767
diff
changeset
|
948 if(demuxer->stream_pts == MP_NOPTS_VALUE) |
20748
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
949 goto dmx_seek; |
21780
c9795699c414
added stream_pts to demuxer_t and demux_packet_t to hold the time value reported by the stream layer
nicodvb
parents:
21767
diff
changeset
|
950 pts = demuxer->stream_pts; |
20748
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
951 } |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
952 |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
953 if(flags & 2) { // percent seek |
24257 | 954 if(stream_control(demuxer->stream, STREAM_CTRL_GET_TIME_LENGTH, &tmp) == STREAM_UNSUPPORTED) |
20748
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
955 goto dmx_seek; |
20851
6602a90a06ec
consistency fix: STREAM_CTRL_GET_TIME_LENGTH and STREAM_CTRL_GET_CURRENT_TIME now return time in (double) seconds
nicodvb
parents:
20841
diff
changeset
|
956 pts += tmp * rel_seek_secs; |
20748
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
957 } else |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
958 pts += rel_seek_secs; |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
959 |
24257 | 960 if(stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_TIME, &pts) != STREAM_UNSUPPORTED) { |
20748
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
961 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
962 return 1; |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
963 } |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
964 |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
965 dmx_seek: |
16175 | 966 if (demuxer->desc->seek) |
17636 | 967 demuxer->desc->seek(demuxer,rel_seek_secs,audio_delay,flags); |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
968 |
16877
9081ae3a702c
move resync_audio_stream after seeking to demuxer.c
reimar
parents:
16572
diff
changeset
|
969 if (sh_audio) resync_audio_stream(sh_audio); |
9081ae3a702c
move resync_audio_stream after seeking to demuxer.c
reimar
parents:
16572
diff
changeset
|
970 |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
971 return 1; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
972 } |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
973 |
19053
75327b24e06f
marks several string parameters as const, as they are not modified inside the function, Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18917
diff
changeset
|
974 int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param) |
3050 | 975 { |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
976 char **info = demuxer->info; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
977 int n = 0; |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
978 |
3050 | 979 |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
980 for(n = 0; info && info[2*n] != NULL; n++) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
981 { |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
982 if(!strcasecmp(opt,info[2*n])) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
983 { |
19413
acd26ccbff0d
Update information and print new value when demux_info_add is called
reimar
parents:
19342
diff
changeset
|
984 mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_DemuxerInfoChanged,opt,param); |
acd26ccbff0d
Update information and print new value when demux_info_add is called
reimar
parents:
19342
diff
changeset
|
985 free(info[2*n+1]); |
acd26ccbff0d
Update information and print new value when demux_info_add is called
reimar
parents:
19342
diff
changeset
|
986 info[2*n+1] = strdup(param); |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
987 return 0; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
988 } |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
989 } |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
990 |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
991 info = demuxer->info = (char**)realloc(info,(2*(n+2))*sizeof(char*)); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
992 info[2*n] = strdup(opt); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
993 info[2*n+1] = strdup(param); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
994 memset(&info[2*(n+1)],0,2*sizeof(char*)); |
3050 | 995 |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
996 return 1; |
3050 | 997 } |
998 | |
999 int demux_info_print(demuxer_t *demuxer) | |
1000 { | |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
1001 char **info = demuxer->info; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
1002 int n; |
3050 | 1003 |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
1004 if(!info) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
1005 return 0; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
1006 |
6951 | 1007 mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_ClipInfo); |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
1008 for(n = 0; info[2*n] != NULL ; n++) |
15789
32d9c8a0a02b
adds some more -identify output, patch by kiriuja < mplayer DASH patches PAM en DASH directo POUM net>
gpoirier
parents:
15780
diff
changeset
|
1009 { |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
1010 mp_msg(MSGT_DEMUX, MSGL_INFO, " %s: %s\n",info[2*n],info[2*n+1]); |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18128
diff
changeset
|
1011 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_NAME%d=%s\n", n, info[2*n]); |
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18128
diff
changeset
|
1012 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_VALUE%d=%s\n", n, info[2*n+1]); |
15789
32d9c8a0a02b
adds some more -identify output, patch by kiriuja < mplayer DASH patches PAM en DASH directo POUM net>
gpoirier
parents:
15780
diff
changeset
|
1013 } |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18128
diff
changeset
|
1014 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_N=%d\n", n); |
4189 | 1015 |
1016 return 0; | |
3050 | 1017 } |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1018 |
23611 | 1019 char* demux_info_get(demuxer_t *demuxer, const char *opt) { |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1020 int i; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1021 char **info = demuxer->info; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1022 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1023 for(i = 0; info && info[2*i] != NULL; i++) { |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1024 if(!strcasecmp(opt,info[2*i])) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1025 return info[2*i+1]; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1026 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1027 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1028 return NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1029 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1030 |
16175 | 1031 int demux_control(demuxer_t *demuxer, int cmd, void *arg) { |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1032 |
16175 | 1033 if (demuxer->desc->control) |
1034 return demuxer->desc->control(demuxer,cmd,arg); | |
1035 | |
1036 return DEMUXER_CTRL_NOTIMPL; | |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1037 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1038 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1039 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1040 |
16346
6ff303d2876b
Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents:
16326
diff
changeset
|
1041 double demuxer_get_time_length(demuxer_t *demuxer){ |
6ff303d2876b
Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents:
16326
diff
changeset
|
1042 double get_time_ans; |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1043 sh_video_t *sh_video = demuxer->video->sh; |
16925 | 1044 sh_audio_t *sh_audio = demuxer->audio->sh; |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1045 // <= 0 means DEMUXER_CTRL_NOTIMPL or DEMUXER_CTRL_DONTKNOW |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1046 if (demux_control(demuxer, DEMUXER_CTRL_GET_TIME_LENGTH,(void *)&get_time_ans)<=0) { |
23552
ba9e664dbbaa
More accurate seeking for demuxers lacking DEMUXER_CTRL_GET_TIME_LENGTH control
zuxy
parents:
23457
diff
changeset
|
1047 if (sh_video && sh_video->i_bps && sh_audio && sh_audio->i_bps) |
ba9e664dbbaa
More accurate seeking for demuxers lacking DEMUXER_CTRL_GET_TIME_LENGTH control
zuxy
parents:
23457
diff
changeset
|
1048 get_time_ans = (double)(demuxer->movi_end-demuxer->movi_start)/(sh_video->i_bps+sh_audio->i_bps); |
ba9e664dbbaa
More accurate seeking for demuxers lacking DEMUXER_CTRL_GET_TIME_LENGTH control
zuxy
parents:
23457
diff
changeset
|
1049 else if (sh_video && sh_video->i_bps) |
16346
6ff303d2876b
Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents:
16326
diff
changeset
|
1050 get_time_ans = (double)(demuxer->movi_end-demuxer->movi_start)/sh_video->i_bps; |
16925 | 1051 else if (sh_audio && sh_audio->i_bps) |
1052 get_time_ans = (double)(demuxer->movi_end-demuxer->movi_start)/sh_audio->i_bps; | |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1053 else |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1054 get_time_ans=0; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1055 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1056 return get_time_ans; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1057 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1058 |
20749
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1059 /** |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1060 * \brief demuxer_get_current_time() returns the time of the current play in three possible ways: |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1061 * either when the stream reader satisfies STREAM_CTRL_GET_CURRENT_TIME (e.g. dvd) |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1062 * or using sh_video->pts when the former method fails |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1063 * 0 otherwise |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1064 * \return the current play time |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1065 */ |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1066 int demuxer_get_current_time(demuxer_t *demuxer){ |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1067 double get_time_ans = 0; |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1068 sh_video_t *sh_video = demuxer->video->sh; |
21782
99ab6c41eb1e
use demuxer->stream_pts rather than stream_control(STREAM_CTRL_GET_CURRENT_TIME)
nicodvb
parents:
21780
diff
changeset
|
1069 if(demuxer->stream_pts != MP_NOPTS_VALUE) |
99ab6c41eb1e
use demuxer->stream_pts rather than stream_control(STREAM_CTRL_GET_CURRENT_TIME)
nicodvb
parents:
21780
diff
changeset
|
1070 get_time_ans = demuxer->stream_pts; |
99ab6c41eb1e
use demuxer->stream_pts rather than stream_control(STREAM_CTRL_GET_CURRENT_TIME)
nicodvb
parents:
21780
diff
changeset
|
1071 else if(sh_video) get_time_ans = sh_video->pts; |
20749
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1072 return (int) get_time_ans; |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1073 } |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1074 |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1075 int demuxer_get_percent_pos(demuxer_t *demuxer){ |
14197
2ae224195625
Use demuxer_get_percent_pos for the OSD position bar
reimar
parents:
14160
diff
changeset
|
1076 int ans = 0; |
2ae224195625
Use demuxer_get_percent_pos for the OSD position bar
reimar
parents:
14160
diff
changeset
|
1077 int res = demux_control(demuxer, DEMUXER_CTRL_GET_PERCENT_POS, &ans); |
2ae224195625
Use demuxer_get_percent_pos for the OSD position bar
reimar
parents:
14160
diff
changeset
|
1078 int len = (demuxer->movi_end - demuxer->movi_start) / 100; |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1079 if (res <= 0) { |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1080 if (len > 0) |
14197
2ae224195625
Use demuxer_get_percent_pos for the OSD position bar
reimar
parents:
14160
diff
changeset
|
1081 ans = (demuxer->filepos - demuxer->movi_start) / len; |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1082 else |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1083 ans = 0; |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1084 } |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1085 if (ans < 0) ans = 0; |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1086 if (ans > 100) ans = 100; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1087 return ans; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1088 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1089 |
15285
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1090 int demuxer_switch_audio(demuxer_t *demuxer, int index){ |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1091 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_AUDIO, &index); |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1092 if (res == DEMUXER_CTRL_NOTIMPL) |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1093 index = demuxer->audio->id; |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1094 return index; |
15046
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14934
diff
changeset
|
1095 } |
19342 | 1096 |
20948 | 1097 int demuxer_switch_video(demuxer_t *demuxer, int index){ |
1098 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_VIDEO, &index); | |
1099 if (res == DEMUXER_CTRL_NOTIMPL) | |
1100 index = demuxer->video->id; | |
1101 return index; | |
1102 } | |
1103 | |
19342 | 1104 int demuxer_add_chapter(demuxer_t* demuxer, const char* name, uint64_t start, uint64_t end){ |
1105 if (demuxer->chapters == NULL) | |
1106 demuxer->chapters = malloc (32*sizeof(*demuxer->chapters)); | |
1107 else if (!(demuxer->num_chapters % 32)) | |
1108 demuxer->chapters = realloc (demuxer->chapters, (demuxer->num_chapters + 32) * sizeof(*demuxer->chapters)); | |
1109 | |
1110 demuxer->chapters[demuxer->num_chapters].start = start; | |
1111 demuxer->chapters[demuxer->num_chapters].end = end; | |
1112 demuxer->chapters[demuxer->num_chapters].name = strdup(name); | |
1113 | |
1114 return demuxer->num_chapters ++; | |
1115 } | |
1116 | |
19435 | 1117 /** |
1118 * \brief demuxer_seek_chapter() seeks to a chapter in two possible ways: | |
1119 * either using the demuxer->chapters structure set by the demuxer | |
1120 * or asking help to the stream layer (e.g. dvd) | |
19439 | 1121 * \param chapter - chapter number wished - 0-based |
19435 | 1122 * \param mode 0: relative to current main pts, 1: absolute |
1123 * \param seek_pts set by the function to the pts to seek to (if demuxer->chapters is set) | |
19478
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1124 * \param num_chapters number of chapters present (set by this function is param is not null) |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1125 * \param chapter_name name of chapter found (set by this function is param is not null) |
19435 | 1126 * \return -1 on error, current chapter if successful |
1127 */ | |
1128 | |
19478
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1129 int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode, float *seek_pts, int *num_chapters, char **chapter_name) { |
19435 | 1130 int ris; |
1131 int current, total; | |
1132 sh_video_t *sh_video = demuxer->video->sh; | |
1133 sh_audio_t *sh_audio = demuxer->audio->sh; | |
1134 | |
1135 if (!demuxer->num_chapters || !demuxer->chapters) { | |
19438
263e95c47aec
support relative seeking in the stream-driven case
nicodvb
parents:
19435
diff
changeset
|
1136 if(!mode) { |
263e95c47aec
support relative seeking in the stream-driven case
nicodvb
parents:
19435
diff
changeset
|
1137 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER, ¤t); |
24257 | 1138 if(ris == STREAM_UNSUPPORTED) return -1; |
19438
263e95c47aec
support relative seeking in the stream-driven case
nicodvb
parents:
19435
diff
changeset
|
1139 chapter += current; |
263e95c47aec
support relative seeking in the stream-driven case
nicodvb
parents:
19435
diff
changeset
|
1140 } |
263e95c47aec
support relative seeking in the stream-driven case
nicodvb
parents:
19435
diff
changeset
|
1141 |
19435 | 1142 if(demuxer->video->sh) |
1143 ds_free_packs(demuxer->video); | |
1144 | |
1145 if(demuxer->audio->sh) | |
1146 ds_free_packs(demuxer->audio); | |
1147 | |
1148 if(demuxer->sub->id >= 0) | |
1149 ds_free_packs(demuxer->sub); | |
1150 | |
1151 ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, &chapter); | |
24257 | 1152 if(ris != STREAM_UNSUPPORTED) |
20839
950ea3171afc
in demux_seek() if STREAM_CTRL_SEEK_TO_CHAPTER suceeds call DEMUXER_CTRL_RESYNC to notify the demuxer of the change
nicodvb
parents:
20749
diff
changeset
|
1153 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); |
19435 | 1154 if(sh_video) { |
1155 ds_fill_buffer(demuxer->video); | |
1156 resync_video_stream(sh_video); | |
1157 } | |
1158 | |
1159 if(sh_audio) { | |
1160 ds_fill_buffer(demuxer->audio); | |
1161 resync_audio_stream(sh_audio); | |
1162 } | |
1163 | |
1164 //exit status may be ok, but main() doesn't have to seek itself (because e.g. dvds depend on sectors, not on pts) | |
1165 *seek_pts = -1.0; | |
19478
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1166 |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1167 if(num_chapters) { |
24257 | 1168 if(stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_CHAPTERS, num_chapters) == STREAM_UNSUPPORTED) |
19478
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1169 *num_chapters = 0; |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1170 } |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1171 |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1172 if(chapter_name) { |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1173 char *tmp = malloc(16); |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1174 *chapter_name = NULL; |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1175 if(num_chapters && *num_chapters && tmp) { |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1176 sprintf(tmp, " of %3d", *num_chapters); |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1177 *chapter_name = tmp; |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1178 } |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1179 } |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1180 |
24257 | 1181 return (ris != STREAM_UNSUPPORTED ? chapter : -1); |
19435 | 1182 } else { //chapters structure is set in the demuxer |
1183 total = demuxer->num_chapters; | |
1184 | |
1185 if (mode==1) { //absolute seeking | |
1186 current = chapter; | |
1187 } else { //relative seeking | |
1188 uint64_t now; | |
1189 now = (sh_video ? sh_video->pts : (sh_audio ? sh_audio->pts : 0.)) * 1000 + .5; | |
1190 | |
1191 for (current = total - 1; current >= 0; --current) { | |
1192 demux_chapter_t* chapter = demuxer->chapters + current; | |
1193 if (chapter->start <= now) | |
1194 break; | |
1195 } | |
1196 current += chapter; | |
1197 } | |
1198 | |
1199 if (current >= total) | |
1200 return -1; | |
1201 if (current < 0) current = 0; | |
1202 | |
1203 *seek_pts = demuxer->chapters[current].start / 1000.0; | |
1204 | |
19478
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1205 if(num_chapters) |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1206 *num_chapters = demuxer->num_chapters; |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1207 |
19479
8dd04ec733f5
100l: *chapter_name was copied from the pointer rather than strupd()-ed (and next free()d in mplayer.c
nicodvb
parents:
19478
diff
changeset
|
1208 if(chapter_name) { |
8dd04ec733f5
100l: *chapter_name was copied from the pointer rather than strupd()-ed (and next free()d in mplayer.c
nicodvb
parents:
19478
diff
changeset
|
1209 if(demuxer->chapters[current].name) |
8dd04ec733f5
100l: *chapter_name was copied from the pointer rather than strupd()-ed (and next free()d in mplayer.c
nicodvb
parents:
19478
diff
changeset
|
1210 *chapter_name = strdup(demuxer->chapters[current].name); |
8dd04ec733f5
100l: *chapter_name was copied from the pointer rather than strupd()-ed (and next free()d in mplayer.c
nicodvb
parents:
19478
diff
changeset
|
1211 else *chapter_name = NULL; |
8dd04ec733f5
100l: *chapter_name was copied from the pointer rather than strupd()-ed (and next free()d in mplayer.c
nicodvb
parents:
19478
diff
changeset
|
1212 } |
19478
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1213 |
19435 | 1214 return current; |
1215 } | |
1216 } |