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