From 94c037821ba26a040006568a103b770571fda140 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Mon, 22 Jun 2015 14:41:44 +0200 Subject: decoder/ffmpeg: check for commands earlier Improve initial seek by not reading/decoding the first frame before checking for the seek command. --- src/decoder/plugins/FfmpegDecoderPlugin.cxx | 44 ++++++++++++++--------------- 1 file changed, 22 insertions(+), 22 deletions(-) (limited to 'src/decoder/plugins/FfmpegDecoderPlugin.cxx') diff --git a/src/decoder/plugins/FfmpegDecoderPlugin.cxx b/src/decoder/plugins/FfmpegDecoderPlugin.cxx index 90699ef5e..88352bbb0 100644 --- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx +++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx @@ -543,8 +543,27 @@ FfmpegDecode(Decoder &decoder, InputStream &input, uint64_t min_frame = 0; - DecoderCommand cmd; - do { + DecoderCommand cmd = decoder_get_command(decoder); + while (cmd != DecoderCommand::STOP) { + if (cmd == DecoderCommand::SEEK) { + int64_t where = + ToFfmpegTime(decoder_seek_time(decoder), + av_stream.time_base) + + start_time_fallback(av_stream); + + /* AVSEEK_FLAG_BACKWARD asks FFmpeg to seek to + the packet boundary before the seek time + stamp, not after */ + if (av_seek_frame(&format_context, audio_stream, where, + AVSEEK_FLAG_ANY|AVSEEK_FLAG_BACKWARD) < 0) + decoder_seek_error(decoder); + else { + avcodec_flush_buffers(&codec_context); + min_frame = decoder_seek_where_frame(decoder); + decoder_command_finished(decoder); + } + } + AVPacket packet; if (av_read_frame(&format_context, &packet) < 0) /* end of file */ @@ -566,26 +585,7 @@ FfmpegDecode(Decoder &decoder, InputStream &input, cmd = decoder_get_command(decoder); av_free_packet(&packet); - - if (cmd == DecoderCommand::SEEK) { - int64_t where = - ToFfmpegTime(decoder_seek_time(decoder), - av_stream.time_base) + - start_time_fallback(av_stream); - - /* AVSEEK_FLAG_BACKWARD asks FFmpeg to seek to - the packet boundary before the seek time - stamp, not after */ - if (av_seek_frame(&format_context, audio_stream, where, - AVSEEK_FLAG_ANY|AVSEEK_FLAG_BACKWARD) < 0) - decoder_seek_error(decoder); - else { - avcodec_flush_buffers(&codec_context); - min_frame = decoder_seek_where_frame(decoder); - decoder_command_finished(decoder); - } - } - } while (cmd != DecoderCommand::STOP); + } #if LIBAVUTIL_VERSION_MAJOR >= 53 av_frame_free(&frame); -- cgit v1.2.3