diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/decoder/ffmpeg_decoder_plugin.c | 52 |
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; } /** |