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
8c3be4a5f0
commit
2e22ff2e36
@ -583,10 +583,7 @@ FfmpegDecode(Decoder &decoder, InputStream &input,
|
|||||||
}
|
}
|
||||||
|
|
||||||
const SignedSongTime total_time =
|
const SignedSongTime total_time =
|
||||||
format_context.duration != (int64_t)AV_NOPTS_VALUE
|
FromFfmpegTimeChecked(av_stream.duration, av_stream.time_base);
|
||||||
? SignedSongTime::FromScale<uint64_t>(format_context.duration,
|
|
||||||
AV_TIME_BASE)
|
|
||||||
: SignedSongTime::Negative();
|
|
||||||
|
|
||||||
decoder_initialized(decoder, audio_format,
|
decoder_initialized(decoder, audio_format,
|
||||||
input.IsSeekable(), total_time);
|
input.IsSeekable(), total_time);
|
||||||
@ -696,12 +693,11 @@ FfmpegScanStream(AVFormatContext &format_context,
|
|||||||
if (audio_stream < 0)
|
if (audio_stream < 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (format_context.duration != (int64_t)AV_NOPTS_VALUE) {
|
const AVStream &stream = *format_context.streams[audio_stream];
|
||||||
const auto duration =
|
if (stream.duration != (int64_t)AV_NOPTS_VALUE)
|
||||||
SongTime::FromScale<uint64_t>(format_context.duration,
|
tag_handler_invoke_duration(&handler, handler_ctx,
|
||||||
AV_TIME_BASE);
|
FromFfmpegTime(stream.duration,
|
||||||
tag_handler_invoke_duration(&handler, handler_ctx, duration);
|
stream.time_base));
|
||||||
}
|
|
||||||
|
|
||||||
FfmpegScanMetadata(format_context, audio_stream, handler, handler_ctx);
|
FfmpegScanMetadata(format_context, audio_stream, handler, handler_ctx);
|
||||||
|
|
||||||
|
@ -59,6 +59,31 @@ RatioToAVRational()
|
|||||||
return { Ratio::num, Ratio::den };
|
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.
|
* Convert a #SongTime to a FFmpeg time stamp with the given base.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user