diff --git a/lib/dtsc.cpp b/lib/dtsc.cpp index 8d84b012..0885d57c 100644 --- a/lib/dtsc.cpp +++ b/lib/dtsc.cpp @@ -3332,6 +3332,38 @@ namespace DTSC{ // return is by reference } + /// Returns true if the tracks idx1 and idx2 are keyframe aligned + bool Meta::keyTimingsMatch(size_t idx1, size_t idx2) const { + const DTSC::Track &t1 = tracks.at(idx1); + const DTSC::Track &t2 = tracks.at(idx2); + uint64_t t1Firstms = t1.track.getInt(t1.trackFirstmsField); + uint64_t t2Firstms = t2.track.getInt(t2.trackFirstmsField); + uint64_t firstms = t1Firstms > t2Firstms ? t1Firstms : t2Firstms; + + uint64_t t1Lastms = t1.track.getInt(t1.trackFirstmsField); + uint64_t t2Lastms = t2.track.getInt(t2.trackFirstmsField); + uint64_t lastms = t1Lastms > t2Lastms ? t1Lastms : t2Lastms; + + if (firstms > lastms) { + WARN_MSG("Cannot check for timing alignment for tracks %zu and %zu: No overlap", idx1, idx2); + return false; + } + + uint32_t keyIdx1 = getKeyIndexForTime(idx1,firstms); + uint32_t keyIdx2 = getKeyIndexForTime(idx2,firstms); + + DTSC::Keys keys1(tracks.at(idx1).keys); + DTSC::Keys keys2(tracks.at(idx2).keys); + + while(true) { + if (lastms < keys1.getTime(keyIdx1) || lastms < keys2.getTime(keyIdx2)) {return true;} + if (keys1.getTime(keyIdx1) != keys2.getTime(keyIdx2)) {return false;} + keyIdx1++; + keyIdx2++; + } + return true; + } + Parts::Parts(const Util::RelAccX &_parts) : parts(_parts){ sizeField = parts.getFieldData("size"); durationField = parts.getFieldData("duration"); diff --git a/lib/dtsc.h b/lib/dtsc.h index 59d4f79f..7debe215 100644 --- a/lib/dtsc.h +++ b/lib/dtsc.h @@ -450,6 +450,7 @@ namespace DTSC{ size_t getPageNumberForTime(uint32_t idx, uint64_t time) const; size_t getPageNumberForKey(uint32_t idx, uint64_t keynumber) const; size_t getKeyNumForTime(uint32_t idx, uint64_t time) const; + bool keyTimingsMatch(size_t idx1, size_t idx2) const; const Util::RelAccX &parts(size_t idx) const; Util::RelAccX &keys(size_t idx);