diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/decoder/ffmpeg_plugin.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/src/decoder/ffmpeg_plugin.c b/src/decoder/ffmpeg_plugin.c index d2bd642fd..0e15d99c1 100644 --- a/src/decoder/ffmpeg_plugin.c +++ b/src/decoder/ffmpeg_plugin.c @@ -55,7 +55,7 @@ struct ffmpeg_context { struct ffmpeg_stream { /** hack - see url_to_struct() */ - char url[8]; + char url[64]; struct decoder *decoder; struct input_stream *input; @@ -140,8 +140,28 @@ ffmpeg_find_audio_stream(const AVFormatContext *format_context) return -1; } +/** + * Append the suffix of the original URI to the virtual stream URI. + * Without this, libavformat cannot detect some of the codecs + * (e.g. "shorten"). + */ +static void +append_uri_suffix(struct ffmpeg_stream *stream, const char *uri) +{ + assert(stream != NULL); + assert(uri != NULL); + + char *base = g_path_get_basename(uri); + + const char *suffix = strrchr(base, '.'); + if (suffix != NULL && suffix[1] != 0) + g_strlcat(stream->url, suffix, sizeof(stream->url)); + + g_free(base); +} + static bool -ffmpeg_helper(struct input_stream *input, +ffmpeg_helper(const char *uri, struct input_stream *input, bool (*callback)(struct ffmpeg_context *ctx), struct ffmpeg_context *ctx) { @@ -154,6 +174,9 @@ ffmpeg_helper(struct input_stream *input, }; bool ret; + if (uri != NULL) + append_uri_suffix(&stream, uri); + stream.input = input; if (ctx && ctx->decoder) { stream.decoder = ctx->decoder; //are we in decoding loop ? @@ -349,7 +372,8 @@ ffmpeg_decode(struct decoder *decoder, struct input_stream *input) ctx.input = input; ctx.decoder = decoder; - ffmpeg_helper(input, ffmpeg_decode_internal, &ctx); + ffmpeg_helper(decoder_get_uri(decoder), input, + ffmpeg_decode_internal, &ctx); } #if LIBAVFORMAT_VERSION_INT >= ((52<<16)+(31<<8)+0) @@ -426,7 +450,7 @@ static struct tag *ffmpeg_tag(const char *file) ctx.decoder = NULL; ctx.tag = tag_new(); - ret = ffmpeg_helper(&input, ffmpeg_tag_internal, &ctx); + ret = ffmpeg_helper(file, &input, ffmpeg_tag_internal, &ctx); if (!ret) { tag_free(ctx.tag); ctx.tag = NULL; |