diff options
author | Max Kellermann <max@duempel.org> | 2015-06-22 14:41:44 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2015-06-22 14:42:19 +0200 |
commit | 94c037821ba26a040006568a103b770571fda140 (patch) | |
tree | 5b47227327e8d4642a42ef5e31fe5e2a2e12b417 | |
parent | e38e8eb6365e6c5534a5362b25746279a79c8a1a (diff) | |
download | mpd-94c037821ba26a040006568a103b770571fda140.tar.gz mpd-94c037821ba26a040006568a103b770571fda140.tar.xz mpd-94c037821ba26a040006568a103b770571fda140.zip |
decoder/ffmpeg: check for commands earlier
Improve initial seek by not reading/decoding the first frame before
checking for the seek command.
Diffstat (limited to '')
-rw-r--r-- | src/decoder/plugins/FfmpegDecoderPlugin.cxx | 44 |
1 files changed, 22 insertions, 22 deletions
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); |