Optimizations ported from conn_http_live.cpp to conn_ts.cpp
This commit is contained in:
parent
907001d78b
commit
d4cb56abd1
1 changed files with 66 additions and 98 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
if (Strm.lastType() == DTSC::VIDEO){
|
std::stringstream TSBuf;
|
||||||
DTMIData = Strm.lastData();
|
Socket::Buffer ToPack;
|
||||||
if (Strm.getPacket(0).isMember("keyframe")){
|
//write PAT and PMT TS packets
|
||||||
IsKeyFrame = true;
|
if (PacketNumber == 0){
|
||||||
FirstIDRInKeyFrame = true;
|
PackData.DefaultPAT();
|
||||||
}else{
|
TSBuf.write(PackData.ToString(), 188);
|
||||||
IsKeyFrame = false;
|
PackData.DefaultPMT();
|
||||||
FirstKeyFrame = false;
|
TSBuf.write(PackData.ToString(), 188);
|
||||||
|
PacketNumber += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PIDno = 0;
|
||||||
|
char * ContCounter = 0;
|
||||||
|
if (Strm.lastType() == DTSC::VIDEO){
|
||||||
|
IsKeyFrame = Strm.getPacket(0).isMember("keyframe");
|
||||||
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{
|
}else{
|
||||||
ToPack.append(TS::ShortNalHeader, 3);
|
ToPack.append(Strm.lastData().c_str(), ThisNaluSize + 4);
|
||||||
|
Strm.lastData().erase(0, ThisNaluSize + 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else if (TSType == 0x01){
|
ToPack.prepend(TS::Packet::getPESVideoLeadIn(0ul, Strm.getPacket(0)["time"].asInt() * 90));
|
||||||
if (FirstPic){
|
PIDno = 0x100;
|
||||||
ToPack.append(TS::NalHeader, 4);
|
ContCounter = &VideoCounter;
|
||||||
FirstPic = false;
|
}else if (Strm.lastType() == DTSC::AUDIO){
|
||||||
}else{
|
ToPack.append(TS::GetAudioHeader(Strm.lastData().size(), Strm.metadata["audio"]["init"].asString()));
|
||||||
ToPack.append(TS::ShortNalHeader, 3);
|
ToPack.append(Strm.lastData());
|
||||||
}
|
ToPack.prepend(TS::Packet::getPESAudioLeadIn(ToPack.bytes(1073741824ul), Strm.getPacket(0)["time"].asInt() * 90));
|
||||||
}else{
|
PIDno = 0x101;
|
||||||
ToPack.append(TS::NalHeader, 4);
|
ContCounter = &AudioCounter;
|
||||||
}
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//initial packet
|
||||||
PackData.Clear();
|
PackData.Clear();
|
||||||
PackData.PID(0x100);
|
PackData.PID(PIDno);
|
||||||
PackData.ContinuityCounter(VideoCounter);
|
PackData.ContinuityCounter(( *ContCounter)++);
|
||||||
VideoCounter++;
|
|
||||||
if (WritePesHeader){
|
|
||||||
PackData.UnitStart(1);
|
PackData.UnitStart(1);
|
||||||
if (IsKeyFrame){
|
if (IsKeyFrame){
|
||||||
PackData.RandomAccess(1);
|
PackData.RandomAccess(1);
|
||||||
PackData.PCR(TimeStamp);
|
PackData.PCR(TimeStamp);
|
||||||
}else{
|
|
||||||
PackData.AdaptationField(1);
|
|
||||||
}
|
}
|
||||||
PackData.AddStuffing(184 - (20 + ToPack.size()));
|
unsigned int toSend = PackData.AddStuffing(ToPack.bytes(184));
|
||||||
PackData.PESVideoLeadIn(ToPack.size(), Strm.getPacket(0)["time"].asInt() * 90);
|
std::string gonnaSend = ToPack.remove(toSend);
|
||||||
WritePesHeader = false;
|
PackData.FillFree(gonnaSend);
|
||||||
}else{
|
TSBuf.write(PackData.ToString(), 188);
|
||||||
PackData.AdaptationField(1);
|
|
||||||
PackData.AddStuffing(184 - (ToPack.size()));
|
|
||||||
}
|
|
||||||
PackData.FillFree(ToPack);
|
|
||||||
conn.SendNow(PackData.ToString(), 188);
|
|
||||||
PacketNumber++;
|
PacketNumber++;
|
||||||
}
|
|
||||||
}else if (Strm.lastType() == DTSC::AUDIO){
|
//rest of packets
|
||||||
WritePesHeader = true;
|
|
||||||
DTMIData = Strm.lastData();
|
|
||||||
ToPack = TS::GetAudioHeader(DTMIData.size(), Strm.metadata["audio"]["init"].asString());
|
|
||||||
ToPack += DTMIData;
|
|
||||||
while (ToPack.size()){
|
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.Clear();
|
||||||
PackData.PID(0x101);
|
PackData.PID(PIDno);
|
||||||
PackData.ContinuityCounter(AudioCounter);
|
PackData.ContinuityCounter(( *ContCounter)++);
|
||||||
AudioCounter++;
|
toSend = PackData.AddStuffing(ToPack.bytes(184));
|
||||||
if (WritePesHeader){
|
gonnaSend = ToPack.remove(toSend);
|
||||||
PackData.UnitStart(1);
|
PackData.FillFree(gonnaSend);
|
||||||
PackData.AddStuffing(184 - (14 + ToPack.size()));
|
TSBuf.write(PackData.ToString(), 188);
|
||||||
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++;
|
PacketNumber++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TSBuf.flush();
|
||||||
|
if (TSBuf.str().size()){
|
||||||
|
conn.SendNow(TSBuf.str().c_str(), TSBuf.str().size());
|
||||||
|
TSBuf.str("");
|
||||||
}
|
}
|
||||||
|
TSBuf.str("");
|
||||||
|
PacketNumber = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue