From 382e1eec0363de9a963f37cf02076b1c96e1c541 Mon Sep 17 00:00:00 2001 From: Marco van Dijk Date: Wed, 1 Nov 2023 12:26:36 +0100 Subject: [PATCH] MistInHLS improvements and speedups, part 3/2 --- lib/dtsc.cpp | 28 ++++++++++++++++++++++++++++ src/input/input_hls.cpp | 7 +++---- src/io.cpp | 2 +- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/dtsc.cpp b/lib/dtsc.cpp index b547f7a4..496f7683 100644 --- a/lib/dtsc.cpp +++ b/lib/dtsc.cpp @@ -2285,6 +2285,34 @@ namespace DTSC{ // Note: pages are not deleted here, but instead deleted by Input::removeUnused (or a child-override) // This is fine, as pages can (and will, at least temporarily) exist for data we no longer fully have in stream metadata setFirstms(trackIdx, t.keys.getInt(t.keyTimeField, t.keys.getDeleted())); + + // Update page info + Util::RelAccX &tPages = pages(trackIdx); + uint32_t firstPage = tPages.getDeleted(); + uint32_t keyCount = tPages.getInt("keycount", firstPage); + uint32_t firstKey = tPages.getInt("firstkey", firstPage); + // Delete the page if this was the last key + if (firstKey + keyCount <= deletedKeyNum + 1){ + if (tPages.getInt("avail", firstPage)){ + // Open the correct page + char pageId[NAME_BUFFER_SIZE]; + snprintf(pageId, NAME_BUFFER_SIZE, SHM_TRACK_DATA, streamName.c_str(), trackIdx, firstKey); + std::string pageName(pageId); + IPC::sharedPage toErase; + toErase.init(pageName, 0, false, false); + // Set the master flag so that the page will be destroyed once it leaves scope + #if defined(__CYGWIN__) || defined(_WIN32) + IPC::releasePage(pageName); + #endif + toErase.master = true; + } + tPages.deleteRecords(1); + } else if (tPages.getInt("avail", firstPage) == 0){ + tPages.setInt("keycount", keyCount - 1, firstPage); + tPages.setInt("parts", tPages.getInt("parts", firstPage) - deletedPartCount, firstPage); + tPages.setInt("firstkey", deletedKeyNum + 1, firstPage); + } + if (resizeLock){resizeLock.unlink();} return true; } diff --git a/src/input/input_hls.cpp b/src/input/input_hls.cpp index a840e53e..c91be57c 100644 --- a/src/input/input_hls.cpp +++ b/src/input/input_hls.cpp @@ -1179,7 +1179,7 @@ namespace Mist{ while (true) { DTSC::Keys keys = M.getKeys(trackIdx->first); // Stop if the earliest key is still in the playlist - if (listEntries[currentPlaylist].front().bytePos < keys.getBpos(keys.getFirstValid())){ + if (listEntries[currentPlaylist].front().bytePos <= keys.getBpos(keys.getFirstValid())){ break; } // Stop if earliest key is still in the buffer window @@ -1403,10 +1403,10 @@ namespace Mist{ playListEntries &entry = curPlaylist.at(currentIndex); segDowner.loadSegment(entry); // If we have an offset, load it + allowRemap = false; if (entry.timeOffset){ HIGH_MSG("Setting time offset of this TS segment to %" PRId64, entry.timeOffset); plsTimeOffset[currentPlaylist] = entry.timeOffset; - allowRemap = false; } } @@ -1763,14 +1763,13 @@ namespace Mist{ ERROR_MSG("Could not download segment: %s", ntry.filename.c_str()); return readNextFile(); // Attempt to read another, if possible. } + allowRemap = false; // If we have an offset, load it if (ntry.timeOffset){ plsTimeOffset[currentPlaylist] = ntry.timeOffset; - allowRemap = false; // Else allow of the offset to be set by getPacketTime }else{ nUTC = ntry.mUTC; - allowRemap = true; } return true; } diff --git a/src/io.cpp b/src/io.cpp index 0c32590b..b0f06835 100644 --- a/src/io.cpp +++ b/src/io.cpp @@ -149,7 +149,7 @@ namespace Mist{ } // If the given pagenumber is not a valid page on this track, do nothing if (pageIdx == INVALID_KEY_NUM){ - WARN_MSG("Can't remove page %" PRIu32 " on track %zu as it is not a valid page number.", pageNumber, idx); + INFO_MSG("Can't remove page %" PRIu32 " on track %zu as the page has already been unloaded", pageNumber, idx); return; }