HTTP Live fixes and optimalisations.

This commit is contained in:
Thulinma 2013-02-11 12:41:34 +01:00
parent 2f4095d7bc
commit b79c41e413

View file

@ -63,8 +63,8 @@ namespace Connector_HTTP {
int lastDuration = 0; int lastDuration = 0;
bool writeOffset = true; bool writeOffset = true;
for (int i = 0; i < fragIndices.size() - 1; i++){ for (int i = 0; i < fragIndices.size() - 1; i++){
Result << "#EXTINF:" << (metadata["keytime"][fragIndices[i + 1]].asInt() - lastDuration) / 1000 << ", no desc\r\n" << fragIndices[i] << "_" Result << "#EXTINF:" << (metadata["keytime"][fragIndices[i + 1]].asInt() - lastDuration) / 1000 << ", no desc\r\n" << fragIndices[i] + 1
<< fragIndices[i + 1] - fragIndices[i] << ".ts\r\n"; << "_" << fragIndices[i + 1] - fragIndices[i] << ".ts\r\n";
lastDuration = metadata["keytime"][fragIndices[i + 1]].asInt(); lastDuration = metadata["keytime"][fragIndices[i + 1]].asInt();
} }
Result << "#EXT-X-ENDLIST"; Result << "#EXT-X-ENDLIST";
@ -288,37 +288,34 @@ 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){
if (PacketNumber == 0){
PackData.DefaultPAT();
TSBuf.write(PackData.ToString(), 188);
PackData.DefaultPMT();
TSBuf.write(PackData.ToString(), 188);
PacketNumber += 2;
}
if (Strm.lastType() == DTSC::VIDEO){ if (Strm.lastType() == DTSC::VIDEO){
DTMIData = Strm.lastData(); DTMIData = Strm.lastData();
IsKeyFrame = Strm.getPacket(0).isMember("keyframe"); IsKeyFrame = Strm.getPacket(0).isMember("keyframe");
std::cout << Strm.getPacket(0)["time"].asInt() << std::endl;
if (IsKeyFrame){ if (IsKeyFrame){
TimeStamp = (Strm.getPacket(0)["time"].asInt() * 27000); TimeStamp = (Strm.getPacket(0)["time"].asInt() * 27000);
} }
int TSType; ToPack += avccbox.asAnnexB();
bool FirstPic = true;
while (DTMIData.size()){ while (DTMIData.size()){
ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) + (DTMIData[2] << 8) + DTMIData[3]; ThisNaluSize = (DTMIData[0] << 24) + (DTMIData[1] << 16) + (DTMIData[2] << 8) + DTMIData[3];
DTMIData.erase(0, 4); //Erase the first four characters; DTMIData.replace(0, 4, TS::NalHeader, 4);
TSType = (int)DTMIData[0] & 0x1F; if (ThisNaluSize + 4 == DTMIData.size()){
if (TSType == 0x05){ ToPack.append(DTMIData);
if (FirstPic){ break;
ToPack += avccbox.asAnnexB(); }else{
FirstPic = false; ToPack.append(DTMIData, 0, ThisNaluSize + 4);
} DTMIData.erase(0, ThisNaluSize + 4);
} }
ToPack.append(TS::NalHeader, 4);
ToPack.append(DTMIData, 0, ThisNaluSize);
DTMIData.erase(0, ThisNaluSize);
} }
WritePesHeader = true; WritePesHeader = true;
while (ToPack.size()){ while (ToPack.size()){
if (PacketNumber == 0){
PackData.DefaultPAT();
TSBuf.write(PackData.ToString(), 188);
PackData.DefaultPMT();
TSBuf.write(PackData.ToString(), 188);
PacketNumber += 2;
}
PackData.Clear(); PackData.Clear();
PackData.PID(0x100); PackData.PID(0x100);
PackData.ContinuityCounter(VideoCounter); PackData.ContinuityCounter(VideoCounter);
@ -331,12 +328,12 @@ namespace Connector_HTTP {
}else{ }else{
PackData.AdaptationField(1); PackData.AdaptationField(1);
} }
PackData.AddStuffing(PackData.BytesFree( ) - (25 + ToPack.size())); PackData.AddStuffing(PackData.BytesFree() - (25 + ToPack.size()));
PackData.PESVideoLeadIn(ToPack.size(), Strm.getPacket(0)["time"].asInt() * 90); PackData.PESVideoLeadIn(ToPack.size(), Strm.getPacket(0)["time"].asInt() * 90);
WritePesHeader = false; WritePesHeader = false;
}else{ }else{
PackData.AdaptationField(1); PackData.AdaptationField(1);
PackData.AddStuffing(PackData.BytesFree( ) - (ToPack.size())); PackData.AddStuffing(PackData.BytesFree() - (ToPack.size()));
} }
PackData.FillFree(ToPack); PackData.FillFree(ToPack);
TSBuf.write(PackData.ToString(), 188); TSBuf.write(PackData.ToString(), 188);
@ -348,26 +345,20 @@ namespace Connector_HTTP {
ToPack = TS::GetAudioHeader(DTMIData.size(), Strm.metadata["audio"]["init"].asString()); ToPack = TS::GetAudioHeader(DTMIData.size(), Strm.metadata["audio"]["init"].asString());
ToPack += DTMIData; ToPack += DTMIData;
while (ToPack.size()){ while (ToPack.size()){
if (PacketNumber == 0){
PackData.DefaultPAT();
TSBuf.write(PackData.ToString(), 188);
PackData.DefaultPMT();
TSBuf.write(PackData.ToString(), 188);
PacketNumber += 2;
}
PackData.Clear(); PackData.Clear();
PackData.PID(0x101); PackData.PID(0x101);
PackData.ContinuityCounter(AudioCounter); PackData.ContinuityCounter(AudioCounter);
AudioCounter++; AudioCounter++;
if (WritePesHeader){ if (WritePesHeader){
PackData.UnitStart(1); PackData.UnitStart(1);
PackData.AddStuffing(PackData.BytesFree( ) - (14 + ToPack.size())); PackData.AddStuffing(PackData.BytesFree() - (14 + ToPack.size()));
PackData.PESAudioLeadIn(ToPack.size(), Strm.getPacket(0)["time"].asInt() * 90); PackData.PESAudioLeadIn(ToPack.size(), Strm.getPacket(0)["time"].asInt() * 90);
WritePesHeader = false; WritePesHeader = false;
}else{ }else{
PackData.AdaptationField(1); PackData.AdaptationField(1);
PackData.AddStuffing(PackData.BytesFree( ) - ToPack.size()); PackData.AddStuffing(PackData.BytesFree() - ToPack.size());
} }
int before = ToPack.size();
PackData.FillFree(ToPack); PackData.FillFree(ToPack);
TSBuf.write(PackData.ToString(), 188); TSBuf.write(PackData.ToString(), 188);
PacketNumber++; PacketNumber++;