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:
parent
e38e8eb636
commit
94c037821b
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue