Mercurial > mplayer.hg
annotate libmpdemux/demuxer.c @ 23510:a6c619ee9d30
Teletext support for tv:// (v4l and v4l2 only)
modified patch from Otvos Attila oattila at chello dot hu
Module uses zvbi library for all low-level VBI operations (like I/O with vbi
device, converting vbi pages into usefull vbi_page stuctures, rendering them
into RGB32 images).
All teletext related stuff (except properties, slave commands and rendering
osd in text mode or RGB32 rendered teletext pages in spu mode) is implemented
in tvi_vbi.c
New properties:
teletext_page - switching between pages
teletext_mode - switch between on/off/opaque/transparent modes
teletext_format - (currently read-only) allows to get format info
(black/white,gray,text)
teletext_half_page - trivial zooming (displaying top/bottom half of teletext
page)
New slave commands:
teletext_add_dec - user interface for jumping to any page by editing page number
interactively
teletext_go_link - goes though links, specified on current page
author | voroshil |
---|---|
date | Sun, 10 Jun 2007 00:06:12 +0000 |
parents | a124f3abc1ec |
children | ba9e664dbbaa |
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, | |
16572
56a5f69e9b35
"LIVE.COM Streaming Media" is now called "LIVE555 Streaming Media".
rsf
parents:
16522
diff
changeset
|
119 #ifdef STREAMING_LIVE555 |
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 | |
20872
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
212 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
|
213 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
|
214 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
|
215 id, MAX_S_STREAMS); |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
216 return NULL; |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
217 } |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
218 if (demuxer->s_streams[id]) |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
219 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
|
220 else { |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
221 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
|
222 demuxer->s_streams[id] = sh; |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
223 sh->sid = sid; |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
224 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid); |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
225 } |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
226 return demuxer->s_streams[id]; |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
227 } |
a8b42366e68a
Make subtitle stream handling more similar to audio and video streams.
reimar
parents:
20851
diff
changeset
|
228 |
19540 | 229 sh_audio_t* new_sh_audio_aid(demuxer_t *demuxer,int id,int aid){ |
5084 | 230 if(id > MAX_A_STREAMS-1 || id < 0) |
4642 | 231 { |
232 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested audio stream id overflow (%d > %d)\n", | |
233 id, MAX_A_STREAMS); | |
234 return NULL; | |
235 } | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
236 if(demuxer->a_streams[id]){ |
1584 | 237 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
|
238 } else { |
13357
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
239 sh_audio_t *sh; |
6951 | 240 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundAudioStream,id); |
20072 | 241 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
|
242 sh = demuxer->a_streams[id]; |
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
243 // set some defaults |
c605df89ca9f
moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents:
13301
diff
changeset
|
244 sh->samplesize=2; |
14245 | 245 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
|
246 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
|
247 sh->pts=MP_NOPTS_VALUE; |
19540 | 248 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
|
249 } |
19540 | 250 ((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
|
251 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
|
252 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
253 |
18708
9e2b300db17b
Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents:
18404
diff
changeset
|
254 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
|
255 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
|
256 demuxer->a_streams[id] = NULL; |
13946 | 257 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_audio at %p\n",sh); |
1643 | 258 if(sh->wf) free(sh->wf); |
259 free(sh); | |
260 } | |
261 | |
19540 | 262 sh_video_t* new_sh_video_vid(demuxer_t *demuxer,int id,int vid){ |
5084 | 263 if(id > MAX_V_STREAMS-1 || id < 0) |
4642 | 264 { |
265 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested video stream id overflow (%d > %d)\n", | |
266 id, MAX_V_STREAMS); | |
267 return NULL; | |
268 } | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
269 if(demuxer->v_streams[id]){ |
1584 | 270 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
|
271 } else { |
6951 | 272 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundVideoStream,id); |
20072 | 273 demuxer->v_streams[id]=calloc(1, sizeof(sh_video_t)); |
19540 | 274 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
|
275 } |
19540 | 276 ((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
|
277 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
|
278 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
279 |
1643 | 280 void free_sh_video(sh_video_t* sh){ |
13946 | 281 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_video at %p\n",sh); |
1657 | 282 if(sh->bih) free(sh->bih); |
1643 | 283 free(sh); |
284 } | |
285 | |
286 void free_demuxer(demuxer_t *demuxer){ | |
287 int i; | |
13946 | 288 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing demuxer at %p\n",demuxer); |
16175 | 289 if(demuxer->desc->close) |
290 demuxer->desc->close(demuxer); | |
291 // Very ugly hack to make it behave like old implementation | |
292 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
|
293 goto skip_streamfree; |
1643 | 294 // free streams: |
14666
91bbfcb66883
Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents:
14502
diff
changeset
|
295 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
|
296 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
|
297 for(i = 0; i < MAX_V_STREAMS; i++) |
1643 | 298 if(demuxer->v_streams[i]) free_sh_video(demuxer->v_streams[i]); |
299 // free demuxers: | |
300 free_demuxer_stream(demuxer->audio); | |
301 free_demuxer_stream(demuxer->video); | |
5412 | 302 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
|
303 skip_streamfree: |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
304 if(demuxer->info) { |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
305 for(i=0;demuxer->info[i] != NULL; i++) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
306 free(demuxer->info[i]); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
307 free(demuxer->info); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
308 } |
16175 | 309 if(demuxer->filename) |
310 free(demuxer->filename); | |
19342 | 311 if (demuxer->chapters) { |
312 for (i=0; i<demuxer->num_chapters; i++) | |
313 if (demuxer->chapters[i].name) | |
314 free(demuxer->chapters[i].name); | |
315 free(demuxer->chapters); | |
316 } | |
1643 | 317 free(demuxer); |
318 } | |
319 | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
320 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
321 void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){ |
1 | 322 // demux_packet_t* dp=new_demux_packet(len); |
323 // stream_read(stream,dp->buffer,len); | |
324 // dp->pts=pts; //(float)pts/90000.0f; | |
325 // dp->pos=pos; | |
326 // append packet to DS stream: | |
327 ++ds->packs; | |
328 ds->bytes+=dp->len; | |
329 if(ds->last){ | |
330 // next packet in stream | |
331 ds->last->next=dp; | |
332 ds->last=dp; | |
333 } else { | |
334 // first packet in stream | |
335 ds->first=ds->last=dp; | |
336 } | |
1567 | 337 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 | 338 (ds==ds->demuxer->audio)?"d_audio":"d_video", |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1421
diff
changeset
|
339 dp->len,dp->pts,(unsigned int)dp->pos,ds->demuxer->audio->packs,ds->demuxer->video->packs); |
1 | 340 } |
341 | |
18309
87161f96fa66
Change common pts variables from floats to doubles. Individual demuxers
uau
parents:
18242
diff
changeset
|
342 void ds_read_packet(demux_stream_t *ds, stream_t *stream, int len, double pts, off_t pos, int flags) { |
1 | 343 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
|
344 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
|
345 resize_demux_packet(dp, len); |
1 | 346 dp->pts=pts; //(float)pts/90000.0f; |
347 dp->pos=pos; | |
979 | 348 dp->flags=flags; |
1 | 349 // append packet to DS stream: |
350 ds_add_packet(ds,dp); | |
351 } | |
352 | |
353 // return value: | |
354 // 0 = EOF or no stream found or invalid type | |
355 // 1 = successfully read a packet | |
356 | |
357 int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){ | |
358 // 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
|
359 // printf("demux->type=%d\n",demux->type); |
16175 | 360 return demux->desc->fill_buffer(demux, ds); |
1 | 361 } |
362 | |
363 // return value: | |
364 // 0 = EOF | |
365 // 1 = succesfull | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
366 int ds_fill_buffer(demux_stream_t *ds){ |
1 | 367 demuxer_t *demux=ds->demuxer; |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
368 if(ds->current) free_demux_packet(ds->current); |
17932 | 369 if( mp_msg_test(MSGT_DEMUXER,MSGL_DBG3) ){ |
1567 | 370 if(ds==demux->audio) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_audio) called\n");else |
371 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
|
372 if(ds==demux->sub) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_sub) called\n");else |
1567 | 373 mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(unknown 0x%X) called\n",(unsigned int)ds); |
1 | 374 } |
375 while(1){ | |
376 if(ds->packs){ | |
377 demux_packet_t *p=ds->first; | |
378 // copy useful data: | |
379 ds->buffer=p->buffer; | |
380 ds->buffer_pos=0; | |
381 ds->buffer_size=p->len; | |
382 ds->pos=p->pos; | |
383 ds->dpos+=p->len; // !!! | |
889 | 384 ++ds->pack_no; |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
385 if (p->pts != (correct_pts ? MP_NOPTS_VALUE : 0)) { |
746 | 386 ds->pts=p->pts; |
387 ds->pts_bytes=0; | |
388 } | |
389 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
|
390 if(p->stream_pts != MP_NOPTS_VALUE) demux->stream_pts=p->stream_pts; |
979 | 391 ds->flags=p->flags; |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
392 // unlink packet: |
1 | 393 ds->bytes-=p->len; |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
394 ds->current=p; |
1 | 395 ds->first=p->next; |
396 if(!ds->first) ds->last=NULL; | |
397 --ds->packs; | |
398 return 1; //ds->buffer_size; | |
399 } | |
400 if(demux->audio->packs>=MAX_PACKS || demux->audio->bytes>=MAX_PACK_BYTES){ | |
1584 | 401 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyAudioInBuffer,demux->audio->packs,demux->audio->bytes); |
402 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); | |
1 | 403 break; |
404 } | |
405 if(demux->video->packs>=MAX_PACKS || demux->video->bytes>=MAX_PACK_BYTES){ | |
1584 | 406 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyVideoInBuffer,demux->video->packs,demux->video->bytes); |
407 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI); | |
1 | 408 break; |
409 } | |
1421 | 410 if(!demux_fill_buffer(demux,ds)){ |
1567 | 411 mp_dbg(MSGT_DEMUXER,MSGL_DBG2,"ds_fill_buffer()->demux_fill_buffer() failed\n"); |
1421 | 412 break; // EOF |
413 } | |
1 | 414 } |
415 ds->buffer_pos=ds->buffer_size=0; | |
416 ds->buffer=NULL; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
417 ds->current=NULL; |
1567 | 418 mp_msg(MSGT_DEMUXER,MSGL_V,"ds_fill_buffer: EOF reached (stream: %s) \n",ds==demux->audio?"audio":"video"); |
1 | 419 ds->eof=1; |
420 return 0; | |
421 } | |
422 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
423 int demux_read_data(demux_stream_t *ds,unsigned char* mem,int len){ |
1 | 424 int x; |
425 int bytes=0; | |
426 while(len>0){ | |
427 x=ds->buffer_size-ds->buffer_pos; | |
428 if(x==0){ | |
429 if(!ds_fill_buffer(ds)) return bytes; | |
430 } else { | |
431 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
|
432 if(mem) fast_memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x); |
1 | 433 bytes+=x;len-=x;ds->buffer_pos+=x; |
434 } | |
435 } | |
436 return bytes; | |
437 } | |
438 | |
746 | 439 int demux_read_data_pack(demux_stream_t *ds,unsigned char* mem,int len){ |
440 int x; | |
441 int bytes=0; | |
442 while(len>0){ | |
443 x=ds->buffer_size-ds->buffer_pos; | |
444 if(x==0){ | |
445 if(!ds_fill_buffer(ds)) return bytes; | |
446 } else { | |
447 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
|
448 if(mem) fast_memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x); |
746 | 449 bytes+=x;len-=x;ds->buffer_pos+=x; |
450 return bytes; // stop at end of package! (for correct timestamping) | |
451 } | |
452 } | |
453 return bytes; | |
454 } | |
455 | |
17417
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
456 /** |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
457 * \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
|
458 * \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
|
459 * \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
|
460 * \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
|
461 * \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
|
462 * \return whether pattern was found |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
463 */ |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
464 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
|
465 int *read, uint32_t pattern) { |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
466 register uint32_t head = 0xffffff00; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
467 register uint32_t pat = pattern & 0xffffff00; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
468 int total_len = 0; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
469 do { |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
470 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
|
471 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
|
472 register long pos = -len; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
473 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
|
474 ds_fill_buffer(ds); |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
475 continue; |
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 do { |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
478 head |= ds_buf[pos]; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
479 head <<= 8; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
480 } while (++pos && head != pat); |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
481 len += pos; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
482 if (total_len + len > maxlen) |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
483 len = maxlen - total_len; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
484 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
|
485 total_len += len; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
486 } 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
|
487 if (read) |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
488 *read = total_len; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
489 return total_len >= 3 && head == pat; |
960b2fa1567e
function to read from a demuxer up to (and including) the specified
reimar
parents:
17366
diff
changeset
|
490 } |
746 | 491 |
1 | 492 void ds_free_packs(demux_stream_t *ds){ |
493 demux_packet_t *dp=ds->first; | |
494 while(dp){ | |
495 demux_packet_t *dn=dp->next; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
496 free_demux_packet(dp); |
1 | 497 dp=dn; |
498 } | |
499 if(ds->asf_packet){ | |
500 // free unfinished .asf fragments: | |
501 free(ds->asf_packet->buffer); | |
502 free(ds->asf_packet); | |
503 ds->asf_packet=NULL; | |
504 } | |
505 ds->first=ds->last=NULL; | |
506 ds->packs=0; // !!!!! | |
507 ds->bytes=0; | |
6192
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
508 if(ds->current) free_demux_packet(ds->current); |
f03fe2e84efd
clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents:
5930
diff
changeset
|
509 ds->current=NULL; |
1 | 510 ds->buffer=NULL; |
511 ds->buffer_pos=ds->buffer_size; | |
828 | 512 ds->pts=0; ds->pts_bytes=0; |
1 | 513 } |
514 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
515 int ds_get_packet(demux_stream_t *ds,unsigned char **start){ |
1 | 516 while(1){ |
517 int len; | |
518 if(ds->buffer_pos>=ds->buffer_size){ | |
519 if(!ds_fill_buffer(ds)){ | |
520 // EOF | |
521 *start = NULL; | |
522 return -1; | |
523 } | |
524 } | |
525 len=ds->buffer_size-ds->buffer_pos; | |
526 *start = &ds->buffer[ds->buffer_pos]; | |
527 ds->buffer_pos+=len; | |
528 return len; | |
529 } | |
530 } | |
554 | 531 |
18242
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
532 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
|
533 { |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
534 int len; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
535 *pts = MP_NOPTS_VALUE; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
536 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
|
537 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
|
538 // EOF |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
539 *start = NULL; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
540 return -1; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
541 } |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
542 } |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
543 // 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
|
544 // 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
|
545 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
|
546 *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
|
547 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
|
548 *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
|
549 ds->buffer_pos+=len; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
550 return len; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
551 } |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
18237
diff
changeset
|
552 |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
554
diff
changeset
|
553 int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start){ |
554 | 554 while(1){ |
555 int len; | |
556 if(ds->buffer_pos>=ds->buffer_size){ | |
557 *start = NULL; | |
558 if(!ds->packs) return -1; // no sub | |
559 if(!ds_fill_buffer(ds)) return -1; // EOF | |
560 } | |
561 len=ds->buffer_size-ds->buffer_pos; | |
562 *start = &ds->buffer[ds->buffer_pos]; | |
563 ds->buffer_pos+=len; | |
564 return len; | |
565 } | |
566 } | |
567 | |
18309
87161f96fa66
Change common pts variables from floats to doubles. Individual demuxers
uau
parents:
18242
diff
changeset
|
568 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
|
569 { |
5930
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
570 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
|
571 while(!ds->first) { |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
572 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
|
573 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
|
574 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
|
575 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
|
576 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
577 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
|
578 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
|
579 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
|
580 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
|
581 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
582 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
|
583 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
|
584 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
585 return ds->first->pts; |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
586 } |
68cac7ecaf05
Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents:
5897
diff
changeset
|
587 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
588 // ==================================================================== |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
589 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
590 // 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
|
591 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
|
592 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
|
593 |
7559
b645204ea527
some cleanup - made private vars/funcs static, removed obsolete externs
arpi
parents:
7482
diff
changeset
|
594 //extern int audio_id; |
b645204ea527
some cleanup - made private vars/funcs static, removed obsolete externs
arpi
parents:
7482
diff
changeset
|
595 //extern int video_id; |
b645204ea527
some cleanup - made private vars/funcs static, removed obsolete externs
arpi
parents:
7482
diff
changeset
|
596 //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
|
597 |
16175 | 598 void demuxer_help(void) |
599 { | |
600 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
|
601 |
16175 | 602 mp_msg(MSGT_DEMUXER, MSGL_INFO, "Available demuxers:\n"); |
603 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
|
604 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DEMUXERS\n"); |
16175 | 605 for (i = 0; demuxer_list[i]; i++) { |
606 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Don't display special demuxers | |
607 continue; | |
608 if (demuxer_list[i]->comment && strlen(demuxer_list[i]->comment)) | |
609 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s (%s)\n", | |
610 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info, demuxer_list[i]->comment); | |
611 else | |
612 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s\n", | |
613 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info); | |
614 } | |
615 } | |
616 | |
14693
37116118ab6a
avisynth demuxer patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents:
14666
diff
changeset
|
617 |
16175 | 618 /** |
619 * Get demuxer type for a given demuxer name | |
620 * | |
621 * @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
|
622 * @param force will be set if demuxer should be forced. |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
623 * May be NULL. |
16175 | 624 * @return DEMUXER_TYPE_xxx, -1 if error or not found |
625 */ | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
626 int get_demuxer_type_from_name(char *demuxer_name, int *force) |
16175 | 627 { |
628 int i; | |
629 long type_int; | |
630 char *endptr; | |
5133
9841a86d66f9
Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents:
5107
diff
changeset
|
631 |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
632 if (!demuxer_name || !demuxer_name[0]) |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
633 return DEMUXER_TYPE_UNKNOWN; |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
634 if (force) *force = demuxer_name[0] == '+'; |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
635 if (demuxer_name[0] == '+') |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
636 demuxer_name = &demuxer_name[1]; |
16175 | 637 for (i = 0; demuxer_list[i]; i++) { |
638 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Can't select special demuxers from commandline | |
639 continue; | |
640 if (strcmp(demuxer_name, demuxer_list[i]->name) == 0) | |
641 return demuxer_list[i]->type; | |
642 } | |
643 | |
644 // No match found, try to parse name as an integer (demuxer number) | |
645 type_int = strtol(demuxer_name, &endptr, 0); | |
646 if (*endptr) // Conversion failed | |
647 return -1; | |
648 if ((type_int > 0) && (type_int <= DEMUXER_TYPE_MAX)) | |
649 return (int)type_int; | |
650 | |
651 return -1; | |
652 } | |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
3786
diff
changeset
|
653 |
9751
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
654 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
|
655 |
18917
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
656 int correct_pts=0; |
d9a75b26da6c
Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents:
18900
diff
changeset
|
657 |
9751
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
658 /* |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
659 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
|
660 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
|
661 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
|
662 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
|
663 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
|
664 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
|
665 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
|
666 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
|
667 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
|
668 (ex: tv,mf). |
00c97b0891e3
Fix all demuxers wich where using a global var to enable themself.
albeu
parents:
9709
diff
changeset
|
669 */ |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
670 |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
671 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
|
672 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
|
673 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
|
674 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
675 //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
|
676 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
677 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
|
678 |
16175 | 679 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
|
680 |
16175 | 681 demuxer_desc_t *demuxer_desc; |
682 int fformat; | |
683 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
|
684 |
1659 | 685 //printf("demux_open(%p,%d,%d,%d,%d) \n",stream,file_format,audio_id,video_id,dvdsub_id); |
686 | |
16175 | 687 // If somebody requested a demuxer check it |
688 if (file_format) { | |
689 if ((demuxer_desc = get_demuxer_desc_from_type(file_format))) { | |
690 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
|
691 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
|
692 fformat = demuxer_desc->check_file(demuxer); |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
693 if (force || !demuxer_desc->check_file) |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
694 fformat = demuxer_desc->type; |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
695 if (fformat != 0) { |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
696 if (fformat == demuxer_desc->type) { |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
697 demuxer_t *demux2 = demuxer; |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
698 // Move messages to demuxer detection code? |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
699 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
|
700 file_format = demuxer_desc->type = fformat; |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
701 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
|
702 demuxer = demux2; |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
703 goto dmx_open; |
16175 | 704 } |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
705 } else { |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
706 // Format changed after check, recurse |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
707 free_demuxer(demuxer); |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
708 return demux_open_stream(stream, fformat, force, |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
709 audio_id, video_id, dvdsub_id, filename); |
20303 | 710 } |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
711 } |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
712 // Check failed for forced demuxer, quit |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
713 free_demuxer(demuxer); |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
714 return NULL; |
16175 | 715 } |
9065 | 716 } |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
6192
diff
changeset
|
717 |
16175 | 718 // Test demuxers with safe file checks |
719 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) { | |
720 if (demuxer_desc->safe_check) { | |
721 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename); | |
722 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) { | |
723 if (fformat == demuxer_desc->type) { | |
20303 | 724 demuxer_t *demux2 = demuxer; |
16175 | 725 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc); |
726 file_format = fformat; | |
20303 | 727 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) { |
728 demuxer = demux2; | |
729 goto dmx_open; | |
730 } | |
16175 | 731 } else { |
16326
88b9c7b0e773
Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents:
16321
diff
changeset
|
732 if (fformat == DEMUXER_TYPE_PLAYLIST) |
88b9c7b0e773
Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents:
16321
diff
changeset
|
733 return demuxer; // handled in mplayer.c |
16175 | 734 // Format changed after check, recurse |
735 free_demuxer(demuxer); | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
736 demuxer=demux_open_stream(stream, fformat, force, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
737 audio_id, video_id, dvdsub_id, filename); |
16175 | 738 if(demuxer) return demuxer; // done! |
739 file_format = DEMUXER_TYPE_UNKNOWN; | |
740 } | |
20303 | 741 } |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
742 free_demuxer(demuxer); |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
743 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
|
744 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
745 } |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
746 |
16175 | 747 // 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
|
748 // 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
|
749 // 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
|
750 // first: |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
751 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
|
752 file_format=demuxer_type_by_filename(filename); |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
753 if(file_format!=DEMUXER_TYPE_UNKNOWN){ |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
754 // we like recursion :) |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
755 demuxer=demux_open_stream(stream, file_format, force, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
756 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
|
757 if(demuxer) return demuxer; // done! |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
758 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
|
759 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
|
760 } |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
761 } |
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
762 |
16175 | 763 // Try detection for all other demuxers |
764 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) { | |
765 if (!demuxer_desc->safe_check && demuxer_desc->check_file) { | |
766 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename); | |
767 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) { | |
768 if (fformat == demuxer_desc->type) { | |
20303 | 769 demuxer_t *demux2 = demuxer; |
16175 | 770 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc); |
771 file_format = fformat; | |
20303 | 772 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) { |
773 demuxer = demux2; | |
774 goto dmx_open; | |
775 } | |
16175 | 776 } else { |
16326
88b9c7b0e773
Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents:
16321
diff
changeset
|
777 if (fformat == DEMUXER_TYPE_PLAYLIST) |
88b9c7b0e773
Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents:
16321
diff
changeset
|
778 return demuxer; // handled in mplayer.c |
16175 | 779 // Format changed after check, recurse |
780 free_demuxer(demuxer); | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
781 demuxer=demux_open_stream(stream, fformat, force, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
782 audio_id, video_id, dvdsub_id, filename); |
16175 | 783 if(demuxer) return demuxer; // done! |
784 file_format = DEMUXER_TYPE_UNKNOWN; | |
785 } | |
20303 | 786 } |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
787 free_demuxer(demuxer); |
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
788 demuxer = NULL; |
4189 | 789 } |
790 } | |
15670 | 791 |
20319
03e64a7a6d5e
Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents:
20318
diff
changeset
|
792 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
|
793 //====== File format recognized, set up these for compatibility: ========= |
16175 | 794 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
|
795 |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
796 demuxer->file_format=file_format; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1456
diff
changeset
|
797 |
16477 | 798 if ((sh_video=demuxer->video->sh) && sh_video->bih){ |
799 int biComp=le2me_32(sh_video->bih->biCompression); | |
17366 | 800 mp_msg(MSGT_DEMUX,MSGL_INFO,"VIDEO: [%.4s] %dx%d %dbpp %5.3f fps %5.1f kbps (%4.1f kbyte/s)\n", |
16477 | 801 (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
|
802 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
|
803 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
|
804 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
|
805 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
|
806 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
|
807 sh_video->i_bps/1024.0f ); |
16477 | 808 } |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
809 return demuxer; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1331
diff
changeset
|
810 } |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
811 |
6623 | 812 char* audio_stream = NULL; |
7867 | 813 char* sub_stream = NULL; |
16175 | 814 int demuxer_type = 0; // used by rawaudio and rawvideo |
9709 | 815 int audio_stream_cache = 0; |
7867 | 816 |
16175 | 817 char *demuxer_name = NULL; // parameter from -demuxer |
818 char *audio_demuxer_name = NULL; // parameter from -audio-demuxer | |
819 char *sub_demuxer_name = NULL; // parameter from -sub-demuxer | |
820 | |
7867 | 821 extern int hr_mp3_seek; |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
822 |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
12434
diff
changeset
|
823 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
|
824 extern float stream_cache_seek_min_percent; |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
12434
diff
changeset
|
825 |
9006
d00997f12257
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents:
8937
diff
changeset
|
826 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
|
827 stream_t *as = NULL,*ss = NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
828 demuxer_t *vd,*ad = NULL,*sd = NULL; |
12223 | 829 int afmt =DEMUXER_TYPE_UNKNOWN,sfmt = DEMUXER_TYPE_UNKNOWN ; |
16175 | 830 int audio_demuxer_type = 0, sub_demuxer_type = 0; |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
831 int demuxer_force = 0, audio_demuxer_force = 0, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
832 sub_demuxer_force = 0; |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
833 |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
834 if ((demuxer_type = get_demuxer_type_from_name(demuxer_name, &demuxer_force)) < 0) { |
16175 | 835 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-demuxer %s does not exist.\n",demuxer_name); |
836 } | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
837 if ((audio_demuxer_type = get_demuxer_type_from_name(audio_demuxer_name, &audio_demuxer_force)) < 0) { |
16175 | 838 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-audio-demuxer %s does not exist.\n",audio_demuxer_name); |
839 } | |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
840 if ((sub_demuxer_type = get_demuxer_type_from_name(sub_demuxer_name, &sub_demuxer_force)) < 0) { |
16175 | 841 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-sub-demuxer %s does not exist.\n",sub_demuxer_name); |
842 } | |
843 | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
844 if(audio_stream) { |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
845 as = open_stream(audio_stream,0,&afmt); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
846 if(!as) { |
6951 | 847 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
|
848 return NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
849 } |
9709 | 850 if(audio_stream_cache) { |
12835
4235ae5a2d60
cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents:
12434
diff
changeset
|
851 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
|
852 audio_stream_cache*1024*(stream_cache_seek_min_percent / 100.0))) { |
9709 | 853 free_stream(as); |
854 mp_msg(MSGT_DEMUXER,MSGL_ERR,"Can't enable audio stream cache\n"); | |
855 return NULL; | |
856 } | |
857 } | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
858 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
859 if(sub_stream) { |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
860 ss = open_stream(sub_stream,0,&sfmt); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
861 if(!ss) { |
6951 | 862 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
|
863 return NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
864 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
865 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
866 |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
867 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
|
868 demuxer_force, audio_stream ? -2 : audio_id, video_id, |
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
869 sub_stream ? -2 : dvdsub_id, filename); |
9709 | 870 if(!vd) { |
871 if(as) free_stream(as); | |
872 if(ss) free_stream(ss); | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
873 return NULL; |
9709 | 874 } |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
875 if(as) { |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
876 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
|
877 audio_demuxer_force, audio_id, -2, -2, audio_stream); |
9709 | 878 if(!ad) { |
6951 | 879 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningAudioDemuxerFailed,audio_stream); |
9709 | 880 free_stream(as); |
881 } | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
882 else if(ad->audio->sh && ((sh_audio_t*)ad->audio->sh)->format == 0x55) // MP3 |
7867 | 883 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
|
884 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
885 if(ss) { |
16321
efbfac98cab1
Allow forcing of demuxers and codecs by prepending '+'
reimar
parents:
16310
diff
changeset
|
886 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
|
887 sub_demuxer_force, -2, -2, dvdsub_id, sub_stream); |
9709 | 888 if(!sd) { |
6951 | 889 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningSubtitlesDemuxerFailed,sub_stream); |
9709 | 890 free_stream(ss); |
891 } | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
892 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
893 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
894 if(ad && sd) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
895 return new_demuxers_demuxer(vd,ad,sd); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
896 else if(ad) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
897 return new_demuxers_demuxer(vd,ad,vd); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
898 else if(sd) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
899 return new_demuxers_demuxer(vd,vd,sd); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
900 else |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
901 return vd; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
902 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
903 |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
904 |
17636 | 905 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
|
906 demux_stream_t *d_audio=demuxer->audio; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
907 demux_stream_t *d_video=demuxer->video; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
908 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
|
909 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
|
910 double tmp = 0; |
20748
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
911 double pts; |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
912 |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
913 if(!demuxer->seekable){ |
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
914 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
|
915 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekRawAVI); |
2790 | 916 #ifdef USE_TV |
917 else if (demuxer->file_format==DEMUXER_TYPE_TV) | |
6951 | 918 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_TVInputNotSeekable); |
2790 | 919 #endif |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
920 else |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1659
diff
changeset
|
921 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekFile); |
1623
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
922 return 0; |
5908dd344067
added demuxer->seekable flag to generalize seeking ability test
arpi
parents:
1584
diff
changeset
|
923 } |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
924 |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
925 // clear demux buffers: |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
926 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
|
927 ds_free_packs(d_video); |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
928 |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
929 demuxer->stream->eof=0; // clear eof flag |
3542
465329581ad8
reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents:
3411
diff
changeset
|
930 demuxer->video->eof=0; |
465329581ad8
reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents:
3411
diff
changeset
|
931 demuxer->audio->eof=0; |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
932 |
4203 | 933 #if 0 |
3824 | 934 if(sh_audio) sh_audio->timer=sh_video->timer; |
935 #else | |
4587
886bf5274992
Audio only support. Include a fix in the asf demuxer opening.
albeu
parents:
4565
diff
changeset
|
936 if(sh_video) sh_video->timer=0; // !!!!!! |
3824 | 937 #endif |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
938 |
20748
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
939 if(flags & 1) // absolute seek |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
940 pts = 0.0f; |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
941 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
|
942 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
|
943 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
|
944 pts = demuxer->stream_pts; |
20748
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
945 } |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
946 |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
947 if(flags & 2) { // percent seek |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
948 if(stream_control(demuxer->stream, STREAM_CTRL_GET_TIME_LENGTH, &tmp) == STREAM_UNSUPORTED) |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
949 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
|
950 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
|
951 } else |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
952 pts += rel_seek_secs; |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
953 |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
954 if(stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_TIME, &pts) != STREAM_UNSUPORTED) { |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
955 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
|
956 return 1; |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
957 } |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
958 |
865b71a83296
now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents:
20319
diff
changeset
|
959 dmx_seek: |
16175 | 960 if (demuxer->desc->seek) |
17636 | 961 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
|
962 |
16877
9081ae3a702c
move resync_audio_stream after seeking to demuxer.c
reimar
parents:
16572
diff
changeset
|
963 if (sh_audio) resync_audio_stream(sh_audio); |
9081ae3a702c
move resync_audio_stream after seeking to demuxer.c
reimar
parents:
16572
diff
changeset
|
964 |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
965 return 1; |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
966 } |
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
967 |
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
|
968 int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param) |
3050 | 969 { |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
970 char **info = demuxer->info; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
971 int n = 0; |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
972 |
3050 | 973 |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
974 for(n = 0; info && info[2*n] != NULL; n++) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
975 { |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
976 if(!strcasecmp(opt,info[2*n])) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
977 { |
19413
acd26ccbff0d
Update information and print new value when demux_info_add is called
reimar
parents:
19342
diff
changeset
|
978 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
|
979 free(info[2*n+1]); |
acd26ccbff0d
Update information and print new value when demux_info_add is called
reimar
parents:
19342
diff
changeset
|
980 info[2*n+1] = strdup(param); |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
981 return 0; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
982 } |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
983 } |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
984 |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
985 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
|
986 info[2*n] = strdup(opt); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
987 info[2*n+1] = strdup(param); |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
988 memset(&info[2*(n+1)],0,2*sizeof(char*)); |
3050 | 989 |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
990 return 1; |
3050 | 991 } |
992 | |
993 int demux_info_print(demuxer_t *demuxer) | |
994 { | |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
995 char **info = demuxer->info; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
996 int n; |
3050 | 997 |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
998 if(!info) |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
999 return 0; |
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
1000 |
6951 | 1001 mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_ClipInfo); |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
1002 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
|
1003 { |
4694
a21735031d6a
Audio file demuxer. Extended version for demuxer info.
albeu
parents:
4660
diff
changeset
|
1004 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
|
1005 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
|
1006 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
|
1007 } |
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
|
1008 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_N=%d\n", n); |
4189 | 1009 |
1010 return 0; | |
3050 | 1011 } |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1012 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1013 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
|
1014 int i; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1015 char **info = demuxer->info; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1016 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1017 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
|
1018 if(!strcasecmp(opt,info[2*i])) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1019 return info[2*i+1]; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1020 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1021 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1022 return NULL; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1023 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
4735
diff
changeset
|
1024 |
16175 | 1025 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
|
1026 |
16175 | 1027 if (demuxer->desc->control) |
1028 return demuxer->desc->control(demuxer,cmd,arg); | |
1029 | |
1030 return DEMUXER_CTRL_NOTIMPL; | |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1031 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1032 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1033 |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1034 |
16346
6ff303d2876b
Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents:
16326
diff
changeset
|
1035 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
|
1036 double get_time_ans; |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1037 sh_video_t *sh_video = demuxer->video->sh; |
16925 | 1038 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
|
1039 // <= 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
|
1040 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
|
1041 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
|
1042 get_time_ans = (double)(demuxer->movi_end-demuxer->movi_start)/sh_video->i_bps; |
16925 | 1043 else if (sh_audio && sh_audio->i_bps) |
1044 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
|
1045 else |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1046 get_time_ans=0; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1047 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1048 return get_time_ans; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1049 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1050 |
20749
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1051 /** |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1052 * \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
|
1053 * 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
|
1054 * 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
|
1055 * 0 otherwise |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1056 * \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
|
1057 */ |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1058 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
|
1059 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
|
1060 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
|
1061 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
|
1062 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
|
1063 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
|
1064 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
|
1065 } |
eafd9953b505
added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents:
20748
diff
changeset
|
1066 |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1067 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
|
1068 int ans = 0; |
2ae224195625
Use demuxer_get_percent_pos for the OSD position bar
reimar
parents:
14160
diff
changeset
|
1069 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
|
1070 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
|
1071 if (res <= 0) { |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1072 if (len > 0) |
14197
2ae224195625
Use demuxer_get_percent_pos for the OSD position bar
reimar
parents:
14160
diff
changeset
|
1073 ans = (demuxer->filepos - demuxer->movi_start) / len; |
14502
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1074 else |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1075 ans = 0; |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1076 } |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1077 if (ans < 0) ans = 0; |
8769fa370f83
Move generic length and percent pos calculation to demuxer.c
reimar
parents:
14276
diff
changeset
|
1078 if (ans > 100) ans = 100; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1079 return ans; |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1080 } |
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8123
diff
changeset
|
1081 |
15285
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1082 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
|
1083 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
|
1084 if (res == DEMUXER_CTRL_NOTIMPL) |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1085 index = demuxer->audio->id; |
39eb8a327ea9
adds a parameter to the switch_audio command to directly select a track.
reimar
parents:
15046
diff
changeset
|
1086 return index; |
15046
b7aa70b05d76
Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents:
14934
diff
changeset
|
1087 } |
19342 | 1088 |
20948 | 1089 int demuxer_switch_video(demuxer_t *demuxer, int index){ |
1090 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_VIDEO, &index); | |
1091 if (res == DEMUXER_CTRL_NOTIMPL) | |
1092 index = demuxer->video->id; | |
1093 return index; | |
1094 } | |
1095 | |
19342 | 1096 int demuxer_add_chapter(demuxer_t* demuxer, const char* name, uint64_t start, uint64_t end){ |
1097 if (demuxer->chapters == NULL) | |
1098 demuxer->chapters = malloc (32*sizeof(*demuxer->chapters)); | |
1099 else if (!(demuxer->num_chapters % 32)) | |
1100 demuxer->chapters = realloc (demuxer->chapters, (demuxer->num_chapters + 32) * sizeof(*demuxer->chapters)); | |
1101 | |
1102 demuxer->chapters[demuxer->num_chapters].start = start; | |
1103 demuxer->chapters[demuxer->num_chapters].end = end; | |
1104 demuxer->chapters[demuxer->num_chapters].name = strdup(name); | |
1105 | |
1106 return demuxer->num_chapters ++; | |
1107 } | |
1108 | |
19435 | 1109 /** |
1110 * \brief demuxer_seek_chapter() seeks to a chapter in two possible ways: | |
1111 * either using the demuxer->chapters structure set by the demuxer | |
1112 * or asking help to the stream layer (e.g. dvd) | |
19439 | 1113 * \param chapter - chapter number wished - 0-based |
19435 | 1114 * \param mode 0: relative to current main pts, 1: absolute |
1115 * \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
|
1116 * \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
|
1117 * \param chapter_name name of chapter found (set by this function is param is not null) |
19435 | 1118 * \return -1 on error, current chapter if successful |
1119 */ | |
1120 | |
19478
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1121 int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode, float *seek_pts, int *num_chapters, char **chapter_name) { |
19435 | 1122 int ris; |
1123 int current, total; | |
1124 sh_video_t *sh_video = demuxer->video->sh; | |
1125 sh_audio_t *sh_audio = demuxer->audio->sh; | |
1126 | |
1127 if (!demuxer->num_chapters || !demuxer->chapters) { | |
19438
263e95c47aec
support relative seeking in the stream-driven case
nicodvb
parents:
19435
diff
changeset
|
1128 if(!mode) { |
263e95c47aec
support relative seeking in the stream-driven case
nicodvb
parents:
19435
diff
changeset
|
1129 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER, ¤t); |
20841 | 1130 if(ris == STREAM_UNSUPORTED) return -1; |
19438
263e95c47aec
support relative seeking in the stream-driven case
nicodvb
parents:
19435
diff
changeset
|
1131 chapter += current; |
263e95c47aec
support relative seeking in the stream-driven case
nicodvb
parents:
19435
diff
changeset
|
1132 } |
263e95c47aec
support relative seeking in the stream-driven case
nicodvb
parents:
19435
diff
changeset
|
1133 |
19435 | 1134 if(demuxer->video->sh) |
1135 ds_free_packs(demuxer->video); | |
1136 | |
1137 if(demuxer->audio->sh) | |
1138 ds_free_packs(demuxer->audio); | |
1139 | |
1140 if(demuxer->sub->id >= 0) | |
1141 ds_free_packs(demuxer->sub); | |
1142 | |
1143 ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, &chapter); | |
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
|
1144 if(ris != STREAM_UNSUPORTED) |
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
|
1145 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); |
19435 | 1146 if(sh_video) { |
1147 ds_fill_buffer(demuxer->video); | |
1148 resync_video_stream(sh_video); | |
1149 } | |
1150 | |
1151 if(sh_audio) { | |
1152 ds_fill_buffer(demuxer->audio); | |
1153 resync_audio_stream(sh_audio); | |
1154 } | |
1155 | |
1156 //exit status may be ok, but main() doesn't have to seek itself (because e.g. dvds depend on sectors, not on pts) | |
1157 *seek_pts = -1.0; | |
19478
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1158 |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1159 if(num_chapters) { |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1160 if(stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_CHAPTERS, num_chapters) == STREAM_UNSUPORTED) |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1161 *num_chapters = 0; |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1162 } |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1163 |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1164 if(chapter_name) { |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1165 char *tmp = malloc(16); |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1166 *chapter_name = NULL; |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1167 if(num_chapters && *num_chapters && tmp) { |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1168 sprintf(tmp, " of %3d", *num_chapters); |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1169 *chapter_name = tmp; |
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 |
19435 | 1173 return (ris != STREAM_UNSUPORTED ? chapter : -1); |
1174 } else { //chapters structure is set in the demuxer | |
1175 total = demuxer->num_chapters; | |
1176 | |
1177 if (mode==1) { //absolute seeking | |
1178 current = chapter; | |
1179 } else { //relative seeking | |
1180 uint64_t now; | |
1181 now = (sh_video ? sh_video->pts : (sh_audio ? sh_audio->pts : 0.)) * 1000 + .5; | |
1182 | |
1183 for (current = total - 1; current >= 0; --current) { | |
1184 demux_chapter_t* chapter = demuxer->chapters + current; | |
1185 if (chapter->start <= now) | |
1186 break; | |
1187 } | |
1188 current += chapter; | |
1189 } | |
1190 | |
1191 if (current >= total) | |
1192 return -1; | |
1193 if (current < 0) current = 0; | |
1194 | |
1195 *seek_pts = demuxer->chapters[current].start / 1000.0; | |
1196 | |
19478
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1197 if(num_chapters) |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1198 *num_chapters = demuxer->num_chapters; |
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1199 |
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
|
1200 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
|
1201 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
|
1202 *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
|
1203 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
|
1204 } |
19478
bab82c53e433
demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents:
19439
diff
changeset
|
1205 |
19435 | 1206 return current; |
1207 } | |
1208 } |