From 3fb92a01d3733a7516e33a30ce3bff830b5013a1 Mon Sep 17 00:00:00 2001 From: Marco van Dijk Date: Wed, 29 Nov 2023 11:34:12 +0100 Subject: [PATCH] TSSRT: fixes to timestamp rewriting --- src/input/input_tssrt.cpp | 22 ++++++++++++++-------- src/input/input_tssrt.h | 1 + src/output/output_tssrt.cpp | 22 ++++++++++++++-------- src/output/output_tssrt.h | 1 + 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/input/input_tssrt.cpp b/src/input/input_tssrt.cpp index def760de..65a63f53 100644 --- a/src/input/input_tssrt.cpp +++ b/src/input/input_tssrt.cpp @@ -51,6 +51,7 @@ namespace Mist{ inputTSSRT::inputTSSRT(Util::Config *cfg, Socket::SRTConnection s) : Input(cfg){ rawIdx = INVALID_TRACK_ID; lastRawPacket = 0; + bootMSOffsetCalculated = false; assembler.setLive(); capa["name"] = "TSSRT"; capa["desc"] = "This input allows for processing MPEG2-TS-based SRT streams. Use mode=listener " @@ -264,18 +265,23 @@ namespace Mist{ thisIdx = M.trackIDToIndex(thisPacket.getTrackId(), getpid()); if (thisIdx == INVALID_TRACK_ID){getNext(idx);} - uint64_t adjustTime = thisPacket.getTime() + timeStampOffset; + uint64_t pktTimeWithOffset = thisPacket.getTime() + timeStampOffset; if (lastTimeStamp || timeStampOffset){ - if (lastTimeStamp + 5000 < adjustTime || lastTimeStamp > adjustTime + 5000){ + uint64_t targetTime = Util::bootMS() - M.getBootMsOffset(); + if (targetTime + 5000 < pktTimeWithOffset || targetTime > pktTimeWithOffset + 5000){ INFO_MSG("Timestamp jump " PRETTY_PRINT_MSTIME " -> " PRETTY_PRINT_MSTIME ", compensating.", - PRETTY_ARG_MSTIME(lastTimeStamp), PRETTY_ARG_MSTIME(adjustTime)); - timeStampOffset += (lastTimeStamp - adjustTime); - adjustTime = thisPacket.getTime() + timeStampOffset; + PRETTY_ARG_MSTIME(targetTime), PRETTY_ARG_MSTIME(pktTimeWithOffset)); + timeStampOffset += (targetTime - pktTimeWithOffset); + pktTimeWithOffset = thisPacket.getTime() + timeStampOffset; } } - if (!lastTimeStamp){meta.setBootMsOffset(Util::bootMS() - adjustTime);} - lastTimeStamp = adjustTime; - thisPacket.setTime(adjustTime); + if (!bootMSOffsetCalculated){ + meta.setBootMsOffset((int64_t)Util::bootMS() - (int64_t)pktTimeWithOffset); + bootMSOffsetCalculated = true; + } + lastTimeStamp = pktTimeWithOffset; + thisPacket.setTime(pktTimeWithOffset); + thisTime = pktTimeWithOffset; } bool inputTSSRT::openStreamSource(){return true;} diff --git a/src/input/input_tssrt.h b/src/input/input_tssrt.h index a70c8a07..77da7aae 100644 --- a/src/input/input_tssrt.h +++ b/src/input/input_tssrt.h @@ -45,6 +45,7 @@ namespace Mist{ Util::ResizeablePointer rawBuffer; size_t rawIdx; uint64_t lastRawPacket; + bool bootMSOffsetCalculated; }; }// namespace Mist diff --git a/src/output/output_tssrt.cpp b/src/output/output_tssrt.cpp index 6c5ce9b0..e47ead9a 100644 --- a/src/output/output_tssrt.cpp +++ b/src/output/output_tssrt.cpp @@ -16,6 +16,7 @@ namespace Mist{ streamName = config->getString("streamname"); Util::setStreamName(streamName); pushOut = false; + bootMSOffsetCalculated = false; assembler.setLive(); // Push output configuration if (config->getString("target").size()){ @@ -382,18 +383,23 @@ namespace Mist{ userSelect[thisIdx].reload(streamName, thisIdx, COMM_STATUS_SOURCE | COMM_STATUS_DONOTTRACK); } - uint64_t adjustTime = thisPacket.getTime() + timeStampOffset; + uint64_t pktTimeWithOffset = thisPacket.getTime() + timeStampOffset; if (lastTimeStamp || timeStampOffset){ - if (lastTimeStamp + 5000 < adjustTime || lastTimeStamp > adjustTime + 5000){ + uint64_t targetTime = Util::bootMS() - M.getBootMsOffset(); + if (targetTime + 5000 < pktTimeWithOffset || targetTime > pktTimeWithOffset + 5000){ INFO_MSG("Timestamp jump " PRETTY_PRINT_MSTIME " -> " PRETTY_PRINT_MSTIME ", compensating.", - PRETTY_ARG_MSTIME(lastTimeStamp), PRETTY_ARG_MSTIME(adjustTime)); - timeStampOffset += (lastTimeStamp - adjustTime); - adjustTime = thisPacket.getTime() + timeStampOffset; + PRETTY_ARG_MSTIME(targetTime), PRETTY_ARG_MSTIME(pktTimeWithOffset)); + timeStampOffset += (targetTime - pktTimeWithOffset); + pktTimeWithOffset = thisPacket.getTime() + timeStampOffset; } } - if (!lastTimeStamp){meta.setBootMsOffset(Util::bootMS() - adjustTime);} - lastTimeStamp = adjustTime; - thisPacket.setTime(adjustTime); + if (!bootMSOffsetCalculated){ + meta.setBootMsOffset(Util::bootMS() - pktTimeWithOffset); + bootMSOffsetCalculated = true; + } + lastTimeStamp = pktTimeWithOffset; + thisPacket.setTime(pktTimeWithOffset); + thisTime = pktTimeWithOffset; bufferLivePacket(thisPacket); } } diff --git a/src/output/output_tssrt.h b/src/output/output_tssrt.h index bfcee95f..9804c3e9 100644 --- a/src/output/output_tssrt.h +++ b/src/output/output_tssrt.h @@ -29,6 +29,7 @@ namespace Mist{ Socket::UDPConnection pushSock; TS::Stream tsIn; TS::Assembler assembler; + bool bootMSOffsetCalculated; Socket::SRTConnection & srtConn; };