aboutsummaryrefslogtreecommitdiffstats
path: root/src/decoder/ffmpeg_decoder_plugin.c
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2010-01-18 10:57:57 +0100
committerMax Kellermann <max@duempel.org>2010-01-18 11:06:04 +0100
commit5477c31160b38d4304159a8521e93b68d047e186 (patch)
treea8cf8d24987d97764167472777799e7125a50482 /src/decoder/ffmpeg_decoder_plugin.c
parentacd3f8cd91f979c0961218a154c3cd4a9e3acf6c (diff)
downloadmpd-5477c31160b38d4304159a8521e93b68d047e186.tar.gz
mpd-5477c31160b38d4304159a8521e93b68d047e186.tar.xz
mpd-5477c31160b38d4304159a8521e93b68d047e186.zip
decoder/ffmpeg: optimized the stream_tag() method
Don't use the function ffmpeg_helper(), don't initialize the codec.
Diffstat (limited to 'src/decoder/ffmpeg_decoder_plugin.c')
-rw-r--r--src/decoder/ffmpeg_decoder_plugin.c52
1 files changed, 27 insertions, 25 deletions
diff --git a/src/decoder/ffmpeg_decoder_plugin.c b/src/decoder/ffmpeg_decoder_plugin.c
index df05edd47..6e4119136 100644
--- a/src/decoder/ffmpeg_decoder_plugin.c
+++ b/src/decoder/ffmpeg_decoder_plugin.c
@@ -51,7 +51,6 @@ struct ffmpeg_context {
AVCodecContext *codec_context;
struct decoder *decoder;
struct input_stream *input;
- struct tag *tag;
};
struct ffmpeg_stream {
@@ -405,14 +404,33 @@ ffmpeg_copy_metadata(struct tag *tag, AVMetadata *m,
}
#endif
-static bool ffmpeg_tag_internal(struct ffmpeg_context *ctx)
+//no tag reading in ffmpeg, check if playable
+static struct tag *
+ffmpeg_stream_tag(struct input_stream *is)
{
- struct tag *tag = (struct tag *) ctx->tag;
- AVFormatContext *f = ctx->format_context;
+ struct ffmpeg_stream stream = {
+ .url = "mpd://X", /* only the mpd:// prefix matters */
+ .decoder = NULL,
+ .input = is,
+ };
+
+ if (is->uri != NULL)
+ append_uri_suffix(&stream, is->uri);
+
+ AVFormatContext *f;
+ if (av_open_input_file(&f, stream.url, NULL, 0, NULL) != 0)
+ return NULL;
+
+ if (av_find_stream_info(f) < 0) {
+ av_close_input_file(f);
+ return NULL;
+ }
+
+ struct tag *tag = tag_new();
- tag->time = 0;
- if (f->duration != (int64_t)AV_NOPTS_VALUE)
- tag->time = f->duration / AV_TIME_BASE;
+ tag->time = f->duration != (int64_t)AV_NOPTS_VALUE
+ ? f->duration / AV_TIME_BASE
+ : 0;
#if LIBAVFORMAT_VERSION_INT >= ((52<<16)+(31<<8)+0)
av_metadata_conv(f, NULL, f->iformat->metadata_conv);
@@ -449,26 +467,10 @@ static bool ffmpeg_tag_internal(struct ffmpeg_context *ctx)
}
#endif
- return true;
-}
-//no tag reading in ffmpeg, check if playable
-static struct tag *
-ffmpeg_stream_tag(struct input_stream *is)
-{
- struct ffmpeg_context ctx;
- bool ret;
-
- ctx.decoder = NULL;
- ctx.tag = tag_new();
-
- ret = ffmpeg_helper(is, ffmpeg_tag_internal, &ctx);
- if (!ret) {
- tag_free(ctx.tag);
- ctx.tag = NULL;
- }
+ av_close_input_file(f);
- return ctx.tag;
+ return tag;
}
/**