Full DVR support using HTTP Dynamic for live streams.

This commit is contained in:
Thulinma 2013-03-05 12:26:14 +01:00
parent ab83b7514e
commit 473d5d1a7f
2 changed files with 10 additions and 11 deletions

View file

@ -260,7 +260,6 @@ namespace Buffer {
} }
while (buffer_running && SS.connected() && conf.is_active){ while (buffer_running && SS.connected() && conf.is_active){
fprintf(stderr, "Still running\n");
//check for new connections, accept them if there are any //check for new connections, accept them if there are any
//starts a thread for every accepted connection //starts a thread for every accepted connection
incoming = SS.accept(true); incoming = SS.accept(true);

View file

@ -30,21 +30,21 @@ namespace Connector_HTTP {
std::string empty; std::string empty;
MP4::ASRT asrt; MP4::ASRT asrt;
if (starttime == 0 && !metadata.isMember("keynum")){ if (starttime == 0 && metadata.isMember("vod")){
asrt.setUpdate(false); asrt.setUpdate(false);
}else{ }else{
asrt.setUpdate(true); asrt.setUpdate(true);
} }
asrt.setVersion(1); asrt.setVersion(1);
//asrt.setQualityEntry(empty, 0); //asrt.setQualityEntry(empty, 0);
if (metadata.isMember("keynum")){ if (metadata.isMember("live")){
asrt.setSegmentRun(1, 4294967295, 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 && !metadata.isMember("keynum")){ if (starttime == 0 && metadata.isMember("vod")){
afrt.setUpdate(false); afrt.setUpdate(false);
}else{ }else{
afrt.setUpdate(true); afrt.setUpdate(true);
@ -53,13 +53,12 @@ namespace Connector_HTTP {
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("live")){
unsigned long long int firstAvail = metadata["keynum"].size() / 2; for (int i = 0; i < metadata["keynum"].size(); i++){
for (int i = firstAvail; i < metadata["keynum"].size(); 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["keylen"][i].asInt(); afrtrun.duration = metadata["keylen"][i].asInt();
afrt.setFragmentRun(afrtrun, i - firstAvail); afrt.setFragmentRun(afrtrun, i);
} }
}else{ }else{
for (int i = 0; i < metadata["keytime"].size(); i++){ for (int i = 0; i < metadata["keytime"].size(); i++){
@ -80,7 +79,7 @@ namespace Connector_HTTP {
MP4::ABST abst; MP4::ABST abst;
abst.setVersion(1); abst.setVersion(1);
if (metadata.isMember("keynum")){ if (metadata.isMember("live")){
abst.setBootstrapinfoVersion(metadata["keynum"][metadata["keynum"].size() - 2].asInt()); abst.setBootstrapinfoVersion(metadata["keynum"][metadata["keynum"].size() - 2].asInt());
}else{ }else{
abst.setBootstrapinfoVersion(1); abst.setBootstrapinfoVersion(1);
@ -92,7 +91,7 @@ namespace Connector_HTTP {
abst.setUpdate(true); abst.setUpdate(true);
} }
abst.setTimeScale(1000); abst.setTimeScale(1000);
if (metadata.isMember("length") && metadata["length"].asInt() > 0){ if (metadata.isMember("vod")){
abst.setLive(false); abst.setLive(false);
if (metadata["lastms"].asInt()){ if (metadata["lastms"].asInt()){
abst.setCurrentMediaTime(metadata["lastms"].asInt()); abst.setCurrentMediaTime(metadata["lastms"].asInt());
@ -121,7 +120,7 @@ namespace Connector_HTTP {
/// Returns a F4M-format manifest file /// Returns a F4M-format manifest file
std::string BuildManifest(std::string & MovieId, JSON::Value & metadata){ std::string BuildManifest(std::string & MovieId, JSON::Value & metadata){
std::string Result; std::string Result;
if ( !metadata.isMember("keynum")){ if (metadata.isMember("vod")){
Result = Result =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<manifest xmlns=\"http://ns.adobe.com/f4m/1.0\">\n" "<manifest xmlns=\"http://ns.adobe.com/f4m/1.0\">\n"
@ -142,6 +141,7 @@ namespace Connector_HTTP {
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<manifest xmlns=\"http://ns.adobe.com/f4m/1.0\">\n" "<manifest xmlns=\"http://ns.adobe.com/f4m/1.0\">\n"
"<id>" + MovieId + "</id>\n" "<id>" + MovieId + "</id>\n"
"<dvrInfo windowDuration=\"" + metadata["buffer_window"].asString().substr(0, metadata["buffer_window"].asString().size() - 3) + "\"></dvrInfo>"
"<mimeType>video/mp4</mimeType>\n" "<mimeType>video/mp4</mimeType>\n"
"<streamType>live</streamType>\n" "<streamType>live</streamType>\n"
"<deliveryType>streaming</deliveryType>\n" "<deliveryType>streaming</deliveryType>\n"