Fixes for DTSC metadata handling
This commit is contained in:
parent
f862263354
commit
63acbb1ddb
12 changed files with 235 additions and 71 deletions
|
@ -1063,6 +1063,9 @@ namespace Mist{
|
|||
for (uint32_t j = 0; j < endKey; j++){
|
||||
uint64_t keyTime = keys.getTime(j);
|
||||
if (newData){
|
||||
if ((tPages.getEndPos() - tPages.getDeleted()) >= tPages.getRCount()){
|
||||
meta.resizeTrack(*it, M.fragments(*it).getRCount(), M.keys(*it).getRCount(), M.parts(*it).getRCount(), tPages.getRCount() * 2, "not enough pages");
|
||||
}
|
||||
tPages.addRecords(1);
|
||||
++pageNum;
|
||||
tPages.setInt("firsttime", keyTime, pageNum);
|
||||
|
|
|
@ -366,8 +366,7 @@ namespace Mist{
|
|||
}
|
||||
}
|
||||
// Alright, everything looks good, let's delete the key and possibly also fragment
|
||||
meta.removeFirstKey(tid);
|
||||
return true;
|
||||
return meta.removeFirstKey(tid);
|
||||
}
|
||||
|
||||
void inputBuffer::finish(){
|
||||
|
@ -399,7 +398,7 @@ namespace Mist{
|
|||
|
||||
curPageNum.erase(tid);
|
||||
INFO_MSG("Should remove track %zu", tid);
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
meta.removeTrack(tid);
|
||||
/*LTS-START*/
|
||||
if (!M.getValidTracks().size()){
|
||||
|
@ -412,7 +411,7 @@ namespace Mist{
|
|||
}
|
||||
|
||||
void inputBuffer::removeUnused(){
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
// first remove all tracks that have not been updated for too long
|
||||
bool changed = true;
|
||||
while (changed){
|
||||
|
@ -456,7 +455,7 @@ namespace Mist{
|
|||
streamName.c_str(), i, type.c_str(), codec.c_str(), firstms / 1000,
|
||||
lastms / 1000, compareFirst / 1000, compareLast / 1000, bufferTime / 1000);
|
||||
}
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
removeTrack(i);
|
||||
changed = true;
|
||||
break;
|
||||
|
@ -500,7 +499,7 @@ namespace Mist{
|
|||
}
|
||||
|
||||
void inputBuffer::userLeadIn(){
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
/*LTS-START*/
|
||||
// Reload the configuration to make sure we stay up to date with changes through the api
|
||||
if (Util::epoch() - lastReTime > 4){preRun();}
|
||||
|
@ -529,7 +528,7 @@ namespace Mist{
|
|||
void inputBuffer::userOnDisconnect(size_t id){
|
||||
if (sourcePids.count(id)){
|
||||
INFO_MSG("Disconnected track %zu", sourcePids[id]);
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
removeTrack(sourcePids[id]);
|
||||
sourcePids.erase(id);
|
||||
}
|
||||
|
|
14
src/io.cpp
14
src/io.cpp
|
@ -20,7 +20,7 @@ namespace Mist{
|
|||
size_t InOutBase::getMainSelectedTrack(){
|
||||
if (!userSelect.size()){return INVALID_TRACK_ID;}
|
||||
size_t bestSoFar = INVALID_TRACK_ID;
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
for (std::map<size_t, Comms::Users>::iterator it = userSelect.begin(); it != userSelect.end(); it++){
|
||||
if (meta.trackValid(it->first)){
|
||||
if (meta.getType(it->first) == "video"){return it->first;}
|
||||
|
@ -324,7 +324,7 @@ namespace Mist{
|
|||
|
||||
void InOutBase::bufferLivePacket(uint64_t packTime, int64_t packOffset, uint32_t packTrack, const char *packData,
|
||||
size_t packDataSize, uint64_t packBytePos, bool isKeyframe){
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
meta.setLive();
|
||||
|
||||
// Store the trackid for easier access
|
||||
|
@ -368,28 +368,32 @@ namespace Mist{
|
|||
// If there is no page, create it
|
||||
if (!endPage){
|
||||
nextPageNum = 0;
|
||||
tPages.addRecords(1);
|
||||
tPages.setInt("firstkey", 0, 0);
|
||||
tPages.setInt("firsttime", packTime, 0);
|
||||
tPages.setInt("size", DEFAULT_DATA_PAGE_SIZE, 0);
|
||||
tPages.setInt("keycount", 0, 0);
|
||||
tPages.setInt("avail", 0, 0);
|
||||
tPages.addRecords(1);
|
||||
++endPage;
|
||||
}
|
||||
|
||||
uint64_t prevPageTime = tPages.getInt("firsttime", endPage - 1);
|
||||
// Compare on 8 mb boundary and target duration
|
||||
if (tPages.getInt("avail", endPage - 1) > FLIP_DATA_PAGE_SIZE || packTime - prevPageTime > FLIP_TARGET_DURATION){
|
||||
|
||||
if ((endPage - tPages.getDeleted()) >= tPages.getRCount()){
|
||||
meta.resizeTrack(packTrack, M.fragments(packTrack).getRCount(), M.keys(packTrack).getRCount(), M.parts(packTrack).getRCount(), tPages.getRCount() * 2, "not enough pages");
|
||||
}
|
||||
// Create the book keeping data for the new page
|
||||
nextPageNum = tPages.getInt("firstkey", endPage - 1) + tPages.getInt("keycount", endPage - 1);
|
||||
HIGH_MSG("Live page transition from %" PRIu32 ":%zu to %" PRIu32 ":%" PRIu32, packTrack,
|
||||
tPages.getInt("firstkey", endPage - 1), packTrack, nextPageNum);
|
||||
tPages.addRecords(1);
|
||||
tPages.setInt("firstkey", nextPageNum, endPage);
|
||||
tPages.setInt("firsttime", packTime, endPage);
|
||||
tPages.setInt("size", DEFAULT_DATA_PAGE_SIZE, endPage);
|
||||
tPages.setInt("keycount", 0, endPage);
|
||||
tPages.setInt("avail", 0, endPage);
|
||||
tPages.addRecords(1);
|
||||
++endPage;
|
||||
}
|
||||
tPages.setInt("lastkeytime", packTime, endPage - 1);
|
||||
|
@ -426,7 +430,7 @@ namespace Mist{
|
|||
// Open the new page
|
||||
if (!bufferStart(packTrack, nextPageNum)){
|
||||
// if this fails, return instantly without actually buffering the packet
|
||||
WARN_MSG("Dropping packet %s:%" PRIu32 "@%" PRIu64, streamName.c_str(), packTrack, packTime);
|
||||
WARN_MSG("Dropping packet for %s: (no page) %" PRIu32 "@%" PRIu64, streamName.c_str(), packTrack, packTime);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -276,7 +276,7 @@ namespace Mist{
|
|||
// If a protocol does not support any codecs, we assume you know what you're doing
|
||||
if (!capa.isMember("codecs")){return true;}
|
||||
if (!isInitialized){initialize();}
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
if (getSupportedTracks().size()){
|
||||
if (!userSelect.size()){selectDefaultTracks();}
|
||||
size_t mainTrack = getMainSelectedTrack();
|
||||
|
@ -374,7 +374,6 @@ namespace Mist{
|
|||
meta.reInit(streamName, false);
|
||||
}
|
||||
if (!meta){return;}
|
||||
meta.refresh();
|
||||
isInitialized = true;
|
||||
statComm.reload();
|
||||
stats(true);
|
||||
|
@ -387,7 +386,7 @@ namespace Mist{
|
|||
break;
|
||||
}
|
||||
Util::wait(500);
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
stats();
|
||||
}
|
||||
}
|
||||
|
@ -406,7 +405,7 @@ namespace Mist{
|
|||
if (!isInitialized){return false;}
|
||||
}
|
||||
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
|
||||
bool autoSeek = buffer.size();
|
||||
uint64_t seekTarget = currentTime();
|
||||
|
@ -533,7 +532,7 @@ namespace Mist{
|
|||
WARN_MSG("Load for track %zu key %zu aborted - track does not exist", trackId, keyNum);
|
||||
return;
|
||||
}
|
||||
if (!M.trackLoaded(trackId)){meta.refresh();}
|
||||
if (!M.trackLoaded(trackId)){meta.reloadReplacedPagesIfNeeded();}
|
||||
DTSC::Keys keys(M.keys(trackId));
|
||||
if (!keys.getValidCount()){
|
||||
WARN_MSG("Load for track %zu key %zu aborted - track is empty", trackId, keyNum);
|
||||
|
@ -710,7 +709,7 @@ namespace Mist{
|
|||
userSelect.erase(tid);
|
||||
return false;
|
||||
}
|
||||
if (!M.trackLoaded(tid)){meta.refresh();}
|
||||
if (!M.trackLoaded(tid)){meta.reloadReplacedPagesIfNeeded();}
|
||||
if (!userSelect.count(tid) || !userSelect[tid]){
|
||||
WARN_MSG("Aborting seek to %" PRIu64 "ms in track %zu: user select failure (%s)", pos, tid, userSelect.count(tid)?"not connected":"not selected");
|
||||
userSelect.erase(tid);
|
||||
|
@ -1496,6 +1495,7 @@ namespace Mist{
|
|||
|
||||
sortedPageInfo nxt = *(buffer.begin());
|
||||
|
||||
if (meta.reloadReplacedPagesIfNeeded()){return false;}
|
||||
if (!M.getValidTracks().count(nxt.tid)){
|
||||
dropTrack(nxt.tid, "disappeared from metadata");
|
||||
return false;
|
||||
|
|
|
@ -242,7 +242,7 @@ namespace Mist{
|
|||
std::string dataPacket = myConn.Received().remove(8 + rSize);
|
||||
DTSC::Packet metaPack(dataPacket.data(), dataPacket.size());
|
||||
DTSC::Scan metaScan = metaPack.getScan();
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
size_t prevTracks = meta.getValidTracks().size();
|
||||
|
||||
size_t tNum = metaScan.getMember("tracks").getSize();
|
||||
|
@ -256,7 +256,7 @@ namespace Mist{
|
|||
HIGH_MSG("Already had track: %s", trk.asJSON().toString().c_str());
|
||||
}
|
||||
}
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
std::stringstream rep;
|
||||
rep << "DTSC_HEAD parsed, we went from " << prevTracks << " to " << meta.getValidTracks().size() << " tracks. Bring on those data packets!";
|
||||
sendOk(rep.str());
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
namespace Mist{
|
||||
bool OutHLS::isReadyForPlay(){
|
||||
if (!isInitialized){initialize();}
|
||||
meta.refresh();
|
||||
meta.reloadReplacedPagesIfNeeded();
|
||||
if (!M.getValidTracks().size()){return false;}
|
||||
uint32_t mainTrack = M.mainTrack();
|
||||
if (mainTrack == INVALID_TRACK_ID){return false;}
|
||||
|
|
|
@ -1073,7 +1073,7 @@ namespace Mist{
|
|||
newState = streamStatus.mapped[0];
|
||||
}
|
||||
|
||||
if (meta){meta.refresh();}
|
||||
if (meta){meta.reloadReplacedPagesIfNeeded();}
|
||||
if (newState != prevState || (newState == STRMSTAT_READY && M.getValidTracks() != prevTracks)){
|
||||
if (newState == STRMSTAT_READY){
|
||||
reconnect();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue