Several HTTP Dynamic fixes/improvements - though no working live yet...

This commit is contained in:
Thulinma 2013-03-04 16:17:50 +01:00
parent fc6868fd46
commit 1ad7e29238

View file

@ -30,32 +30,32 @@ namespace Connector_HTTP {
std::string empty; std::string empty;
MP4::ASRT asrt; MP4::ASRT asrt;
if (starttime == 0){ if (starttime == 0 && !metadata.isMember("keynum")){
asrt.setUpdate(false); asrt.setUpdate(false);
}else{ }else{
asrt.setUpdate(true); asrt.setUpdate(true);
} }
asrt.setVersion(0); //1 asrt.setVersion(1);
//asrt.setQualityEntry(empty, 0); //asrt.setQualityEntry(empty, 0);
if (metadata.isMember("keynum")){ if (metadata.isMember("keynum")){
asrt.setSegmentRun(1, -1, 0); asrt.setSegmentRun(1, 4294967295, 0);
}else{ }else{
asrt.setSegmentRun(1, metadata["keytime"].size(), 0); asrt.setSegmentRun(1, metadata["keytime"].size(), 0);
} }
MP4::AFRT afrt; MP4::AFRT afrt;
if (starttime == 0){ if (starttime == 0 && !metadata.isMember("keynum")){
afrt.setUpdate(false); afrt.setUpdate(false);
}else{ }else{
afrt.setUpdate(true); afrt.setUpdate(true);
} }
afrt.setVersion(0); //1 afrt.setVersion(1);
afrt.setTimeScale(1000); afrt.setTimeScale(1000);
//afrt.setQualityEntry(empty, 0); //afrt.setQualityEntry(empty, 0);
MP4::afrt_runtable afrtrun; MP4::afrt_runtable afrtrun;
if (metadata.isMember("keynum")){ if (metadata.isMember("keynum")){
unsigned long long int firstAvail = metadata["keynum"].size() / 2; unsigned long long int firstAvail = metadata["keynum"].size() / 2;
for (int i = firstAvail; i < metadata["keynum"].size() - 2; i++){ for (int i = firstAvail; i < metadata["keynum"].size() - 1; i++){
afrtrun.firstFragment = metadata["keynum"][i].asInt(); afrtrun.firstFragment = metadata["keynum"][i].asInt();
afrtrun.firstTimestamp = metadata["keytime"][i].asInt(); afrtrun.firstTimestamp = metadata["keytime"][i].asInt();
afrtrun.duration = metadata["keytime"][i + 1].asInt() - metadata["keytime"][i].asInt(); afrtrun.duration = metadata["keytime"][i + 1].asInt() - metadata["keytime"][i].asInt();
@ -79,9 +79,9 @@ namespace Connector_HTTP {
} }
MP4::ABST abst; MP4::ABST abst;
abst.setVersion(0); abst.setVersion(1);
if (metadata.isMember("keynum")){ if (metadata.isMember("keynum")){
abst.setBootstrapinfoVersion(metadata["keynum"][0u].asInt()); abst.setBootstrapinfoVersion(metadata["keynum"][metadata["keynum"].size() - 2].asInt());
}else{ }else{
abst.setBootstrapinfoVersion(1); abst.setBootstrapinfoVersion(1);
} }
@ -100,8 +100,8 @@ namespace Connector_HTTP {
abst.setCurrentMediaTime(1000 * metadata["length"].asInt()); abst.setCurrentMediaTime(1000 * metadata["length"].asInt());
} }
}else{ }else{
abst.setLive(true); abst.setLive(false);
abst.setCurrentMediaTime(metadata["lastms"].asInt()); abst.setCurrentMediaTime(metadata["keytime"][metadata["keytime"].size() - 2].asInt());
} }
abst.setSmpteTimeCodeOffset(0); abst.setSmpteTimeCodeOffset(0);
abst.setMovieIdentifier(MovieId); abst.setMovieIdentifier(MovieId);
@ -202,7 +202,6 @@ namespace Connector_HTTP {
if (HTTP_R.Read(conn.Received().get())){ if (HTTP_R.Read(conn.Received().get())){
#if DEBUG >= 4 #if DEBUG >= 4
std::cout << "Received request: " << HTTP_R.getUrl() << std::endl; std::cout << "Received request: " << HTTP_R.getUrl() << std::endl;
std::cout << "Received request: " << HTTP_R.BuildRequest() << std::endl;
#endif #endif
conn.setHost(HTTP_R.GetHeader("X-Origin")); conn.setHost(HTTP_R.GetHeader("X-Origin"));
streamname = HTTP_R.GetHeader("X-Stream"); streamname = HTTP_R.GetHeader("X-Stream");
@ -229,6 +228,8 @@ namespace Connector_HTTP {
if (HTTP_R.url.find(".bootstrap") != std::string::npos){ if (HTTP_R.url.find(".bootstrap") != std::string::npos){
HTTP_S.Clean(); HTTP_S.Clean();
HTTP_S.SetBody(GenerateBootstrap(streamname, Strm.metadata, 1, 0, 0)); HTTP_S.SetBody(GenerateBootstrap(streamname, Strm.metadata, 1, 0, 0));
HTTP_S.SetHeader("Content-Type", "binary/octet");
HTTP_S.SetHeader("Cache-Control", "no-cache");
conn.SendNow(HTTP_S.BuildResponse("200", "OK")); conn.SendNow(HTTP_S.BuildResponse("200", "OK"));
HTTP_R.Clean(); //clean for any possible next requests HTTP_R.Clean(); //clean for any possible next requests
continue; continue;