Commit 2e22ff2e authored by Max Kellermann's avatar Max Kellermann

decoder/ffmpeg: use AVStream::duration

Use the duration of the stream we're actually decoding - not the "global" attribute AVFormatContext::duration which may differ.
parent 8c3be4a5
......@@ -583,10 +583,7 @@ FfmpegDecode(Decoder &decoder, InputStream &input,
}
const SignedSongTime total_time =
format_context.duration != (int64_t)AV_NOPTS_VALUE
? SignedSongTime::FromScale<uint64_t>(format_context.duration,
AV_TIME_BASE)
: SignedSongTime::Negative();
FromFfmpegTimeChecked(av_stream.duration, av_stream.time_base);
decoder_initialized(decoder, audio_format,
input.IsSeekable(), total_time);
......@@ -696,12 +693,11 @@ FfmpegScanStream(AVFormatContext &format_context,
if (audio_stream < 0)
return false;
if (format_context.duration != (int64_t)AV_NOPTS_VALUE) {
const auto duration =
SongTime::FromScale<uint64_t>(format_context.duration,
AV_TIME_BASE);
tag_handler_invoke_duration(&handler, handler_ctx, duration);
}
const AVStream &stream = *format_context.streams[audio_stream];
if (stream.duration != (int64_t)AV_NOPTS_VALUE)
tag_handler_invoke_duration(&handler, handler_ctx,
FromFfmpegTime(stream.duration,
stream.time_base));
FfmpegScanMetadata(format_context, audio_stream, handler, handler_ctx);
......
......@@ -60,6 +60,31 @@ RatioToAVRational()
}
/**
* Convert a FFmpeg time stamp to a #SongTime.
*/
gcc_const
static inline SongTime
FromFfmpegTime(int64_t t, const AVRational time_base)
{
assert(t != (int64_t)AV_NOPTS_VALUE);
return SongTime::FromMS(av_rescale_q(t, time_base,
(AVRational){1, 1000}));
}
/**
* Convert a FFmpeg time stamp to a #SignedSongTime.
*/
gcc_const
static inline SignedSongTime
FromFfmpegTimeChecked(int64_t t, const AVRational time_base)
{
return t != (int64_t)AV_NOPTS_VALUE
? SignedSongTime(FromFfmpegTime(t, time_base))
: SignedSongTime::Negative();
}
/**
* Convert a #SongTime to a FFmpeg time stamp with the given base.
*/
gcc_const
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment