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
62f7375804
commit
4dd2ad9b27
@ -478,8 +478,27 @@ ffmpeg_decode(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 */
|
||||||
@ -502,27 +521,7 @@ ffmpeg_decode(Decoder &decoder, InputStream &input)
|
|||||||
#else
|
#else
|
||||||
av_free_packet(&packet);
|
av_free_packet(&packet);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user