Mercurial > mplayer.hg
annotate libmpdemux/demuxer.c @ 16198:3e8e281ecc86
fix brokeness caused by demuxer patch, this code is useless for
any case other than avi and should not be run even then.
patch by Uoti Urpala (urpala BANG cc MEEP helsinki MEEP fi)
author | ods15 |
---|---|
date | Thu, 11 Aug 2005 17:01:13 +0000 |
parents | 6b86089c2edd |
children | f443f849531b |
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" |
9709 | 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 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
16 #include "stream.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
17 #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
|
18 #include "stheader.h" |
4551 | 19 #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
|
20 |
14245 | 21 #include "../libaf/af_format.h" |
5084 | 22 #include "../libvo/fastmemcpy.h" |
23 | |
16175 | 24 |
25 // Demuxer list | |
26 extern demuxer_desc_t demuxer_desc_rawaudio; | |
27 extern demuxer_desc_t demuxer_desc_rawvideo; | |
28 extern demuxer_desc_t demuxer_desc_tv; | |
29 extern demuxer_desc_t demuxer_desc_mf; | |
30 extern demuxer_desc_t demuxer_desc_avi; | |
31 extern demuxer_desc_t demuxer_desc_y4m; | |
32 extern demuxer_desc_t demuxer_desc_asf; | |
33 extern demuxer_desc_t demuxer_desc_nsv; | |
34 extern demuxer_desc_t demuxer_desc_nuv; | |
35 extern demuxer_desc_t demuxer_desc_real; | |
36 extern demuxer_desc_t demuxer_desc_smjpeg; | |
37 extern demuxer_desc_t demuxer_desc_matroska; | |
38 extern demuxer_desc_t demuxer_desc_realaudio; | |
39 extern demuxer_desc_t demuxer_desc_vqf; | |
40 extern demuxer_desc_t demuxer_desc_mov; | |
41 extern demuxer_desc_t demuxer_desc_vivo; | |
42 extern demuxer_desc_t demuxer_desc_fli; | |
43 extern demuxer_desc_t demuxer_desc_film; | |
44 extern demuxer_desc_t demuxer_desc_roq; | |
45 extern demuxer_desc_t demuxer_desc_gif; | |
46 extern demuxer_desc_t demuxer_desc_ogg; | |
47 extern demuxer_desc_t demuxer_desc_avs; | |
48 extern demuxer_desc_t demuxer_desc_pva; | |
49 extern demuxer_desc_t demuxer_desc_mpeg_ts; | |
50 extern demuxer_desc_t demuxer_desc_lmlm4; | |
51 extern demuxer_desc_t demuxer_desc_mpeg_ps; | |
52 extern demuxer_desc_t demuxer_desc_mpeg_pes; | |
53 extern demuxer_desc_t demuxer_desc_mpeg_es; | |
54 extern demuxer_desc_t demuxer_desc_mpeg4_es; | |
55 extern demuxer_desc_t demuxer_desc_h264_es; | |
56 extern demuxer_desc_t demuxer_desc_rawdv; | |
57 extern demuxer_desc_t demuxer_desc_audio; | |
58 extern demuxer_desc_t demuxer_desc_xmms; | |
59 extern demuxer_desc_t demuxer_desc_mpeg_ty; | |
60 extern demuxer_desc_t demuxer_desc_rtp; | |
61 extern demuxer_desc_t demuxer_desc_lavf; | |
62 extern demuxer_desc_t demuxer_desc_aac; | |
63 | |
64 demuxer_desc_t* demuxer_list[] = { | |
65 &demuxer_desc_rawaudio, | |
66 &demuxer_desc_rawvideo, | |
67 #ifdef USE_TV | |
68 &demuxer_desc_tv, | |
69 #endif | |
70 &demuxer_desc_mf, | |
71 &demuxer_desc_avi, | |
72 &demuxer_desc_y4m, | |
73 &demuxer_desc_asf, | |
74 &demuxer_desc_nsv, | |
75 &demuxer_desc_nuv, | |
76 &demuxer_desc_real, | |
77 &demuxer_desc_smjpeg, | |
78 #ifdef HAVE_MATROSKA | |
79 &demuxer_desc_matroska, | |
80 #endif | |
81 &demuxer_desc_realaudio, | |
82 &demuxer_desc_vqf, | |
83 &demuxer_desc_mov, | |
84 &demuxer_desc_vivo, | |
85 &demuxer_desc_fli, | |
86 &demuxer_desc_film, | |
87 &demuxer_desc_roq, | |
88 #ifdef HAVE_GIF | |
89 &demuxer_desc_gif, | |
90 #endif | |
91 #ifdef HAVE_OGGVORBIS | |
92 &demuxer_desc_ogg, | |
93 #endif | |
94 #ifdef USE_WIN32DLL | |
95 &demuxer_desc_avs, | |
96 #endif | |
97 &demuxer_desc_pva, | |
98 &demuxer_desc_mpeg_ts, | |
99 &demuxer_desc_lmlm4, | |
100 &demuxer_desc_mpeg_ps, | |
101 &demuxer_desc_mpeg_pes, | |
102 &demuxer_desc_mpeg_es, | |
103 &demuxer_desc_mpeg4_es, | |
104 &demuxer_desc_h264_es, | |
105 #ifdef HAVE_LIBDV095 | |
106 &demuxer_desc_rawdv, | |
107 #endif | |
108 &demuxer_desc_audio, | |
109 #ifdef HAVE_XMMS | |
110 &demuxer_desc_xmms, | |
111 #endif | |
112 &demuxer_desc_mpeg_ty, | |
113 #ifdef STREAMING_LIVE_DOT_COM | |
114 &demuxer_desc_rtp, | |
115 #endif | |
116 #ifdef USE_LIBAVFORMAT | |
117 &demuxer_desc_lavf, | |
118 #endif | |
119 &demuxer_desc_aac, | |
120 NULL | |
121 }; | |
122 | |
14046
4802041ab8e3
Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents:
14034
diff
changeset
|
123 // Should be set to 1 by demux module if ids it passes to new_sh_audio and |
4802041ab8e3
Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents:
14034
diff
changeset
|
124 // new_sh_video don't match aids and vids it accepts from the command line |
4802041ab8e3
Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents:
14034
diff
changeset
|
125 int demux_aid_vid_mismatch = 0; |
4802041ab8e3
Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents:
14034
diff
changeset
|
126 |
1643 | 127 void free_demuxer_stream(demux_stream_t *ds){ |
128 ds_free_packs(ds); | |
129 free(ds); | |
130 } | |
131 | |
1 | 132 demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){ |
133 demux_stream_t* ds=malloc(sizeof(demux_stream_t)); | |
134 ds->buffer_pos=ds->buffer_size=0; | |
135 ds->buffer=NULL; | |
136 ds->pts=0; | |
746 | 137 ds->pts_bytes=0; |
1 | 138 ds->eof=0; |
139 ds->pos=0; | |
140 ds->dpos=0; | |
889 | 141 ds->pack_no=0; |
1 | 142 //--------------- |
143 ds->packs=0; | |
144 ds->bytes=0; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
145 ds->first=ds->last=ds->current=NULL; |
1 | 146 ds->id=id; |
147 ds->demuxer=demuxer; | |
148 //---------------- | |
149 ds->asf_seq=-1; | |
150 ds->asf_packet=NULL; | |
291 | 151 //---------------- |
7754 | 152 ds->ss_mul=ds->ss_div=0; |
2419 | 153 //---------------- |
291 | 154 ds->sh=NULL; |
1 | 155 return ds; |
156 } | |
157 | |
16175 | 158 |
159 /** | |
160 * Get demuxer description structure for a given demuxer type | |
161 * | |
162 * @param file_format type of the demuxer | |
163 * @return structure for the demuxer, NULL if not found | |
164 */ | |
165 static demuxer_desc_t* get_demuxer_desc_from_type(int file_format) | |
166 { | |
167 int i; | |
168 | |
169 for (i = 0; demuxer_list[i]; i++) | |
170 if (file_format == demuxer_list[i]->type) | |
171 return demuxer_list[i]; | |
172 | |
173 return NULL; | |
174 } | |
175 | |
176 | |
177 demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id,char *filename){ | |
1 | 178 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
|
179 memset(d,0,sizeof(demuxer_t)); |
1 | 180 d->stream=stream; |
598 | 181 d->movi_start=stream->start_pos; |
182 d->movi_end=stream->end_pos; | |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
183 d->seekable=1; |
1 | 184 d->synced=0; |
185 d->filepos=0; | |
186 d->audio=new_demuxer_stream(d,a_id); | |
187 d->video=new_demuxer_stream(d,v_id); | |
552 | 188 d->sub=new_demuxer_stream(d,s_id); |
1 | 189 d->type=type; |
16175 | 190 if(type) |
191 if (!(d->desc = get_demuxer_desc_from_type(type))) | |
192 mp_msg(MSGT_DEMUXER,MSGL_ERR,"BUG! Invalid demuxer type in new_demuxer(), big troubles ahead."); | |
193 if(filename) // Filename hack for avs_check_file | |
194 d->filename=strdup(filename); | |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
195 stream_reset(stream); |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
196 stream_seek(stream,stream->start_pos); |
1 | 197 return d; |
198 } | |
199 | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
200 sh_audio_t* new_sh_audio(demuxer_t *demuxer,int id){ |
5084 | 201 if(id > MAX_A_STREAMS-1 || id < 0) |
4642 | 202 { |
203 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested audio stream id overflow (%d > %d)\n", | |
204 id, MAX_A_STREAMS); | |
205 return NULL; | |
206 } | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
207 if(demuxer->a_streams[id]){ |
1584 | 208 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
|
209 } else { |
13357
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
210 sh_audio_t *sh; |
6951 | 211 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundAudioStream,id); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
212 demuxer->a_streams[id]=malloc(sizeof(sh_audio_t)); |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
213 memset(demuxer->a_streams[id],0,sizeof(sh_audio_t)); |
13357
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
214 sh = demuxer->a_streams[id]; |
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
215 // set some defaults |
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
216 sh->samplesize=2; |
14245 | 217 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
|
218 sh->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/ |
14046
4802041ab8e3
Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents:
14034
diff
changeset
|
219 if (identify && !demux_aid_vid_mismatch) |
4802041ab8e3
Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents:
14034
diff
changeset
|
220 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_AUDIO_ID=%d\n", id); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
221 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
222 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
|
223 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
224 |
1643 | 225 void free_sh_audio(sh_audio_t* sh){ |
13946 | 226 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_audio at %p\n",sh); |
1643 | 227 if(sh->wf) free(sh->wf); |
228 free(sh); | |
229 } | |
230 | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
231 sh_video_t* new_sh_video(demuxer_t *demuxer,int id){ |
5084 | 232 if(id > MAX_V_STREAMS-1 || id < 0) |
4642 | 233 { |
234 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested video stream id overflow (%d > %d)\n", | |
235 id, MAX_V_STREAMS); | |
236 return NULL; | |
237 } | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
238 if(demuxer->v_streams[id]){ |
1584 | 239 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
|
240 } else { |
6951 | 241 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundVideoStream,id); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
242 demuxer->v_streams[id]=malloc(sizeof(sh_video_t)); |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
243 memset(demuxer->v_streams[id],0,sizeof(sh_video_t)); |
14046
4802041ab8e3
Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents:
14034
diff
changeset
|
244 if (identify && !demux_aid_vid_mismatch) |
4802041ab8e3
Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents:
14034
diff
changeset
|
245 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_VIDEO_ID=%d\n", id); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
246 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
247 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
|
248 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
249 |
1643 | 250 void free_sh_video(sh_video_t* sh){ |
13946 | 251 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_video at %p\n",sh); |
1657 | 252 if(sh->bih) free(sh->bih); |
1643 | 253 free(sh); |
254 } | |
255 | |
256 void free_demuxer(demuxer_t *demuxer){ | |
257 int i; | |
13946 | 258 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing demuxer at %p\n",demuxer); |
16175 | 259 if(demuxer->desc->close) |
260 demuxer->desc->close(demuxer); | |
261 // Very ugly hack to make it behave like old implementation | |
262 if (demuxer->desc->type == DEMUXER_TYPE_DEMUXERS) | |
263 return; | |
1643 | 264 // free streams: |
14666
91bbfcb66883
Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents:
14502
diff
changeset
|
265 for(i = 0; i < MAX_A_STREAMS; i++) |
1643 | 266 if(demuxer->a_streams[i]) free_sh_audio(demuxer->a_streams[i]); |
14666
91bbfcb66883
Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents:
14502
diff
changeset
|
267 for(i = 0; i < MAX_V_STREAMS; i++) |
1643 | 268 if(demuxer->v_streams[i]) free_sh_video(demuxer->v_streams[i]); |
269 //if(sh_audio) free_sh_audio(sh_audio); | |
270 //if(sh_video) free_sh_video(sh_video); | |
271 // free demuxers: | |
272 free_demuxer_stream(demuxer->audio); | |
273 free_demuxer_stream(demuxer->video); | |
5412 | 274 free_demuxer_stream(demuxer->sub); |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
275 if(demuxer->info) { |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
276 for(i=0;demuxer->info[i] != NULL; i++) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
277 free(demuxer->info[i]); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
278 free(demuxer->info); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
279 } |
16175 | 280 if(demuxer->filename) |
281 free(demuxer->filename); | |
1643 | 282 free(demuxer); |
283 } | |
284 | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
285 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
286 void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){ |
1 | 287 // demux_packet_t* dp=new_demux_packet(len); |
288 // stream_read(stream,dp->buffer,len); | |
289 // dp->pts=pts; //(float)pts/90000.0f; | |
290 // dp->pos=pos; | |
291 // append packet to DS stream: | |
292 ++ds->packs; | |
293 ds->bytes+=dp->len; | |
294 if(ds->last){ | |
295 // next packet in stream | |
296 ds->last->next=dp; | |
297 ds->last=dp; | |
298 } else { | |
299 // first packet in stream | |
300 ds->first=ds->last=dp; | |
301 } | |
1567 | 302 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 | 303 (ds==ds->demuxer->audio)?"d_audio":"d_video", |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1421
diff
changeset
|
304 dp->len,dp->pts,(unsigned int)dp->pos,ds->demuxer->audio->packs,ds->demuxer->video->packs); |
1 | 305 } |
306 | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1421
diff
changeset
|
307 void ds_read_packet(demux_stream_t *ds,stream_t *stream,int len,float pts,off_t pos,int flags){ |
1 | 308 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
|
309 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
|
310 resize_demux_packet(dp, len); |
1 | 311 dp->pts=pts; //(float)pts/90000.0f; |
312 dp->pos=pos; | |
979 | 313 dp->flags=flags; |
1 | 314 // append packet to DS stream: |
315 ds_add_packet(ds,dp); | |
316 } | |
317 | |
318 // return value: | |
319 // 0 = EOF or no stream found or invalid type | |
320 // 1 = successfully read a packet | |
321 | |
322 int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){ | |
323 // 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
|
324 // printf("demux->type=%d\n",demux->type); |
16175 | 325 return demux->desc->fill_buffer(demux, ds); |
1 | 326 } |
327 | |
328 // return value: | |
329 // 0 = EOF | |
330 // 1 = succesfull | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
331 int ds_fill_buffer(demux_stream_t *ds){ |
1 | 332 demuxer_t *demux=ds->demuxer; |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
333 if(ds->current) free_demux_packet(ds->current); |
1 | 334 if(verbose>2){ |
1567 | 335 if(ds==demux->audio) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_audio) called\n");else |
336 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
|
337 if(ds==demux->sub) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_sub) called\n");else |
1567 | 338 mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(unknown 0x%X) called\n",(unsigned int)ds); |
1 | 339 } |
340 while(1){ | |
341 if(ds->packs){ | |
342 demux_packet_t *p=ds->first; | |
343 // copy useful data: | |
344 ds->buffer=p->buffer; | |
345 ds->buffer_pos=0; | |
346 ds->buffer_size=p->len; | |
347 ds->pos=p->pos; | |
348 ds->dpos+=p->len; // !!! | |
889 | 349 ++ds->pack_no; |
746 | 350 if(p->pts){ |
351 ds->pts=p->pts; | |
352 ds->pts_bytes=0; | |
353 } | |
354 ds->pts_bytes+=p->len; // !!! | |
979 | 355 ds->flags=p->flags; |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
356 // unlink packet: |
1 | 357 ds->bytes-=p->len; |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
358 ds->current=p; |
1 | 359 ds->first=p->next; |
360 if(!ds->first) ds->last=NULL; | |
361 --ds->packs; | |
362 return 1; //ds->buffer_size; | |
363 } | |
364 if(demux->audio->packs>=MAX_PACKS || demux->audio->bytes>=MAX_PACK_BYTES){ | |
1584 | 365 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyAudioInBuffer,demux->audio->packs,demux->audio->bytes); |
366 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); | |
1 | 367 break; |
368 } | |
369 if(demux->video->packs>=MAX_PACKS || demux->video->bytes>=MAX_PACK_BYTES){ | |
1584 | 370 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyVideoInBuffer,demux->video->packs,demux->video->bytes); |
371 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); | |
1 | 372 break; |
373 } | |
1421 | 374 if(!demux_fill_buffer(demux,ds)){ |
1567 | 375 mp_dbg(MSGT_DEMUXER,MSGL_DBG2,"ds_fill_buffer()->demux_fill_buffer() failed\n"); |
1421 | 376 break; // EOF |
377 } | |
1 | 378 } |
379 ds->buffer_pos=ds->buffer_size=0; | |
380 ds->buffer=NULL; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
381 ds->current=NULL; |
1567 | 382 mp_msg(MSGT_DEMUXER,MSGL_V,"ds_fill_buffer: EOF reached (stream: %s) \n",ds==demux->audio?"audio":"video"); |
1 | 383 ds->eof=1; |
384 return 0; | |
385 } | |
386 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
387 int demux_read_data(demux_stream_t *ds,unsigned char* mem,int len){ |
1 | 388 int x; |
389 int bytes=0; | |
390 while(len>0){ | |
391 x=ds->buffer_size-ds->buffer_pos; | |
392 if(x==0){ | |
393 if(!ds_fill_buffer(ds)) return bytes; | |
394 } else { | |
395 if(x>len) x=len; | |
396 if(mem) memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x); | |
397 bytes+=x;len-=x;ds->buffer_pos+=x; | |
398 } | |
399 } | |
400 return bytes; | |
401 } | |
402 | |
746 | 403 int demux_read_data_pack(demux_stream_t *ds,unsigned char* mem,int len){ |
404 int x; | |
405 int bytes=0; | |
406 while(len>0){ | |
407 x=ds->buffer_size-ds->buffer_pos; | |
408 if(x==0){ | |
409 if(!ds_fill_buffer(ds)) return bytes; | |
410 } else { | |
411 if(x>len) x=len; | |
412 if(mem) memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x); | |
413 bytes+=x;len-=x;ds->buffer_pos+=x; | |
414 return bytes; // stop at end of package! (for correct timestamping) | |
415 } | |
416 } | |
417 return bytes; | |
418 } | |
419 | |
420 | |
1 | 421 void ds_free_packs(demux_stream_t *ds){ |
422 demux_packet_t *dp=ds->first; | |
423 while(dp){ | |
424 demux_packet_t *dn=dp->next; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
425 free_demux_packet(dp); |
1 | 426 dp=dn; |
427 } | |
428 if(ds->asf_packet){ | |
429 // free unfinished .asf fragments: | |
430 free(ds->asf_packet->buffer); | |
431 free(ds->asf_packet); | |
432 ds->asf_packet=NULL; | |
433 } | |
434 ds->first=ds->last=NULL; | |
435 ds->packs=0; // !!!!! | |
436 ds->bytes=0; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
437 if(ds->current) free_demux_packet(ds->current); |
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
438 ds->current=NULL; |
1 | 439 ds->buffer=NULL; |
440 ds->buffer_pos=ds->buffer_size; | |
828 | 441 ds->pts=0; ds->pts_bytes=0; |
1 | 442 } |
443 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
444 int ds_get_packet(demux_stream_t *ds,unsigned char **start){ |
1 | 445 while(1){ |
446 int len; | |
447 if(ds->buffer_pos>=ds->buffer_size){ | |
448 if(!ds_fill_buffer(ds)){ | |
449 // EOF | |
450 *start = NULL; | |
451 return -1; | |
452 } | |
453 } | |
454 len=ds->buffer_size-ds->buffer_pos; | |
455 *start = &ds->buffer[ds->buffer_pos]; | |
456 ds->buffer_pos+=len; | |
457 return len; | |
458 } | |
459 } | |
554 | 460 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
461 int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start){ |
554 | 462 while(1){ |
463 int len; | |
464 if(ds->buffer_pos>=ds->buffer_size){ | |
465 *start = NULL; | |
466 if(!ds->packs) return -1; // no sub | |
467 if(!ds_fill_buffer(ds)) return -1; // EOF | |
468 } | |
469 len=ds->buffer_size-ds->buffer_pos; | |
470 *start = &ds->buffer[ds->buffer_pos]; | |
471 ds->buffer_pos+=len; | |
472 return len; | |
473 } | |
474 } | |
475 | |
5930
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
476 float ds_get_next_pts(demux_stream_t *ds) { |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
477 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
|
478 while(!ds->first) { |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
479 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
|
480 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
|
481 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
482 return -1; |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
483 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
484 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
|
485 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
|
486 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
487 return -1; |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
488 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
489 if(!demux_fill_buffer(demux,ds)) |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
490 return -1; |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
491 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
492 return ds->first->pts; |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
493 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
494 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
495 // ==================================================================== |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
496 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
497 // commandline options, flags: |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
498 extern int force_ni; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
499 extern int pts_from_bps; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
500 |
7559
b645204ea527
some cleanup - made private vars/funcs static, removed obsolete externs
arpi
parents:
7482
diff
changeset
|
501 //extern int audio_id; |
b645204ea527
some cleanup - made private vars/funcs static, removed obsolete externs
arpi
parents:
7482
diff
changeset
|
502 //extern int video_id; |
b645204ea527
some cleanup - made private vars/funcs static, removed obsolete externs
arpi
parents:
7482
diff
changeset
|
503 //extern int dvdsub_id; |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
504 |
16175 | 505 void demuxer_help(void) |
506 { | |
507 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
|
508 |
16175 | 509 mp_msg(MSGT_DEMUXER, MSGL_INFO, "Available demuxers:\n"); |
510 mp_msg(MSGT_DEMUXER, MSGL_INFO, " demuxer: type info: (comment)\n"); | |
511 for (i = 0; demuxer_list[i]; i++) { | |
512 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Don't display special demuxers | |
513 continue; | |
514 if (demuxer_list[i]->comment && strlen(demuxer_list[i]->comment)) | |
515 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s (%s)\n", | |
516 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info, demuxer_list[i]->comment); | |
517 else | |
518 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s\n", | |
519 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info); | |
520 } | |
521 } | |
522 | |
14693
37116118ab6a
avisynth demuxer patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents:
14666
diff
changeset
|
523 |
16175 | 524 /** |
525 * Get demuxer type for a given demuxer name | |
526 * | |
527 * @param demuxer_name string with demuxer name of demuxer number | |
528 * @return DEMUXER_TYPE_xxx, -1 if error or not found | |
529 */ | |
530 int get_demuxer_type_from_name(char *demuxer_name) | |
531 { | |
532 int i; | |
533 long type_int; | |
534 char *endptr; | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
5107
diff
changeset
|
535 |
16175 | 536 for (i = 0; demuxer_list[i]; i++) { |
537 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Can't select special demuxers from commandline | |
538 continue; | |
539 if (strcmp(demuxer_name, demuxer_list[i]->name) == 0) | |
540 return demuxer_list[i]->type; | |
541 } | |
542 | |
543 // No match found, try to parse name as an integer (demuxer number) | |
544 type_int = strtol(demuxer_name, &endptr, 0); | |
545 if (*endptr) // Conversion failed | |
546 return -1; | |
547 if ((type_int > 0) && (type_int <= DEMUXER_TYPE_MAX)) | |
548 return (int)type_int; | |
549 | |
550 return -1; | |
551 } | |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
3786
diff
changeset
|
552 |
9751
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
553 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
|
554 |
9751
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
555 /* |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
556 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
|
557 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
|
558 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
|
559 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
|
560 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
|
561 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
|
562 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
|
563 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
|
564 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
|
565 (ex: tv,mf). |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
566 */ |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
567 |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
568 static demuxer_t* demux_open_stream(stream_t *stream,int file_format,int audio_id,int video_id,int dvdsub_id,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
|
569 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
570 //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
|
571 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
572 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
|
573 |
16175 | 574 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
|
575 |
16175 | 576 demuxer_desc_t *demuxer_desc; |
577 int fformat; | |
578 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
|
579 |
1659 | 580 //printf("demux_open(%p,%d,%d,%d,%d) \n",stream,file_format,audio_id,video_id,dvdsub_id); |
581 | |
16175 | 582 // If somebody requested a demuxer check it |
583 if (file_format) { | |
584 if ((demuxer_desc = get_demuxer_desc_from_type(file_format))) { | |
585 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename); | |
586 if (demuxer_desc->check_file) { | |
587 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) { | |
588 if (fformat == demuxer_desc->type) { | |
589 // Move messages to demuxer detection code? | |
590 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc); | |
591 file_format = demuxer_desc->type = fformat; | |
592 } else { | |
593 // Format changed after check, recurse | |
594 free_demuxer(demuxer); | |
595 return demux_open_stream(stream,fformat,audio_id,video_id,dvdsub_id,filename); | |
596 } | |
597 } else { | |
598 // Check failed for forced demuxer, quit | |
599 free_demuxer(demuxer); | |
600 return NULL; | |
601 } | |
602 } | |
603 } | |
9065 | 604 } |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
6192
diff
changeset
|
605 |
16175 | 606 if (demuxer) |
607 goto dmx_open; | |
6942
6048ac6ab001
detection reordered. note: raw DV detection should be more reliable.
arpi
parents:
6925
diff
changeset
|
608 |
16175 | 609 // Test demuxers with safe file checks |
610 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) { | |
611 if (demuxer_desc->safe_check) { | |
612 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename); | |
613 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) { | |
614 if (fformat == demuxer_desc->type) { | |
615 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc); | |
616 file_format = fformat; | |
617 break; | |
618 } else { | |
619 // Format changed after check, recurse | |
620 free_demuxer(demuxer); | |
621 demuxer=demux_open_stream(stream,fformat,audio_id,video_id,dvdsub_id,filename); | |
622 if(demuxer) return demuxer; // done! | |
623 file_format = DEMUXER_TYPE_UNKNOWN; | |
624 } | |
625 } else { | |
13520 | 626 free_demuxer(demuxer); |
627 demuxer = NULL; | |
628 } | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
629 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
630 } |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
631 |
16175 | 632 if (demuxer) |
633 goto dmx_open; | |
14276 | 634 |
16175 | 635 // 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
|
636 // 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
|
637 // 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
|
638 // first: |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
639 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
|
640 file_format=demuxer_type_by_filename(filename); |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
641 if(file_format!=DEMUXER_TYPE_UNKNOWN){ |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
642 // we like recursion :) |
14693
37116118ab6a
avisynth demuxer patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents:
14666
diff
changeset
|
643 demuxer=demux_open_stream(stream,file_format,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
|
644 if(demuxer) return demuxer; // done! |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
645 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
|
646 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
|
647 } |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
648 } |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
649 |
16175 | 650 // Try detection for all other demuxers |
651 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) { | |
652 if (!demuxer_desc->safe_check && demuxer_desc->check_file) { | |
653 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename); | |
654 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) { | |
655 if (fformat == demuxer_desc->type) { | |
656 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc); | |
657 file_format = fformat; | |
658 break; | |
659 } else { | |
660 // Format changed after check, recurse | |
661 free_demuxer(demuxer); | |
662 demuxer=demux_open_stream(stream,fformat,audio_id,video_id,dvdsub_id,filename); | |
663 if(demuxer) return demuxer; // done! | |
664 file_format = DEMUXER_TYPE_UNKNOWN; | |
665 } | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
666 } else { |
4660 | 667 free_demuxer(demuxer); |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
668 demuxer = NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
669 } |
4189 | 670 } |
671 } | |
15670 | 672 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
673 //=============== Unknown, exiting... =========================== |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
674 if(file_format==DEMUXER_TYPE_UNKNOWN || demuxer == NULL){ |
8925
5c15777f1c07
this patch adds an fallback to playlist (any but the plaintext-list format)
arpi
parents:
8821
diff
changeset
|
675 //mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_FormatNotRecognized); // will be done by mplayer.c after fallback to playlist-parsing |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
676 return NULL; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
677 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
678 //====== File format recognized, set up these for compatibility: ========= |
16175 | 679 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
|
680 |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
681 demuxer->file_format=file_format; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
682 |
16175 | 683 if (demuxer->desc->open) |
684 if (!(demuxer = demuxer->desc->open(demuxer))) | |
685 return NULL; | |
10263 | 686 |
13301
638673d1f83a
show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents:
13006
diff
changeset
|
687 if ((sh_video=demuxer->video->sh) && sh_video->bih) |
638673d1f83a
show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents:
13006
diff
changeset
|
688 mp_msg(MSGT_DEMUX,MSGL_INFO,"VIDEO: [%.4s] %ldx%ld %dbpp %5.3f fps %5.1f kbps (%4.1f kbyte/s)\n", |
638673d1f83a
show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents:
13006
diff
changeset
|
689 (char *)&sh_video->bih->biCompression, |
638673d1f83a
show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents:
13006
diff
changeset
|
690 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
|
691 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
|
692 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
|
693 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
|
694 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
|
695 sh_video->i_bps/1024.0f ); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
696 return demuxer; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
697 } |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
698 |
6623 | 699 char* audio_stream = NULL; |
7867 | 700 char* sub_stream = NULL; |
16175 | 701 int demuxer_type = 0; // used by rawaudio and rawvideo |
9709 | 702 int audio_stream_cache = 0; |
7867 | 703 |
16175 | 704 char *demuxer_name = NULL; // parameter from -demuxer |
705 char *audio_demuxer_name = NULL; // parameter from -audio-demuxer | |
706 char *sub_demuxer_name = NULL; // parameter from -sub-demuxer | |
707 | |
7867 | 708 extern int hr_mp3_seek; |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
709 |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
12434
diff
changeset
|
710 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
|
711 extern float stream_cache_seek_min_percent; |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
12434
diff
changeset
|
712 |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
713 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
|
714 stream_t *as = NULL,*ss = NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
715 demuxer_t *vd,*ad = NULL,*sd = NULL; |
12223 | 716 int afmt =DEMUXER_TYPE_UNKNOWN,sfmt = DEMUXER_TYPE_UNKNOWN ; |
16175 | 717 int audio_demuxer_type = 0, sub_demuxer_type = 0; |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
718 |
14046
4802041ab8e3
Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents:
14034
diff
changeset
|
719 demux_aid_vid_mismatch = 0; |
4802041ab8e3
Output more information about vids, aids, sids, alangs and slangs with -identify. Patch by kiriuja <mplayer-patches@en-directo.net>
mosu
parents:
14034
diff
changeset
|
720 |
16175 | 721 if (demuxer_name && ((demuxer_type = get_demuxer_type_from_name(demuxer_name)) < 0)) { |
722 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-demuxer %s does not exist.\n",demuxer_name); | |
723 } | |
724 if (audio_demuxer_name && ((audio_demuxer_type = get_demuxer_type_from_name(audio_demuxer_name)) < 0)) { | |
725 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-audio-demuxer %s does not exist.\n",audio_demuxer_name); | |
726 } | |
727 if (sub_demuxer_name && ((sub_demuxer_type = get_demuxer_type_from_name(sub_demuxer_name)) < 0)) { | |
728 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-sub-demuxer %s does not exist.\n",sub_demuxer_name); | |
729 } | |
730 | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
731 if(audio_stream) { |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
732 as = open_stream(audio_stream,0,&afmt); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
733 if(!as) { |
6951 | 734 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
|
735 return NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
736 } |
9709 | 737 if(audio_stream_cache) { |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
12434
diff
changeset
|
738 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
|
739 audio_stream_cache*1024*(stream_cache_seek_min_percent / 100.0))) { |
9709 | 740 free_stream(as); |
741 mp_msg(MSGT_DEMUXER,MSGL_ERR,"Can't enable audio stream cache\n"); | |
742 return NULL; | |
743 } | |
744 } | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
745 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
746 if(sub_stream) { |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
747 ss = open_stream(sub_stream,0,&sfmt); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
748 if(!ss) { |
6951 | 749 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
|
750 return NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
751 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
752 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
753 |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
754 vd = demux_open_stream(vs,demuxer_type ? demuxer_type : file_format,audio_stream ? -2 : audio_id,video_id, sub_stream ? -2 : dvdsub_id, filename); |
9709 | 755 if(!vd) { |
756 if(as) free_stream(as); | |
757 if(ss) free_stream(ss); | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
758 return NULL; |
9709 | 759 } |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
760 if(as) { |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
761 ad = demux_open_stream(as,audio_demuxer_type ? audio_demuxer_type : afmt,audio_id,-2,-2, audio_stream); |
9709 | 762 if(!ad) { |
6951 | 763 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningAudioDemuxerFailed,audio_stream); |
9709 | 764 free_stream(as); |
765 } | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
766 else if(ad->audio->sh && ((sh_audio_t*)ad->audio->sh)->format == 0x55) // MP3 |
7867 | 767 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
|
768 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
769 if(ss) { |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
770 sd = demux_open_stream(ss,sub_demuxer_type ? sub_demuxer_type : sfmt,-2,-2,dvdsub_id, sub_stream); |
9709 | 771 if(!sd) { |
6951 | 772 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningSubtitlesDemuxerFailed,sub_stream); |
9709 | 773 free_stream(ss); |
774 } | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
775 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
776 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
777 if(ad && sd) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
778 return new_demuxers_demuxer(vd,ad,sd); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
779 else if(ad) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
780 return new_demuxers_demuxer(vd,ad,vd); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
781 else if(sd) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
782 return new_demuxers_demuxer(vd,vd,sd); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
783 else |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
784 return vd; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
785 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
786 |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
787 |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
788 int demux_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
789 demux_stream_t *d_audio=demuxer->audio; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
790 demux_stream_t *d_video=demuxer->video; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
791 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
|
792 sh_video_t *sh_video=d_video->sh; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
793 |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
794 if(!demuxer->seekable){ |
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
795 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
|
796 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekRawAVI); |
2790 | 797 #ifdef USE_TV |
798 else if (demuxer->file_format==DEMUXER_TYPE_TV) | |
6951 | 799 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_TVInputNotSeekable); |
2790 | 800 #endif |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
801 else |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1659
diff
changeset
|
802 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekFile); |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
803 return 0; |
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
804 } |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
805 |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
806 // clear demux buffers: |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
807 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
|
808 ds_free_packs(d_video); |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
809 |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
810 demuxer->stream->eof=0; // clear eof flag |
3542
465329581ad8
reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents:
3411
diff
changeset
|
811 demuxer->video->eof=0; |
465329581ad8
reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents:
3411
diff
changeset
|
812 demuxer->audio->eof=0; |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
813 |
4203 | 814 #if 0 |
3824 | 815 if(sh_audio) sh_audio->timer=sh_video->timer; |
816 #else | |
8056
324b6e5387be
A-V sync cleanup: sh_audio->timer replaced by sh_audio->delay, it contains
arpi
parents:
8030
diff
changeset
|
817 if(sh_audio) sh_audio->delay=0; |
4587
886bf5274992
Audio only support. Include a fix in the asf demuxer opening.
albeu
parents:
4565
diff
changeset
|
818 if(sh_video) sh_video->timer=0; // !!!!!! |
3824 | 819 #endif |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
820 |
16175 | 821 if (demuxer->desc->seek) |
822 demuxer->desc->seek(demuxer,rel_seek_secs,flags); | |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
823 |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
824 return 1; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
825 } |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
826 |
3050 | 827 int demux_info_add(demuxer_t *demuxer, char *opt, char *param) |
828 { | |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
829 char **info = demuxer->info; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
830 int n = 0; |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
831 |
3050 | 832 |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
833 for(n = 0; info && info[2*n] != NULL; n++) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
834 { |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
835 if(!strcasecmp(opt,info[2*n])) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
836 { |
6951 | 837 mp_msg(MSGT_DEMUX, MSGL_WARN,MSGTR_DemuxerInfoAlreadyPresent,opt); |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
838 return 0; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
839 } |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
840 } |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
841 |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
842 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
|
843 info[2*n] = strdup(opt); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
844 info[2*n+1] = strdup(param); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
845 memset(&info[2*(n+1)],0,2*sizeof(char*)); |
3050 | 846 |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
847 return 1; |
3050 | 848 } |
849 | |
850 int demux_info_print(demuxer_t *demuxer) | |
851 { | |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
852 char **info = demuxer->info; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
853 int n; |
3050 | 854 |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
855 if(!info) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
856 return 0; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
857 |
6951 | 858 mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_ClipInfo); |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
859 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
|
860 { |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
861 mp_msg(MSGT_DEMUX, MSGL_INFO, " %s: %s\n",info[2*n],info[2*n+1]); |
15938
cf34ac76bd15
-identify variable names should follow [A-Z_][A-Z0-9_]* convention
ranma
parents:
15789
diff
changeset
|
862 if (identify) { |
cf34ac76bd15
-identify variable names should follow [A-Z_][A-Z0-9_]* convention
ranma
parents:
15789
diff
changeset
|
863 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_CLIP_INFO_NAME%d=%s\n", n, info[2*n]); |
cf34ac76bd15
-identify variable names should follow [A-Z_][A-Z0-9_]* convention
ranma
parents:
15789
diff
changeset
|
864 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_CLIP_INFO_VALUE%d=%s\n", n, info[2*n+1]); |
cf34ac76bd15
-identify variable names should follow [A-Z_][A-Z0-9_]* convention
ranma
parents:
15789
diff
changeset
|
865 } |
15789
32d9c8a0a02b
adds some more -identify output, patch by kiriuja < mplayer DASH patches PAM en DASH directo POUM net>
gpoirier
parents:
15780
diff
changeset
|
866 } |
15938
cf34ac76bd15
-identify variable names should follow [A-Z_][A-Z0-9_]* convention
ranma
parents:
15789
diff
changeset
|
867 if (identify) |
cf34ac76bd15
-identify variable names should follow [A-Z_][A-Z0-9_]* convention
ranma
parents:
15789
diff
changeset
|
868 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_CLIP_INFO_N=%d\n", n); |
4189 | 869 |
870 return 0; | |
3050 | 871 } |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
872 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
873 char* demux_info_get(demuxer_t *demuxer, char *opt) { |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
874 int i; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
875 char **info = demuxer->info; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
876 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
877 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
|
878 if(!strcasecmp(opt,info[2*i])) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
879 return info[2*i+1]; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
880 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
881 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
882 return NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
883 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
884 |
16175 | 885 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
|
886 |
16175 | 887 if (demuxer->desc->control) |
888 return demuxer->desc->control(demuxer,cmd,arg); | |
889 | |
890 return DEMUXER_CTRL_NOTIMPL; | |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
891 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
892 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
893 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
894 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
895 unsigned long demuxer_get_time_length(demuxer_t *demuxer){ |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
896 unsigned long get_time_ans; |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
897 sh_video_t *sh_video = demuxer->video->sh; |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
898 // <= 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
|
899 if (demux_control(demuxer, DEMUXER_CTRL_GET_TIME_LENGTH,(void *)&get_time_ans)<=0) { |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
900 if (sh_video && sh_video->i_bps) |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
901 get_time_ans = (demuxer->movi_end-demuxer->movi_start)/sh_video->i_bps; |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
902 else |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
903 get_time_ans=0; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
904 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
905 return get_time_ans; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
906 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
907 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
908 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
|
909 int ans = 0; |
2ae224195625
Use demuxer_get_percent_pos for the OSD position bar
reimar
parents:
14160
diff
changeset
|
910 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
|
911 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
|
912 if (res <= 0) { |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
913 if (len > 0) |
14197
2ae224195625
Use demuxer_get_percent_pos for the OSD position bar
reimar
parents:
14160
diff
changeset
|
914 ans = (demuxer->filepos - demuxer->movi_start) / len; |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
915 else |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
916 ans = 0; |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
917 } |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
918 if (ans < 0) ans = 0; |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
919 if (ans > 100) ans = 100; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
920 return ans; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
921 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
922 |
15285
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
923 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
|
924 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
|
925 if (res == DEMUXER_CTRL_NOTIMPL) |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
926 index = demuxer->audio->id; |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
927 return index; |
15046
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14934
diff
changeset
|
928 } |