decoder/ffmpeg: check for commands earlier

Improve initial seek by not reading/decoding the first frame before
checking for the seek command.
This commit is contained in:
Max Kellermann 2015-06-22 14:41:44 +02:00
parent e38e8eb636
commit 94c037821b
1 changed files with 22 additions and 22 deletions

View File

@ -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);