From a4a034a84e4544d5933a49048daa2c8d88e5f2d8 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Thu, 15 May 2025 12:48:48 +0100 Subject: [PATCH 1/2] Fix pts <-> seconds conversions --- src/torchcodec/_core/SingleStreamDecoder.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/torchcodec/_core/SingleStreamDecoder.cpp b/src/torchcodec/_core/SingleStreamDecoder.cpp index e2c55ef2..42989340 100644 --- a/src/torchcodec/_core/SingleStreamDecoder.cpp +++ b/src/torchcodec/_core/SingleStreamDecoder.cpp @@ -17,16 +17,13 @@ namespace facebook::torchcodec { namespace { -double ptsToSeconds(int64_t pts, int den) { - return static_cast(pts) / den; -} - double ptsToSeconds(int64_t pts, const AVRational& timeBase) { - return ptsToSeconds(pts, timeBase.den); + return static_cast(pts) * timeBase.num / timeBase.den; } int64_t secondsToClosestPts(double seconds, const AVRational& timeBase) { - return static_cast(std::round(seconds * timeBase.den)); + return static_cast( + std::round(seconds * timeBase.den / timeBase.num)); } } // namespace @@ -152,7 +149,7 @@ void SingleStreamDecoder::initializeDecoder() { if (formatContext_->duration > 0) { containerMetadata_.durationSeconds = - ptsToSeconds(formatContext_->duration, AV_TIME_BASE); + ptsToSeconds(formatContext_->duration, AV_TIME_BASE_Q); } if (formatContext_->bit_rate > 0) { From 06cd220261b7f829aa43a2bc6f35cc70363a37c9 Mon Sep 17 00:00:00 2001 From: Nicolas Hug Date: Thu, 15 May 2025 13:07:15 +0100 Subject: [PATCH 2/2] Fix compile issue --- src/torchcodec/_core/SingleStreamDecoder.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/torchcodec/_core/SingleStreamDecoder.cpp b/src/torchcodec/_core/SingleStreamDecoder.cpp index 42989340..6299e319 100644 --- a/src/torchcodec/_core/SingleStreamDecoder.cpp +++ b/src/torchcodec/_core/SingleStreamDecoder.cpp @@ -148,8 +148,9 @@ void SingleStreamDecoder::initializeDecoder() { } if (formatContext_->duration > 0) { + AVRational defaultTimeBase{1, AV_TIME_BASE}; containerMetadata_.durationSeconds = - ptsToSeconds(formatContext_->duration, AV_TIME_BASE_Q); + ptsToSeconds(formatContext_->duration, defaultTimeBase); } if (formatContext_->bit_rate > 0) {