annotate libmpdemux/demuxer.c @ 24576:6704a924d4aa

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