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:
@@ -543,8 +543,27 @@ FfmpegDecode(Decoder &decoder, InputStream &input,
|
|||||||
|
|
||||||
uint64_t min_frame = 0;
|
uint64_t min_frame = 0;
|
||||||
|
|
||||||
DecoderCommand cmd;
|
DecoderCommand cmd = decoder_get_command(decoder);
|
||||||
do {
|
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;
|
AVPacket packet;
|
||||||
if (av_read_frame(&format_context, &packet) < 0)
|
if (av_read_frame(&format_context, &packet) < 0)
|
||||||
/* end of file */
|
/* end of file */
|
||||||
@@ -566,26 +585,7 @@ FfmpegDecode(Decoder &decoder, InputStream &input,
|
|||||||
cmd = decoder_get_command(decoder);
|
cmd = decoder_get_command(decoder);
|
||||||
|
|
||||||
av_free_packet(&packet);
|
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
|
#if LIBAVUTIL_VERSION_MAJOR >= 53
|
||||||
av_frame_free(&frame);
|
av_frame_free(&frame);
|
||||||
|
Reference in New Issue
Block a user