Added timestamp rewriting to HTTP Dynamic for live streams.

This commit is contained in:
Thulinma 2012-08-24 17:13:06 +02:00
parent 86a7d74768
commit fb2d022800

View file

@ -30,8 +30,9 @@ namespace Connector_HTTP{
afrt.SetUpdate(false); afrt.SetUpdate(false);
afrt.SetTimeScale(1000); afrt.SetTimeScale(1000);
afrt.AddQualityEntry(""); afrt.AddQualityEntry("");
if (!metadata.isMember("video") || !metadata["video"].isMember("keyms")){ if (!metadata.isMember("video") || !metadata["video"].isMember("keyms") || metadata["video"]["keyms"].asInt() == 0){
afrt.AddFragmentRunEntry(1, 0, 1000); //FirstFragment, FirstFragmentTimestamp,Fragment Duration in milliseconds //metadata["lasttime"].asInt()?
afrt.AddFragmentRunEntry(1, 0, 2000); //FirstFragment, FirstFragmentTimestamp,Fragment Duration in milliseconds
}else{ }else{
afrt.AddFragmentRunEntry(1, 0, metadata["video"]["keyms"].asInt()); //FirstFragment, FirstFragmentTimestamp,Fragment Duration in milliseconds afrt.AddFragmentRunEntry(1, 0, metadata["video"]["keyms"].asInt()); //FirstFragment, FirstFragmentTimestamp,Fragment Duration in milliseconds
} }
@ -53,7 +54,7 @@ namespace Connector_HTTP{
abst.SetMediaTime(1000*metadata["length"].asInt()); abst.SetMediaTime(1000*metadata["length"].asInt());
}else{ }else{
abst.SetLive(true); abst.SetLive(true);
abst.SetMediaTime(0xFFFFFFFF); abst.SetMediaTime(0xFFFFFFFF);//metadata["lasttime"].asInt()?
} }
abst.SetUpdate(false); abst.SetUpdate(false);
abst.SetTimeScale(1000); abst.SetTimeScale(1000);
@ -67,6 +68,7 @@ namespace Connector_HTTP{
std::string Result; std::string Result;
Result.append((char*)abst.GetBoxedData(), (int)abst.GetBoxedDataSize()); Result.append((char*)abst.GetBoxedData(), (int)abst.GetBoxedDataSize());
std::cout << "Sending bootstrap:" << std::endl << abst.toPrettyString(0) << std::endl;
return Base64::encode(Result); return Base64::encode(Result);
} }
@ -120,7 +122,6 @@ namespace Connector_HTTP{
FLV::Tag tag;///< Temporary tag buffer. FLV::Tag tag;///< Temporary tag buffer.
std::string recBuffer = ""; std::string recBuffer = "";
std::string Movie;
std::string Quality; std::string Quality;
int Segment = -1; int Segment = -1;
int ReqFragment = -1; int ReqFragment = -1;
@ -197,12 +198,22 @@ namespace Connector_HTTP{
} }
if (ss.spool() || ss.Received() != ""){ if (ss.spool() || ss.Received() != ""){
if (Strm.parsePacket(ss.Received())){ if (Strm.parsePacket(ss.Received())){
if (Strm.getPacket(0).isMember("time")){
if (!Strm.metadata.isMember("firsttime")){
Strm.metadata["firsttime"] = Strm.getPacket(0)["time"];
}else{
if (!Strm.metadata.isMember("length") || Strm.metadata["length"].asInt() == 0){
Strm.getPacket(0)["time"] = Strm.getPacket(0)["time"].asInt() - Strm.metadata["firsttime"].asInt();
}
}
Strm.metadata["lasttime"] = Strm.getPacket(0)["time"];
}
tag.DTSCLoader(Strm); tag.DTSCLoader(Strm);
if (pending_manifest){ if (pending_manifest){
HTTP_S.Clean(); HTTP_S.Clean();
HTTP_S.SetHeader("Content-Type","text/xml"); HTTP_S.SetHeader("Content-Type","text/xml");
HTTP_S.SetHeader("Cache-Control","no-cache"); HTTP_S.SetHeader("Cache-Control","no-cache");
std::string manifest = BuildManifest(Movie, Strm.metadata); std::string manifest = BuildManifest(streamname, Strm.metadata);
HTTP_S.SetBody(manifest); HTTP_S.SetBody(manifest);
conn.Send(HTTP_S.BuildResponse("200", "OK")); conn.Send(HTTP_S.BuildResponse("200", "OK"));
#if DEBUG >= 3 #if DEBUG >= 3