From 3949f6282c49f59c9ae5b3c8a149358f452eeabf Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 24 Aug 2012 12:09:19 +0200 Subject: [PATCH] Added support for VoD manifests and fix HTTPDynamic loading. --- src/conn_http_dynamic.cpp | 72 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/src/conn_http_dynamic.cpp b/src/conn_http_dynamic.cpp index 6d26fec1..02439bba 100644 --- a/src/conn_http_dynamic.cpp +++ b/src/conn_http_dynamic.cpp @@ -20,22 +20,86 @@ #include #include #include +#include /// Holds everything unique to HTTP Dynamic Connector. namespace Connector_HTTP{ + std::string GenerateBootstrap(std::string & MovieId, JSON::Value & metadata){ + MP4::AFRT afrt; + afrt.SetUpdate(false); + afrt.SetTimeScale(1000); + afrt.AddQualityEntry(""); + if (!metadata.isMember("video") || !metadata["video"].isMember("keyms")){ + afrt.AddFragmentRunEntry(1, 0, 1000); //FirstFragment, FirstFragmentTimestamp,Fragment Duration in milliseconds + }else{ + afrt.AddFragmentRunEntry(1, 0, metadata["video"]["keyms"].asInt()); //FirstFragment, FirstFragmentTimestamp,Fragment Duration in milliseconds + } + afrt.WriteContent(); + + MP4::ASRT asrt; + asrt.SetUpdate(false); + asrt.AddQualityEntry(""); + asrt.AddSegmentRunEntry(1, 199);//1 Segment, 199 Fragments + asrt.WriteContent(); + + MP4::ABST abst; + abst.AddFragmentRunTable(&afrt); + abst.AddSegmentRunTable(&asrt); + abst.SetBootstrapVersion(1); + abst.SetProfile(0); + if (metadata.isMember("length")){ + abst.SetLive(false); + abst.SetMediaTime(1000*metadata["length"].asInt()); + }else{ + abst.SetLive(true); + abst.SetMediaTime(0); + } + abst.SetUpdate(false); + abst.SetTimeScale(1000); + abst.SetSMPTE(0); + abst.SetMovieIdentifier(MovieId); + abst.SetDRM(""); + abst.SetMetaData(""); + abst.AddServerEntry(""); + abst.AddQualityEntry(""); + abst.WriteContent(); + + std::string Result; + Result.append((char*)abst.GetBoxedData(), (int)abst.GetBoxedDataSize()); + return Base64::encode(Result); + } + + /// Returns a F4M-format manifest file - std::string BuildManifest(std::string MovieId, JSON::Value & metadata) { - std::string Result="\n" + std::string BuildManifest(std::string & MovieId, JSON::Value & metadata){ + std::string Result; + if (metadata.isMember("length") && metadata["length"].asInt() > 0){ + std::stringstream st; + st << ((double)metadata["video"]["keyms"].asInt() / 1000); + Result="\n" + "\n" + "" + MovieId + "\n" + "" + metadata["length"].asString() + "\n" + "video/mp4\n" + "recorded\n" + "streaming\n" + "\n" + "" + GenerateBootstrap(MovieId, metadata) + "\n" + "\n" + "\n"; + }else{ + Result="\n" "\n" "" + MovieId + "\n" "video/mp4\n" "live\n" "streaming\n" "" + Base64::encode(MP4::GenerateLiveBootstrap(metadata)) + "\n" - "\n" - "\n" + "\n" "\n"; + } + std::cerr << "Sending this manifest:" << std::endl << Result << std::endl; return Result; }//BuildManifest