Fixed CPU Usage in the buffer.

This commit is contained in:
Erik Zandvliet 2013-07-22 14:38:01 +02:00
parent 47baa483c8
commit 867fa715eb

View file

@ -188,6 +188,7 @@ void DTSC::Stream::endStream(){
} }
void DTSC::Stream::addPacket(JSON::Value & newPack){ void DTSC::Stream::addPacket(JSON::Value & newPack){
bool updateMeta = false;
long long unsigned int now = Util::getMS(); long long unsigned int now = Util::getMS();
livePos newPos; livePos newPos;
newPos.trackID = newPack["trackid"].asInt(); newPos.trackID = newPack["trackid"].asInt();
@ -195,7 +196,7 @@ void DTSC::Stream::addPacket(JSON::Value & newPack){
if (buffers.size() > 0){ if (buffers.size() > 0){
livePos lastPos = buffers.rbegin()->first; livePos lastPos = buffers.rbegin()->first;
if (newPos < lastPos){ if (newPos < lastPos){
if (newPos.seekTime < lastPos.seekTime - 1000){ if ((lastPos.seekTime > 1000) && newPos.seekTime < lastPos.seekTime - 1000){
metadata.null(); metadata.null();
metadata["reset"] = 1LL; metadata["reset"] = 1LL;
buffers.clear(); buffers.clear();
@ -239,6 +240,7 @@ void DTSC::Stream::addPacket(JSON::Value & newPack){
metadata["tracks"][newTrack]["lastms"] = newPack["time"]; metadata["tracks"][newTrack]["lastms"] = newPack["time"];
#define prevKey metadata["tracks"][newTrack]["keys"][keySize - 1] #define prevKey metadata["tracks"][newTrack]["keys"][keySize - 1]
if (newPack.isMember("keyframe") || !keySize || (datapointertype != VIDEO && newPack["time"].asInt() - 2000 > prevKey["time"].asInt())){ if (newPack.isMember("keyframe") || !keySize || (datapointertype != VIDEO && newPack["time"].asInt() - 2000 > prevKey["time"].asInt())){
updateMeta = true;
keyframes[newPos.trackID].insert(newPos); keyframes[newPos.trackID].insert(newPos);
JSON::Value key; JSON::Value key;
key["time"] = newPack["time"]; key["time"] = newPack["time"];
@ -306,13 +308,14 @@ void DTSC::Stream::addPacket(JSON::Value & newPack){
buffercount = buffers.size(); buffercount = buffers.size();
if (buffercount < 2){buffercount = 2;} if (buffercount < 2){buffercount = 2;}
} }
if (metadata["buffer_window"].asInt() < timeBuffered){ if (updateMeta && metadata["buffer_window"].asInt() < timeBuffered){
metadata["buffer_window"] = (long long int)timeBuffered; metadata["buffer_window"] = (long long int)timeBuffered;
} }
} }
while (buffers.size() > buffercount){ while (buffers.size() > buffercount){
if (keyframes[buffers.begin()->first.trackID].count(buffers.begin()->first)){ if (keyframes[buffers.begin()->first.trackID].count(buffers.begin()->first)){
updateMeta = true;
//if there are < 3 keyframes, throwing one away would mean less than 2 left. //if there are < 3 keyframes, throwing one away would mean less than 2 left.
if (keyframes[buffers.begin()->first.trackID].size() < 3){ if (keyframes[buffers.begin()->first.trackID].size() < 3){
std::cout << "Warning - track " << buffers.begin()->first.trackID << " doesn't have enough keyframes to be reliably served." << std::endl; std::cout << "Warning - track " << buffers.begin()->first.trackID << " doesn't have enough keyframes to be reliably served." << std::endl;
@ -332,7 +335,7 @@ void DTSC::Stream::addPacket(JSON::Value & newPack){
} }
buffers.erase(buffers.begin()); buffers.erase(buffers.begin());
} }
if (buffercount > 1){ if (updateMeta){
metadata.netPrepare(); metadata.netPrepare();
} }
} }