annotate libmpdemux/demuxer.c @ 25880:4df11ac927fc

clarify comments/docs about lav* being the preferred place to implement new codecs and (de)muxers, except for wrappers around external libraries and codecs and (de)muxers requiring binary support.
author ivo
date Mon, 28 Jan 2008 22:09:21 +0000
parents edfe8baed49f
children c6f535c5f65b
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;
598
c7117e17e20b OSD seekbar fixed for mpeg/VCD
arpi_esp
parents: 587
diff changeset
209 d->movi_start=stream->start_pos;
c7117e17e20b OSD seekbar fixed for mpeg/VCD
arpi_esp
parents: 587
diff changeset
210 d->movi_end=stream->end_pos;
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
211 d->seekable=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212 d->synced=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 d->filepos=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 d->audio=new_demuxer_stream(d,a_id);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 d->video=new_demuxer_stream(d,v_id);
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 291
diff changeset
216 d->sub=new_demuxer_stream(d,s_id);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 d->type=type;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
218 if(type)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
219 if (!(d->desc = get_demuxer_desc_from_type(type)))
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
220 mp_msg(MSGT_DEMUXER,MSGL_ERR,"BUG! Invalid demuxer type in new_demuxer(), big troubles ahead.");
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
221 if(filename) // Filename hack for avs_check_file
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
222 d->filename=strdup(filename);
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
223 stream_reset(stream);
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
224 stream_seek(stream,stream->start_pos);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 return d;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227
24022
4d576e0ed40b When a new subtitle stream becomes available check if it is the one that
reimar
parents: 23865
diff changeset
228 extern int dvdsub_id;
4d576e0ed40b When a new subtitle stream becomes available check if it is the one that
reimar
parents: 23865
diff changeset
229
20872
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
230 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
231 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
232 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
233 id, MAX_S_STREAMS);
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
234 return NULL;
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
235 }
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
236 if (demuxer->s_streams[id])
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
237 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
238 else {
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
239 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
240 demuxer->s_streams[id] = sh;
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
241 sh->sid = sid;
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
242 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid);
24022
4d576e0ed40b When a new subtitle stream becomes available check if it is the one that
reimar
parents: 23865
diff changeset
243 if (dvdsub_id == id) {
4d576e0ed40b When a new subtitle stream becomes available check if it is the one that
reimar
parents: 23865
diff changeset
244 demuxer->sub->id = id;
4d576e0ed40b When a new subtitle stream becomes available check if it is the one that
reimar
parents: 23865
diff changeset
245 demuxer->sub->sh = sh;
4d576e0ed40b When a new subtitle stream becomes available check if it is the one that
reimar
parents: 23865
diff changeset
246 }
20872
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
247 }
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
248 return demuxer->s_streams[id];
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
249 }
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
250
23592
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
251 void free_sh_sub(sh_sub_t *sh) {
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
252 mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_sub at %p\n", sh);
25652
6e25dda14b62 Add extradata to sh_sub_t.
eugeni
parents: 25614
diff changeset
253 if (sh->extradata) free(sh->extradata);
25702
c4275201a489 Add a forgotten #ifdef USE_ASS around ass_free_track
reimar
parents: 25657
diff changeset
254 #ifdef USE_ASS
25654
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
255 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
256 #endif
23592
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
257 free(sh);
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
258 }
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
259
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
260 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
261 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
262 {
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
263 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
264 id, MAX_A_STREAMS);
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
265 return NULL;
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
266 }
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
267 if(demuxer->a_streams[id]){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
268 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
269 } else {
13357
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
270 sh_audio_t *sh;
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
271 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundAudioStream,id);
20072
3f63d6e12a1a Simplify: replace malloc + memset 0 by calloc
reimar
parents: 19862
diff changeset
272 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
273 sh = demuxer->a_streams[id];
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
274 // set some defaults
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
275 sh->samplesize=2;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14197
diff changeset
276 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
277 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
278 sh->pts=MP_NOPTS_VALUE;
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
279 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
280 }
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
281 ((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
282 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
283 }
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
284
18708
9e2b300db17b Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents: 18404
diff changeset
285 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
286 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
287 demuxer->a_streams[id] = NULL;
13946
e632b43f0598 Reduce excessive verbosity.
diego
parents: 13738
diff changeset
288 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_audio at %p\n",sh);
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
289 if(sh->wf) free(sh->wf);
25614
cc740dcda27c Deallocate audio track codecdata.
eugeni
parents: 25575
diff changeset
290 if(sh->codecdata) free(sh->codecdata);
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
291 free(sh);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
292 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
293
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
294 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
295 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
296 {
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
297 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
298 id, MAX_V_STREAMS);
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
299 return NULL;
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
300 }
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
301 if(demuxer->v_streams[id]){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
302 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
303 } else {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
304 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundVideoStream,id);
20072
3f63d6e12a1a Simplify: replace malloc + memset 0 by calloc
reimar
parents: 19862
diff changeset
305 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
306 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
307 }
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
308 ((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
309 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
310 }
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
311
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
312 void free_sh_video(sh_video_t* sh){
13946
e632b43f0598 Reduce excessive verbosity.
diego
parents: 13738
diff changeset
313 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_video at %p\n",sh);
1657
f6d3c1287748 freeing video buffer
arpi
parents: 1643
diff changeset
314 if(sh->bih) free(sh->bih);
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
315 free(sh);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
316 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
317
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
318 void free_demuxer(demuxer_t *demuxer){
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
319 int i;
13946
e632b43f0598 Reduce excessive verbosity.
diego
parents: 13738
diff changeset
320 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing demuxer at %p\n",demuxer);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
321 if(demuxer->desc->close)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
322 demuxer->desc->close(demuxer);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
323 // Very ugly hack to make it behave like old implementation
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
324 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
325 goto skip_streamfree;
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
326 // free streams:
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14502
diff changeset
327 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
328 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
329 for(i = 0; i < MAX_V_STREAMS; i++)
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
330 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
331 for(i = 0; i < MAX_S_STREAMS; i++)
76bed8202233 Fix memleak due to not freeing demuxer->s_streams
reimar
parents: 23552
diff changeset
332 if(demuxer->s_streams[i]) free_sh_sub(demuxer->s_streams[i]);
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
333 // free demuxers:
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
334 free_demuxer_stream(demuxer->audio);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
335 free_demuxer_stream(demuxer->video);
5412
db582be1b590 added soem debug prints, and fixed 10l bug of Alban
arpi
parents: 5214
diff changeset
336 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
337 skip_streamfree:
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
338 if(demuxer->info) {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
339 for(i=0;demuxer->info[i] != NULL; i++)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
340 free(demuxer->info[i]);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
341 free(demuxer->info);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
342 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
343 if(demuxer->filename)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
344 free(demuxer->filename);
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
345 if (demuxer->chapters) {
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
346 for (i=0; i<demuxer->num_chapters; i++)
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
347 if (demuxer->chapters[i].name)
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
348 free(demuxer->chapters[i].name);
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
349 free(demuxer->chapters);
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
350 }
25657
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
351 if (demuxer->attachments) {
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
352 for (i=0; i<demuxer->num_attachments; i++) {
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
353 free(demuxer->attachments[i].name);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
354 free(demuxer->attachments[i].type);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
355 free(demuxer->attachments[i].data);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
356 }
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
357 free(demuxer->attachments);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
358 }
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
359 free(demuxer);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
360 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
361
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
362
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
363 void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
364 // demux_packet_t* dp=new_demux_packet(len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
365 // stream_read(stream,dp->buffer,len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
366 // dp->pts=pts; //(float)pts/90000.0f;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
367 // dp->pos=pos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
368 // append packet to DS stream:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
369 ++ds->packs;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
370 ds->bytes+=dp->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
371 if(ds->last){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
372 // next packet in stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
373 ds->last->next=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
374 ds->last=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
375 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
376 // first packet in stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
377 ds->first=ds->last=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
378 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
379 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
380 (ds==ds->demuxer->audio)?"d_audio":"d_video",
1428
a90d889eb649 largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents: 1421
diff changeset
381 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
382 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
383
18309
87161f96fa66 Change common pts variables from floats to doubles. Individual demuxers
uau
parents: 18242
diff changeset
384 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
385 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
386 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
387 resize_demux_packet(dp, len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
388 dp->pts=pts; //(float)pts/90000.0f;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
389 dp->pos=pos;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 889
diff changeset
390 dp->flags=flags;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
391 // append packet to DS stream:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
392 ds_add_packet(ds,dp);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
393 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
394
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
395 // return value:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
396 // 0 = EOF or no stream found or invalid type
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
397 // 1 = successfully read a packet
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
398
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
399 int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
400 // 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
401 // printf("demux->type=%d\n",demux->type);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
402 return demux->desc->fill_buffer(demux, ds);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
403 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
404
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
405 // return value:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
406 // 0 = EOF
25197
eb2c5925ec34 Fix typos in comments to stop them hurting my eyes
reimar
parents: 24826
diff changeset
407 // 1 = successful
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
408 int ds_fill_buffer(demux_stream_t *ds){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
409 demuxer_t *demux=ds->demuxer;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
410 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
411 ds->current=NULL;
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17636
diff changeset
412 if( mp_msg_test(MSGT_DEMUXER,MSGL_DBG3) ){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
413 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
414 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
415 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
416 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
417 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
418 while(1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
419 if(ds->packs){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
420 demux_packet_t *p=ds->first;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
421 // copy useful data:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
422 ds->buffer=p->buffer;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
423 ds->buffer_pos=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
424 ds->buffer_size=p->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
425 ds->pos=p->pos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
426 ds->dpos+=p->len; // !!!
889
1b905517c684 AVI -bps desync problem solved
arpi_esp
parents: 828
diff changeset
427 ++ds->pack_no;
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
428 if (p->pts != (correct_pts ? MP_NOPTS_VALUE : 0)) {
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
429 ds->pts=p->pts;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
430 ds->pts_bytes=0;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
431 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
432 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
433 if(p->stream_pts != MP_NOPTS_VALUE) demux->stream_pts=p->stream_pts;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 889
diff changeset
434 ds->flags=p->flags;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
435 // unlink packet:
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
436 ds->bytes-=p->len;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
437 ds->current=p;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
438 ds->first=p->next;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
439 if(!ds->first) ds->last=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
440 --ds->packs;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
441 return 1; //ds->buffer_size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
442 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
443 if(demux->audio->packs>=MAX_PACKS || demux->audio->bytes>=MAX_PACK_BYTES){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
444 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyAudioInBuffer,demux->audio->packs,demux->audio->bytes);
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
445 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
446 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
447 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
448 if(demux->video->packs>=MAX_PACKS || demux->video->bytes>=MAX_PACK_BYTES){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
449 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyVideoInBuffer,demux->video->packs,demux->video->bytes);
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
450 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
451 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
452 }
1421
ea0a0b9e6fbc nosound avi seeking fixed
arpi
parents: 1401
diff changeset
453 if(!demux_fill_buffer(demux,ds)){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
454 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
455 break; // EOF
ea0a0b9e6fbc nosound avi seeking fixed
arpi
parents: 1401
diff changeset
456 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
457 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
458 ds->buffer_pos=ds->buffer_size=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
459 ds->buffer=NULL;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
460 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
461 ds->eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
462 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
463 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
464
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
465 int demux_read_data(demux_stream_t *ds,unsigned char* mem,int len){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
466 int x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
467 int bytes=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
468 while(len>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
469 x=ds->buffer_size-ds->buffer_pos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
470 if(x==0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
471 if(!ds_fill_buffer(ds)) return bytes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
472 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
473 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
474 if(mem) fast_memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
475 bytes+=x;len-=x;ds->buffer_pos+=x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
476 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
477 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
478 return bytes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
479 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
480
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
481 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
482 int x;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
483 int bytes=0;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
484 while(len>0){
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
485 x=ds->buffer_size-ds->buffer_pos;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
486 if(x==0){
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
487 if(!ds_fill_buffer(ds)) return bytes;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
488 } else {
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
489 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
490 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
491 bytes+=x;len-=x;ds->buffer_pos+=x;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
492 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
493 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
494 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
495 return bytes;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
496 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
497
17417
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
498 /**
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
499 * \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
500 * \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
501 * \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
502 * \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
503 * \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
504 * \return whether pattern was found
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 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
507 int *read, uint32_t pattern) {
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
508 register uint32_t head = 0xffffff00;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
509 register uint32_t pat = pattern & 0xffffff00;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
510 int total_len = 0;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
511 do {
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
512 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
513 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
514 register long pos = -len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
515 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
516 ds_fill_buffer(ds);
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
517 continue;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
518 }
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
519 do {
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
520 head |= ds_buf[pos];
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
521 head <<= 8;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
522 } while (++pos && head != pat);
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
523 len += pos;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
524 if (total_len + len > maxlen)
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
525 len = maxlen - total_len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
526 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
527 total_len += len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
528 } 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
529 if (read)
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
530 *read = total_len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
531 return total_len >= 3 && head == pat;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
532 }
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
533
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
534 void ds_free_packs(demux_stream_t *ds){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
535 demux_packet_t *dp=ds->first;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
536 while(dp){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
537 demux_packet_t *dn=dp->next;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
538 free_demux_packet(dp);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
539 dp=dn;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
540 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
541 if(ds->asf_packet){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
542 // free unfinished .asf fragments:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
543 free(ds->asf_packet->buffer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
544 free(ds->asf_packet);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
545 ds->asf_packet=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
546 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
547 ds->first=ds->last=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
548 ds->packs=0; // !!!!!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
549 ds->bytes=0;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
550 if(ds->current) free_demux_packet(ds->current);
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
551 ds->current=NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
552 ds->buffer=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
553 ds->buffer_pos=ds->buffer_size;
828
c71695c30006 added pts_bytes=0 to ds_free_packs
arpi_esp
parents: 746
diff changeset
554 ds->pts=0; ds->pts_bytes=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
555 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
556
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
557 int ds_get_packet(demux_stream_t *ds,unsigned char **start){
24826
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
558 int len;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
559 if(ds->buffer_pos>=ds->buffer_size){
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
560 if(!ds_fill_buffer(ds)){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
561 // EOF
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
562 *start = NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
563 return -1;
24826
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
564 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
565 }
24826
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
566 len=ds->buffer_size-ds->buffer_pos;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
567 *start = &ds->buffer[ds->buffer_pos];
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
568 ds->buffer_pos+=len;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
569 return len;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
570 }
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
571
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
572 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
573 {
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
574 int len;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
575 *pts = MP_NOPTS_VALUE;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
576 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
577 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
578 // EOF
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
579 *start = NULL;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
580 return -1;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
581 }
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
582 }
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
583 // Should use MP_NOPTS_VALUE for "unknown pts" in the packets too
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
584 // Return pts unless this read starts from the middle of a packet
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
585 if (!ds->buffer_pos && (correct_pts || ds->current->pts))
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
586 *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
587 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
588 *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
589 ds->buffer_pos+=len;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
590 return len;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
591 }
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
592
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
593 int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start){
24826
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
594 int len;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
595 if(ds->buffer_pos>=ds->buffer_size){
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
596 *start = NULL;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
597 if(!ds->packs) return -1; // no sub
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
598 if(!ds_fill_buffer(ds)) return -1; // EOF
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
599 }
24826
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
600 len=ds->buffer_size-ds->buffer_pos;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
601 *start = &ds->buffer[ds->buffer_pos];
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
602 ds->buffer_pos+=len;
ac881f93b661 demuxer.c: Remove useless code
uau
parents: 24678
diff changeset
603 return len;
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
604 }
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
605
18309
87161f96fa66 Change common pts variables from floats to doubles. Individual demuxers
uau
parents: 18242
diff changeset
606 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
607 {
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
608 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
609 while(!ds->first) {
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
610 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
611 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
612 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
613 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
614 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
615 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
616 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
617 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
618 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
619 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
620 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
621 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
622 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
623 return ds->first->pts;
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
624 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
625
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
626 // ====================================================================
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
627
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
628 void demuxer_help(void)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
629 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
630 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
631
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
632 mp_msg(MSGT_DEMUXER, MSGL_INFO, "Available demuxers:\n");
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
633 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
634 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DEMUXERS\n");
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
635 for (i = 0; demuxer_list[i]; i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
636 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Don't display special demuxers
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
637 continue;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
638 if (demuxer_list[i]->comment && strlen(demuxer_list[i]->comment))
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
639 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s (%s)\n",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
640 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info, demuxer_list[i]->comment);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
641 else
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
642 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s\n",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
643 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
644 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
645 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
646
14693
37116118ab6a avisynth demuxer patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents: 14666
diff changeset
647
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
648 /**
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
649 * Get demuxer type for a given demuxer name
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
650 *
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
651 * @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
652 * @param force will be set if demuxer should be forced.
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
653 * May be NULL.
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
654 * @return DEMUXER_TYPE_xxx, -1 if error or not found
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
655 */
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
656 int get_demuxer_type_from_name(char *demuxer_name, int *force)
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
657 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
658 int i;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
659 long type_int;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
660 char *endptr;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents: 5107
diff changeset
661
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
662 if (!demuxer_name || !demuxer_name[0])
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
663 return DEMUXER_TYPE_UNKNOWN;
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
664 if (force) *force = demuxer_name[0] == '+';
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
665 if (demuxer_name[0] == '+')
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
666 demuxer_name = &demuxer_name[1];
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
667 for (i = 0; demuxer_list[i]; i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
668 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Can't select special demuxers from commandline
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
669 continue;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
670 if (strcmp(demuxer_name, demuxer_list[i]->name) == 0)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
671 return demuxer_list[i]->type;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
672 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
673
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
674 // No match found, try to parse name as an integer (demuxer number)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
675 type_int = strtol(demuxer_name, &endptr, 0);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
676 if (*endptr) // Conversion failed
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
677 return -1;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
678 if ((type_int > 0) && (type_int <= DEMUXER_TYPE_MAX))
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
679 return (int)type_int;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
680
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
681 return -1;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
682 }
3801
3cea69dda1b3 added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents: 3786
diff changeset
683
9751
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
684 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
685
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
686 int correct_pts=0;
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
687
9751
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
688 /*
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
689 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
690 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
691 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
692 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
693 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
694 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
695 to the right type (ex: rawaudio,rawvideo).
25197
eb2c5925ec34 Fix typos in comments to stop them hurting my eyes
reimar
parents: 24826
diff changeset
696 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
697 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
698 (ex: tv,mf).
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
699 */
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
700
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
701 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
702 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
703 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
704
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
705 //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
706
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
707 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
708
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
709 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
710
25706
f0d45f8866e8 First step towards making all demuxer_desc_t const
reimar
parents: 25705
diff changeset
711 const demuxer_desc_t *demuxer_desc;
23865
4d3f8a0d864c Make sure fformat is set before use
reimar
parents: 23864
diff changeset
712 int fformat = 0;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
713 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
714
1659
6b71bbf515e4 num_elementary_packets1xx reset
arpi
parents: 1657
diff changeset
715 //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
716
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
717 // If somebody requested a demuxer check it
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
718 if (file_format) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
719 if ((demuxer_desc = get_demuxer_desc_from_type(file_format))) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
720 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
721 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
722 fformat = demuxer_desc->check_file(demuxer);
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
723 if (force || !demuxer_desc->check_file)
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
724 fformat = demuxer_desc->type;
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
725 if (fformat != 0) {
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
726 if (fformat == demuxer_desc->type) {
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
727 demuxer_t *demux2 = demuxer;
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
728 // Move messages to demuxer detection code?
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
729 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
730 file_format = fformat;
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
731 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
732 demuxer = demux2;
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
733 goto dmx_open;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
734 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
735 } else {
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
736 // Format changed after check, recurse
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
737 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
738 return demux_open_stream(stream, fformat, force,
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
739 audio_id, video_id, dvdsub_id, filename);
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
740 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
741 }
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
742 // Check failed for forced demuxer, quit
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
743 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
744 return NULL;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
745 }
9065
59805b2d220a raw video demuxer, requested by Michael
arpi
parents: 9006
diff changeset
746 }
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents: 6192
diff changeset
747
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
748 // Test demuxers with safe file checks
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
749 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
750 if (demuxer_desc->safe_check) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
751 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
752 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
753 if (fformat == demuxer_desc->type) {
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
754 demuxer_t *demux2 = demuxer;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
755 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
756 file_format = fformat;
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
757 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) {
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
758 demuxer = demux2;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
759 goto dmx_open;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
760 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
761 } else {
16326
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
762 if (fformat == DEMUXER_TYPE_PLAYLIST)
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
763 return demuxer; // handled in mplayer.c
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
764 // Format changed after check, recurse
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
765 free_demuxer(demuxer);
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
766 demuxer=demux_open_stream(stream, fformat, force,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
767 audio_id, video_id, dvdsub_id, filename);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
768 if(demuxer) return demuxer; // done!
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
769 file_format = DEMUXER_TYPE_UNKNOWN;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
770 }
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
771 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
772 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
773 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
774 }
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
775 }
9006
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
776
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
777 // 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
778 // 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
779 // 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
780 // first:
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
781 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
782 file_format=demuxer_type_by_filename(filename);
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
783 if(file_format!=DEMUXER_TYPE_UNKNOWN){
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
784 // we like recursion :)
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
785 demuxer=demux_open_stream(stream, file_format, force,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
786 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
787 if(demuxer) return demuxer; // done!
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
788 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
789 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
790 }
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
791 }
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
792
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
793 // Try detection for all other demuxers
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
794 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
795 if (!demuxer_desc->safe_check && demuxer_desc->check_file) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
796 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
797 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
798 if (fformat == demuxer_desc->type) {
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
799 demuxer_t *demux2 = demuxer;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
800 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
801 file_format = fformat;
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
802 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) {
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
803 demuxer = demux2;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
804 goto dmx_open;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
805 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
806 } else {
16326
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
807 if (fformat == DEMUXER_TYPE_PLAYLIST)
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
808 return demuxer; // handled in mplayer.c
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
809 // Format changed after check, recurse
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
810 free_demuxer(demuxer);
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
811 demuxer=demux_open_stream(stream, fformat, force,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
812 audio_id, video_id, dvdsub_id, filename);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
813 if(demuxer) return demuxer; // done!
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
814 file_format = DEMUXER_TYPE_UNKNOWN;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
815 }
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
816 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
817 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
818 demuxer = NULL;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents: 4065
diff changeset
819 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents: 4065
diff changeset
820 }
15670
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15576
diff changeset
821
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
822 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
823 //====== File format recognized, set up these for compatibility: =========
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
824 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
825
1485
b895f95e7657 AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents: 1456
diff changeset
826 demuxer->file_format=file_format;
b895f95e7657 AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents: 1456
diff changeset
827
16477
c2e0e8c6f00a Make the fourcc output endianness-independent.
diego
parents: 16413
diff changeset
828 if ((sh_video=demuxer->video->sh) && sh_video->bih){
c2e0e8c6f00a Make the fourcc output endianness-independent.
diego
parents: 16413
diff changeset
829 int biComp=le2me_32(sh_video->bih->biCompression);
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17354
diff changeset
830 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
831 (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
832 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
833 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
834 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
835 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
836 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
837 sh_video->i_bps/1024.0f );
16477
c2e0e8c6f00a Make the fourcc output endianness-independent.
diego
parents: 16413
diff changeset
838 }
25654
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
839 #ifdef USE_ASS
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
840 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
841 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
842 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
843 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
844 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
845 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
846 ass_process_codec_private(sh->ass_track, sh->extradata, sh->extradata_len);
25656
00e4d59a0be4 Remove global_ass_track. Instead create an ass_track for each 't' track.
eugeni
parents: 25654
diff changeset
847 } else if (sh && sh->type == 't')
00e4d59a0be4 Remove global_ass_track. Instead create an ass_track for each 't' track.
eugeni
parents: 25654
diff changeset
848 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
849 }
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
850 }
0190aa38aae2 Init and destroy ass_tracks in demuxer.c based on sh_sub->type value.
eugeni
parents: 25652
diff changeset
851 #endif
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
852 return demuxer;
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
853 }
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
854
6623
7bc4c6ba9485 add -audiofile support for gui
pontscho
parents: 6384
diff changeset
855 char* audio_stream = NULL;
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7754
diff changeset
856 char* sub_stream = NULL;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
857 int demuxer_type = 0; // used by rawaudio and rawvideo
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
858 int audio_stream_cache = 0;
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7754
diff changeset
859
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
860 char *demuxer_name = NULL; // parameter from -demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
861 char *audio_demuxer_name = NULL; // parameter from -audio-demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
862 char *sub_demuxer_name = NULL; // parameter from -sub-demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
863
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7754
diff changeset
864 extern int hr_mp3_seek;
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
865
12835
4235ae5a2d60 cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents: 12434
diff changeset
866 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
867 extern float stream_cache_seek_min_percent;
12835
4235ae5a2d60 cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents: 12434
diff changeset
868
9006
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
869 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
870 stream_t *as = NULL,*ss = NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
871 demuxer_t *vd,*ad = NULL,*sd = NULL;
12223
e7c8200ffdc5 Respect -playlist for asx streams
rtognimp
parents: 12175
diff changeset
872 int afmt =DEMUXER_TYPE_UNKNOWN,sfmt = DEMUXER_TYPE_UNKNOWN ;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
873 int audio_demuxer_type = 0, sub_demuxer_type = 0;
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
874 int demuxer_force = 0, audio_demuxer_force = 0,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
875 sub_demuxer_force = 0;
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
876
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
877 if ((demuxer_type = get_demuxer_type_from_name(demuxer_name, &demuxer_force)) < 0) {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
878 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-demuxer %s does not exist.\n",demuxer_name);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
879 }
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
880 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
881 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-audio-demuxer %s does not exist.\n",audio_demuxer_name);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
882 }
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
883 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
884 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-sub-demuxer %s does not exist.\n",sub_demuxer_name);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
885 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
886
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
887 if(audio_stream) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
888 as = open_stream(audio_stream,0,&afmt);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
889 if(!as) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
890 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
891 return NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
892 }
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
893 if(audio_stream_cache) {
12835
4235ae5a2d60 cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents: 12434
diff changeset
894 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
895 audio_stream_cache*1024*(stream_cache_seek_min_percent / 100.0))) {
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
896 free_stream(as);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
897 mp_msg(MSGT_DEMUXER,MSGL_ERR,"Can't enable audio stream cache\n");
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
898 return NULL;
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
899 }
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
900 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
901 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
902 if(sub_stream) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
903 ss = open_stream(sub_stream,0,&sfmt);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
904 if(!ss) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
905 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
906 return NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
907 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
908 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
909
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
910 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
911 demuxer_force, audio_stream ? -2 : audio_id, video_id,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
912 sub_stream ? -2 : dvdsub_id, filename);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
913 if(!vd) {
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
914 if(as) free_stream(as);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
915 if(ss) free_stream(ss);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
916 return NULL;
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
917 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
918 if(as) {
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
919 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
920 audio_demuxer_force, audio_id, -2, -2, audio_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
921 if(!ad) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
922 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningAudioDemuxerFailed,audio_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
923 free_stream(as);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
924 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
925 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
926 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
927 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
928 if(ss) {
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
929 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
930 sub_demuxer_force, -2, -2, dvdsub_id, sub_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
931 if(!sd) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
932 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningSubtitlesDemuxerFailed,sub_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
933 free_stream(ss);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
934 }
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
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
937 if(ad && sd)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
938 return new_demuxers_demuxer(vd,ad,sd);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
939 else if(ad)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
940 return new_demuxers_demuxer(vd,ad,vd);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
941 else if(sd)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
942 return new_demuxers_demuxer(vd,vd,sd);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
943 else
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
944 return vd;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
945 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
946
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
947
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
948 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
949 demux_stream_t *d_audio=demuxer->audio;
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
950 demux_stream_t *d_video=demuxer->video;
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
951 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
952 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
953 double tmp = 0;
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
954 double pts;
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
955
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
956 if(!demuxer->seekable){
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
957 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
958 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekRawAVI);
2790
98769cea155c added tv subsystem
alex
parents: 2687
diff changeset
959 #ifdef USE_TV
98769cea155c added tv subsystem
alex
parents: 2687
diff changeset
960 else if (demuxer->file_format==DEMUXER_TYPE_TV)
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
961 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_TVInputNotSeekable);
2790
98769cea155c added tv subsystem
alex
parents: 2687
diff changeset
962 #endif
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
963 else
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1659
diff changeset
964 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekFile);
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
965 return 0;
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
966 }
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
967
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
968 // clear demux buffers:
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
969 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
970 ds_free_packs(d_video);
24678
9aab9d7b51f0 Fix missing subtitles after seeking back
uau
parents: 24564
diff changeset
971 ds_free_packs(demuxer->sub);
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
972
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
973 demuxer->stream->eof=0; // clear eof flag
3542
465329581ad8 reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents: 3411
diff changeset
974 demuxer->video->eof=0;
465329581ad8 reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents: 3411
diff changeset
975 demuxer->audio->eof=0;
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
976
4203
7cfa69df9e0b reverted old seeking method - ask Holm why...
arpi
parents: 4189
diff changeset
977 #if 0
3824
be5e58955f57 don't reset timer at seek - req. for dxr3
arpi
parents: 3801
diff changeset
978 if(sh_audio) sh_audio->timer=sh_video->timer;
be5e58955f57 don't reset timer at seek - req. for dxr3
arpi
parents: 3801
diff changeset
979 #else
4587
886bf5274992 Audio only support. Include a fix in the asf demuxer opening.
albeu
parents: 4565
diff changeset
980 if(sh_video) sh_video->timer=0; // !!!!!!
3824
be5e58955f57 don't reset timer at seek - req. for dxr3
arpi
parents: 3801
diff changeset
981 #endif
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
982
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
983 if(flags & 1) // absolute seek
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
984 pts = 0.0f;
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
985 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
986 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
987 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
988 pts = demuxer->stream_pts;
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
989 }
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
990
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
991 if(flags & 2) { // percent seek
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
992 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
993 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
994 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
995 } else
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
996 pts += rel_seek_secs;
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
997
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
998 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
999 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
1000 return 1;
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
1001 }
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 dmx_seek:
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1004 if (demuxer->desc->seek)
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
1005 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
1006
16877
9081ae3a702c move resync_audio_stream after seeking to demuxer.c
reimar
parents: 16572
diff changeset
1007 if (sh_audio) resync_audio_stream(sh_audio);
9081ae3a702c move resync_audio_stream after seeking to demuxer.c
reimar
parents: 16572
diff changeset
1008
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
1009 return 1;
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
1010 }
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
1011
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
1012 int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param)
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1013 {
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1014 char **info = demuxer->info;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1015 int n = 0;
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
1016
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1017
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1018 for(n = 0; info && info[2*n] != NULL; n++)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1019 {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1020 if(!strcasecmp(opt,info[2*n]))
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1021 {
19413
acd26ccbff0d Update information and print new value when demux_info_add is called
reimar
parents: 19342
diff changeset
1022 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
1023 free(info[2*n+1]);
acd26ccbff0d Update information and print new value when demux_info_add is called
reimar
parents: 19342
diff changeset
1024 info[2*n+1] = strdup(param);
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1025 return 0;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1026 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1027 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1028
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1029 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
1030 info[2*n] = strdup(opt);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1031 info[2*n+1] = strdup(param);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1032 memset(&info[2*(n+1)],0,2*sizeof(char*));
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1033
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1034 return 1;
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1035 }
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1036
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1037 int demux_info_print(demuxer_t *demuxer)
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1038 {
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1039 char **info = demuxer->info;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1040 int n;
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1041
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1042 if(!info)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1043 return 0;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1044
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
1045 mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_ClipInfo);
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1046 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
1047 {
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1048 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
1049 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
1050 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
1051 }
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
1052 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
1053
6871d97e4261 initial support for FILM file demuxing
melanson
parents: 4065
diff changeset
1054 return 0;
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1055 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1056
23611
ecbb54f8d299 make opt argument of demux_info_get const.
reimar
parents: 23592
diff changeset
1057 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
1058 int i;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1059 char **info = demuxer->info;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1060
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1061 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
1062 if(!strcasecmp(opt,info[2*i]))
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1063 return info[2*i+1];
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1064 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1065
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1066 return NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1067 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1068
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1069 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
1070
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1071 if (demuxer->desc->control)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1072 return demuxer->desc->control(demuxer,cmd,arg);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1073
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1074 return DEMUXER_CTRL_NOTIMPL;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1075 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1076
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1077
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1078
16346
6ff303d2876b Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents: 16326
diff changeset
1079 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
1080 double get_time_ans;
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1081 sh_video_t *sh_video = demuxer->video->sh;
16925
4bce034eeb0a estimate total time also for audio-only files.
reimar
parents: 16877
diff changeset
1082 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
1083 // <= 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
1084 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
1085 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
1086 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
1087 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
1088 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
1089 else if (sh_audio && sh_audio->i_bps)
4bce034eeb0a estimate total time also for audio-only files.
reimar
parents: 16877
diff changeset
1090 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
1091 else
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1092 get_time_ans=0;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1093 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1094 return get_time_ans;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1095 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1096
20749
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1097 /**
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1098 * \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
1099 * 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
1100 * 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
1101 * 0 otherwise
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1102 * \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
1103 */
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1104 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
1105 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
1106 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
1107 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
1108 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
1109 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
1110 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
1111 }
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1112
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1113 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
1114 int ans = 0;
2ae224195625 Use demuxer_get_percent_pos for the OSD position bar
reimar
parents: 14160
diff changeset
1115 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
1116 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
1117 if (res <= 0) {
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1118 if (len > 0)
14197
2ae224195625 Use demuxer_get_percent_pos for the OSD position bar
reimar
parents: 14160
diff changeset
1119 ans = (demuxer->filepos - demuxer->movi_start) / len;
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1120 else
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1121 ans = 0;
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1122 }
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1123 if (ans < 0) ans = 0;
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1124 if (ans > 100) ans = 100;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1125 return ans;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1126 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1127
15285
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1128 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
1129 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
1130 if (res == DEMUXER_CTRL_NOTIMPL)
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1131 index = demuxer->audio->id;
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1132 return index;
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14934
diff changeset
1133 }
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1134
20948
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1135 int demuxer_switch_video(demuxer_t *demuxer, int index){
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1136 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_VIDEO, &index);
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1137 if (res == DEMUXER_CTRL_NOTIMPL)
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1138 index = demuxer->video->id;
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1139 return index;
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1140 }
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1141
25657
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1142 int demuxer_add_attachment(demuxer_t* demuxer, const char* name,
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1143 const char* type, const void* data, size_t size) {
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1144 if (!(demuxer->num_attachments & 31))
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1145 demuxer->attachments = realloc(demuxer->attachments, (demuxer->num_attachments + 32) * sizeof(demux_attachment_t));
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1146
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1147 demuxer->attachments[demuxer->num_attachments].name = strdup(name);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1148 demuxer->attachments[demuxer->num_attachments].type = strdup(type);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1149 demuxer->attachments[demuxer->num_attachments].data = malloc(size);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1150 memcpy(demuxer->attachments[demuxer->num_attachments].data, data, size);
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1151 demuxer->attachments[demuxer->num_attachments].data_size = size;
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1152
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1153 return demuxer->num_attachments ++;
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1154 }
dfeb8ea2a7a8 Add demuxer interface for attachments.
eugeni
parents: 25656
diff changeset
1155
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1156 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
1157 if (demuxer->chapters == NULL)
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1158 demuxer->chapters = malloc (32*sizeof(*demuxer->chapters));
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1159 else if (!(demuxer->num_chapters % 32))
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1160 demuxer->chapters = realloc (demuxer->chapters, (demuxer->num_chapters + 32) * sizeof(*demuxer->chapters));
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1161
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1162 demuxer->chapters[demuxer->num_chapters].start = start;
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1163 demuxer->chapters[demuxer->num_chapters].end = end;
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1164 demuxer->chapters[demuxer->num_chapters].name = strdup(name);
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1165
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1166 return demuxer->num_chapters ++;
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1167 }
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1168
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1169 /**
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1170 * \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
1171 * either using the demuxer->chapters structure set by the demuxer
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1172 * or asking help to the stream layer (e.g. dvd)
19439
28d2d1fddff4 clarification in a comment
nicodvb
parents: 19438
diff changeset
1173 * \param chapter - chapter number wished - 0-based
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1174 * \param mode 0: relative to current main pts, 1: absolute
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1175 * \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
1176 * \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
1177 * \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
1178 * \return -1 on error, current chapter if successful
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1179 */
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1180
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1181 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
1182 int ris;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1183 int current, total;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1184 sh_video_t *sh_video = demuxer->video->sh;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1185 sh_audio_t *sh_audio = demuxer->audio->sh;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1186
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1187 if (!demuxer->num_chapters || !demuxer->chapters) {
19438
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1188 if(!mode) {
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1189 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER, &current);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
1190 if(ris == STREAM_UNSUPPORTED) return -1;
19438
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1191 chapter += current;
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1192 }
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1193
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1194 if(demuxer->video->sh)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1195 ds_free_packs(demuxer->video);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1196
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1197 if(demuxer->audio->sh)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1198 ds_free_packs(demuxer->audio);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1199
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1200 if(demuxer->sub->id >= 0)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1201 ds_free_packs(demuxer->sub);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1202
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1203 ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, &chapter);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
1204 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
1205 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1206 if(sh_video) {
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1207 ds_fill_buffer(demuxer->video);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1208 resync_video_stream(sh_video);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1209 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1210
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1211 if(sh_audio) {
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1212 ds_fill_buffer(demuxer->audio);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1213 resync_audio_stream(sh_audio);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1214 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1215
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1216 //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
1217 *seek_pts = -1.0;
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1218
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1219 if(num_chapters) {
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
1220 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
1221 *num_chapters = 0;
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1222 }
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1223
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1224 if(chapter_name) {
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1225 *chapter_name = NULL;
25314
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1226 if (num_chapters && *num_chapters) {
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1227 char *tmp = malloc(16);
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1228 if (tmp) {
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1229 sprintf(tmp, " of %3d", *num_chapters);
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1230 *chapter_name = tmp;
02e2e7a5599a Fix memory leak that tmp allocated but maybe not used.
ulion
parents: 25266
diff changeset
1231 }
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1232 }
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1233 }
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1234
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 24022
diff changeset
1235 return (ris != STREAM_UNSUPPORTED ? chapter : -1);
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1236 } else { //chapters structure is set in the demuxer
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1237 total = demuxer->num_chapters;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1238
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1239 if (mode==1) { //absolute seeking
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1240 current = chapter;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1241 } else { //relative seeking
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1242 uint64_t now;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1243 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
1244
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1245 for (current = total - 1; current >= 0; --current) {
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1246 demux_chapter_t* chapter = demuxer->chapters + current;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1247 if (chapter->start <= now)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1248 break;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1249 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1250 current += chapter;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1251 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1252
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1253 if (current >= total)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1254 return -1;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1255 if (current < 0) current = 0;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1256
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1257 *seek_pts = demuxer->chapters[current].start / 1000.0;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1258
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1259 if(num_chapters)
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1260 *num_chapters = demuxer->num_chapters;
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1261
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
1262 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
1263 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
1264 *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
1265 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
1266 }
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1267
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1268 return current;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1269 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1270 }
25358
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1271
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1272 int demuxer_get_current_chapter(demuxer_t *demuxer) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1273 int chapter = -1;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1274 if (!demuxer->num_chapters || !demuxer->chapters) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1275 if (stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER,
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1276 &chapter) == STREAM_UNSUPPORTED)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1277 chapter = -1;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1278 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1279 else {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1280 sh_video_t *sh_video = demuxer->video->sh;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1281 sh_audio_t *sh_audio = demuxer->audio->sh;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1282 uint64_t now;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1283 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
1284 for (chapter = demuxer->num_chapters - 1; chapter >= 0; --chapter) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1285 if (demuxer->chapters[chapter].start <= now)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1286 break;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1287 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1288 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1289 return chapter;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1290 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1291
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1292 char *demuxer_chapter_name(demuxer_t *demuxer, int chapter) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1293 if (demuxer->num_chapters && demuxer->chapters) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1294 if (chapter >=0 && chapter < demuxer->num_chapters &&
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1295 demuxer->chapters[chapter].name)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1296 return strdup(demuxer->chapters[chapter].name);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1297 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1298 return NULL;
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
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1301 char *demuxer_chapter_display_name(demuxer_t *demuxer, int chapter) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1302 char *chapter_name = demuxer_chapter_name(demuxer, chapter);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1303 if (chapter_name) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1304 char *tmp = malloc(strlen(chapter_name) + 14);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1305 snprintf(tmp, 63, "(%d) %s", chapter + 1, chapter_name);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1306 free(chapter_name);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1307 return tmp;
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 else {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1310 int chapter_num = demuxer_chapter_count(demuxer);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1311 char tmp[30];
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1312 if (chapter_num <= 0)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1313 sprintf(tmp, "(%d)", chapter + 1);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1314 else
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1315 sprintf(tmp, "(%d) of %d", chapter + 1, chapter_num);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1316 return strdup(tmp);
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1317 }
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
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1320 float demuxer_chapter_time(demuxer_t *demuxer, int chapter, float *end) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1321 if (demuxer->num_chapters && demuxer->chapters && chapter >= 0
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1322 && chapter < demuxer->num_chapters) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1323 if (end)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1324 *end = demuxer->chapters[chapter].end / 1000.0;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1325 return demuxer->chapters[chapter].start / 1000.0;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1326 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1327 return -1.0;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1328 }
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 int demuxer_chapter_count(demuxer_t *demuxer) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1331 if (!demuxer->num_chapters || !demuxer->chapters) {
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1332 int num_chapters = 0;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1333 if (stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_CHAPTERS,
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1334 &num_chapters) == STREAM_UNSUPPORTED)
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1335 num_chapters = 0;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1336 return num_chapters;
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1337 }
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1338 else
89b3a18bfa66 Add demuxer functions for chapter feature.
ulion
parents: 25314
diff changeset
1339 return demuxer->num_chapters;
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
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
1342 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
1343 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
1344
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
1345 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
1346 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
1347 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
1348 }
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
1349
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
1350 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
1351 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
1352 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
1353 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
1354 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
1355 }
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
1356
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
1357
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
1358 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
1359 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
1360 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
1361 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
1362
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 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
1364 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
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 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
1367 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
1368
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 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
1370 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
1371
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 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
1373 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
1374
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 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
1376 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
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 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
1379 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
1380 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
1381 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
1382 }
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 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
1385 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
1386 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
1387 }
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
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 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
1390 }