~5-10 times speedup in HLS protocol handling
This commit is contained in:
parent
be34419da0
commit
3b98ac6547
1 changed files with 17 additions and 12 deletions
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue