~5-10 times speedup in HLS protocol handling

This commit is contained in:
Thulinma 2013-03-12 16:21:17 +01:00
parent be34419da0
commit 3b98ac6547

View file

@ -74,6 +74,9 @@ namespace Connector_HTTP {
} }
Result << "#EXT-X-ENDLIST"; Result << "#EXT-X-ENDLIST";
}else{ }else{
if (metadata["missed_frags"].asInt() < 0){
metadata["missed_frags"] = 0ll;
}
Result << "#EXTM3U\r\n" Result << "#EXTM3U\r\n"
"#EXT-X-MEDIA-SEQUENCE:" << metadata["missed_frags"].asInt() <<"\r\n" "#EXT-X-MEDIA-SEQUENCE:" << metadata["missed_frags"].asInt() <<"\r\n"
"#EXT-X-TARGETDURATION:30\r\n"; "#EXT-X-TARGETDURATION:30\r\n";
@ -103,7 +106,6 @@ namespace Connector_HTTP {
std::string streamname; std::string streamname;
std::string recBuffer = ""; std::string recBuffer = "";
std::string ToPack;
TS::Packet PackData; TS::Packet PackData;
int PacketNumber = 0; int PacketNumber = 0;
long long unsigned int TimeStamp = 0; long long unsigned int TimeStamp = 0;
@ -252,7 +254,7 @@ namespace Connector_HTTP {
if ( !receive_marks && Strm.metadata.isMember("length")){ if ( !receive_marks && Strm.metadata.isMember("length")){
receive_marks = true; receive_marks = true;
} }
if ((Strm.getPacket(0).isMember("keyframe") && !receive_marks) || Strm.lastType() == DTSC::PAUSEMARK){ if (Strm.lastType() == DTSC::PAUSEMARK){
TSBuf.flush(); TSBuf.flush();
if (Flash_RequestPending > 0 && TSBuf.str().size()){ if (Flash_RequestPending > 0 && TSBuf.str().size()){
HTTP_S.Clean(); HTTP_S.Clean();
@ -274,6 +276,7 @@ namespace Connector_HTTP {
haveAvcc = true; haveAvcc = true;
} }
if (Strm.lastType() == DTSC::VIDEO || Strm.lastType() == DTSC::AUDIO){ if (Strm.lastType() == DTSC::VIDEO || Strm.lastType() == DTSC::AUDIO){
Socket::Buffer ToPack;
//write PAT and PMT TS packets //write PAT and PMT TS packets
if (PacketNumber == 0){ if (PacketNumber == 0){
PackData.DefaultPAT(); PackData.DefaultPAT();
@ -290,7 +293,7 @@ namespace Connector_HTTP {
if (IsKeyFrame){ if (IsKeyFrame){
TimeStamp = (Strm.getPacket(0)["time"].asInt() * 27000); TimeStamp = (Strm.getPacket(0)["time"].asInt() * 27000);
} }
ToPack += avccbox.asAnnexB(); ToPack.append(avccbox.asAnnexB());
while (Strm.lastData().size()){ while (Strm.lastData().size()){
ThisNaluSize = (Strm.lastData()[0] << 24) + (Strm.lastData()[1] << 16) + (Strm.lastData()[2] << 8) + Strm.lastData()[3]; ThisNaluSize = (Strm.lastData()[0] << 24) + (Strm.lastData()[1] << 16) + (Strm.lastData()[2] << 8) + Strm.lastData()[3];
Strm.lastData().replace(0, 4, TS::NalHeader, 4); Strm.lastData().replace(0, 4, TS::NalHeader, 4);
@ -298,17 +301,17 @@ namespace Connector_HTTP {
ToPack.append(Strm.lastData()); ToPack.append(Strm.lastData());
break; break;
}else{ }else{
ToPack.append(Strm.lastData(), 0, ThisNaluSize + 4); ToPack.append(Strm.lastData().c_str(), ThisNaluSize + 4);
Strm.lastData().erase(0, ThisNaluSize + 4); Strm.lastData().erase(0, ThisNaluSize + 4);
} }
} }
TS::Packet::PESVideoLeadIn(ToPack, Strm.getPacket(0)["time"].asInt() * 90); ToPack.prepend(TS::Packet::getPESVideoLeadIn(0ul, Strm.getPacket(0)["time"].asInt() * 90));
PIDno = 0x100; PIDno = 0x100;
ContCounter = &VideoCounter; ContCounter = &VideoCounter;
}else if (Strm.lastType() == DTSC::AUDIO){ }else if (Strm.lastType() == DTSC::AUDIO){
ToPack = TS::GetAudioHeader(Strm.lastData().size(), Strm.metadata["audio"]["init"].asString()); ToPack.append(TS::GetAudioHeader(Strm.lastData().size(), Strm.metadata["audio"]["init"].asString()));
ToPack += Strm.lastData(); ToPack.append(Strm.lastData());
TS::Packet::PESAudioLeadIn(ToPack, Strm.getPacket(0)["time"].asInt() * 90); ToPack.prepend(TS::Packet::getPESAudioLeadIn(ToPack.bytes(1073741824ul), Strm.getPacket(0)["time"].asInt() * 90));
PIDno = 0x101; PIDno = 0x101;
ContCounter = &AudioCounter; ContCounter = &AudioCounter;
} }
@ -322,8 +325,9 @@ namespace Connector_HTTP {
PackData.RandomAccess(1); PackData.RandomAccess(1);
PackData.PCR(TimeStamp); PackData.PCR(TimeStamp);
} }
PackData.AddStuffing(PackData.BytesFree() - ToPack.size()); unsigned int toSend = PackData.AddStuffing(ToPack.bytes(184));
PackData.FillFree(ToPack); std::string gonnaSend = ToPack.remove(toSend);
PackData.FillFree(gonnaSend);
TSBuf.write(PackData.ToString(), 188); TSBuf.write(PackData.ToString(), 188);
PacketNumber++; PacketNumber++;
@ -332,8 +336,9 @@ namespace Connector_HTTP {
PackData.Clear(); PackData.Clear();
PackData.PID(PIDno); PackData.PID(PIDno);
PackData.ContinuityCounter(( *ContCounter)++); PackData.ContinuityCounter(( *ContCounter)++);
PackData.AddStuffing(PackData.BytesFree() - ToPack.size()); toSend = PackData.AddStuffing(ToPack.bytes(184));
PackData.FillFree(ToPack); gonnaSend = ToPack.remove(toSend);
PackData.FillFree(gonnaSend);
TSBuf.write(PackData.ToString(), 188); TSBuf.write(PackData.ToString(), 188);
PacketNumber++; PacketNumber++;
} }