Optimizations ported from conn_http_live.cpp to conn_ts.cpp

This commit is contained in:
Erik Zandvliet 2013-03-21 16:08:30 +01:00 committed by Thulinma
parent 907001d78b
commit d4cb56abd1

View file

@ -62,113 +62,81 @@ int TS_Handler(Socket::Connection conn, std::string streamname){
avccbox.setPayload(Strm.metadata["video"]["init"].asString()); avccbox.setPayload(Strm.metadata["video"]["init"].asString());
haveAvcc = true; haveAvcc = true;
} }
std::stringstream TSBuf;
Socket::Buffer ToPack;
//write PAT and PMT TS packets
if (PacketNumber == 0){
PackData.DefaultPAT();
TSBuf.write(PackData.ToString(), 188);
PackData.DefaultPMT();
TSBuf.write(PackData.ToString(), 188);
PacketNumber += 2;
}
int PIDno = 0;
char * ContCounter = 0;
if (Strm.lastType() == DTSC::VIDEO){ if (Strm.lastType() == DTSC::VIDEO){
DTMIData = Strm.lastData(); IsKeyFrame = Strm.getPacket(0).isMember("keyframe");
if (Strm.getPacket(0).isMember("keyframe")){
IsKeyFrame = true;
FirstIDRInKeyFrame = true;
}else{
IsKeyFrame = false;
FirstKeyFrame = false;
}
if (IsKeyFrame){ if (IsKeyFrame){
TimeStamp = (Strm.getPacket(0)["time"].asInt() * 27000); TimeStamp = (Strm.getPacket(0)["time"].asInt() * 27000);
} }
int TSType; ToPack.append(avccbox.asAnnexB());
bool FirstPic = true; while (Strm.lastData().size()){
while (DTMIData.size()){ ThisNaluSize = (Strm.lastData()[0] << 24) + (Strm.lastData()[1] << 16) + (Strm.lastData()[2] << 8) + Strm.lastData()[3];
ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) + (DTMIData[2] << 8) + DTMIData[3]; Strm.lastData().replace(0, 4, TS::NalHeader, 4);
DTMIData.erase(0, 4); //Erase the first four characters; if (ThisNaluSize + 4 == Strm.lastData().size()){
TSType = (int)DTMIData[0] & 0x1F; ToPack.append(Strm.lastData());
if (TSType == 0x05){ break;
if (FirstPic){
ToPack += avccbox.asAnnexB();
FirstPic = false;
}
if (IsKeyFrame){
if ( !FirstKeyFrame && FirstIDRInKeyFrame){
ToPack.append(TS::NalHeader, 4);
FirstIDRInKeyFrame = false;
}else{
ToPack.append(TS::ShortNalHeader, 3);
}
}
}else if (TSType == 0x01){
if (FirstPic){
ToPack.append(TS::NalHeader, 4);
FirstPic = false;
}else{
ToPack.append(TS::ShortNalHeader, 3);
}
}else{ }else{
ToPack.append(TS::NalHeader, 4); ToPack.append(Strm.lastData().c_str(), ThisNaluSize + 4);
Strm.lastData().erase(0, ThisNaluSize + 4);
} }
ToPack.append(DTMIData, 0, ThisNaluSize);
DTMIData.erase(0, ThisNaluSize);
}
WritePesHeader = true;
while (ToPack.size()){
if ((PacketNumber % 42) == 0){
PackData.DefaultPAT();
conn.SendNow(PackData.ToString(), 188);
PackData.DefaultPMT();
conn.SendNow(PackData.ToString(), 188);
PacketNumber += 2;
}
PackData.Clear();
PackData.PID(0x100);
PackData.ContinuityCounter(VideoCounter);
VideoCounter++;
if (WritePesHeader){
PackData.UnitStart(1);
if (IsKeyFrame){
PackData.RandomAccess(1);
PackData.PCR(TimeStamp);
}else{
PackData.AdaptationField(1);
}
PackData.AddStuffing(184 - (20 + ToPack.size()));
PackData.PESVideoLeadIn(ToPack.size(), Strm.getPacket(0)["time"].asInt() * 90);
WritePesHeader = false;
}else{
PackData.AdaptationField(1);
PackData.AddStuffing(184 - (ToPack.size()));
}
PackData.FillFree(ToPack);
conn.SendNow(PackData.ToString(), 188);
PacketNumber++;
} }
ToPack.prepend(TS::Packet::getPESVideoLeadIn(0ul, Strm.getPacket(0)["time"].asInt() * 90));
PIDno = 0x100;
ContCounter = &VideoCounter;
}else if (Strm.lastType() == DTSC::AUDIO){ }else if (Strm.lastType() == DTSC::AUDIO){
WritePesHeader = true; ToPack.append(TS::GetAudioHeader(Strm.lastData().size(), Strm.metadata["audio"]["init"].asString()));
DTMIData = Strm.lastData(); ToPack.append(Strm.lastData());
ToPack = TS::GetAudioHeader(DTMIData.size(), Strm.metadata["audio"]["init"].asString()); ToPack.prepend(TS::Packet::getPESAudioLeadIn(ToPack.bytes(1073741824ul), Strm.getPacket(0)["time"].asInt() * 90));
ToPack += DTMIData; PIDno = 0x101;
while (ToPack.size()){ ContCounter = &AudioCounter;
if ((PacketNumber % 42) == 0){
PackData.DefaultPAT();
conn.SendNow(PackData.ToString(), 188);
PackData.DefaultPMT();
conn.SendNow(PackData.ToString(), 188);
PacketNumber += 2;
}
PackData.Clear();
PackData.PID(0x101);
PackData.ContinuityCounter(AudioCounter);
AudioCounter++;
if (WritePesHeader){
PackData.UnitStart(1);
PackData.AddStuffing(184 - (14 + ToPack.size()));
PackData.PESAudioLeadIn(ToPack.size(), Strm.getPacket(0)["time"].asInt() * 90);
WritePesHeader = false;
}else{
PackData.AdaptationField(1);
PackData.AddStuffing(184 - (ToPack.size()));
}
PackData.FillFree(ToPack);
conn.SendNow(PackData.ToString(), 188);
PacketNumber++;
}
} }
//initial packet
PackData.Clear();
PackData.PID(PIDno);
PackData.ContinuityCounter(( *ContCounter)++);
PackData.UnitStart(1);
if (IsKeyFrame){
PackData.RandomAccess(1);
PackData.PCR(TimeStamp);
}
unsigned int toSend = PackData.AddStuffing(ToPack.bytes(184));
std::string gonnaSend = ToPack.remove(toSend);
PackData.FillFree(gonnaSend);
TSBuf.write(PackData.ToString(), 188);
PacketNumber++;
//rest of packets
while (ToPack.size()){
PackData.Clear();
PackData.PID(PIDno);
PackData.ContinuityCounter(( *ContCounter)++);
toSend = PackData.AddStuffing(ToPack.bytes(184));
gonnaSend = ToPack.remove(toSend);
PackData.FillFree(gonnaSend);
TSBuf.write(PackData.ToString(), 188);
PacketNumber++;
}
TSBuf.flush();
if (TSBuf.str().size()){
conn.SendNow(TSBuf.str().c_str(), TSBuf.str().size());
TSBuf.str("");
}
TSBuf.str("");
PacketNumber = 0;
} }
} }
} }