HDS live fixed, further improvements to HDS efficiency.

This commit is contained in:
Thulinma 2014-04-30 15:40:33 +02:00
parent 4ad0a661b4
commit ce26adb105

View file

@ -37,7 +37,7 @@ namespace Mist {
if (myMeta.live){ if (myMeta.live){
asrt.setSegmentRun(1, 4294967295ul, 0); asrt.setSegmentRun(1, 4294967295ul, 0);
}else{ }else{
asrt.setSegmentRun(1, myMeta.tracks[tid].keys.size(), 0); asrt.setSegmentRun(1, myMeta.tracks[tid].fragments.size(), 0);
} }
MP4::AFRT afrt; MP4::AFRT afrt;
@ -47,13 +47,22 @@ namespace Mist {
//afrt.setQualityEntry(empty, 0); //afrt.setQualityEntry(empty, 0);
MP4::afrt_runtable afrtrun; MP4::afrt_runtable afrtrun;
int i = 0; int i = 0;
for (std::deque<DTSC::Key>::iterator it = myMeta.tracks[tid].keys.begin(); it != myMeta.tracks[tid].keys.end(); it++){ int j = 0;
if (it->getLength()){ if (myMeta.tracks[tid].fragments.size()){
afrtrun.firstFragment = it->getNumber(); unsigned int firstTime = myMeta.tracks[tid].getKey(myMeta.tracks[tid].fragments.begin()->getNumber()).getTime();
afrtrun.firstTimestamp = it->getTime(); for (std::deque<DTSC::Fragment>::iterator it = myMeta.tracks[tid].fragments.begin(); it != myMeta.tracks[tid].fragments.end(); it++){
afrtrun.duration = it->getLength(); if (myMeta.vod || it->getDuration() > 0){
afrt.setFragmentRun(afrtrun, i); afrtrun.firstFragment = myMeta.tracks[tid].missedFrags + j + 1;
i++; afrtrun.firstTimestamp = myMeta.tracks[tid].getKey(it->getNumber()).getTime() - firstTime;
if (it->getDuration() > 0){
afrtrun.duration = it->getDuration();
}else{
afrtrun.duration = myMeta.tracks[tid].lastms - afrtrun.firstTimestamp;
}
afrt.setFragmentRun(afrtrun, i);
i++;
}
j++;
} }
} }
@ -184,44 +193,30 @@ namespace Mist {
int temp; int temp;
temp = HTTP_R.url.find("Seg") + 3; temp = HTTP_R.url.find("Seg") + 3;
temp = HTTP_R.url.find("Frag") + 4; temp = HTTP_R.url.find("Frag") + 4;
fragNum = atoi(HTTP_R.url.substr(temp).c_str()); fragNum = atoi(HTTP_R.url.substr(temp).c_str()) - 1;
DEBUG_MSG(DLVL_MEDIUM, "Video track %d, fragment %d\n", tid, fragNum); DEBUG_MSG(DLVL_MEDIUM, "Video track %d, fragment %d\n", tid, fragNum);
if (!audioTrack){getTracks();} if (!audioTrack){getTracks();}
unsigned int mstime = 0; unsigned int mstime = 0;
unsigned int mslen = 0; unsigned int mslen = 0;
for (std::deque<DTSC::Key>::iterator it = myMeta.tracks[tid].keys.begin(); it != myMeta.tracks[tid].keys.end(); it++){ if (fragNum < myMeta.tracks[tid].missedFrags){
if (it->getNumber() >= fragNum){ HTTP_S.Clean();
mstime = it->getTime(); HTTP_S.SetBody("The requested fragment is no longer kept in memory on the server and cannot be served.\n");
mslen = it->getLength(); HTTP_S.SendResponse("412", "Fragment out of range", myConn);
if (myMeta.live){ HTTP_R.Clean(); //clean for any possible next requests
if (it == myMeta.tracks[tid].keys.end() - 2){ std::cout << "Fragment " << fragNum << " too old" << std::endl;
HTTP_S.Clean(); continue;
HTTP_S.SetBody("Proxy, re-request this in a second or two.\n");
HTTP_S.SendResponse("208", "Ask again later", myConn);
HTTP_R.Clean(); //clean for any possible next requests
std::cout << "Fragment after fragment " << fragNum << " not available yet" << std::endl;
/*
///\todo patch this back in?
if (ss.spool()){
while (Strm.parsePacket(ss.Received())){}
}
*/
}
}
break;
}
} }
if (HTTP_R.url == "/"){continue;}//Don't continue, but continue instead. if (fragNum > myMeta.tracks[tid].missedFrags + myMeta.tracks[tid].fragments.size() - 1){
if (myMeta.live){ HTTP_S.Clean();
if (mstime == 0 && fragNum > 1){ HTTP_S.SetBody("Proxy, re-request this in a second or two.\n");
HTTP_S.Clean(); HTTP_S.SendResponse("208", "Ask again later", myConn);
HTTP_S.SetBody("The requested fragment is no longer kept in memory on the server and cannot be served.\n"); HTTP_R.Clean(); //clean for any possible next requests
HTTP_S.SendResponse("412", "Fragment out of range", myConn); std::cout << "Fragment after fragment " << fragNum << " not available yet" << std::endl;
HTTP_R.Clean(); //clean for any possible next requests continue;
std::cout << "Fragment " << fragNum << " too old" << std::endl;
continue;
}
} }
mstime = myMeta.tracks[tid].getKey(myMeta.tracks[tid].fragments[fragNum - myMeta.tracks[tid].missedFrags].getNumber()).getTime();
mslen = myMeta.tracks[tid].fragments[fragNum - myMeta.tracks[tid].missedFrags].getDuration();
selectedTracks.clear(); selectedTracks.clear();
selectedTracks.insert(tid); selectedTracks.insert(tid);
selectedTracks.insert(audioTrack); selectedTracks.insert(audioTrack);