From 1893d2e0f0047133546d10a35623f4e059941b8b Mon Sep 17 00:00:00 2001 From: Maryla Date: Mon, 30 Mar 2026 17:55:16 +0200 Subject: [PATCH] In t35_tool json manifest, use composition order frame indices. Previously the code assumed decoding order which is not intuitive. --- IsoLib/t35_tool/injection/StrategyHelpers.cpp | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/IsoLib/t35_tool/injection/StrategyHelpers.cpp b/IsoLib/t35_tool/injection/StrategyHelpers.cpp index 198da7a..0b74a5d 100644 --- a/IsoLib/t35_tool/injection/StrategyHelpers.cpp +++ b/IsoLib/t35_tool/injection/StrategyHelpers.cpp @@ -70,7 +70,13 @@ MP4Err getVideoSampleDurations(MP4Media mediaV, std::vector &durations) err = MP4GetMediaSampleCount(mediaV, &sampleCount); if(err) return err; - durations.reserve(sampleCount); + struct SampleInfo + { + u64 cts; + u32 duration; + }; + std::vector samples; + samples.reserve(sampleCount); for(u32 i = 1; i <= sampleCount; ++i) { @@ -88,11 +94,26 @@ MP4Err getVideoSampleDurations(MP4Media mediaV, std::vector &durations) return err; } - durations.push_back(static_cast(outDuration)); + u64 cts = outDTS; + if(outSampleFlags & MP4MediaSampleHasCTSOffset) + { + cts = static_cast(static_cast(outDTS) + outCTSOffset); + } + samples.push_back({cts, static_cast(outDuration)}); if(sampleH) MP4DisposeHandle(sampleH); } + // Sort by CTS + std::sort(samples.begin(), samples.end(), + [](const SampleInfo &a, const SampleInfo &b) { return a.cts < b.cts; }); + + durations.reserve(sampleCount); + for(const auto &s : samples) + { + durations.push_back(s.duration); + } + LOG_DEBUG("Collected {} video sample durations", durations.size()); return MP4NoErr; }