Full DVR support using HTTP Dynamic for live streams.
This commit is contained in:
parent
ab83b7514e
commit
473d5d1a7f
2 changed files with 10 additions and 11 deletions
|
@ -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);
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Add table
Reference in a new issue