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; }