annotate libmpdemux/demuxer.c @ 26273:8c92e7e4ccd9

command.h: Remove unnecessary includes Remove #include of "mp_core.h" and "input/input.h". Their only use was that functions declared in command.h took pointers to structs defined in those headers. Declare the structs directly as incomplete types instead.
author uau
date Mon, 31 Mar 2008 04:10:54 +0000
parents 65ad20416dd7
children ad825aff822b
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
25654
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
25 #ifdef USE_ASS
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
26 #include "libass/ass.h"
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
27 #include "libass/ass_mp.h"
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
28 #endif
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
29
22142
84f95595f31f Fix a few gcc warnings, approved by Diego and Reimar.
rathann
parents: 21809
diff changeset
30 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
31 extern void resync_audio_stream(sh_audio_t *sh_audio);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
32
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
33 // Demuxer list
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
34 extern const demuxer_desc_t demuxer_desc_rawaudio;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
35 extern const demuxer_desc_t demuxer_desc_rawvideo;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
36 extern const demuxer_desc_t demuxer_desc_tv;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
37 extern const demuxer_desc_t demuxer_desc_mf;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
38 extern const demuxer_desc_t demuxer_desc_avi;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
39 extern const demuxer_desc_t demuxer_desc_y4m;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
40 extern const demuxer_desc_t demuxer_desc_asf;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
41 extern const demuxer_desc_t demuxer_desc_nuv;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
42 extern const demuxer_desc_t demuxer_desc_real;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
43 extern const demuxer_desc_t demuxer_desc_smjpeg;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
44 extern const demuxer_desc_t demuxer_desc_matroska;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
45 extern const demuxer_desc_t demuxer_desc_realaudio;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
46 extern const demuxer_desc_t demuxer_desc_vqf;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
47 extern const demuxer_desc_t demuxer_desc_mov;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
48 extern const demuxer_desc_t demuxer_desc_vivo;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
49 extern const demuxer_desc_t demuxer_desc_fli;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
50 extern const demuxer_desc_t demuxer_desc_film;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
51 extern const demuxer_desc_t demuxer_desc_roq;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
52 extern const demuxer_desc_t demuxer_desc_gif;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
53 extern const demuxer_desc_t demuxer_desc_ogg;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
54 extern const demuxer_desc_t demuxer_desc_avs;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
55 extern const demuxer_desc_t demuxer_desc_pva;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
56 extern const demuxer_desc_t demuxer_desc_nsv;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
57 extern const demuxer_desc_t demuxer_desc_mpeg_ts;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
58 extern const demuxer_desc_t demuxer_desc_lmlm4;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
59 extern const demuxer_desc_t demuxer_desc_mpeg_ps;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
60 extern const demuxer_desc_t demuxer_desc_mpeg_pes;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
61 extern const demuxer_desc_t demuxer_desc_mpeg_es;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
62 extern const demuxer_desc_t demuxer_desc_mpeg_gxf;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
63 extern const demuxer_desc_t demuxer_desc_mpeg4_es;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
64 extern const demuxer_desc_t demuxer_desc_h264_es;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
65 extern const demuxer_desc_t demuxer_desc_rawdv;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
66 extern const demuxer_desc_t demuxer_desc_mpc;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
67 extern const demuxer_desc_t demuxer_desc_audio;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
68 extern const demuxer_desc_t demuxer_desc_xmms;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
69 extern const demuxer_desc_t demuxer_desc_mpeg_ty;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
70 extern const demuxer_desc_t demuxer_desc_rtp;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
71 extern const demuxer_desc_t demuxer_desc_rtp_nemesi;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
72 extern const demuxer_desc_t demuxer_desc_lavf;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
73 extern const demuxer_desc_t demuxer_desc_lavf_preferred;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
74 extern const demuxer_desc_t demuxer_desc_aac;
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25706
diff changeset
75 extern const demuxer_desc_t demuxer_desc_nut;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
76
25876
edfe8baed49f copy note on new demuxers and codecs to the top of the array as well to be
ivo
parents: 25872
diff changeset
77 /* Please do not add any new demuxers here. If you want to implement a new
25880
4df11ac927fc clarify comments/docs about lav* being the preferred place to implement new
ivo
parents: 25876
diff changeset
78 * demuxer, add it to libavformat, except for wrappers around external
4df11ac927fc clarify comments/docs about lav* being the preferred place to implement new
ivo
parents: 25876
diff changeset
79 * libraries and demuxers requiring binary support. */
25876
edfe8baed49f copy note on new demuxers and codecs to the top of the array as well to be
ivo
parents: 25872
diff changeset
80
25706
f0d45f8866e8 First step towards making all demuxer_desc_t const
reimar
parents: 25705
diff changeset
81 const demuxer_desc_t* const demuxer_list[] = {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
82 &demuxer_desc_rawaudio,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
83 &demuxer_desc_rawvideo,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
84 #ifdef USE_TV
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
85 &demuxer_desc_tv,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
86 #endif
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
87 &demuxer_desc_mf,
23121
a257dd426da5 Simplify preprocessor directives: There is a general variable for
diego
parents: 23072
diff changeset
88 #ifdef USE_LIBAVFORMAT
22971
a1b2fbb000fc Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents: 22605
diff changeset
89 &demuxer_desc_lavf_preferred,
23069
93948eb0280f demuxer_desc_lavf_preferred depends on USE_LIBAVFORMAT or USE_LIBAVFORMAT_SO
nicodvb
parents: 22971
diff changeset
90 #endif
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
91 &demuxer_desc_avi,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
92 &demuxer_desc_y4m,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
93 &demuxer_desc_asf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
94 &demuxer_desc_nsv,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
95 &demuxer_desc_nuv,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
96 &demuxer_desc_real,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
97 &demuxer_desc_smjpeg,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
98 &demuxer_desc_matroska,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
99 &demuxer_desc_realaudio,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
100 &demuxer_desc_vqf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
101 &demuxer_desc_mov,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
102 &demuxer_desc_vivo,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
103 &demuxer_desc_fli,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
104 &demuxer_desc_film,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
105 &demuxer_desc_roq,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
106 #ifdef HAVE_GIF
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
107 &demuxer_desc_gif,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
108 #endif
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
109 #ifdef HAVE_OGGVORBIS
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
110 &demuxer_desc_ogg,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
111 #endif
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
112 #ifdef USE_WIN32DLL
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
113 &demuxer_desc_avs,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
114 #endif
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
115 &demuxer_desc_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
116 &demuxer_desc_mpeg_ts,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
117 &demuxer_desc_lmlm4,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
118 &demuxer_desc_mpeg_ps,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
119 &demuxer_desc_mpeg_pes,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
120 &demuxer_desc_mpeg_es,
16310
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16291
diff changeset
121 &demuxer_desc_mpeg_gxf,
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
122 &demuxer_desc_mpeg4_es,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
123 &demuxer_desc_h264_es,
21767
ff8dbfde335e don't compile demux_mpc.c when libmpcdec is disabled
aurel
parents: 20948
diff changeset
124 #ifdef MUSEPACK
16412
b86be98019b1 Forgotten mpc demuxer
reimar
parents: 16346
diff changeset
125 &demuxer_desc_mpc,
21767
ff8dbfde335e don't compile demux_mpc.c when libmpcdec is disabled
aurel
parents: 20948
diff changeset
126 #endif
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
127 &demuxer_desc_audio,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
128 &demuxer_desc_mpeg_ty,
25266
239330301b33 Make libnemesi use specific struct and DEMUXER_TYPE
lu_zero
parents: 25197
diff changeset
129 #ifdef STREAMING_LIVE555
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
130 &demuxer_desc_rtp,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
131 #endif
25266
239330301b33 Make libnemesi use specific struct and DEMUXER_TYPE
lu_zero
parents: 25197
diff changeset
132 #ifdef LIBNEMESI
239330301b33 Make libnemesi use specific struct and DEMUXER_TYPE
lu_zero
parents: 25197
diff changeset
133 &demuxer_desc_rtp_nemesi,
239330301b33 Make libnemesi use specific struct and DEMUXER_TYPE
lu_zero
parents: 25197
diff changeset
134 #endif
23121
a257dd426da5 Simplify preprocessor directives: There is a general variable for
diego
parents: 23072
diff changeset
135 #ifdef USE_LIBAVFORMAT
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
136 &demuxer_desc_lavf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
137 #endif
18900
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
138 #ifdef HAVE_LIBDV095
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
139 &demuxer_desc_rawdv,
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
140 #endif
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
141 &demuxer_desc_aac,
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents: 19540
diff changeset
142 #ifdef HAVE_LIBNUT
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents: 19540
diff changeset
143 &demuxer_desc_nut,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents: 19540
diff changeset
144 #endif
18900
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
145 #ifdef HAVE_XMMS
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
146 &demuxer_desc_xmms,
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
147 #endif
25872
3eeaf9d4c65a note on new demuxers and codecs, add them to lav* instead of libmp*
ivo
parents: 25707
diff changeset
148 /* Please do not add any new demuxers here. If you want to implement a new
25880
4df11ac927fc clarify comments/docs about lav* being the preferred place to implement new
ivo
parents: 25876
diff changeset
149 * demuxer, add it to libavformat, except for wrappers around external
4df11ac927fc clarify comments/docs about lav* being the preferred place to implement new
ivo
parents: 25876
diff changeset
150 * libraries and demuxers requiring binary support. */
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
151 NULL
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
152 };
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
153
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
154 void free_demuxer_stream(demux_stream_t *ds){
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
155 ds_free_packs(ds);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
156 free(ds);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
157 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
158
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 demux_stream_t* ds=malloc(sizeof(demux_stream_t));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 ds->buffer_pos=ds->buffer_size=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162 ds->buffer=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 ds->pts=0;
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
164 ds->pts_bytes=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 ds->eof=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 ds->pos=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 ds->dpos=0;
889
1b905517c684 AVI -bps desync problem solved
arpi_esp
parents: 828
diff changeset
168 ds->pack_no=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 //---------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 ds->packs=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171 ds->bytes=0;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
172 ds->first=ds->last=ds->current=NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 ds->id=id;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 ds->demuxer=demuxer;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 //----------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176 ds->asf_seq=-1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 ds->asf_packet=NULL;
291
da98e96499bb sh_audio/sh_video added, general codec cleanup
arpi_esp
parents: 1
diff changeset
178 //----------------
7754
0568245deeb8 ss_div/ss_mul defaults to 0
arpi
parents: 7594
diff changeset
179 ds->ss_mul=ds->ss_div=0;
2419
24ba3dfb8e89 compressed mov audio fixed
arpi
parents: 2338
diff changeset
180 //----------------
291
da98e96499bb sh_audio/sh_video added, general codec cleanup
arpi_esp
parents: 1
diff changeset
181 ds->sh=NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182 return ds;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184
16175
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 * Get demuxer description structure for a given demuxer type
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
188 *
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
189 * @param file_format type of the demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
190 * @return structure for the demuxer, NULL if not found
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
191 */
25706
f0d45f8866e8 First step towards making all demuxer_desc_t const
reimar
parents: 25705
diff changeset
192 static const demuxer_desc_t* get_demuxer_desc_from_type(int file_format)
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
193 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
194 int i;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
195
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
196 for (i = 0; demuxer_list[i]; i++)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
197 if (file_format == demuxer_list[i]->type)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
198 return demuxer_list[i];
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
199
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
200 return NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
201 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
202
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
203
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
204 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
205 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
206 memset(d,0,sizeof(demuxer_t));
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 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
208 d->stream_pts = MP_NOPTS_VALUE;
26037
bee99864f397 New member in demuxer_t: reference_clock.
nicodvb
parents: 25956
diff changeset
209 d->reference_clock = MP_NOPTS_VALUE;
598
c7117e17e20b OSD seekbar fixed for mpeg/VCD
arpi_esp
parents: 587
diff changeset
210 d->movi_start=stream->start_pos;
c7117e17e20b OSD seekbar fixed for mpeg/VCD
arpi_esp
parents: 587
diff changeset
211 d->movi_end=stream->end_pos;
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
212 d->seekable=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 d->synced=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 d->filepos=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 d->audio=new_demuxer_stream(d,a_id);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216 d->video=new_demuxer_stream(d,v_id);
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 291
diff changeset
217 d->sub=new_demuxer_stream(d,s_id);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 d->type=type;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
219 if(type)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
220 if (!(d->desc = get_demuxer_desc_from_type(type)))
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
221 mp_msg(MSGT_DEMUXER,MSGL_ERR,"BUG! Invalid demuxer type in new_demuxer(), big troubles ahead.");
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
222 if(filename) // Filename hack for avs_check_file
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
223 d->filename=strdup(filename);
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
224 stream_reset(stream);
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
225 stream_seek(stream,stream->start_pos);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226 return d;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228
24022
4d576e0ed40b When a new subtitle stream becomes available check if it is the one that
reimar
parents: 23865
diff changeset
229 extern int dvdsub_id;
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 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
232 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
233 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
234 id, MAX_S_STREAMS);
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
235 return NULL;
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
236 }
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
237 if (demuxer->s_streams[id])
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
238 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
239 else {
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
240 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
241 demuxer->s_streams[id] = sh;
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
242 sh->sid = sid;
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
243 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid);
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
244 }
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
245 return demuxer->s_streams[id];
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
246 }
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
247
23592
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
248 void free_sh_sub(sh_sub_t *sh) {
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
249 mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_sub at %p\n", sh);
26085
681f6ae38b68 Remove stupid checks of free() argument.
eugeni
parents: 26082
diff changeset
250 free(sh->extradata);
25702
c4275201a489 Add a forgotten #ifdef USE_ASS around ass_free_track
reimar
parents: 25657
diff changeset
251 #ifdef USE_ASS
25654
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
252 if (sh->ass_track) ass_free_track(sh->ass_track);
25702
c4275201a489 Add a forgotten #ifdef USE_ASS around ass_free_track
reimar
parents: 25657
diff changeset
253 #endif
26082
026b1ac69d47 Add language info to sh_sub_t and sh_audio_t.
eugeni
parents: 26071
diff changeset
254 free(sh->lang);
23592
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
255 free(sh);
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
256 }
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
257
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
258 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
259 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
260 {
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
261 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
262 id, MAX_A_STREAMS);
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
263 return NULL;
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
264 }
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
265 if(demuxer->a_streams[id]){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
266 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
267 } else {
13357
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
268 sh_audio_t *sh;
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
269 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundAudioStream,id);
20072
3f63d6e12a1a Simplify: replace malloc + memset 0 by calloc
reimar
parents: 19862
diff changeset
270 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
271 sh = demuxer->a_streams[id];
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
272 // set some defaults
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
273 sh->samplesize=2;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14197
diff changeset
274 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
275 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
276 sh->pts=MP_NOPTS_VALUE;
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
277 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
278 }
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
279 ((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
280 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
281 }
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
282
18708
9e2b300db17b Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents: 18404
diff changeset
283 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
284 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
285 demuxer->a_streams[id] = NULL;
13946
e632b43f0598 Reduce excessive verbosity.
diego
parents: 13738
diff changeset
286 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_audio at %p\n",sh);
26085
681f6ae38b68 Remove stupid checks of free() argument.
eugeni
parents: 26082
diff changeset
287 free(sh->wf);
681f6ae38b68 Remove stupid checks of free() argument.
eugeni
parents: 26082
diff changeset
288 free(sh->codecdata);
26082
026b1ac69d47 Add language info to sh_sub_t and sh_audio_t.
eugeni
parents: 26071
diff changeset
289 free(sh->lang);
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
290 free(sh);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
291 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
292
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
293 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
294 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
295 {
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
296 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
297 id, MAX_V_STREAMS);
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
298 return NULL;
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
299 }
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
300 if(demuxer->v_streams[id]){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
301 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
302 } else {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
303 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundVideoStream,id);
20072
3f63d6e12a1a Simplify: replace malloc + memset 0 by calloc
reimar
parents: 19862
diff changeset
304 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
305 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
306 }
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
307 ((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
308 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
309 }
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
310
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
311 void free_sh_video(sh_video_t* sh){
13946
e632b43f0598 Reduce excessive verbosity.
diego
parents: 13738
diff changeset
312 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_video at %p\n",sh);
26085
681f6ae38b68 Remove stupid checks of free() argument.
eugeni
parents: 26082
diff changeset
313 free(sh->bih);
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
314 free(sh);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
315 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
316
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
317 void free_demuxer(demuxer_t *demuxer){
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
318 int i;
13946
e632b43f0598 Reduce excessive verbosity.
diego
parents: 13738
diff changeset
319 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing demuxer at %p\n",demuxer);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
320 if(demuxer->desc->close)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
321 demuxer->desc->close(demuxer);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
322 // Very ugly hack to make it behave like old implementation
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
323 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
324 goto skip_streamfree;
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
325 // free streams:
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14502
diff changeset
326 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
327 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
328 for(i = 0; i < MAX_V_STREAMS; i++)
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
329 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
330 for(i = 0; i < MAX_S_STREAMS; i++)
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
331 if(demuxer->s_streams[i]) free_sh_sub(demuxer->s_streams[i]);
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
332 // free demuxers:
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
333 free_demuxer_stream(demuxer->audio);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
334 free_demuxer_stream(demuxer->video);
5412
db582be1b590 added soem debug prints, and fixed 10l bug of Alban
arpi
parents: 5214
diff changeset
335 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
336 skip_streamfree:
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
337 if(demuxer->info) {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
338 for(i=0;demuxer->info[i] != NULL; i++)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
339 free(demuxer->info[i]);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
340 free(demuxer->info);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
341 }
26085
681f6ae38b68 Remove stupid checks of free() argument.
eugeni
parents: 26082
diff changeset
342 free(demuxer->filename);
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
343 if (demuxer->chapters) {
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
344 for (i=0; i<demuxer->num_chapters; i++)
26085
681f6ae38b68 Remove stupid checks of free() argument.
eugeni
parents: 26082
diff changeset
345 free(demuxer->chapters[i].name);
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
346 free(demuxer->chapters);
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
347 }
25657
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
348 if (demuxer->attachments) {
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
349 for (i=0; i<demuxer->num_attachments; i++) {
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
350 free(demuxer->attachments[i].name);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
351 free(demuxer->attachments[i].type);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
352 free(demuxer->attachments[i].data);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
353 }
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
354 free(demuxer->attachments);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
355 }
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
356 free(demuxer);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
357 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
358
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
359
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
360 void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
361 // demux_packet_t* dp=new_demux_packet(len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
362 // stream_read(stream,dp->buffer,len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
363 // dp->pts=pts; //(float)pts/90000.0f;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
364 // dp->pos=pos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
365 // append packet to DS stream:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
366 ++ds->packs;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
367 ds->bytes+=dp->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
368 if(ds->last){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
369 // next packet in stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
370 ds->last->next=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
371 ds->last=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
372 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
373 // first packet in stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
374 ds->first=ds->last=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
375 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
376 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
377 (ds==ds->demuxer->audio)?"d_audio":"d_video",
1428
a90d889eb649 largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents: 1421
diff changeset
378 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
379 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
380
18309
87161f96fa66 Change common pts variables from floats to doubles. Individual demuxers
uau
parents: 18242
diff changeset
381 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
382 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
383 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
384 resize_demux_packet(dp, len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
385 dp->pts=pts; //(float)pts/90000.0f;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
386 dp->pos=pos;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 889
diff changeset
387 dp->flags=flags;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
388 // append packet to DS stream:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
389 ds_add_packet(ds,dp);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
390 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
391
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
392 // return value:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
393 // 0 = EOF or no stream found or invalid type
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
394 // 1 = successfully read a packet
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
395
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
396 int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
397 // 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
398 // printf("demux->type=%d\n",demux->type);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
399 return demux->desc->fill_buffer(demux, ds);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
400 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
401
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
402 // return value:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
403 // 0 = EOF
25197
eb2c5925ec34 Fix typos in comments to stop them hurting my eyes
reimar
parents: 24826
diff changeset
404 // 1 = successful
26037
bee99864f397 New member in demuxer_t: reference_clock.
nicodvb
parents: 25956
diff changeset
405 #define MAX_ACUMULATED_PACKETS 64
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
406 int ds_fill_buffer(demux_stream_t *ds){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
407 demuxer_t *demux=ds->demuxer;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
408 if(ds->current) free_demux_packet(ds->current);
25444
acaa10e43c52 Move ds->current=NULL; further up to the free_demux_packet.
reimar
parents: 25358
diff changeset
409 ds->current=NULL;
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17636
diff changeset
410 if( mp_msg_test(MSGT_DEMUXER,MSGL_DBG3) ){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
411 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
412 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
413 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
414 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
415 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
416 while(1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
417 if(ds->packs){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
418 demux_packet_t *p=ds->first;
26071
449ad51bd8c7 in ds_fill_buffer() disabled the code that demuxes until the arrival of the right reference_clock
nicodvb
parents: 26037
diff changeset
419 #if 0
26037
bee99864f397 New member in demuxer_t: reference_clock.
nicodvb
parents: 25956
diff changeset
420 if(demux->reference_clock != MP_NOPTS_VALUE) {
bee99864f397 New member in demuxer_t: reference_clock.
nicodvb
parents: 25956
diff changeset
421 if((p->pts != MP_NOPTS_VALUE) && (p->pts > demux->reference_clock)
bee99864f397 New member in demuxer_t: reference_clock.
nicodvb
parents: 25956
diff changeset
422 && (ds->packs < MAX_ACUMULATED_PACKETS)) {
bee99864f397 New member in demuxer_t: reference_clock.
nicodvb
parents: 25956
diff changeset
423 if(demux_fill_buffer(demux,ds))
bee99864f397 New member in demuxer_t: reference_clock.
nicodvb
parents: 25956
diff changeset
424 continue;
bee99864f397 New member in demuxer_t: reference_clock.
nicodvb
parents: 25956
diff changeset
425 }
bee99864f397 New member in demuxer_t: reference_clock.
nicodvb
parents: 25956
diff changeset
426 }
26071
449ad51bd8c7 in ds_fill_buffer() disabled the code that demuxes until the arrival of the right reference_clock
nicodvb
parents: 26037
diff changeset
427 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
428 // copy useful data:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
429 ds->buffer=p->buffer;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
430 ds->buffer_pos=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
431 ds->buffer_size=p->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
432 ds->pos=p->pos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
433 ds->dpos+=p->len; // !!!
889
1b905517c684 AVI -bps desync problem solved
arpi_esp
parents: 828
diff changeset
434 ++ds->pack_no;
25956
7e4a2ab8b61c Change to always use MP_NOPTS_VALUE (instead of sometimes 0) for unknown pts.
reimar
parents: 25919
diff changeset
435 if (p->pts != MP_NOPTS_VALUE) {
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
436 ds->pts=p->pts;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
437 ds->pts_bytes=0;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
438 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
439 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
440 if(p->stream_pts != MP_NOPTS_VALUE) demux->stream_pts=p->stream_pts;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 889
diff changeset
441 ds->flags=p->flags;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
442 // unlink packet:
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
443 ds->bytes-=p->len;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
444 ds->current=p;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
445 ds->first=p->next;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
446 if(!ds->first) ds->last=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
447 --ds->packs;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
448 return 1; //ds->buffer_size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
449 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
450 if(demux->audio->packs>=MAX_PACKS || demux->audio->bytes>=MAX_PACK_BYTES){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
451 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyAudioInBuffer,demux->audio->packs,demux->audio->bytes);
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
452 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
453 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
454 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
455 if(demux->video->packs>=MAX_PACKS || demux->video->bytes>=MAX_PACK_BYTES){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
456 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyVideoInBuffer,demux->video->packs,demux->video->bytes);
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
457 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
458 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
459 }
1421
ea0a0b9e6fbc nosound avi seeking fixed
arpi
parents: 1401
diff changeset
460 if(!demux_fill_buffer(demux,ds)){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
461 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
462 break; // EOF
ea0a0b9e6fbc nosound avi seeking fixed
arpi
parents: 1401
diff changeset
463 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
464 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
465 ds->buffer_pos=ds->buffer_size=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
466 ds->buffer=NULL;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
467 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
468 ds->eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
469 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
470 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
471
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
472 int demux_read_data(demux_stream_t *ds,unsigned char* mem,int len){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
473 int x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
474 int bytes=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
475 while(len>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
476 x=ds->buffer_size-ds->buffer_pos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
477 if(x==0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
478 if(!ds_fill_buffer(ds)) return bytes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
479 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
480 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
481 if(mem) fast_memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
482 bytes+=x;len-=x;ds->buffer_pos+=x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
483 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
484 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
485 return bytes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
486 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
487
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
488 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
489 int x;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
490 int bytes=0;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
491 while(len>0){
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
492 x=ds->buffer_size-ds->buffer_pos;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
493 if(x==0){
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
494 if(!ds_fill_buffer(ds)) return bytes;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
495 } else {
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
496 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
497 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
498 bytes+=x;len-=x;ds->buffer_pos+=x;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
499 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
500 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
501 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
502 return bytes;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
503 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
504
17417
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
505 /**
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
506 * \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
507 * \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
508 * \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
509 * \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
510 * \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
511 * \return whether pattern was found
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
512 */
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
513 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
514 int *read, uint32_t pattern) {
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
515 register uint32_t head = 0xffffff00;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
516 register uint32_t pat = pattern & 0xffffff00;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
517 int total_len = 0;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
518 do {
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
519 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
520 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
521 register long pos = -len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
522 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
523 ds_fill_buffer(ds);
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
524 continue;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
525 }
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
526 do {
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
527 head |= ds_buf[pos];
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
528 head <<= 8;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
529 } while (++pos && head != pat);
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
530 len += pos;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
531 if (total_len + len > maxlen)
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
532 len = maxlen - total_len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
533 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
534 total_len += len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
535 } 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
536 if (read)
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
537 *read = total_len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
538 return total_len >= 3 && head == pat;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
539 }
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
540
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
541 void ds_free_packs(demux_stream_t *ds){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
542 demux_packet_t *dp=ds->first;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
543 while(dp){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
544 demux_packet_t *dn=dp->next;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
545 free_demux_packet(dp);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
546 dp=dn;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
547 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
548 if(ds->asf_packet){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
549 // free unfinished .asf fragments:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
550 free(ds->asf_packet->buffer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
551 free(ds->asf_packet);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
552 ds->asf_packet=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
553 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
554 ds->first=ds->last=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
555 ds->packs=0; // !!!!!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
556 ds->bytes=0;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
557 if(ds->current) free_demux_packet(ds->current);
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
558 ds->current=NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
559 ds->buffer=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
560 ds->buffer_pos=ds->buffer_size;
828
c71695c30006 added pts_bytes=0 to ds_free_packs
arpi_esp
parents: 746
diff changeset
561 ds->pts=0; ds->pts_bytes=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
562 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
563
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
564 int ds_get_packet(demux_stream_t *ds,unsigned char **start){
24826
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
565 int len;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
566 if(ds->buffer_pos>=ds->buffer_size){
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
567 if(!ds_fill_buffer(ds)){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
568 // EOF
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
569 *start = NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
570 return -1;
24826
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
571 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
572 }
24826
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
573 len=ds->buffer_size-ds->buffer_pos;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
574 *start = &ds->buffer[ds->buffer_pos];
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
575 ds->buffer_pos+=len;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
576 return len;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
577 }
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
578
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
579 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
580 {
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
581 int len;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
582 *pts = MP_NOPTS_VALUE;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
583 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
584 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
585 // EOF
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
586 *start = NULL;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
587 return -1;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
588 }
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
589 }
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
590 // Return pts unless this read starts from the middle of a packet
25956
7e4a2ab8b61c Change to always use MP_NOPTS_VALUE (instead of sometimes 0) for unknown pts.
reimar
parents: 25919
diff changeset
591 if (!ds->buffer_pos)
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
592 *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
593 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
594 *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
595 ds->buffer_pos+=len;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
596 return len;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
597 }
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
598
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
599 int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start){
24826
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
600 int len;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
601 if(ds->buffer_pos>=ds->buffer_size){
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
602 *start = NULL;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
603 if(!ds->packs) return -1; // no sub
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
604 if(!ds_fill_buffer(ds)) return -1; // EOF
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
605 }
24826
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
606 len=ds->buffer_size-ds->buffer_pos;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
607 *start = &ds->buffer[ds->buffer_pos];
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
608 ds->buffer_pos+=len;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
609 return len;
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
610 }
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
611
18309
87161f96fa66 Change common pts variables from floats to doubles. Individual demuxers
uau
parents: 18242
diff changeset
612 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
613 {
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
614 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
615 while(!ds->first) {
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
616 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
617 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
618 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
619 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
620 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
621 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
622 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
623 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
624 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
625 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
626 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
627 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
628 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
629 return ds->first->pts;
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
630 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
631
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
632 // ====================================================================
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
633
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
634 void demuxer_help(void)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
635 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
636 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
637
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
638 mp_msg(MSGT_DEMUXER, MSGL_INFO, "Available demuxers:\n");
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
639 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
640 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DEMUXERS\n");
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
641 for (i = 0; demuxer_list[i]; i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
642 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Don't display special demuxers
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
643 continue;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
644 if (demuxer_list[i]->comment && strlen(demuxer_list[i]->comment))
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
645 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s (%s)\n",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
646 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info, demuxer_list[i]->comment);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
647 else
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
648 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s\n",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
649 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
650 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
651 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
652
14693
37116118ab6a avisynth demuxer patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents: 14666
diff changeset
653
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
654 /**
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
655 * Get demuxer type for a given demuxer name
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
656 *
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
657 * @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
658 * @param force will be set if demuxer should be forced.
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
659 * May be NULL.
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
660 * @return DEMUXER_TYPE_xxx, -1 if error or not found
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
661 */
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
662 int get_demuxer_type_from_name(char *demuxer_name, int *force)
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
663 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
664 int i;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
665 long type_int;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
666 char *endptr;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents: 5107
diff changeset
667
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
668 if (!demuxer_name || !demuxer_name[0])
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
669 return DEMUXER_TYPE_UNKNOWN;
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
670 if (force) *force = demuxer_name[0] == '+';
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
671 if (demuxer_name[0] == '+')
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
672 demuxer_name = &demuxer_name[1];
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
673 for (i = 0; demuxer_list[i]; i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
674 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Can't select special demuxers from commandline
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
675 continue;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
676 if (strcmp(demuxer_name, demuxer_list[i]->name) == 0)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
677 return demuxer_list[i]->type;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
678 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
679
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
680 // No match found, try to parse name as an integer (demuxer number)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
681 type_int = strtol(demuxer_name, &endptr, 0);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
682 if (*endptr) // Conversion failed
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
683 return -1;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
684 if ((type_int > 0) && (type_int <= DEMUXER_TYPE_MAX))
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
685 return (int)type_int;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
686
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
687 return -1;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
688 }
3801
3cea69dda1b3 added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents: 3786
diff changeset
689
9751
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
690 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
691
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
692 int correct_pts=0;
25919
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
693 int user_correct_pts=-1;
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
694
9751
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
695 /*
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
696 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
697 demuxers should NEVER rely on an external var to enable them
25197
eb2c5925ec34 Fix typos in comments to stop them hurting my eyes
reimar
parents: 24826
diff changeset
698 self. If a demuxer can't do any auto-detection it should only use
eb2c5925ec34 Fix typos in comments to stop them hurting my eyes
reimar
parents: 24826
diff changeset
699 file_format. The user can explicitly set file_format with the -demuxer
9751
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
700 option so there is really no need for another extra var.
25197
eb2c5925ec34 Fix typos in comments to stop them hurting my eyes
reimar
parents: 24826
diff changeset
701 For convenience an option can be added to set file_format directly
9751
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
702 to the right type (ex: rawaudio,rawvideo).
25197
eb2c5925ec34 Fix typos in comments to stop them hurting my eyes
reimar
parents: 24826
diff changeset
703 Also the stream can override the file_format so a demuxer which rely
9751
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
704 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
705 (ex: tv,mf).
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
706 */
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
707
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
708 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
709 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
710 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
711
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
712 //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
713
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
714 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
715
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
716 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
717
25706
f0d45f8866e8 First step towards making all demuxer_desc_t const
reimar
parents: 25705
diff changeset
718 const demuxer_desc_t *demuxer_desc;
23865
4d3f8a0d864c Make sure fformat is set before use
reimar
parents: 23864
diff changeset
719 int fformat = 0;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
720 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
721
1659
6b71bbf515e4 num_elementary_packets1xx reset
arpi
parents: 1657
diff changeset
722 //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
723
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
724 // If somebody requested a demuxer check it
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
725 if (file_format) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
726 if ((demuxer_desc = get_demuxer_desc_from_type(file_format))) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
727 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
728 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
729 fformat = demuxer_desc->check_file(demuxer);
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
730 if (force || !demuxer_desc->check_file)
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
731 fformat = demuxer_desc->type;
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
732 if (fformat != 0) {
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
733 if (fformat == demuxer_desc->type) {
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
734 demuxer_t *demux2 = demuxer;
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
735 // Move messages to demuxer detection code?
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
736 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc);
25705
aab0c3e38476 Remove a useless assignment (there is an if just a few lines above
reimar
parents: 25702
diff changeset
737 file_format = fformat;
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
738 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
739 demuxer = demux2;
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
740 goto dmx_open;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
741 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
742 } else {
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
743 // Format changed after check, recurse
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
744 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
745 return demux_open_stream(stream, fformat, force,
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
746 audio_id, video_id, dvdsub_id, filename);
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
747 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
748 }
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
749 // Check failed for forced demuxer, quit
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
750 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
751 return NULL;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
752 }
9065
59805b2d220a raw video demuxer, requested by Michael
arpi
parents: 9006
diff changeset
753 }
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents: 6192
diff changeset
754
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
755 // Test demuxers with safe file checks
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
756 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
757 if (demuxer_desc->safe_check) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
758 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
759 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
760 if (fformat == demuxer_desc->type) {
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
761 demuxer_t *demux2 = demuxer;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
762 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
763 file_format = fformat;
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
764 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) {
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
765 demuxer = demux2;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
766 goto dmx_open;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
767 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
768 } else {
16326
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
769 if (fformat == DEMUXER_TYPE_PLAYLIST)
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
770 return demuxer; // handled in mplayer.c
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
771 // Format changed after check, recurse
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
772 free_demuxer(demuxer);
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
773 demuxer=demux_open_stream(stream, fformat, force,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
774 audio_id, video_id, dvdsub_id, filename);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
775 if(demuxer) return demuxer; // done!
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
776 file_format = DEMUXER_TYPE_UNKNOWN;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
777 }
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
778 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
779 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
780 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
781 }
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
782 }
9006
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
783
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
784 // 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
785 // 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
786 // 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
787 // first:
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
788 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
789 file_format=demuxer_type_by_filename(filename);
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
790 if(file_format!=DEMUXER_TYPE_UNKNOWN){
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
791 // we like recursion :)
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
792 demuxer=demux_open_stream(stream, file_format, force,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
793 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
794 if(demuxer) return demuxer; // done!
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
795 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
796 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
797 }
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
798 }
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
799
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
800 // Try detection for all other demuxers
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
801 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
802 if (!demuxer_desc->safe_check && demuxer_desc->check_file) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
803 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
804 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
805 if (fformat == demuxer_desc->type) {
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
806 demuxer_t *demux2 = demuxer;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
807 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
808 file_format = fformat;
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
809 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) {
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
810 demuxer = demux2;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
811 goto dmx_open;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
812 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
813 } else {
16326
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
814 if (fformat == DEMUXER_TYPE_PLAYLIST)
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
815 return demuxer; // handled in mplayer.c
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
816 // Format changed after check, recurse
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
817 free_demuxer(demuxer);
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
818 demuxer=demux_open_stream(stream, fformat, force,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
819 audio_id, video_id, dvdsub_id, filename);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
820 if(demuxer) return demuxer; // done!
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
821 file_format = DEMUXER_TYPE_UNKNOWN;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
822 }
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
823 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
824 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
825 demuxer = NULL;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents: 4065
diff changeset
826 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents: 4065
diff changeset
827 }
15670
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15576
diff changeset
828
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
829 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
830 //====== File format recognized, set up these for compatibility: =========
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
831 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
832
1485
b895f95e7657 AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents: 1456
diff changeset
833 demuxer->file_format=file_format;
b895f95e7657 AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents: 1456
diff changeset
834
16477
c2e0e8c6f00a Make the fourcc output endianness-independent.
diego
parents: 16413
diff changeset
835 if ((sh_video=demuxer->video->sh) && sh_video->bih){
c2e0e8c6f00a Make the fourcc output endianness-independent.
diego
parents: 16413
diff changeset
836 int biComp=le2me_32(sh_video->bih->biCompression);
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17354
diff changeset
837 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
838 (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
839 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
840 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
841 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
842 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
843 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
844 sh_video->i_bps/1024.0f );
16477
c2e0e8c6f00a Make the fourcc output endianness-independent.
diego
parents: 16413
diff changeset
845 }
25654
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
846 #ifdef USE_ASS
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
847 if (ass_enabled && ass_library) {
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
848 for (i = 0; i < MAX_S_STREAMS; ++i) {
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
849 sh_sub_t* sh = demuxer->s_streams[i];
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
850 if (sh && sh->type == 'a') {
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
851 sh->ass_track = ass_new_track(ass_library);
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
852 if (sh->ass_track && sh->extradata)
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
853 ass_process_codec_private(sh->ass_track, sh->extradata, sh->extradata_len);
25881
c6f535c5f65b Make mov subtitles work with -ass
reimar
parents: 25880
diff changeset
854 } else if (sh && sh->type != 'v')
25656
00e4d59a0be4 Remove global_ass_track. Instead create an ass_track for each 't' track.
eugeni
parents: 25654
diff changeset
855 sh->ass_track = ass_default_track(ass_library);
25654
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
856 }
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
857 }
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
858 #endif
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
859 return demuxer;
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
860 }
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
861
6623
7bc4c6ba9485 add -audiofile support for gui
pontscho
parents: 6384
diff changeset
862 char* audio_stream = NULL;
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7754
diff changeset
863 char* sub_stream = NULL;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
864 int demuxer_type = 0; // used by rawaudio and rawvideo
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
865 int audio_stream_cache = 0;
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7754
diff changeset
866
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
867 char *demuxer_name = NULL; // parameter from -demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
868 char *audio_demuxer_name = NULL; // parameter from -audio-demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
869 char *sub_demuxer_name = NULL; // parameter from -sub-demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
870
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7754
diff changeset
871 extern int hr_mp3_seek;
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
872
12835
4235ae5a2d60 cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents: 12434
diff changeset
873 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
874 extern float stream_cache_seek_min_percent;
12835
4235ae5a2d60 cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents: 12434
diff changeset
875
9006
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
876 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
877 stream_t *as = NULL,*ss = NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
878 demuxer_t *vd,*ad = NULL,*sd = NULL;
25919
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
879 demuxer_t *res;
12223
e7c8200ffdc5 Respect -playlist for asx streams
rtognimp
parents: 12175
diff changeset
880 int afmt =DEMUXER_TYPE_UNKNOWN,sfmt = DEMUXER_TYPE_UNKNOWN ;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
881 int audio_demuxer_type = 0, sub_demuxer_type = 0;
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
882 int demuxer_force = 0, audio_demuxer_force = 0,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
883 sub_demuxer_force = 0;
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
884
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
885 if ((demuxer_type = get_demuxer_type_from_name(demuxer_name, &demuxer_force)) < 0) {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
886 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-demuxer %s does not exist.\n",demuxer_name);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
887 }
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
888 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
889 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-audio-demuxer %s does not exist.\n",audio_demuxer_name);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
890 }
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
891 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
892 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-sub-demuxer %s does not exist.\n",sub_demuxer_name);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
893 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
894
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
895 if(audio_stream) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
896 as = open_stream(audio_stream,0,&afmt);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
897 if(!as) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
898 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
899 return NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
900 }
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
901 if(audio_stream_cache) {
12835
4235ae5a2d60 cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents: 12434
diff changeset
902 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
903 audio_stream_cache*1024*(stream_cache_seek_min_percent / 100.0))) {
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
904 free_stream(as);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
905 mp_msg(MSGT_DEMUXER,MSGL_ERR,"Can't enable audio stream cache\n");
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
906 return NULL;
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
907 }
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
908 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
909 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
910 if(sub_stream) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
911 ss = open_stream(sub_stream,0,&sfmt);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
912 if(!ss) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
913 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
914 return NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
915 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
916 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
917
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
918 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
919 demuxer_force, audio_stream ? -2 : audio_id, video_id,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
920 sub_stream ? -2 : dvdsub_id, filename);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
921 if(!vd) {
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
922 if(as) free_stream(as);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
923 if(ss) free_stream(ss);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
924 return NULL;
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
925 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
926 if(as) {
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
927 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
928 audio_demuxer_force, audio_id, -2, -2, audio_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
929 if(!ad) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
930 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningAudioDemuxerFailed,audio_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
931 free_stream(as);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
932 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
933 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
934 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
935 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
936 if(ss) {
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
937 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
938 sub_demuxer_force, -2, -2, dvdsub_id, sub_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
939 if(!sd) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
940 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningSubtitlesDemuxerFailed,sub_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
941 free_stream(ss);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
942 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
943 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
944
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
945 if(ad && sd)
25919
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
946 res = new_demuxers_demuxer(vd,ad,sd);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
947 else if(ad)
25919
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
948 res = new_demuxers_demuxer(vd,ad,vd);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
949 else if(sd)
25919
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
950 res = new_demuxers_demuxer(vd,vd,sd);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
951 else
25919
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
952 res = vd;
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
953
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
954 correct_pts = user_correct_pts;
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
955 if (correct_pts < 0)
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
956 correct_pts = demux_control(res, DEMUXER_CTRL_CORRECT_PTS, NULL) == DEMUXER_CTRL_OK;
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
957 return res;
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
958 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
959
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
960
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
961 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
962 demux_stream_t *d_audio=demuxer->audio;
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
963 demux_stream_t *d_video=demuxer->video;
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
964 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
965 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
966 double tmp = 0;
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
967 double pts;
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
968
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
969 if(!demuxer->seekable){
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
970 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
971 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekRawAVI);
2790
98769cea155c added tv subsystem
alex
parents: 2687
diff changeset
972 #ifdef USE_TV
98769cea155c added tv subsystem
alex
parents: 2687
diff changeset
973 else if (demuxer->file_format==DEMUXER_TYPE_TV)
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
974 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_TVInputNotSeekable);
2790
98769cea155c added tv subsystem
alex
parents: 2687
diff changeset
975 #endif
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
976 else
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1659
diff changeset
977 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekFile);
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
978 return 0;
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
979 }
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
980
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
981 // clear demux buffers:
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
982 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
983 ds_free_packs(d_video);
24678
9aab9d7b51f0 Fix missing subtitles after seeking back
uau
parents: 24564
diff changeset
984 ds_free_packs(demuxer->sub);
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
985
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
986 demuxer->stream->eof=0; // clear eof flag
3542
465329581ad8 reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents: 3411
diff changeset
987 demuxer->video->eof=0;
465329581ad8 reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents: 3411
diff changeset
988 demuxer->audio->eof=0;
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
989
4203
7cfa69df9e0b reverted old seeking method - ask Holm why...
arpi
parents: 4189
diff changeset
990 #if 0
3824
be5e58955f57 don't reset timer at seek - req. for dxr3
arpi
parents: 3801
diff changeset
991 if(sh_audio) sh_audio->timer=sh_video->timer;
be5e58955f57 don't reset timer at seek - req. for dxr3
arpi
parents: 3801
diff changeset
992 #else
4587
886bf5274992 Audio only support. Include a fix in the asf demuxer opening.
albeu
parents: 4565
diff changeset
993 if(sh_video) sh_video->timer=0; // !!!!!!
3824
be5e58955f57 don't reset timer at seek - req. for dxr3
arpi
parents: 3801
diff changeset
994 #endif
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
995
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25881
diff changeset
996 if(flags & SEEK_ABSOLUTE)
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
997 pts = 0.0f;
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
998 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
999 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
1000 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
1001 pts = demuxer->stream_pts;
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
1002 }
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
1003
25883
baf32110d3fc Use defines to give names to the different seek flags.
reimar
parents: 25881
diff changeset
1004 if(flags & SEEK_FACTOR) {
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
1005 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
1006 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
1007 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
1008 } else
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
1009 pts += rel_seek_secs;
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
1010
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
1011 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
1012 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
1013 return 1;
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
1014 }
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
1015
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
1016 dmx_seek:
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1017 if (demuxer->desc->seek)
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
1018 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
1019
16877
9081ae3a702c move resync_audio_stream after seeking to demuxer.c
reimar
parents: 16572
diff changeset
1020 if (sh_audio) resync_audio_stream(sh_audio);
9081ae3a702c move resync_audio_stream after seeking to demuxer.c
reimar
parents: 16572
diff changeset
1021
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
1022 return 1;
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
1023 }
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
1024
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
1025 int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param)
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1026 {
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1027 char **info = demuxer->info;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1028 int n = 0;
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
1029
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1030
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1031 for(n = 0; info && info[2*n] != NULL; n++)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1032 {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1033 if(!strcasecmp(opt,info[2*n]))
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1034 {
19413
acd26ccbff0d Update information and print new value when demux_info_add is called
reimar
parents: 19342
diff changeset
1035 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
1036 free(info[2*n+1]);
acd26ccbff0d Update information and print new value when demux_info_add is called
reimar
parents: 19342
diff changeset
1037 info[2*n+1] = strdup(param);
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1038 return 0;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1039 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1040 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1041
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1042 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
1043 info[2*n] = strdup(opt);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1044 info[2*n+1] = strdup(param);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1045 memset(&info[2*(n+1)],0,2*sizeof(char*));
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1046
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1047 return 1;
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1048 }
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1049
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1050 int demux_info_print(demuxer_t *demuxer)
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1051 {
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1052 char **info = demuxer->info;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1053 int n;
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1054
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1055 if(!info)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1056 return 0;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1057
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
1058 mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_ClipInfo);
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1059 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
1060 {
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1061 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
1062 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
1063 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
1064 }
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
1065 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
1066
6871d97e4261 initial support for FILM file demuxing
melanson
parents: 4065
diff changeset
1067 return 0;
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1068 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1069
23611
ecbb54f8d299 make opt argument of demux_info_get const.
reimar
parents: 23592
diff changeset
1070 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
1071 int i;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1072 char **info = demuxer->info;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1073
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1074 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
1075 if(!strcasecmp(opt,info[2*i]))
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1076 return info[2*i+1];
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1077 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1078
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1079 return NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1080 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1081
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1082 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
1083
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1084 if (demuxer->desc->control)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1085 return demuxer->desc->control(demuxer,cmd,arg);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1086
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1087 return DEMUXER_CTRL_NOTIMPL;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1088 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1089
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1090
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1091
16346
6ff303d2876b Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents: 16326
diff changeset
1092 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
1093 double get_time_ans;
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1094 sh_video_t *sh_video = demuxer->video->sh;
16925
4bce034eeb0a estimate total time also for audio-only files.
reimar
parents: 16877
diff changeset
1095 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
1096 // <= 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
1097 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
1098 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
1099 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
1100 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
1101 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
1102 else if (sh_audio && sh_audio->i_bps)
4bce034eeb0a estimate total time also for audio-only files.
reimar
parents: 16877
diff changeset
1103 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
1104 else
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1105 get_time_ans=0;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1106 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1107 return get_time_ans;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1108 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1109
20749
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1110 /**
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1111 * \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
1112 * 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
1113 * 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
1114 * 0 otherwise
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1115 * \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
1116 */
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1117 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
1118 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
1119 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
1120 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
1121 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
1122 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
1123 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
1124 }
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1125
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1126 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
1127 int ans = 0;
2ae224195625 Use demuxer_get_percent_pos for the OSD position bar
reimar
parents: 14160
diff changeset
1128 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
1129 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
1130 if (res <= 0) {
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1131 if (len > 0)
14197
2ae224195625 Use demuxer_get_percent_pos for the OSD position bar
reimar
parents: 14160
diff changeset
1132 ans = (demuxer->filepos - demuxer->movi_start) / len;
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1133 else
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1134 ans = 0;
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1135 }
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1136 if (ans < 0) ans = 0;
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1137 if (ans > 100) ans = 100;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1138 return ans;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1139 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1140
15285
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1141 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
1142 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
1143 if (res == DEMUXER_CTRL_NOTIMPL)
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1144 index = demuxer->audio->id;
26089
e2f35d90ad39 Set audio->sh correctly when switching audio tracks. The same for video tracks.
eugeni
parents: 26088
diff changeset
1145 if (demuxer->audio->id >= 0)
e2f35d90ad39 Set audio->sh correctly when switching audio tracks. The same for video tracks.
eugeni
parents: 26088
diff changeset
1146 demuxer->audio->sh = demuxer->a_streams[demuxer->audio->id];
e2f35d90ad39 Set audio->sh correctly when switching audio tracks. The same for video tracks.
eugeni
parents: 26088
diff changeset
1147 else
e2f35d90ad39 Set audio->sh correctly when switching audio tracks. The same for video tracks.
eugeni
parents: 26088
diff changeset
1148 demuxer->audio->sh = NULL;
15285
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1149 return index;
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14934
diff changeset
1150 }
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1151
20948
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1152 int demuxer_switch_video(demuxer_t *demuxer, int index){
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1153 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_VIDEO, &index);
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1154 if (res == DEMUXER_CTRL_NOTIMPL)
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1155 index = demuxer->video->id;
26089
e2f35d90ad39 Set audio->sh correctly when switching audio tracks. The same for video tracks.
eugeni
parents: 26088
diff changeset
1156 if (demuxer->video->id >= 0)
e2f35d90ad39 Set audio->sh correctly when switching audio tracks. The same for video tracks.
eugeni
parents: 26088
diff changeset
1157 demuxer->video->sh = demuxer->v_streams[demuxer->video->id];
e2f35d90ad39 Set audio->sh correctly when switching audio tracks. The same for video tracks.
eugeni
parents: 26088
diff changeset
1158 else
e2f35d90ad39 Set audio->sh correctly when switching audio tracks. The same for video tracks.
eugeni
parents: 26088
diff changeset
1159 demuxer->video->sh = NULL;
20948
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1160 return index;
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1161 }
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1162
25657
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1163 int demuxer_add_attachment(demuxer_t* demuxer, const char* name,
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1164 const char* type, const void* data, size_t size) {
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1165 if (!(demuxer->num_attachments & 31))
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1166 demuxer->attachments = realloc(demuxer->attachments, (demuxer->num_attachments + 32) * sizeof(demux_attachment_t));
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1167
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1168 demuxer->attachments[demuxer->num_attachments].name = strdup(name);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1169 demuxer->attachments[demuxer->num_attachments].type = strdup(type);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1170 demuxer->attachments[demuxer->num_attachments].data = malloc(size);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1171 memcpy(demuxer->attachments[demuxer->num_attachments].data, data, size);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1172 demuxer->attachments[demuxer->num_attachments].data_size = size;
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1173
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1174 return demuxer->num_attachments ++;
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1175 }
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1176
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1177 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
1178 if (demuxer->chapters == NULL)
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1179 demuxer->chapters = malloc (32*sizeof(*demuxer->chapters));
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1180 else if (!(demuxer->num_chapters % 32))
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1181 demuxer->chapters = realloc (demuxer->chapters, (demuxer->num_chapters + 32) * sizeof(*demuxer->chapters));
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1182
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1183 demuxer->chapters[demuxer->num_chapters].start = start;
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1184 demuxer->chapters[demuxer->num_chapters].end = end;
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1185 demuxer->chapters[demuxer->num_chapters].name = strdup(name);
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1186
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1187 return demuxer->num_chapters ++;
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1188 }
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1189
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1190 /**
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1191 * \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
1192 * either using the demuxer->chapters structure set by the demuxer
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1193 * or asking help to the stream layer (e.g. dvd)
19439
28d2d1fddff4 clarification in a comment
nicodvb
parents: 19438
diff changeset
1194 * \param chapter - chapter number wished - 0-based
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1195 * \param mode 0: relative to current main pts, 1: absolute
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1196 * \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
1197 * \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
1198 * \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
1199 * \return -1 on error, current chapter if successful
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1200 */
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1201
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1202 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
1203 int ris;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1204 int current, total;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1205 sh_video_t *sh_video = demuxer->video->sh;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1206 sh_audio_t *sh_audio = demuxer->audio->sh;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1207
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1208 if (!demuxer->num_chapters || !demuxer->chapters) {
19438
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1209 if(!mode) {
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1210 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER, &current);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
1211 if(ris == STREAM_UNSUPPORTED) return -1;
19438
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1212 chapter += current;
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1213 }
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1214
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1215 if(demuxer->video->sh)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1216 ds_free_packs(demuxer->video);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1217
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1218 if(demuxer->audio->sh)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1219 ds_free_packs(demuxer->audio);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1220
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1221 if(demuxer->sub->id >= 0)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1222 ds_free_packs(demuxer->sub);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1223
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1224 ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, &chapter);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
1225 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
1226 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1227 if(sh_video) {
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1228 ds_fill_buffer(demuxer->video);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1229 resync_video_stream(sh_video);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1230 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1231
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1232 if(sh_audio) {
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1233 ds_fill_buffer(demuxer->audio);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1234 resync_audio_stream(sh_audio);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1235 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1236
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1237 //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
1238 *seek_pts = -1.0;
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1239
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1240 if(num_chapters) {
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
1241 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
1242 *num_chapters = 0;
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1243 }
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1244
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1245 if(chapter_name) {
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1246 *chapter_name = NULL;
25314
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1247 if (num_chapters && *num_chapters) {
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1248 char *tmp = malloc(16);
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1249 if (tmp) {
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1250 sprintf(tmp, " of %3d", *num_chapters);
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1251 *chapter_name = tmp;
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1252 }
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1253 }
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1254 }
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1255
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
1256 return (ris != STREAM_UNSUPPORTED ? chapter : -1);
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1257 } else { //chapters structure is set in the demuxer
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1258 total = demuxer->num_chapters;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1259
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1260 if (mode==1) { //absolute seeking
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1261 current = chapter;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1262 } else { //relative seeking
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1263 uint64_t now;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1264 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
1265
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1266 for (current = total - 1; current >= 0; --current) {
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1267 demux_chapter_t* chapter = demuxer->chapters + current;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1268 if (chapter->start <= now)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1269 break;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1270 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1271 current += chapter;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1272 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1273
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1274 if (current >= total)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1275 return -1;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1276 if (current < 0) current = 0;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1277
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1278 *seek_pts = demuxer->chapters[current].start / 1000.0;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1279
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1280 if(num_chapters)
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1281 *num_chapters = demuxer->num_chapters;
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1282
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
1283 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
1284 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
1285 *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
1286 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
1287 }
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1288
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1289 return current;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1290 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1291 }
25358
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1292
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1293 int demuxer_get_current_chapter(demuxer_t *demuxer) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1294 int chapter = -1;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1295 if (!demuxer->num_chapters || !demuxer->chapters) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1296 if (stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER,
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1297 &chapter) == STREAM_UNSUPPORTED)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1298 chapter = -1;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1299 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1300 else {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1301 sh_video_t *sh_video = demuxer->video->sh;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1302 sh_audio_t *sh_audio = demuxer->audio->sh;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1303 uint64_t now;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1304 now = (sh_video ? sh_video->pts : (sh_audio?sh_audio->pts:0))*1000+0.5;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1305 for (chapter = demuxer->num_chapters - 1; chapter >= 0; --chapter) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1306 if (demuxer->chapters[chapter].start <= now)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1307 break;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1308 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1309 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1310 return chapter;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1311 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1312
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1313 char *demuxer_chapter_name(demuxer_t *demuxer, int chapter) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1314 if (demuxer->num_chapters && demuxer->chapters) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1315 if (chapter >=0 && chapter < demuxer->num_chapters &&
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1316 demuxer->chapters[chapter].name)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1317 return strdup(demuxer->chapters[chapter].name);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1318 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1319 return NULL;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1320 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1321
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1322 char *demuxer_chapter_display_name(demuxer_t *demuxer, int chapter) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1323 char *chapter_name = demuxer_chapter_name(demuxer, chapter);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1324 if (chapter_name) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1325 char *tmp = malloc(strlen(chapter_name) + 14);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1326 snprintf(tmp, 63, "(%d) %s", chapter + 1, chapter_name);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1327 free(chapter_name);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1328 return tmp;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1329 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1330 else {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1331 int chapter_num = demuxer_chapter_count(demuxer);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1332 char tmp[30];
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1333 if (chapter_num <= 0)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1334 sprintf(tmp, "(%d)", chapter + 1);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1335 else
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1336 sprintf(tmp, "(%d) of %d", chapter + 1, chapter_num);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1337 return strdup(tmp);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1338 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1339 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1340
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1341 float demuxer_chapter_time(demuxer_t *demuxer, int chapter, float *end) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1342 if (demuxer->num_chapters && demuxer->chapters && chapter >= 0
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1343 && chapter < demuxer->num_chapters) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1344 if (end)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1345 *end = demuxer->chapters[chapter].end / 1000.0;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1346 return demuxer->chapters[chapter].start / 1000.0;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1347 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1348 return -1.0;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1349 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1350
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1351 int demuxer_chapter_count(demuxer_t *demuxer) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1352 if (!demuxer->num_chapters || !demuxer->chapters) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1353 int num_chapters = 0;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1354 if (stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_CHAPTERS,
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1355 &num_chapters) == STREAM_UNSUPPORTED)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1356 num_chapters = 0;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1357 return num_chapters;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1358 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1359 else
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1360 return demuxer->num_chapters;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1361 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1362
25575
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1363 int demuxer_angles_count(demuxer_t *demuxer) {
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1364 int ris, angles=-1;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1365
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1366 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_ANGLES, &angles);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1367 if(ris == STREAM_UNSUPPORTED) return -1;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1368 return angles;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1369 }
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1370
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1371 int demuxer_get_current_angle(demuxer_t *demuxer) {
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1372 int ris, curr_angle=-1;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1373 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_ANGLE, &curr_angle);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1374 if(ris == STREAM_UNSUPPORTED) return -1;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1375 return curr_angle;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1376 }
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1377
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1378
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1379 int demuxer_set_angle(demuxer_t *demuxer, int angle) {
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1380 int ris, angles=-1;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1381 sh_video_t *sh_video = demuxer->video->sh;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1382 sh_audio_t *sh_audio = demuxer->audio->sh;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1383
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1384 angles = demuxer_angles_count(demuxer);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1385 if((angles < 1) || (angle > angles)) return -1;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1386
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1387 if(demuxer->video->sh)
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1388 ds_free_packs(demuxer->video);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1389
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1390 if(demuxer->audio->sh)
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1391 ds_free_packs(demuxer->audio);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1392
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1393 if(demuxer->sub->id >= 0)
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1394 ds_free_packs(demuxer->sub);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1395
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1396 ris = stream_control(demuxer->stream, STREAM_CTRL_SET_ANGLE, &angle);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1397 if(ris == STREAM_UNSUPPORTED) return -1;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1398
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1399 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1400 if(sh_video) {
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1401 ds_fill_buffer(demuxer->video);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1402 resync_video_stream(sh_video);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1403 }
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1404
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1405 if(sh_audio) {
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1406 ds_fill_buffer(demuxer->audio);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1407 resync_audio_stream(sh_audio);
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1408 }
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1409
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1410 return angle;
f94eee219ee0 wrapper functions to get/set angle: the wrapping is needed to RESYNC the demuxer; patch by oattila chello hu
nicodvb
parents: 25444
diff changeset
1411 }
26086
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1412
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1413 int demuxer_audio_track_by_lang(demuxer_t* d, char* lang)
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1414 {
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1415 int i, len;
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1416 lang += strspn(lang, ",");
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1417 while((len = strcspn(lang, ",")) > 0) {
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1418 for (i=0; i < MAX_A_STREAMS; ++i) {
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1419 sh_audio_t* sh = d->a_streams[i];
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1420 if (sh && sh->lang && strncmp(sh->lang, lang, len) == 0)
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1421 return sh->aid;
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1422 }
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1423 lang += len;
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1424 lang += strspn(lang, ",");
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1425 }
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1426 return -1;
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1427 }
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1428
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1429 int demuxer_sub_track_by_lang(demuxer_t* d, char* lang)
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1430 {
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1431 int i, len;
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1432 lang += strspn(lang, ",");
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1433 while((len = strcspn(lang, ",")) > 0) {
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1434 for (i=0; i < MAX_S_STREAMS; ++i) {
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1435 sh_sub_t* sh = d->s_streams[i];
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1436 if (sh && sh->lang && strncmp(sh->lang, lang, len) == 0)
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1437 return sh->sid;
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1438 }
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1439 lang += len;
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1440 lang += strspn(lang, ",");
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1441 }
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1442 return -1;
c9a877daca42 Demuxer-independent functions for selecting tracks based on language.
eugeni
parents: 26085
diff changeset
1443 }
26269
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1444
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1445 int demuxer_default_audio_track(demuxer_t* d)
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1446 {
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1447 int i;
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1448 for (i=0; i < MAX_A_STREAMS; ++i) {
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1449 sh_audio_t* sh = d->a_streams[i];
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1450 if (sh && sh->default_track)
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1451 return sh->aid;
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1452 }
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1453 for (i=0; i < MAX_A_STREAMS; ++i) {
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1454 sh_audio_t* sh = d->a_streams[i];
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1455 if (sh)
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1456 return sh->aid;
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1457 }
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1458 return -1;
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1459 }
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1460
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1461 int demuxer_default_sub_track(demuxer_t* d)
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1462 {
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1463 int i;
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1464 for (i=0; i < MAX_S_STREAMS; ++i) {
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1465 sh_sub_t* sh = d->s_streams[i];
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1466 if (sh && sh->default_track)
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1467 return sh->sid;
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1468 }
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1469 return -1;
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1470 }
65ad20416dd7 Support 'default' attribute for audio and subtitle tracks.
eugeni
parents: 26089
diff changeset
1471