From b5d48a006a29db6da9c23e9d7d21eb00fa295174 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 19 Oct 2018 15:56:58 +0200 Subject: [PATCH] Fixed outputs not reporting their current position accurately, improved buffering behaviour for VoD inputs. --- src/input/input.cpp | 7 +++++++ src/output/output.cpp | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/input/input.cpp b/src/input/input.cpp index 7e3c0542..1eb70743 100644 --- a/src/input/input.cpp +++ b/src/input/input.cpp @@ -784,14 +784,21 @@ namespace Mist { if (nProxy.isBuffered(track, keyNum)) { //get corresponding page number int pageNumber = 0; + int pageSize = 0; for (std::map::iterator it = nProxy.pagesByTrack[track].begin(); it != nProxy.pagesByTrack[track].end(); it++) { if (it->first <= keyNum) { pageNumber = it->first; + pageSize = it->second.keyNum; } else { break; } } pageCounter[track][pageNumber] = 15; + //If we're less than 10% off from the next page, make sure the next is also buffered. + if (keyNum+pageSize/10 > pageNumber+pageSize){ + MEDIUM_MSG("Pre-buffering next page! (%u+%u/10 > %u+%u)", keyNum, pageSize, pageNumber, pageSize); + return bufferFrame(track, pageNumber+pageSize+1); + } VERYHIGH_MSG("Track %u, key %u is already buffered in page %d. Cancelling bufferFrame", track, keyNum, pageNumber); return true; } diff --git a/src/output/output.cpp b/src/output/output.cpp index 7b484ea6..5da915cd 100644 --- a/src/output/output.cpp +++ b/src/output/output.cpp @@ -1576,7 +1576,7 @@ namespace Mist{ } //when live, every keyframe, check correctness of the keyframe number - if (myMeta.live && thisPacket.getFlag("keyframe")){ + if (thisPacket.getFlag("keyframe")){ //cancel if not alive if (!nProxy.userClient.isAlive()){ return false; @@ -1585,7 +1585,7 @@ namespace Mist{ //Failure here will cause tracks to drop due to inconsistent internal state. nxtKeyNum[nxt.tid] = getKeyForTime(nxt.tid, thisPacket.getTime()); int counter = 0; - while(counter < 40 && myMeta.tracks[nxt.tid].getKey(nxtKeyNum[nxt.tid]).getTime() != thisPacket.getTime()){ + while(myMeta.live && counter < 40 && myMeta.tracks[nxt.tid].getKey(nxtKeyNum[nxt.tid]).getTime() != thisPacket.getTime()){ if (counter++){ //Only sleep 250ms if this is not the first updatemeta try Util::wait(250);