diff --git a/src/input/input_buffer.cpp b/src/input/input_buffer.cpp index 444bce24..960a442f 100644 --- a/src/input/input_buffer.cpp +++ b/src/input/input_buffer.cpp @@ -393,23 +393,8 @@ namespace Mist { if (bufferLocations[tid].size() > 1){ //Check if the first key starts on the second page or higher if (myMeta.tracks[tid].keys[0].getNumber() >= (++(bufferLocations[tid].begin()))->first || !config->is_active){ - //Find page in indexpage and null it - for (int i = 0; i < 8192; i += 8){ - unsigned int thisKeyNum = ((((long long int *)(nProxy.metaPages[tid].mapped + i))[0]) >> 32) & 0xFFFFFFFF; - if (thisKeyNum == htonl(bufferLocations[tid].begin()->first) && ((((long long int *)(nProxy.metaPages[tid].mapped + i))[0]) != 0)){ - (((long long int *)(nProxy.metaPages[tid].mapped + i))[0]) = 0; - } - } DEBUG_MSG(DLVL_DEVEL, "Erasing track %d, keys %lu-%lu from buffer", tid, bufferLocations[tid].begin()->first, bufferLocations[tid].begin()->first + bufferLocations[tid].begin()->second.keyNum - 1); bufferRemove(tid, bufferLocations[tid].begin()->first); - for (int i = 0; i < 1024; i++){ - int * tmpOffset = (int *)(nProxy.metaPages[tid].mapped + (i * 8)); - int tmpNum = ntohl(tmpOffset[0]); - if (tmpNum == bufferLocations[tid].begin()->first){ - tmpOffset[0] = 0; - tmpOffset[1] = 0; - } - } nProxy.curPageNum.erase(tid); char thisPageName[NAME_BUFFER_SIZE]; @@ -551,8 +536,9 @@ namespace Mist { } for (std::map::iterator it = myMeta.tracks.begin(); it != myMeta.tracks.end(); it++){ //non-video tracks need to have a second keyframe that is <= firstVideo + //firstVideo = 1 happens when there are no tracks, in which case we don't care any more if (it->second.type != "video"){ - if (it->second.keys.size() < 2 || it->second.keys[1].getTime() > firstVideo){ + if (it->second.keys.size() < 2 || (it->second.keys[1].getTime() > firstVideo && firstVideo != 1)){ continue; } } diff --git a/src/io.cpp b/src/io.cpp index 19c1cc24..81a954ba 100644 --- a/src/io.cpp +++ b/src/io.cpp @@ -96,6 +96,19 @@ namespace Mist { //If the track is accepted, we will have a mapped tid unsigned long mapTid = trackMap[tid]; + //Before we start a new page, make sure we can be heard by the buffer about this. + //Otherwise, it might linger forever as a nasty data leak. + //Nobody likes nasty data leaks. + { + char pageName[NAME_BUFFER_SIZE]; + snprintf(pageName, NAME_BUFFER_SIZE, SHM_TRACK_INDEX, streamName.c_str(), mapTid); + IPC::sharedPage checkPage(pageName, 8 * 1024 * 1024, false, false); + if (!checkPage.mapped){ + WARN_MSG("The buffer deleted our index. Aborting new page."); + return false; + } + } + //If we are currently buffering a page, abandon it completely and print a message about this //This page will NEVER be deleted, unless we open it again later. if (curPage.count(tid)) {