Mercurial > mplayer.hg
annotate libmpdemux/demux_lavf.c @ 33661:b2071e60b20b
Rename guiGetEvent type guiSetAudioOnly guiSetAudio.
(All audio related guiGetEvent() code will be moved here later.)
Additionally, set variable guiInfo.AudioChannels in guiGetEvent()
rather than in mplayer.c. In order to do this, guiSetVideo must come
first, then audio.
author | ib |
---|---|
date | Tue, 28 Jun 2011 08:52:02 +0000 |
parents | 3348a9e99214 |
children | 30f5e5cd3676 |
rev | line source |
---|---|
12164 | 1 /* |
26742
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at> |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
3 * |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
4 * This file is part of MPlayer. |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
5 * |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
6 * MPlayer is free software; you can redistribute it and/or modify |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
9 * (at your option) any later version. |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
10 * |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
11 * MPlayer is distributed in the hope that it will be useful, |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
14 * GNU General Public License for more details. |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
15 * |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
0c1db5fd3f79
Use standard license headers with standard formatting.
diego
parents:
26696
diff
changeset
|
19 */ |
12164 | 20 |
21 // #include <stdio.h> | |
22 #include <stdlib.h> | |
23 // #include <unistd.h> | |
19611 | 24 #include <limits.h> |
12164 | 25 |
26 #include "config.h" | |
27 #include "mp_msg.h" | |
23010
74efb0fa8a0b
with -identify show audio and video id; patch by Andrew Savchenko (Bircoph list ru)
nicodvb
parents:
22990
diff
changeset
|
28 #include "help_mp.h" |
26696 | 29 #include "av_opts.h" |
12164 | 30 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22440
diff
changeset
|
31 #include "stream/stream.h" |
30589
df6c41f16b40
Add header for AVI print functions; avoids many forward declarations.
diego
parents:
30505
diff
changeset
|
32 #include "aviprint.h" |
12164 | 33 #include "demuxer.h" |
34 #include "stheader.h" | |
19598 | 35 #include "m_option.h" |
32467 | 36 #include "sub/sub.h" |
12164 | 37 |
26069
1318e956c092
FFmpeg now uses different (unified) #include paths.
diego
parents:
26014
diff
changeset
|
38 #include "libavformat/avformat.h" |
27584 | 39 #include "libavformat/avio.h" |
26069
1318e956c092
FFmpeg now uses different (unified) #include paths.
diego
parents:
26014
diff
changeset
|
40 #include "libavutil/avutil.h" |
30458 | 41 #include "libavutil/avstring.h" |
33533 | 42 #include "libavutil/mathematics.h" |
26069
1318e956c092
FFmpeg now uses different (unified) #include paths.
diego
parents:
26014
diff
changeset
|
43 #include "libavcodec/opt.h" |
12164 | 44 |
26328
11aac031b4b7
Split the lavf taglists out of the lavf muxer to allow using libmpmux
albeu
parents:
26294
diff
changeset
|
45 #include "mp_taglists.h" |
11aac031b4b7
Split the lavf taglists out of the lavf muxer to allow using libmpmux
albeu
parents:
26294
diff
changeset
|
46 |
30904
c449f1667e78
Start probing with a size matching the stream buffer size so it is possible
reimar
parents:
30620
diff
changeset
|
47 #define INITIAL_PROBE_SIZE STREAM_BUFFER_SIZE |
c449f1667e78
Start probing with a size matching the stream buffer size so it is possible
reimar
parents:
30620
diff
changeset
|
48 #define SMALL_MAX_PROBE_SIZE (32 * 1024) |
30505
580319e640b3
Dynamically increase probe size for lavf demuxer up to 2 MB.
reimar
parents:
30458
diff
changeset
|
49 #define PROBE_BUF_SIZE (2*1024*1024) |
12164 | 50 |
19598 | 51 static unsigned int opt_probesize = 0; |
24635 | 52 static unsigned int opt_analyzeduration = 0; |
22150
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
53 static char *opt_format; |
24757 | 54 static char *opt_cryptokey; |
26696 | 55 static char *opt_avopt = NULL; |
19598 | 56 |
25241
bb7c65f2a289
Make m_option_t arrays referenced by cfg-common.h const
reimar
parents:
25117
diff
changeset
|
57 const m_option_t lavfdopts_conf[] = { |
19598 | 58 {"probesize", &(opt_probesize), CONF_TYPE_INT, CONF_RANGE, 32, INT_MAX, NULL}, |
22150
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
59 {"format", &(opt_format), CONF_TYPE_STRING, 0, 0, 0, NULL}, |
24635 | 60 {"analyzeduration", &(opt_analyzeduration), CONF_TYPE_INT, CONF_RANGE, 0, INT_MAX, NULL}, |
24757 | 61 {"cryptokey", &(opt_cryptokey), CONF_TYPE_STRING, 0, 0, 0, NULL}, |
26696 | 62 {"o", &opt_avopt, CONF_TYPE_STRING, 0, 0, 0, NULL}, |
19598 | 63 {NULL, NULL, 0, 0, 0, 0, NULL} |
64 }; | |
65 | |
25471
5075d5ff1da8
Get rid of URLProtocol mess (especially problematic since it made use
reimar
parents:
25241
diff
changeset
|
66 #define BIO_BUFFER_SIZE 32768 |
18775 | 67 |
31186 | 68 typedef struct lavf_priv { |
12164 | 69 AVInputFormat *avif; |
70 AVFormatContext *avfc; | |
25117
c6702b710b2c
Bring (de)muxer_lavf up to date with the libavformat API changes introduced by FFmpeg commit r11071.
iive
parents:
25092
diff
changeset
|
71 ByteIOContext *pb; |
30505
580319e640b3
Dynamically increase probe size for lavf demuxer up to 2 MB.
reimar
parents:
30458
diff
changeset
|
72 uint8_t buffer[BIO_BUFFER_SIZE]; |
12164 | 73 int audio_streams; |
74 int video_streams; | |
23758 | 75 int sub_streams; |
12168 | 76 int64_t last_pts; |
18762 | 77 int astreams[MAX_A_STREAMS]; |
21100
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
78 int vstreams[MAX_V_STREAMS]; |
23758 | 79 int sstreams[MAX_S_STREAMS]; |
24844 | 80 int cur_program; |
32353
a5ed4bcb1149
Handle libavformat adding additional streams during playback.
reimar
parents:
32111
diff
changeset
|
81 int nb_streams_last; |
12164 | 82 }lavf_priv_t; |
83 | |
25471
5075d5ff1da8
Get rid of URLProtocol mess (especially problematic since it made use
reimar
parents:
25241
diff
changeset
|
84 static int mp_read(void *opaque, uint8_t *buf, int size) { |
31161
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
85 demuxer_t *demuxer = opaque; |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
86 stream_t *stream = demuxer->stream; |
12165
6ae21c78ed8d
libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents:
12164
diff
changeset
|
87 int ret; |
6ae21c78ed8d
libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents:
12164
diff
changeset
|
88 |
6ae21c78ed8d
libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents:
12164
diff
changeset
|
89 ret=stream_read(stream, buf, size); |
12166 | 90 |
31260
9a748502953b
Also print current stream position in mp_read debug output.
reimar
parents:
31259
diff
changeset
|
91 mp_msg(MSGT_HEADER,MSGL_DBG2,"%d=mp_read(%p, %p, %d), pos: %"PRId64", eof:%d\n", |
9a748502953b
Also print current stream position in mp_read debug output.
reimar
parents:
31259
diff
changeset
|
92 ret, stream, buf, size, stream_tell(stream), stream->eof); |
12165
6ae21c78ed8d
libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents:
12164
diff
changeset
|
93 return ret; |
12164 | 94 } |
95 | |
27656 | 96 static int64_t mp_seek(void *opaque, int64_t pos, int whence) { |
31161
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
97 demuxer_t *demuxer = opaque; |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
98 stream_t *stream = demuxer->stream; |
27656 | 99 int64_t current_pos; |
30620 | 100 mp_msg(MSGT_HEADER,MSGL_DBG2,"mp_seek(%p, %"PRId64", %d)\n", stream, pos, whence); |
12164 | 101 if(whence == SEEK_CUR) |
102 pos +=stream_tell(stream); | |
24085
71d17c28f545
We can support SEEK_END seeks only when stream->end_pos is known
reimar
parents:
24084
diff
changeset
|
103 else if(whence == SEEK_END && stream->end_pos > 0) |
12164 | 104 pos += stream->end_pos; |
22440
ee6b8e74d727
when seeking consider stream->start_pos instead of 0 as initial position; patch by Zuxy Meng approved by Michael
nicodvb
parents:
22266
diff
changeset
|
105 else if(whence == SEEK_SET) |
ee6b8e74d727
when seeking consider stream->start_pos instead of 0 as initial position; patch by Zuxy Meng approved by Michael
nicodvb
parents:
22266
diff
changeset
|
106 pos += stream->start_pos; |
24084 | 107 else if(whence == AVSEEK_SIZE && stream->end_pos > 0) |
108 return stream->end_pos - stream->start_pos; | |
22440
ee6b8e74d727
when seeking consider stream->start_pos instead of 0 as initial position; patch by Zuxy Meng approved by Michael
nicodvb
parents:
22266
diff
changeset
|
109 else |
12164 | 110 return -1; |
111 | |
24082 | 112 if(pos<0) |
113 return -1; | |
27427
a54c51af6595
demux_lavf: fix mp_seek behavior in case of seeking error
aurel
parents:
27219
diff
changeset
|
114 current_pos = stream_tell(stream); |
a54c51af6595
demux_lavf: fix mp_seek behavior in case of seeking error
aurel
parents:
27219
diff
changeset
|
115 if(stream_seek(stream, pos)==0) { |
a54c51af6595
demux_lavf: fix mp_seek behavior in case of seeking error
aurel
parents:
27219
diff
changeset
|
116 stream_reset(stream); |
a54c51af6595
demux_lavf: fix mp_seek behavior in case of seeking error
aurel
parents:
27219
diff
changeset
|
117 stream_seek(stream, current_pos); |
12164 | 118 return -1; |
27427
a54c51af6595
demux_lavf: fix mp_seek behavior in case of seeking error
aurel
parents:
27219
diff
changeset
|
119 } |
12166 | 120 |
22440
ee6b8e74d727
when seeking consider stream->start_pos instead of 0 as initial position; patch by Zuxy Meng approved by Michael
nicodvb
parents:
22266
diff
changeset
|
121 return pos - stream->start_pos; |
12164 | 122 } |
123 | |
31161
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
124 static int64_t mp_read_seek(void *opaque, int stream_idx, int64_t ts, int flags) { |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
125 demuxer_t *demuxer = opaque; |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
126 stream_t *stream = demuxer->stream; |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
127 lavf_priv_t *priv = demuxer->priv; |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
128 AVStream *st = priv->avfc->streams[stream_idx]; |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
129 int ret; |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
130 double pts; |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
131 |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
132 pts = (double)ts * st->time_base.num / st->time_base.den; |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
133 ret = stream_control(stream, STREAM_CTRL_SEEK_TO_TIME, &pts); |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
134 if (ret < 0) |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
135 ret = AVERROR(ENOSYS); |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
136 return ret; |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
137 } |
0255b5679645
Add support for STREAM_CTRL_SEEK_TO_TIME in ffmpeg streams
hyc
parents:
31133
diff
changeset
|
138 |
22150
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
139 static void list_formats(void) { |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
140 AVInputFormat *fmt; |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
141 mp_msg(MSGT_DEMUX, MSGL_INFO, "Available lavf input formats:\n"); |
32766
f6c832aedcb1
Use av_iformat_next instead of first_iformat to conform with new FFmpeg API.
reimar
parents:
32765
diff
changeset
|
142 for (fmt = av_iformat_next(NULL); fmt; av_iformat_next(fmt)) |
22150
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
143 mp_msg(MSGT_DEMUX, MSGL_INFO, "%15s : %s\n", fmt->name, fmt->long_name); |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
144 } |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
145 |
16175 | 146 static int lavf_check_file(demuxer_t *demuxer){ |
12164 | 147 AVProbeData avpd; |
148 lavf_priv_t *priv; | |
30505
580319e640b3
Dynamically increase probe size for lavf demuxer up to 2 MB.
reimar
parents:
30458
diff
changeset
|
149 int probe_data_size = 0; |
580319e640b3
Dynamically increase probe size for lavf demuxer up to 2 MB.
reimar
parents:
30458
diff
changeset
|
150 int read_size = INITIAL_PROBE_SIZE; |
31068
ae2e8f0d4625
Use av_probe_input_format2 and avoid accepting detection
reimar
parents:
30905
diff
changeset
|
151 int score; |
25841 | 152 |
153 if(!demuxer->priv) | |
12164 | 154 demuxer->priv=calloc(sizeof(lavf_priv_t),1); |
155 priv= demuxer->priv; | |
156 | |
157 av_register_all(); | |
158 | |
22150
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
159 if (opt_format) { |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
160 if (strcmp(opt_format, "help") == 0) { |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
161 list_formats(); |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
162 return 0; |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
163 } |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
164 priv->avif= av_find_input_format(opt_format); |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
165 if (!priv->avif) { |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
166 mp_msg(MSGT_DEMUX,MSGL_FATAL,"Unknown lavf format %s\n", opt_format); |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
167 return 0; |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
168 } |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
169 mp_msg(MSGT_DEMUX,MSGL_INFO,"Forced lavf %s demuxer\n", priv->avif->long_name); |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
170 return DEMUXER_TYPE_LAVF; |
6d50b08a8bcd
Support selecting a specific lavf demuxer and listing available ones via -lavfdopts
reimar
parents:
22058
diff
changeset
|
171 } |
29295
25283dc2a86b
100l, do not read probe buffer if it will not be used because a format was forced.
reimar
parents:
29288
diff
changeset
|
172 |
30505
580319e640b3
Dynamically increase probe size for lavf demuxer up to 2 MB.
reimar
parents:
30458
diff
changeset
|
173 avpd.buf = av_mallocz(FFMAX(BIO_BUFFER_SIZE, PROBE_BUF_SIZE) + |
580319e640b3
Dynamically increase probe size for lavf demuxer up to 2 MB.
reimar
parents:
30458
diff
changeset
|
174 FF_INPUT_BUFFER_PADDING_SIZE); |
580319e640b3
Dynamically increase probe size for lavf demuxer up to 2 MB.
reimar
parents:
30458
diff
changeset
|
175 do { |
30905 | 176 read_size = stream_read(demuxer->stream, avpd.buf + probe_data_size, read_size); |
177 if(read_size < 0) { | |
178 av_free(avpd.buf); | |
179 return 0; | |
180 } | |
181 probe_data_size += read_size; | |
182 avpd.filename= demuxer->stream->url; | |
31521
7ae298e3ba15
Avoid a crash if stream->url is not set, but print a warning since this
reimar
parents:
31260
diff
changeset
|
183 if (!avpd.filename) { |
7ae298e3ba15
Avoid a crash if stream->url is not set, but print a warning since this
reimar
parents:
31260
diff
changeset
|
184 mp_msg(MSGT_DEMUX, MSGL_WARN, "Stream url is not set!\n"); |
7ae298e3ba15
Avoid a crash if stream->url is not set, but print a warning since this
reimar
parents:
31260
diff
changeset
|
185 avpd.filename = ""; |
7ae298e3ba15
Avoid a crash if stream->url is not set, but print a warning since this
reimar
parents:
31260
diff
changeset
|
186 } |
30905 | 187 if (!strncmp(avpd.filename, "ffmpeg://", 9)) |
188 avpd.filename += 9; | |
189 avpd.buf_size= probe_data_size; | |
29295
25283dc2a86b
100l, do not read probe buffer if it will not be used because a format was forced.
reimar
parents:
29288
diff
changeset
|
190 |
31068
ae2e8f0d4625
Use av_probe_input_format2 and avoid accepting detection
reimar
parents:
30905
diff
changeset
|
191 score = 0; |
ae2e8f0d4625
Use av_probe_input_format2 and avoid accepting detection
reimar
parents:
30905
diff
changeset
|
192 priv->avif= av_probe_input_format2(&avpd, probe_data_size > 0, &score); |
30905 | 193 read_size = FFMIN(2*read_size, PROBE_BUF_SIZE - probe_data_size); |
30904
c449f1667e78
Start probing with a size matching the stream buffer size so it is possible
reimar
parents:
30620
diff
changeset
|
194 } while ((demuxer->desc->type != DEMUXER_TYPE_LAVF_PREFERRED || |
c449f1667e78
Start probing with a size matching the stream buffer size so it is possible
reimar
parents:
30620
diff
changeset
|
195 probe_data_size < SMALL_MAX_PROBE_SIZE) && |
31069
d7c792ed942e
Continue probing even for score == AVPROBE_SCORE_MAX / 4 to match
reimar
parents:
31068
diff
changeset
|
196 score <= AVPROBE_SCORE_MAX / 4 && |
31068
ae2e8f0d4625
Use av_probe_input_format2 and avoid accepting detection
reimar
parents:
30905
diff
changeset
|
197 read_size > 0 && probe_data_size < PROBE_BUF_SIZE); |
30505
580319e640b3
Dynamically increase probe size for lavf demuxer up to 2 MB.
reimar
parents:
30458
diff
changeset
|
198 av_free(avpd.buf); |
580319e640b3
Dynamically increase probe size for lavf demuxer up to 2 MB.
reimar
parents:
30458
diff
changeset
|
199 |
12164 | 200 if(!priv->avif){ |
201 mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: no clue about this gibberish!\n"); | |
202 return 0; | |
203 }else | |
204 mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: %s\n", priv->avif->long_name); | |
205 | |
16175 | 206 return DEMUXER_TYPE_LAVF; |
12164 | 207 } |
22971
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
208 |
29296
8fa7fb4ae9ef
Add const where appropriate, also gets rid of a compiler warning.
reimar
parents:
29295
diff
changeset
|
209 static const char * const preferred_list[] = { |
22971
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
210 "dxa", |
29625
aaf67d00ae75
Sort preferred_list alphabetically since the order does not matter otherwise.
reimar
parents:
29622
diff
changeset
|
211 "flv", |
22971
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
212 "gxf", |
29625
aaf67d00ae75
Sort preferred_list alphabetically since the order does not matter otherwise.
reimar
parents:
29622
diff
changeset
|
213 "nut", |
aaf67d00ae75
Sort preferred_list alphabetically since the order does not matter otherwise.
reimar
parents:
29622
diff
changeset
|
214 "nuv", |
31812
88eef0d997e4
Update for libavformat matroska demuxer name change.
reimar
parents:
31643
diff
changeset
|
215 "matroska,webm", |
25846
f3ae700cc317
Prefer lavf mov demuxer over our own, it should work better most of the time now.
reimar
parents:
25843
diff
changeset
|
216 "mov,mp4,m4a,3gp,3g2,mj2", |
26423
38b8096cae32
Prefer libavformat musepack demuxer over internal one (which does not even support v8).
reimar
parents:
26328
diff
changeset
|
217 "mpc", |
38b8096cae32
Prefer libavformat musepack demuxer over internal one (which does not even support v8).
reimar
parents:
26328
diff
changeset
|
218 "mpc8", |
29625
aaf67d00ae75
Sort preferred_list alphabetically since the order does not matter otherwise.
reimar
parents:
29622
diff
changeset
|
219 "mxf", |
31168 | 220 "ogg", |
29625
aaf67d00ae75
Sort preferred_list alphabetically since the order does not matter otherwise.
reimar
parents:
29622
diff
changeset
|
221 "swf", |
29613
7386b883fba6
Add support for lavf vqf demuxer and lavc TwinVQ decoder.
vitor
parents:
29551
diff
changeset
|
222 "vqf", |
29626
2a2bc7ee5b81
Add w64 to list of preferred lavf formats (otherwise demux_audio incorrectly
reimar
parents:
29625
diff
changeset
|
223 "w64", |
29625
aaf67d00ae75
Sort preferred_list alphabetically since the order does not matter otherwise.
reimar
parents:
29622
diff
changeset
|
224 "wv", |
32611
3f043f0a4ac9
Prefer yuv4mpeg via libavformat, since that one supports multiple
reimar
parents:
32572
diff
changeset
|
225 "yuv4mpegpipe", |
22971
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
226 NULL |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
227 }; |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
228 |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
229 static int lavf_check_preferred_file(demuxer_t *demuxer){ |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
230 if (lavf_check_file(demuxer)) { |
29296
8fa7fb4ae9ef
Add const where appropriate, also gets rid of a compiler warning.
reimar
parents:
29295
diff
changeset
|
231 const char * const *p = preferred_list; |
22971
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
232 lavf_priv_t *priv = demuxer->priv; |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
233 while (*p) { |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
234 if (strcmp(*p, priv->avif->name) == 0) |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
235 return DEMUXER_TYPE_LAVF_PREFERRED; |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
236 p++; |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
237 } |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
238 } |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
239 return 0; |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
240 } |
25841 | 241 |
24757 | 242 static uint8_t char2int(char c) { |
243 if (c >= '0' && c <= '9') return c - '0'; | |
244 if (c >= 'a' && c <= 'f') return c - 'a' + 10; | |
245 if (c >= 'A' && c <= 'F') return c - 'A' + 10; | |
246 return 0; | |
247 } | |
248 | |
249 static void parse_cryptokey(AVFormatContext *avfc, const char *str) { | |
250 int len = strlen(str) / 2; | |
251 uint8_t *key = av_mallocz(len); | |
252 int i; | |
253 avfc->keylen = len; | |
254 avfc->key = key; | |
255 for (i = 0; i < len; i++, str += 2) | |
256 *key++ = (char2int(str[0]) << 4) | char2int(str[1]); | |
257 } | |
258 | |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
259 static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) { |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
260 lavf_priv_t *priv= demuxer->priv; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
261 AVStream *st= avfc->streams[i]; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
262 AVCodecContext *codec= st->codec; |
31075
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
263 char *stream_type = NULL; |
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
264 int stream_id; |
29344
fb8ad1c8b5d6
AVStream.language is deprecated, switch to av_get_metadata instead.
reimar
parents:
29343
diff
changeset
|
265 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0); |
31073
c35d122852da
add ID_..._NAME to -identify for each lavf stream which has a title
aurel
parents:
31072
diff
changeset
|
266 AVMetadataTag *title= av_metadata_get(st->metadata, "title", NULL, 0); |
29551
19fa7aedb519
Rename mp_wav_override_tag* as mp_codecid_override_tag* to reflect that
cehoyos
parents:
29548
diff
changeset
|
267 int g, override_tag = av_codec_get_tag(mp_codecid_override_taglists, |
19fa7aedb519
Rename mp_wav_override_tag* as mp_codecid_override_tag* to reflect that
cehoyos
parents:
29548
diff
changeset
|
268 codec->codec_id); |
29548
02a57b19fb92
Use mp_wav_override_taglists for both audio and video.
cehoyos
parents:
29455
diff
changeset
|
269 // For some formats (like PCM) always trust CODEC_ID_* more than codec_tag |
02a57b19fb92
Use mp_wav_override_taglists for both audio and video.
cehoyos
parents:
29455
diff
changeset
|
270 if (override_tag) |
02a57b19fb92
Use mp_wav_override_taglists for both audio and video.
cehoyos
parents:
29455
diff
changeset
|
271 codec->codec_tag = override_tag; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
272 |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
273 switch(codec->codec_type){ |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32766
diff
changeset
|
274 case AVMEDIA_TYPE_AUDIO:{ |
29343
28486169f9e0
Move allocation to avoid a possible memleak if new_sh_audio fails.
reimar
parents:
29342
diff
changeset
|
275 WAVEFORMATEX *wf; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
276 sh_audio_t* sh_audio; |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
31602
diff
changeset
|
277 sh_audio = new_sh_audio_aid(demuxer, i, priv->audio_streams, lang ? lang->value : NULL); |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
278 if(!sh_audio) |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
279 break; |
31075
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
280 stream_type = "audio"; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
281 priv->astreams[priv->audio_streams] = i; |
32111 | 282 wf= calloc(sizeof(*wf) + codec->extradata_size, 1); |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
283 // mp4a tag is used for all mp4 files no matter what they actually contain |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
284 if(codec->codec_tag == MKTAG('m', 'p', '4', 'a')) |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
285 codec->codec_tag= 0; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
286 if(!codec->codec_tag) |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
287 codec->codec_tag= av_codec_get_tag(mp_wav_taglists, codec->codec_id); |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
288 wf->wFormatTag= codec->codec_tag; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
289 wf->nChannels= codec->channels; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
290 wf->nSamplesPerSec= codec->sample_rate; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
291 wf->nAvgBytesPerSec= codec->bit_rate/8; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
292 wf->nBlockAlign= codec->block_align ? codec->block_align : 1; |
27516
3364aef9a988
Fix compilation after libavcodec major version 52 changes
uau
parents:
27493
diff
changeset
|
293 wf->wBitsPerSample= codec->bits_per_coded_sample; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
294 wf->cbSize= codec->extradata_size; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
295 if(codec->extradata_size) |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
296 memcpy(wf + 1, codec->extradata, codec->extradata_size); |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
297 sh_audio->wf= wf; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
298 sh_audio->audio.dwSampleSize= codec->block_align; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
299 if(codec->frame_size && codec->sample_rate){ |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
300 sh_audio->audio.dwScale=codec->frame_size; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
301 sh_audio->audio.dwRate= codec->sample_rate; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
302 }else{ |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
303 sh_audio->audio.dwScale= codec->block_align ? codec->block_align*8 : 8; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
304 sh_audio->audio.dwRate = codec->bit_rate; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
305 } |
28303 | 306 g= av_gcd(sh_audio->audio.dwScale, sh_audio->audio.dwRate); |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
307 sh_audio->audio.dwScale /= g; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
308 sh_audio->audio.dwRate /= g; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
309 // printf("sca:%d rat:%d fs:%d sr:%d ba:%d\n", sh_audio->audio.dwScale, sh_audio->audio.dwRate, codec->frame_size, codec->sample_rate, codec->block_align); |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
310 sh_audio->ds= demuxer->audio; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
311 sh_audio->format= codec->codec_tag; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
312 sh_audio->channels= codec->channels; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
313 sh_audio->samplerate= codec->sample_rate; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
314 sh_audio->i_bps= codec->bit_rate/8; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
315 switch (codec->codec_id) { |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
316 case CODEC_ID_PCM_S8: |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
317 case CODEC_ID_PCM_U8: |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
318 sh_audio->samplesize = 1; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
319 break; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
320 case CODEC_ID_PCM_S16LE: |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
321 case CODEC_ID_PCM_S16BE: |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
322 case CODEC_ID_PCM_U16LE: |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
323 case CODEC_ID_PCM_U16BE: |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
324 sh_audio->samplesize = 2; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
325 break; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
326 case CODEC_ID_PCM_ALAW: |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
327 sh_audio->format = 0x6; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
328 break; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
329 case CODEC_ID_PCM_MULAW: |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
330 sh_audio->format = 0x7; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
331 break; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
332 } |
31073
c35d122852da
add ID_..._NAME to -identify for each lavf stream which has a title
aurel
parents:
31072
diff
changeset
|
333 if (title && title->value) |
c35d122852da
add ID_..._NAME to -identify for each lavf stream which has a title
aurel
parents:
31072
diff
changeset
|
334 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_NAME=%s\n", priv->audio_streams, title->value); |
26269
65ad20416dd7
Support 'default' attribute for audio and subtitle tracks.
eugeni
parents:
26094
diff
changeset
|
335 if (st->disposition & AV_DISPOSITION_DEFAULT) |
65ad20416dd7
Support 'default' attribute for audio and subtitle tracks.
eugeni
parents:
26094
diff
changeset
|
336 sh_audio->default_track = 1; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
337 if(mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf, MSGL_V); |
32491
90206ba16fec
Set st->discard in the same way for audio and video, fixes -aid no
reimar
parents:
32467
diff
changeset
|
338 // select the first audio stream if auto-selection is requested |
90206ba16fec
Set st->discard in the same way for audio and video, fixes -aid no
reimar
parents:
32467
diff
changeset
|
339 if (demuxer->audio->id == -1) { |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
340 demuxer->audio->id = i; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
341 demuxer->audio->sh= demuxer->a_streams[i]; |
32491
90206ba16fec
Set st->discard in the same way for audio and video, fixes -aid no
reimar
parents:
32467
diff
changeset
|
342 } |
90206ba16fec
Set st->discard in the same way for audio and video, fixes -aid no
reimar
parents:
32467
diff
changeset
|
343 if (demuxer->audio->id != i) |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
344 st->discard= AVDISCARD_ALL; |
31075
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
345 stream_id = priv->audio_streams++; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
346 break; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
347 } |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32766
diff
changeset
|
348 case AVMEDIA_TYPE_VIDEO:{ |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
349 sh_video_t* sh_video; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
350 BITMAPINFOHEADER *bih; |
31074
84a83cc32f99
10l: correctly use video_stream instead of audio_stream in the video section
aurel
parents:
31073
diff
changeset
|
351 sh_video=new_sh_video_vid(demuxer, i, priv->video_streams); |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
352 if(!sh_video) break; |
31075
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
353 stream_type = "video"; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
354 priv->vstreams[priv->video_streams] = i; |
32111 | 355 bih=calloc(sizeof(*bih) + codec->extradata_size,1); |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
356 |
26294 | 357 if(codec->codec_id == CODEC_ID_RAWVIDEO) { |
358 switch (codec->pix_fmt) { | |
359 case PIX_FMT_RGB24: | |
360 codec->codec_tag= MKTAG(24, 'B', 'G', 'R'); | |
32572 | 361 case PIX_FMT_BGR24: |
362 codec->codec_tag= MKTAG(24, 'R', 'G', 'B'); | |
26294 | 363 } |
364 } | |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
365 if(!codec->codec_tag) |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
366 codec->codec_tag= av_codec_get_tag(mp_bmp_taglists, codec->codec_id); |
32111 | 367 bih->biSize= sizeof(*bih) + codec->extradata_size; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
368 bih->biWidth= codec->width; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
369 bih->biHeight= codec->height; |
27516
3364aef9a988
Fix compilation after libavcodec major version 52 changes
uau
parents:
27493
diff
changeset
|
370 bih->biBitCount= codec->bits_per_coded_sample; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
371 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount/8; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
372 bih->biCompression= codec->codec_tag; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
373 sh_video->bih= bih; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
374 sh_video->disp_w= codec->width; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
375 sh_video->disp_h= codec->height; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
376 if (st->time_base.den) { /* if container has time_base, use that */ |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
377 sh_video->video.dwRate= st->time_base.den; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
378 sh_video->video.dwScale= st->time_base.num; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
379 } else { |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
380 sh_video->video.dwRate= codec->time_base.den; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
381 sh_video->video.dwScale= codec->time_base.num; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
382 } |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
383 sh_video->fps=av_q2d(st->r_frame_rate); |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
384 sh_video->frametime=1/av_q2d(st->r_frame_rate); |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
385 sh_video->format=bih->biCompression; |
27447
d35a61df7122
use new lavf API to grab sample_aspect_ratio from the demuxers
aurel
parents:
27427
diff
changeset
|
386 if(st->sample_aspect_ratio.num) |
d35a61df7122
use new lavf API to grab sample_aspect_ratio from the demuxers
aurel
parents:
27427
diff
changeset
|
387 sh_video->aspect = codec->width * st->sample_aspect_ratio.num |
d35a61df7122
use new lavf API to grab sample_aspect_ratio from the demuxers
aurel
parents:
27427
diff
changeset
|
388 / (float)(codec->height * st->sample_aspect_ratio.den); |
d35a61df7122
use new lavf API to grab sample_aspect_ratio from the demuxers
aurel
parents:
27427
diff
changeset
|
389 else |
27448 | 390 sh_video->aspect=codec->width * codec->sample_aspect_ratio.num |
391 / (float)(codec->height * codec->sample_aspect_ratio.den); | |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
392 sh_video->i_bps=codec->bit_rate/8; |
31073
c35d122852da
add ID_..._NAME to -identify for each lavf stream which has a title
aurel
parents:
31072
diff
changeset
|
393 if (title && title->value) |
c35d122852da
add ID_..._NAME to -identify for each lavf stream which has a title
aurel
parents:
31072
diff
changeset
|
394 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_NAME=%s\n", priv->video_streams, title->value); |
25841 | 395 mp_msg(MSGT_DEMUX,MSGL_DBG2,"aspect= %d*%d/(%d*%d)\n", |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
396 codec->width, codec->sample_aspect_ratio.num, |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
397 codec->height, codec->sample_aspect_ratio.den); |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
398 |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
399 sh_video->ds= demuxer->video; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
400 if(codec->extradata_size) |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
401 memcpy(sh_video->bih + 1, codec->extradata, codec->extradata_size); |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
402 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_video_header(sh_video->bih, MSGL_V); |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
403 /* |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
404 short biPlanes; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
405 int biXPelsPerMeter; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
406 int biYPelsPerMeter; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
407 int biClrUsed; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
408 int biClrImportant; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
409 */ |
32491
90206ba16fec
Set st->discard in the same way for audio and video, fixes -aid no
reimar
parents:
32467
diff
changeset
|
410 // select the first video stream if auto-selection is requested |
90206ba16fec
Set st->discard in the same way for audio and video, fixes -aid no
reimar
parents:
32467
diff
changeset
|
411 if(demuxer->video->id == -1) { |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
412 demuxer->video->id = i; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
413 demuxer->video->sh= demuxer->v_streams[i]; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
414 } |
32491
90206ba16fec
Set st->discard in the same way for audio and video, fixes -aid no
reimar
parents:
32467
diff
changeset
|
415 if(demuxer->video->id != i) |
90206ba16fec
Set st->discard in the same way for audio and video, fixes -aid no
reimar
parents:
32467
diff
changeset
|
416 st->discard= AVDISCARD_ALL; |
31075
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
417 stream_id = priv->video_streams++; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
418 break; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
419 } |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32766
diff
changeset
|
420 case AVMEDIA_TYPE_SUBTITLE:{ |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
421 sh_sub_t* sh_sub; |
25659 | 422 char type; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
423 /* only support text subtitles for now */ |
25659 | 424 if(codec->codec_id == CODEC_ID_TEXT) |
425 type = 't'; | |
25879 | 426 else if(codec->codec_id == CODEC_ID_MOV_TEXT) |
427 type = 'm'; | |
25659 | 428 else if(codec->codec_id == CODEC_ID_SSA) |
429 type = 'a'; | |
25839
327e98d7d2be
Partially support vobsub subtitles from lavf demuxers (palette support missing)
reimar
parents:
25789
diff
changeset
|
430 else if(codec->codec_id == CODEC_ID_DVD_SUBTITLE) |
327e98d7d2be
Partially support vobsub subtitles from lavf demuxers (palette support missing)
reimar
parents:
25789
diff
changeset
|
431 type = 'v'; |
31628
f15df2e3081b
Add support for DVB and XSUB subtitles, not yet working properly.
reimar
parents:
31609
diff
changeset
|
432 else if(codec->codec_id == CODEC_ID_XSUB) |
f15df2e3081b
Add support for DVB and XSUB subtitles, not yet working properly.
reimar
parents:
31609
diff
changeset
|
433 type = 'x'; |
f15df2e3081b
Add support for DVB and XSUB subtitles, not yet working properly.
reimar
parents:
31609
diff
changeset
|
434 else if(codec->codec_id == CODEC_ID_DVB_SUBTITLE) |
f15df2e3081b
Add support for DVB and XSUB subtitles, not yet working properly.
reimar
parents:
31609
diff
changeset
|
435 type = 'b'; |
29807
fe38b68ae9f4
Allow demuxer lavf to export CODEC_ID_DVB_TELETEXT.
cehoyos
parents:
29805
diff
changeset
|
436 else if(codec->codec_id == CODEC_ID_DVB_TELETEXT) |
fe38b68ae9f4
Allow demuxer lavf to export CODEC_ID_DVB_TELETEXT.
cehoyos
parents:
29805
diff
changeset
|
437 type = 'd'; |
31599
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31588
diff
changeset
|
438 else if(codec->codec_id == CODEC_ID_HDMV_PGS_SUBTITLE) |
cafeb7863de8
Add support for PGS subtitle decoding via libavcodec.
reimar
parents:
31588
diff
changeset
|
439 type = 'p'; |
25659 | 440 else |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
441 break; |
31609
cd81fce1f010
Make the stream language an argument to the stream creation function
reimar
parents:
31602
diff
changeset
|
442 sh_sub = new_sh_sub_sid(demuxer, i, priv->sub_streams, lang ? lang->value : NULL); |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
443 if(!sh_sub) break; |
31080 | 444 stream_type = "subtitle"; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
445 priv->sstreams[priv->sub_streams] = i; |
25659 | 446 sh_sub->type = type; |
447 if (codec->extradata_size) { | |
448 sh_sub->extradata = malloc(codec->extradata_size); | |
449 memcpy(sh_sub->extradata, codec->extradata, codec->extradata_size); | |
450 sh_sub->extradata_len = codec->extradata_size; | |
451 } | |
31073
c35d122852da
add ID_..._NAME to -identify for each lavf stream which has a title
aurel
parents:
31072
diff
changeset
|
452 if (title && title->value) |
c35d122852da
add ID_..._NAME to -identify for each lavf stream which has a title
aurel
parents:
31072
diff
changeset
|
453 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", priv->sub_streams, title->value); |
26269
65ad20416dd7
Support 'default' attribute for audio and subtitle tracks.
eugeni
parents:
26094
diff
changeset
|
454 if (st->disposition & AV_DISPOSITION_DEFAULT) |
65ad20416dd7
Support 'default' attribute for audio and subtitle tracks.
eugeni
parents:
26094
diff
changeset
|
455 sh_sub->default_track = 1; |
31075
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
456 stream_id = priv->sub_streams++; |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
457 break; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
458 } |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32766
diff
changeset
|
459 case AVMEDIA_TYPE_ATTACHMENT:{ |
33190 | 460 if (st->codec->codec_id == CODEC_ID_TTF) { |
461 AVMetadataTag *fnametag = av_metadata_get(st->metadata, "filename", NULL, 0); | |
462 demuxer_add_attachment(demuxer, fnametag ? fnametag->value : NULL, | |
25900 | 463 "application/x-truetype-font", |
464 codec->extradata, codec->extradata_size); | |
33190 | 465 } |
25900 | 466 break; |
467 } | |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
468 default: |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
469 st->discard= AVDISCARD_ALL; |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
470 } |
31075
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
471 if (stream_type) { |
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
472 AVCodec *avc = avcodec_find_decoder(codec->codec_id); |
31925
616375aefdda
Print subtitle type also for internally-supported types with a libavcodec decoder.
reimar
parents:
31812
diff
changeset
|
473 const char *codec_name = avc ? avc->name : "unknown"; |
33576
c97ec47d1bbb
Fix printing of subtitle type, the wrong index was used to lookup the type.
reimar
parents:
33533
diff
changeset
|
474 if (!avc && *stream_type == 's' && demuxer->s_streams[i]) |
c97ec47d1bbb
Fix printing of subtitle type, the wrong index was used to lookup the type.
reimar
parents:
33533
diff
changeset
|
475 codec_name = sh_sub_type2str(((sh_sub_t *)demuxer->s_streams[i])->type); |
31925
616375aefdda
Print subtitle type also for internally-supported types with a libavcodec decoder.
reimar
parents:
31812
diff
changeset
|
476 mp_msg(MSGT_DEMUX, MSGL_INFO, "[lavf] stream %d: %s (%s), -%cid %d", i, stream_type, codec_name, *stream_type, stream_id); |
31075
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
477 if (lang && lang->value && *stream_type != 'v') |
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
478 mp_msg(MSGT_DEMUX, MSGL_INFO, ", -%clang %s", *stream_type, lang->value); |
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
479 if (title && title->value) |
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
480 mp_msg(MSGT_DEMUX, MSGL_INFO, ", %s", title->value); |
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
481 mp_msg(MSGT_DEMUX, MSGL_INFO, "\n"); |
a259f3d8694d
print a more detailed and more useful description of each stream with lavf
aurel
parents:
31074
diff
changeset
|
482 } |
24842
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
483 } |
d5f716b49cb4
moved to a new function handle_stream() the code to parse the streams and assign the demuxer_streams
nicodvb
parents:
24764
diff
changeset
|
484 |
16175 | 485 static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ |
12164 | 486 AVFormatContext *avfc; |
487 AVFormatParameters ap; | |
24633 | 488 const AVOption *opt; |
29455 | 489 AVMetadataTag *t = NULL; |
12164 | 490 lavf_priv_t *priv= demuxer->priv; |
24868 | 491 int i; |
12164 | 492 char mp_filename[256]="mp:"; |
493 | |
494 memset(&ap, 0, sizeof(AVFormatParameters)); | |
495 | |
496 stream_seek(demuxer->stream, 0); | |
497 | |
29917 | 498 avfc = avformat_alloc_context(); |
21548 | 499 |
24757 | 500 if (opt_cryptokey) |
501 parse_cryptokey(avfc, opt_cryptokey); | |
25919
382672c7480a
Allow demuxers to choose a default value for correct_pts
reimar
parents:
25900
diff
changeset
|
502 if (user_correct_pts != 0) |
21548 | 503 avfc->flags |= AVFMT_FLAG_GENPTS; |
21568 | 504 if (index_mode == 0) |
505 avfc->flags |= AVFMT_FLAG_IGNIDX; | |
21548 | 506 |
19598 | 507 ap.prealloced_context = 1; |
508 if(opt_probesize) { | |
24634 | 509 opt = av_set_int(avfc, "probesize", opt_probesize); |
510 if(!opt) mp_msg(MSGT_HEADER,MSGL_ERR, "demux_lavf, couldn't set option probesize to %u\n", opt_probesize); | |
19598 | 511 } |
24635 | 512 if(opt_analyzeduration) { |
513 opt = av_set_int(avfc, "analyzeduration", opt_analyzeduration * AV_TIME_BASE); | |
514 if(!opt) mp_msg(MSGT_HEADER,MSGL_ERR, "demux_lavf, couldn't set option analyzeduration to %u\n", opt_analyzeduration); | |
515 } | |
19598 | 516 |
26696 | 517 if(opt_avopt){ |
518 if(parse_avopts(avfc, opt_avopt) < 0){ | |
519 mp_msg(MSGT_HEADER,MSGL_ERR, "Your options /%s/ look like gibberish to me pal\n", opt_avopt); | |
520 return NULL; | |
521 } | |
522 } | |
523 | |
30456
0eee9d2e7a1d
Add support for FFmpeg's rtsp dummy URL-with-pseudo-demuxer scheme.
reimar
parents:
30092
diff
changeset
|
524 if(demuxer->stream->url) { |
0eee9d2e7a1d
Add support for FFmpeg's rtsp dummy URL-with-pseudo-demuxer scheme.
reimar
parents:
30092
diff
changeset
|
525 if (!strncmp(demuxer->stream->url, "ffmpeg://rtsp:", 14)) |
30458 | 526 av_strlcpy(mp_filename, demuxer->stream->url + 9, sizeof(mp_filename)); |
30456
0eee9d2e7a1d
Add support for FFmpeg's rtsp dummy URL-with-pseudo-demuxer scheme.
reimar
parents:
30092
diff
changeset
|
527 else |
30458 | 528 av_strlcat(mp_filename, demuxer->stream->url, sizeof(mp_filename)); |
30456
0eee9d2e7a1d
Add support for FFmpeg's rtsp dummy URL-with-pseudo-demuxer scheme.
reimar
parents:
30092
diff
changeset
|
529 } else |
30458 | 530 av_strlcat(mp_filename, "foobar.dummy", sizeof(mp_filename)); |
25841 | 531 |
33607
a761fc66ddc7
Do not set priv->pb for AVFMT_NOFILE formats, this now causes FFmpeg to error out.
reimar
parents:
33576
diff
changeset
|
532 if (!(priv->avif->flags & AVFMT_NOFILE)) { |
33608 | 533 priv->pb = av_alloc_put_byte(priv->buffer, BIO_BUFFER_SIZE, 0, |
534 demuxer, mp_read, NULL, mp_seek); | |
535 priv->pb->read_seek = mp_read_seek; | |
536 priv->pb->is_streamed = !demuxer->stream->end_pos || (demuxer->stream->flags & MP_STREAM_SEEK) != MP_STREAM_SEEK; | |
33607
a761fc66ddc7
Do not set priv->pb for AVFMT_NOFILE formats, this now causes FFmpeg to error out.
reimar
parents:
33576
diff
changeset
|
537 } |
25841 | 538 |
25117
c6702b710b2c
Bring (de)muxer_lavf up to date with the libavformat API changes introduced by FFmpeg commit r11071.
iive
parents:
25092
diff
changeset
|
539 if(av_open_input_stream(&avfc, priv->pb, mp_filename, priv->avif, &ap)<0){ |
12164 | 540 mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_open_input_stream() failed\n"); |
16175 | 541 return NULL; |
12164 | 542 } |
543 | |
544 priv->avfc= avfc; | |
545 | |
546 if(av_find_stream_info(avfc) < 0){ | |
547 mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_find_stream_info() failed\n"); | |
16175 | 548 return NULL; |
12164 | 549 } |
550 | |
29455 | 551 /* Add metadata. */ |
552 while((t = av_metadata_get(avfc->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) | |
553 demux_info_add(demuxer, t->key, t->value); | |
12164 | 554 |
27058 | 555 for(i=0; i < avfc->nb_chapters; i++) { |
556 AVChapter *c = avfc->chapters[i]; | |
557 uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000}); | |
558 uint64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,1000}); | |
29455 | 559 t = av_metadata_get(c->metadata, "title", NULL, 0); |
560 demuxer_add_chapter(demuxer, t ? t->value : NULL, start, end); | |
27058 | 561 } |
562 | |
29615
70404a7bebaf
Always register all streams from libavformat, not just those belonging to a program.
reimar
parents:
29613
diff
changeset
|
563 for(i=0; i<avfc->nb_streams; i++) |
70404a7bebaf
Always register all streams from libavformat, not just those belonging to a program.
reimar
parents:
29613
diff
changeset
|
564 handle_stream(demuxer, avfc, i); |
32353
a5ed4bcb1149
Handle libavformat adding additional streams during playback.
reimar
parents:
32111
diff
changeset
|
565 priv->nb_streams_last = avfc->nb_streams; |
a5ed4bcb1149
Handle libavformat adding additional streams during playback.
reimar
parents:
32111
diff
changeset
|
566 |
24844 | 567 if(avfc->nb_programs) { |
29805
b9350576d4fc
Remove pointless and broken (e.g. does not set aid and vid) -tsprog handling
reimar
parents:
29803
diff
changeset
|
568 int p; |
b9350576d4fc
Remove pointless and broken (e.g. does not set aid and vid) -tsprog handling
reimar
parents:
29803
diff
changeset
|
569 for (p = 0; p < avfc->nb_programs; p++) { |
24844 | 570 AVProgram *program = avfc->programs[p]; |
29455 | 571 t = av_metadata_get(program->metadata, "title", NULL, 0); |
572 mp_msg(MSGT_HEADER,MSGL_INFO,"LAVF: Program %d %s\n", program->id, t ? t->value : ""); | |
32492
5fc287bf541a
Print PROGRAM_ID -identify output similar to demux_ts
reimar
parents:
32491
diff
changeset
|
573 mp_msg(MSGT_IDENTIFY, MSGL_V, "PROGRAM_ID=%d\n", program->id); |
29805
b9350576d4fc
Remove pointless and broken (e.g. does not set aid and vid) -tsprog handling
reimar
parents:
29803
diff
changeset
|
574 } |
29615
70404a7bebaf
Always register all streams from libavformat, not just those belonging to a program.
reimar
parents:
29613
diff
changeset
|
575 } |
25841 | 576 |
12164 | 577 mp_msg(MSGT_HEADER,MSGL_V,"LAVF: %d audio and %d video streams found\n",priv->audio_streams,priv->video_streams); |
13749 | 578 mp_msg(MSGT_HEADER,MSGL_V,"LAVF: build %d\n", LIBAVFORMAT_BUILD); |
12164 | 579 if(!priv->audio_streams) demuxer->audio->id=-2; // nosound |
580 // else if(best_audio > 0 && demuxer->audio->id == -1) demuxer->audio->id=best_audio; | |
581 if(!priv->video_streams){ | |
582 if(!priv->audio_streams){ | |
583 mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF: no audio or video headers found - broken file?\n"); | |
25841 | 584 return NULL; |
12164 | 585 } |
586 demuxer->video->id=-2; // audio-only | |
587 } //else if (best_video > 0 && demuxer->video->id == -1) demuxer->video->id = best_video; | |
588 | |
16175 | 589 return demuxer; |
12164 | 590 } |
591 | |
16175 | 592 static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds){ |
12164 | 593 lavf_priv_t *priv= demux->priv; |
594 AVPacket pkt; | |
595 demux_packet_t *dp; | |
596 demux_stream_t *ds; | |
597 int id; | |
598 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_lavf_fill_buffer()\n"); | |
599 | |
600 demux->filepos=stream_tell(demux->stream); | |
601 | |
602 if(av_read_frame(priv->avfc, &pkt) < 0) | |
603 return 0; | |
25841 | 604 |
32353
a5ed4bcb1149
Handle libavformat adding additional streams during playback.
reimar
parents:
32111
diff
changeset
|
605 // handle any new streams that might have been added |
a5ed4bcb1149
Handle libavformat adding additional streams during playback.
reimar
parents:
32111
diff
changeset
|
606 for (id = priv->nb_streams_last; id < priv->avfc->nb_streams; id++) |
a5ed4bcb1149
Handle libavformat adding additional streams during playback.
reimar
parents:
32111
diff
changeset
|
607 handle_stream(demux, priv->avfc, id); |
a5ed4bcb1149
Handle libavformat adding additional streams during playback.
reimar
parents:
32111
diff
changeset
|
608 priv->nb_streams_last = priv->avfc->nb_streams; |
a5ed4bcb1149
Handle libavformat adding additional streams during playback.
reimar
parents:
32111
diff
changeset
|
609 |
12164 | 610 id= pkt.stream_index; |
611 | |
612 if(id==demux->audio->id){ | |
613 // audio | |
614 ds=demux->audio; | |
615 if(!ds->sh){ | |
616 ds->sh=demux->a_streams[id]; | |
617 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected LAVF audio ID = %d\n",ds->id); | |
618 } | |
619 } else if(id==demux->video->id){ | |
620 // video | |
621 ds=demux->video; | |
622 if(!ds->sh){ | |
623 ds->sh=demux->v_streams[id]; | |
624 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected LAVF video ID = %d\n",ds->id); | |
625 } | |
23758 | 626 } else if(id==demux->sub->id){ |
627 // subtitle | |
628 ds=demux->sub; | |
629 sub_utf8=1; | |
14611 | 630 } else { |
631 av_free_packet(&pkt); | |
632 return 1; | |
633 } | |
25841 | 634 |
31588 | 635 if(pkt.destruct == av_destruct_packet && !CONFIG_MEMALIGN_HACK){ |
31643
33be6a8f9197
Avoid incorrectly duplicating initialization code in new_demux_packet,
reimar
parents:
31628
diff
changeset
|
636 dp=new_demux_packet(0); |
12164 | 637 dp->len=pkt.size; |
638 dp->buffer=pkt.data; | |
639 pkt.destruct= NULL; | |
640 }else{ | |
641 dp=new_demux_packet(pkt.size); | |
642 memcpy(dp->buffer, pkt.data, pkt.size); | |
643 av_free_packet(&pkt); | |
644 } | |
645 | |
13747 | 646 if(pkt.pts != AV_NOPTS_VALUE){ |
15308 | 647 dp->pts=pkt.pts * av_q2d(priv->avfc->streams[id]->time_base); |
648 priv->last_pts= dp->pts * AV_TIME_BASE; | |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32766
diff
changeset
|
649 // always set endpts for subtitles, even if AV_PKT_FLAG_KEY is not set, |
31950
77b4e83fe42d
Always use convergence_duration for subtitles otherwise
reimar
parents:
31925
diff
changeset
|
650 // otherwise they will stay on screen to long if e.g. ASS is demuxed from mkv |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32766
diff
changeset
|
651 if((ds == demux->sub || (pkt.flags & AV_PKT_FLAG_KEY)) && |
31950
77b4e83fe42d
Always use convergence_duration for subtitles otherwise
reimar
parents:
31925
diff
changeset
|
652 pkt.convergence_duration > 0) |
27493
a126c38cb1c7
lavf: the subtitles display duration is stored in pkt.convergence_duration
aurel
parents:
27452
diff
changeset
|
653 dp->endpts = dp->pts + pkt.convergence_duration * av_q2d(priv->avfc->streams[id]->time_base); |
13747 | 654 } |
12164 | 655 dp->pos=demux->filepos; |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32766
diff
changeset
|
656 dp->flags= !!(pkt.flags&AV_PKT_FLAG_KEY); |
12164 | 657 // append packet to DS stream: |
658 ds_add_packet(ds,dp); | |
659 return 1; | |
660 } | |
661 | |
17636 | 662 static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags){ |
12168 | 663 lavf_priv_t *priv = demuxer->priv; |
20070 | 664 int avsflags = 0; |
17636 | 665 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_seek_lavf(%p, %f, %f, %d)\n", demuxer, rel_seek_secs, audio_delay, flags); |
19073
8b52dad54b1d
Remove #if LIBAVCODEC_BUILD >= XXX and #if LIBAVFORMAT_BUILD >= XXX jungle.
diego
parents:
19062
diff
changeset
|
666 |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25879
diff
changeset
|
667 if (flags & SEEK_ABSOLUTE) { |
33236
889bde9a7c11
Improve seeking for files where start_time is not (properly) set.
reimar
parents:
33190
diff
changeset
|
668 priv->last_pts = priv->avfc->start_time != AV_NOPTS_VALUE ? |
889bde9a7c11
Improve seeking for files where start_time is not (properly) set.
reimar
parents:
33190
diff
changeset
|
669 priv->avfc->start_time : 0; |
25843 | 670 } else { |
25842
f8fe66772c3a
Used wrong condition for using AVSEEK_FLAG_BACKWARD, it should depend on
reimar
parents:
25841
diff
changeset
|
671 if (rel_seek_secs < 0) avsflags = AVSEEK_FLAG_BACKWARD; |
f8fe66772c3a
Used wrong condition for using AVSEEK_FLAG_BACKWARD, it should depend on
reimar
parents:
25841
diff
changeset
|
672 } |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25879
diff
changeset
|
673 if (flags & SEEK_FACTOR) { |
20070 | 674 if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE) |
675 return; | |
676 priv->last_pts += rel_seek_secs * priv->avfc->duration; | |
677 } else { | |
678 priv->last_pts += rel_seek_secs * AV_TIME_BASE; | |
679 } | |
29699
3819fcdeaaf8
lavf: if seeking in the desired direction failed, also try in the opposite one,
reimar
parents:
29626
diff
changeset
|
680 if (av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags) < 0) { |
3819fcdeaaf8
lavf: if seeking in the desired direction failed, also try in the opposite one,
reimar
parents:
29626
diff
changeset
|
681 avsflags ^= AVSEEK_FLAG_BACKWARD; |
3819fcdeaaf8
lavf: if seeking in the desired direction failed, also try in the opposite one,
reimar
parents:
29626
diff
changeset
|
682 av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags); |
3819fcdeaaf8
lavf: if seeking in the desired direction failed, also try in the opposite one,
reimar
parents:
29626
diff
changeset
|
683 } |
12164 | 684 } |
685 | |
16175 | 686 static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg) |
12164 | 687 { |
688 lavf_priv_t *priv = demuxer->priv; | |
25841 | 689 |
12164 | 690 switch (cmd) { |
30091
1368993fb7a9
Revert r30100: It breaks some mov and asf samples.
cehoyos
parents:
30058
diff
changeset
|
691 case DEMUXER_CTRL_CORRECT_PTS: |
1368993fb7a9
Revert r30100: It breaks some mov and asf samples.
cehoyos
parents:
30058
diff
changeset
|
692 return DEMUXER_CTRL_OK; |
12168 | 693 case DEMUXER_CTRL_GET_TIME_LENGTH: |
19207
c636a4e9565a
Do not treat AV_NOPTS_VALUE as a valid duration value.
reimar
parents:
19160
diff
changeset
|
694 if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE) |
12164 | 695 return DEMUXER_CTRL_DONTKNOW; |
25841 | 696 |
16346
6ff303d2876b
Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents:
16175
diff
changeset
|
697 *((double *)arg) = (double)priv->avfc->duration / AV_TIME_BASE; |
12164 | 698 return DEMUXER_CTRL_OK; |
699 | |
700 case DEMUXER_CTRL_GET_PERCENT_POS: | |
19207
c636a4e9565a
Do not treat AV_NOPTS_VALUE as a valid duration value.
reimar
parents:
19160
diff
changeset
|
701 if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE) |
12164 | 702 return DEMUXER_CTRL_DONTKNOW; |
25841 | 703 |
19160
ccb42ce33c23
Take start time into consideration when calculation percentage position
reimar
parents:
19073
diff
changeset
|
704 *((int *)arg) = (int)((priv->last_pts - priv->avfc->start_time)*100 / priv->avfc->duration); |
12168 | 705 return DEMUXER_CTRL_OK; |
18762 | 706 case DEMUXER_CTRL_SWITCH_AUDIO: |
21100
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
707 case DEMUXER_CTRL_SWITCH_VIDEO: |
18762 | 708 { |
709 int id = *((int*)arg); | |
710 int newid = -2; | |
26094 | 711 int i, curridx = -1; |
21100
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
712 int nstreams, *pstreams; |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
713 demux_stream_t *ds; |
18762 | 714 |
21100
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
715 if(cmd == DEMUXER_CTRL_SWITCH_VIDEO) |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
716 { |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
717 ds = demuxer->video; |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
718 nstreams = priv->video_streams; |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
719 pstreams = priv->vstreams; |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
720 } |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
721 else |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
722 { |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
723 ds = demuxer->audio; |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
724 nstreams = priv->audio_streams; |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
725 pstreams = priv->astreams; |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
726 } |
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
727 for(i = 0; i < nstreams; i++) |
18762 | 728 { |
21100
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
729 if(pstreams[i] == ds->id) //current stream id |
18762 | 730 { |
731 curridx = i; | |
732 break; | |
733 } | |
734 } | |
735 | |
26094 | 736 if(id == -2) { // no sound |
737 i = -1; | |
738 } else if(id == -1) { // next track | |
739 i = (curridx + 2) % (nstreams + 1) - 1; | |
740 if (i >= 0) | |
741 newid = pstreams[i]; | |
18762 | 742 } |
26094 | 743 else // select track by id |
18762 | 744 { |
31072
b8cccda750cf
uniformize handling of aid and vid with lavf so that it matches handling of sid
aurel
parents:
31069
diff
changeset
|
745 if (id >= 0 && id < nstreams) { |
b8cccda750cf
uniformize handling of aid and vid with lavf so that it matches handling of sid
aurel
parents:
31069
diff
changeset
|
746 i = id; |
b8cccda750cf
uniformize handling of aid and vid with lavf so that it matches handling of sid
aurel
parents:
31069
diff
changeset
|
747 newid = pstreams[i]; |
18762 | 748 } |
749 } | |
24843
2bd6d730782f
permit the transititions no stream <-> some streams and viceversa (needed for forthcoming program switching patch)
nicodvb
parents:
24842
diff
changeset
|
750 if(i == curridx) |
18762 | 751 return DEMUXER_CTRL_NOTIMPL; |
752 else | |
753 { | |
21100
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
754 ds_free_packs(ds); |
24843
2bd6d730782f
permit the transititions no stream <-> some streams and viceversa (needed for forthcoming program switching patch)
nicodvb
parents:
24842
diff
changeset
|
755 if(ds->id >= 0) |
24848 | 756 priv->avfc->streams[ds->id]->discard = AVDISCARD_ALL; |
21100
6bc989360c8b
check we aren't short of sh_videos before allocating another one
nicodvb
parents:
20990
diff
changeset
|
757 *((int*)arg) = ds->id = newid; |
24843
2bd6d730782f
permit the transititions no stream <-> some streams and viceversa (needed for forthcoming program switching patch)
nicodvb
parents:
24842
diff
changeset
|
758 if(newid >= 0) |
24848 | 759 priv->avfc->streams[newid]->discard = AVDISCARD_NONE; |
18762 | 760 return DEMUXER_CTRL_OK; |
761 } | |
762 } | |
24845
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
763 case DEMUXER_CTRL_IDENTIFY_PROGRAM: |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
764 { |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
765 demux_program_t *prog = arg; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
766 AVProgram *program; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
767 int p, i; |
29618 | 768 int start; |
24845
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
769 |
29803
3b42ce7b09cf
Remove an empty program if the one requested by IDENTIFY_PROGRAM does not exist
reimar
parents:
29699
diff
changeset
|
770 prog->vid = prog->aid = prog->sid = -2; //no audio and no video by default |
3b42ce7b09cf
Remove an empty program if the one requested by IDENTIFY_PROGRAM does not exist
reimar
parents:
29699
diff
changeset
|
771 if(priv->avfc->nb_programs < 1) |
3b42ce7b09cf
Remove an empty program if the one requested by IDENTIFY_PROGRAM does not exist
reimar
parents:
29699
diff
changeset
|
772 return DEMUXER_CTRL_DONTKNOW; |
24845
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
773 |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
774 if(prog->progid == -1) |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
775 { |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
776 p = 0; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
777 while(p<priv->avfc->nb_programs && priv->avfc->programs[p]->id != priv->cur_program) |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
778 p++; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
779 p = (p + 1) % priv->avfc->nb_programs; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
780 } |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
781 else |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
782 { |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
783 for(i=0; i<priv->avfc->nb_programs; i++) |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
784 if(priv->avfc->programs[i]->id == prog->progid) |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
785 break; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
786 if(i==priv->avfc->nb_programs) |
29803
3b42ce7b09cf
Remove an empty program if the one requested by IDENTIFY_PROGRAM does not exist
reimar
parents:
29699
diff
changeset
|
787 return DEMUXER_CTRL_DONTKNOW; |
24845
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
788 p = i; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
789 } |
29618 | 790 start = p; |
24845
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
791 redo: |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
792 program = priv->avfc->programs[p]; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
793 for(i=0; i<program->nb_stream_indexes; i++) |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
794 { |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
795 switch(priv->avfc->streams[program->stream_index[i]]->codec->codec_type) |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
796 { |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32766
diff
changeset
|
797 case AVMEDIA_TYPE_VIDEO: |
24845
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
798 if(prog->vid == -2) |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
799 prog->vid = program->stream_index[i]; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
800 break; |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32766
diff
changeset
|
801 case AVMEDIA_TYPE_AUDIO: |
24845
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
802 if(prog->aid == -2) |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
803 prog->aid = program->stream_index[i]; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
804 break; |
32768
3544ba7244bf
Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents:
32766
diff
changeset
|
805 case AVMEDIA_TYPE_SUBTITLE: |
24845
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
806 if(prog->sid == -2 && priv->avfc->streams[program->stream_index[i]]->codec->codec_id == CODEC_ID_TEXT) |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
807 prog->sid = program->stream_index[i]; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
808 break; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
809 } |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
810 } |
32493 | 811 if (prog->aid >= 0 && prog->aid < MAX_A_STREAMS && |
812 demuxer->a_streams[prog->aid]) { | |
813 sh_audio_t *sh = demuxer->a_streams[prog->aid]; | |
814 prog->aid = sh->aid; | |
815 } else | |
816 prog->aid = -2; | |
817 if (prog->vid >= 0 && prog->vid < MAX_V_STREAMS && | |
818 demuxer->v_streams[prog->vid]) { | |
819 sh_video_t *sh = demuxer->v_streams[prog->vid]; | |
820 prog->vid = sh->vid; | |
821 } else | |
822 prog->vid = -2; | |
24845
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
823 if(prog->progid == -1 && prog->vid == -2 && prog->aid == -2) |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
824 { |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
825 p = (p + 1) % priv->avfc->nb_programs; |
29618 | 826 if (p == start) |
827 return DEMUXER_CTRL_DONTKNOW; | |
24845
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
828 goto redo; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
829 } |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
830 priv->cur_program = prog->progid = program->id; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
831 return DEMUXER_CTRL_OK; |
3dacff6ae67c
implemented DEMUXER_CTRL_IDENTIFY_PROGRAM to permit program switching
nicodvb
parents:
24844
diff
changeset
|
832 } |
12164 | 833 default: |
834 return DEMUXER_CTRL_NOTIMPL; | |
835 } | |
836 } | |
837 | |
16175 | 838 static void demux_close_lavf(demuxer_t *demuxer) |
12164 | 839 { |
840 lavf_priv_t* priv = demuxer->priv; | |
841 if (priv){ | |
12304
434242b0706c
fix possible segfault on lavf demuxer patch by (adland <adland123 at yahoo dot com>)
michael
parents:
12168
diff
changeset
|
842 if(priv->avfc) |
33608 | 843 { |
24757 | 844 av_freep(&priv->avfc->key); |
25471
5075d5ff1da8
Get rid of URLProtocol mess (especially problematic since it made use
reimar
parents:
25241
diff
changeset
|
845 av_close_input_stream(priv->avfc); |
12304
434242b0706c
fix possible segfault on lavf demuxer patch by (adland <adland123 at yahoo dot com>)
michael
parents:
12168
diff
changeset
|
846 } |
25471
5075d5ff1da8
Get rid of URLProtocol mess (especially problematic since it made use
reimar
parents:
25241
diff
changeset
|
847 av_freep(&priv->pb); |
12164 | 848 free(priv); demuxer->priv= NULL; |
849 } | |
850 } | |
851 | |
16175 | 852 |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
25659
diff
changeset
|
853 const demuxer_desc_t demuxer_desc_lavf = { |
16175 | 854 "libavformat demuxer", |
855 "lavf", | |
856 "libavformat", | |
857 "Michael Niedermayer", | |
858 "supports many formats, requires libavformat", | |
859 DEMUXER_TYPE_LAVF, | |
860 0, // Check after other demuxer | |
861 lavf_check_file, | |
862 demux_lavf_fill_buffer, | |
863 demux_open_lavf, | |
864 demux_close_lavf, | |
865 demux_seek_lavf, | |
866 demux_lavf_control | |
867 }; | |
868 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
25659
diff
changeset
|
869 const demuxer_desc_t demuxer_desc_lavf_preferred = { |
22971
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
870 "libavformat preferred demuxer", |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
871 "lavfpref", |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
872 "libavformat", |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
873 "Michael Niedermayer", |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
874 "supports many formats, requires libavformat", |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
875 DEMUXER_TYPE_LAVF_PREFERRED, |
24354
ae226b882283
Mark lavfpref demuxer as safe, so it that it is actually used for e.g.
reimar
parents:
24085
diff
changeset
|
876 1, |
22971
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
877 lavf_check_preferred_file, |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
878 demux_lavf_fill_buffer, |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
879 demux_open_lavf, |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
880 demux_close_lavf, |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
881 demux_seek_lavf, |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
882 demux_lavf_control |
a1b2fbb000fc
Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents:
22918
diff
changeset
|
883 }; |