Mercurial > mplayer.hg
annotate libmpdemux/demux_demuxers.c @ 29303:4f26b760cb37
CONFIG_LIBNEMESI and CONFIG_LIVE555 are not defined to 0/1 values.
Thus, we cannot check for them in an #if directive, but have to
use #if defined() instead.
author | diego |
---|---|
date | Wed, 03 Jun 2009 13:42:11 +0000 |
parents | 0f1b5b68af32 |
children | ccb7b7f4b764 |
rev | line source |
---|---|
29238
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
1 /* |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
2 * This file is part of MPlayer. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
3 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
7 * (at your option) any later version. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
8 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
12 * GNU General Public License for more details. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
13 * |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d643e4643313
Add standard license header to all files in libmpdemux.
diego
parents:
26817
diff
changeset
|
17 */ |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
18 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
19 #include "config.h" |
18176
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
17636
diff
changeset
|
20 #include "mp_msg.h" |
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
17636
diff
changeset
|
21 #include "help_mp.h" |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
22 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
23 #include <stdlib.h> |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
24 #include <stdio.h> |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
20071
diff
changeset
|
25 #include "stream/stream.h" |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
26 #include "demuxer.h" |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
27 #include "stheader.h" |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
28 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
29 typedef struct dd_priv { |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
30 demuxer_t* vd; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
31 demuxer_t* ad; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
32 demuxer_t* sd; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
33 } dd_priv_t; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
34 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
22605
diff
changeset
|
35 extern const demuxer_desc_t demuxer_desc_demuxers; |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
36 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
37 demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd) { |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
38 demuxer_t* ret; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
39 dd_priv_t* priv; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
40 |
18885 | 41 ret = calloc(1,sizeof(demuxer_t)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
42 |
18885 | 43 priv = malloc(sizeof(dd_priv_t)); |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
44 priv->vd = vd; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
45 priv->ad = ad; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
46 priv->sd = sd; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
47 ret->priv = priv; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
48 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
49 ret->type = ret->file_format = DEMUXER_TYPE_DEMUXERS; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
50 // Video is the most important :-) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
51 ret->stream = vd->stream; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
52 ret->seekable = vd->seekable && ad->seekable && sd->seekable; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
53 |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
54 ret->video = vd->video; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
55 ret->audio = ad->audio; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
56 ret->sub = sd->sub; |
16175 | 57 |
26817
a0c157a99aac
Make internal subtitle and subtitle switching work with -audiofile
reimar
parents:
26297
diff
changeset
|
58 // HACK?, necessary for subtitle (and audio and video when implemented) switching |
a0c157a99aac
Make internal subtitle and subtitle switching work with -audiofile
reimar
parents:
26297
diff
changeset
|
59 memcpy(ret->v_streams, vd->v_streams, sizeof(ret->v_streams)); |
a0c157a99aac
Make internal subtitle and subtitle switching work with -audiofile
reimar
parents:
26297
diff
changeset
|
60 memcpy(ret->a_streams, ad->a_streams, sizeof(ret->a_streams)); |
a0c157a99aac
Make internal subtitle and subtitle switching work with -audiofile
reimar
parents:
26297
diff
changeset
|
61 memcpy(ret->s_streams, sd->s_streams, sizeof(ret->s_streams)); |
a0c157a99aac
Make internal subtitle and subtitle switching work with -audiofile
reimar
parents:
26297
diff
changeset
|
62 |
16175 | 63 ret->desc = &demuxer_desc_demuxers; |
64 | |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
65 return ret; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
66 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
67 |
16175 | 68 static int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) { |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
69 dd_priv_t* priv; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
70 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
71 priv=demux->priv; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
72 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
73 if(ds->demuxer == priv->vd) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
74 return demux_fill_buffer(priv->vd,ds); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
75 else if(ds->demuxer == priv->ad) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
76 return demux_fill_buffer(priv->ad,ds); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
77 else if(ds->demuxer == priv->sd) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
78 return demux_fill_buffer(priv->sd,ds); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
79 |
18176
f72bc5754209
Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents:
17636
diff
changeset
|
80 mp_msg(MSGT_DEMUX,MSGL_WARN,MSGTR_MPDEMUX_DEMUXERS_FillBufferError); |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
81 return 0; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
82 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
83 |
17636 | 84 static void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags) { |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
85 dd_priv_t* priv; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
86 float pos; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
87 priv=demuxer->priv; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
88 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
89 priv->ad->stream->eof = 0; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
90 priv->sd->stream->eof = 0; |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
91 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
92 // Seek video |
17636 | 93 demux_seek(priv->vd,rel_seek_secs,audio_delay,flags); |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
94 // Get the new pos |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
95 pos = demuxer->video->pts; |
20071
672123d27ae3
Fix demux_demuxers seeking if the video demuxer does not set
reimar
parents:
18958
diff
changeset
|
96 if (!pos) { |
672123d27ae3
Fix demux_demuxers seeking if the video demuxer does not set
reimar
parents:
18958
diff
changeset
|
97 demux_fill_buffer(priv->vd, demuxer->video); |
672123d27ae3
Fix demux_demuxers seeking if the video demuxer does not set
reimar
parents:
18958
diff
changeset
|
98 if (demuxer->video->first) |
672123d27ae3
Fix demux_demuxers seeking if the video demuxer does not set
reimar
parents:
18958
diff
changeset
|
99 pos = demuxer->video->first->pts; |
672123d27ae3
Fix demux_demuxers seeking if the video demuxer does not set
reimar
parents:
18958
diff
changeset
|
100 } |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
101 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
102 if(priv->ad != priv->vd) { |
26297 | 103 sh_audio_t* sh = demuxer->audio->sh; |
17636 | 104 demux_seek(priv->ad,pos,audio_delay,1); |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
105 // In case the demuxer don't set pts |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
106 if(!demuxer->audio->pts) |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
107 demuxer->audio->pts = pos-((ds_tell_pts(demuxer->audio)-sh->a_in_buffer_len)/(float)sh->i_bps); |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
108 } |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
109 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
110 if(priv->sd != priv->vd) |
17636 | 111 demux_seek(priv->sd,pos,audio_delay,1); |
4765
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
112 |
d0c2c8af46b4
Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff
changeset
|
113 } |
5812 | 114 |
16175 | 115 static void demux_close_demuxers(demuxer_t* demuxer) { |
5812 | 116 dd_priv_t* priv = demuxer->priv; |
9710 | 117 stream_t *s; |
5812 | 118 |
119 if(priv->vd) | |
120 free_demuxer(priv->vd); | |
9710 | 121 if(priv->ad && priv->ad != priv->vd) { |
122 // That's a hack to free the audio file stream | |
123 // It's ok atm but we shouldn't free that here | |
124 s = priv->ad->stream; | |
5812 | 125 free_demuxer(priv->ad); |
9710 | 126 free_stream(s); |
127 } if(priv->sd && priv->sd != priv->vd && priv->sd != priv->ad) { | |
128 s = priv->sd->stream; | |
5812 | 129 free_demuxer(priv->sd); |
9710 | 130 free_stream(s); |
131 } | |
5812 | 132 |
133 free(priv); | |
134 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29238
diff
changeset
|
135 |
16175 | 136 |
16876
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
137 static int demux_demuxers_control(demuxer_t *demuxer,int cmd, void *arg){ |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
138 dd_priv_t* priv = demuxer->priv; |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
139 switch (cmd) { |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
140 case DEMUXER_CTRL_GET_TIME_LENGTH: |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
141 *((double *)arg) = demuxer_get_time_length(priv->vd); |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
142 return DEMUXER_CTRL_OK; |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
143 case DEMUXER_CTRL_GET_PERCENT_POS: |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
144 *((int *)arg) = demuxer_get_percent_pos(priv->vd); |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
145 return DEMUXER_CTRL_OK; |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
146 } |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
147 return DEMUXER_CTRL_NOTIMPL; |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
148 } |
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
149 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
22605
diff
changeset
|
150 const demuxer_desc_t demuxer_desc_demuxers = { |
16175 | 151 "Demuxers demuxer", |
152 "", // Not selectable | |
153 "", | |
154 "?", | |
155 "internal use only", | |
156 DEMUXER_TYPE_DEMUXERS, | |
157 0, // no autodetect | |
158 NULL, | |
159 demux_demuxers_fill_buffer, | |
160 NULL, | |
161 demux_close_demuxers, | |
162 demux_demuxers_seek, | |
16876
9dd44ff7ec32
Provide DEMUXER_CTRL_GET_TIME_LENGTH and DEMUXER_CTRL_GET_PERCENT_POS.
reimar
parents:
16291
diff
changeset
|
163 demux_demuxers_control |
16175 | 164 }; |