decoder/ffmpeg: use AVStream::duration
Use the duration of the stream we're actually decoding - not the "global" attribute AVFormatContext::duration which may differ.
This commit is contained in:
parent
cc19e760cf
commit
42c5f68362
|
@ -583,10 +583,7 @@ ffmpeg_decode(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);
|
||||
|
|
|
@ -53,6 +53,34 @@ RatioToAVRational()
|
|||
return { Ratio::num, Ratio::den };
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
static inline int64_t
|
||||
ToFfmpegTime(SongTime t, const AVRational time_base)
|
||||
|
|
Loading…
Reference in New Issue