Generalized PMT generation across all TS-based protocols.

This commit is contained in:
Thulinma 2015-02-12 15:28:57 +01:00
parent 4e50f13d03
commit aa6e07c2bd
3 changed files with 35 additions and 119 deletions

View file

@ -112,47 +112,6 @@ namespace Mist {
capa["methods"][0u]["priority"] = 9ll;
}
///this function generates the PMT packet
std::string OutHLS::createPMT(){
TS::ProgramMappingTable PMT;
PMT.PID(4096);
PMT.setTableId(2);
PMT.setSectionLength(0xB017);
PMT.setProgramNumber(1);
PMT.setVersionNumber(0);
PMT.setCurrentNextIndicator(0);
PMT.setSectionNumber(0);
PMT.setLastSectionNumber(0);
int vidTrack = -1;
for (std::set<unsigned long>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
if (myMeta.tracks[*it].type == "video"){
vidTrack = *it;
break;
}
}
if (vidTrack == -1){
vidTrack = *(selectedTracks.begin());
}
PMT.setPCRPID(0x100 + vidTrack - 1);
PMT.setProgramInfoLength(0);
short id = 0;
//for all selected tracks
for (std::set<long unsigned int>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
if (myMeta.tracks[*it].codec == "H264"){
PMT.setStreamType(0x1B,id);
}else if (myMeta.tracks[*it].codec == "AAC"){
PMT.setStreamType(0x0F,id);
}else if (myMeta.tracks[*it].codec == "MP3"){
PMT.setStreamType(0x03,id);
}
PMT.setElementaryPID(0x100 + (*it) - 1, id);
PMT.setESInfoLength(0,id);
id++;
}
PMT.calcCRC();
return PMT.getStrBuf();
}
void OutHLS::fillPacket(bool & first, const char * data, size_t dataLen, char & ContCounter){
static std::map<int, int> contCounter;
static unsigned int lastPCR = 0;
@ -162,7 +121,7 @@ namespace Mist {
tmpPack.FromPointer(TS::PAT);
tmpPack.ContinuityCounter(++contCounter[tmpPack.PID()]);
H.Chunkify(tmpPack.ToString(), 188, myConn);
tmpPack.FromPointer(createPMT().c_str());
tmpPack.FromPointer(TS::createPMT(selectedTracks, myMeta).c_str());
tmpPack.ContinuityCounter(++contCounter[tmpPack.PID()]);
H.Chunkify(tmpPack.ToString(), 188, myConn);
PacketNumber += 2;
@ -220,7 +179,6 @@ namespace Mist {
fillPacket(first, "\000\000\000\001\011\360", 6, VideoCounter);
}
if (currentPacket.getInt("keyframe")){
if (!haveAvcc){
avccbox.setPayload(myMeta.tracks[currentPacket.getTrackId()].init);
@ -246,14 +204,22 @@ namespace Mist {
fillPacket(first, 0, 0, VideoCounter);
}
}else if (myMeta.tracks[currentPacket.getTrackId()].type == "audio"){
long long unsigned int tempTime;
if (AppleCompat){
bs = TS::Packet::getPESAudioLeadIn(7+dataLen, lastVid);
tempTime = lastVid;
}else{
bs = TS::Packet::getPESAudioLeadIn(7+dataLen, currentPacket.getTime() * 90);
tempTime = currentPacket.getTime() * 90;
}
long unsigned int tempLen = dataLen;
if ( myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){
tempLen += 7;
}
bs = TS::Packet::getPESAudioLeadIn(tempLen, tempTime);
fillPacket(first, bs.data(), bs.size(), AudioCounter);
bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init);
fillPacket(first, bs.data(), bs.size(), AudioCounter);
if (myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){
bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init);
fillPacket(first, bs.data(), bs.size(), AudioCounter);
}
fillPacket(first, dataPointer,dataLen, AudioCounter);
if (PackData.BytesFree() < 184){
PackData.AddStuffing();

View file

@ -27,43 +27,11 @@ namespace Mist {
capa["methods"][0u]["priority"] = 1ll;
}
///this function generates the PMT packet
std::string OutHTTPTS::createPMT(){
TS::ProgramMappingTable PMT;
PMT.PID(4096);
PMT.setTableId(2);
PMT.setSectionLength(0xB017);
PMT.setProgramNumber(1);
PMT.setVersionNumber(0);
PMT.setCurrentNextIndicator(0);
PMT.setSectionNumber(0);
PMT.setLastSectionNumber(0);
PMT.setPCRPID(0x100 + (*(selectedTracks.begin())) - 1);
PMT.setProgramInfoLength(0);
short id = 0;
//for all selected tracks
for (std::set<long unsigned int>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
if (myMeta.tracks[*it].codec == "H264"){
PMT.setStreamType(0x1B,id);
}else if (myMeta.tracks[*it].codec == "AAC"){
PMT.setStreamType(0x0F,id);
}else if (myMeta.tracks[*it].codec == "MP3"){
PMT.setStreamType(0x03,id);
}
PMT.setElementaryPID(0x100 + (*it) - 1, id);
PMT.setESInfoLength(0,id);
id++;
}
PMT.calcCRC();
return PMT.getStrBuf();
}
void OutHTTPTS::fillPacket(bool & first, const char * data, size_t dataLen, char & ContCounter){
if (!PackData.BytesFree()){
if (PacketNumber % 42 == 0){
H.Chunkify(TS::PAT, 188, myConn);
std::string PMT = createPMT();
H.Chunkify(PMT, myConn);
H.Chunkify(TS::createPMT(selectedTracks, myMeta), myConn);
PacketNumber += 2;
}
H.Chunkify(PackData.ToString(), 188, myConn);
@ -127,10 +95,16 @@ namespace Mist {
fillPacket(first, 0, 0, VideoCounter);
}
}else if (myMeta.tracks[currentPacket.getTrackId()].type == "audio"){
bs = TS::Packet::getPESAudioLeadIn(7+dataLen, currentPacket.getTime() * 90);
fillPacket(first, bs.data(), bs.size(), AudioCounter);
bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init);
unsigned int tempLen = dataLen;
if ( myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){
tempLen += 7;
}
bs = TS::Packet::getPESAudioLeadIn(tempLen, currentPacket.getTime() * 90);
fillPacket(first, bs.data(), bs.size(), AudioCounter);
if (myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){
bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init);
fillPacket(first, bs.data(), bs.size(), AudioCounter);
}
ContCounter = &AudioCounter;
fillPacket(first, dataPointer,dataLen, AudioCounter);
if (PackData.BytesFree() < 184){

View file

@ -119,10 +119,17 @@ namespace Mist {
i += ThisNaluSize+4;
}
}else if (myMeta.tracks[currentPacket.getTrackId()].type == "audio"){
bs = TS::Packet::getPESAudioLeadIn(7+dataLen, currentPacket.getTime() * 90);
fillPacket(first, bs.data(), bs.size(),AudioCounter);
bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init);
unsigned int tempLen = dataLen;
if (myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){
tempLen += 7;
}
bs = TS::Packet::getPESAudioLeadIn(tempLen, currentPacket.getTime() * 90);
fillPacket(first, bs.data(), bs.size(),AudioCounter);
if (myMeta.tracks[currentPacket.getTrackId()].codec == "AAC"){
bs = TS::GetAudioHeader(dataLen, myMeta.tracks[currentPacket.getTrackId()].init);
fillPacket(first, bs.data(), bs.size(),AudioCounter);
}else{
}
fillPacket(first, dataPointer,dataLen,AudioCounter);
}
@ -132,40 +139,9 @@ namespace Mist {
}
}
///this function generates the PMT packet
std::string OutTS::createPMT(){
TS::ProgramMappingTable PMT;
PMT.PID(4096);
PMT.setTableId(2);
PMT.setSectionLength(0xB017);
PMT.setProgramNumber(1);
PMT.setVersionNumber(0);
PMT.setCurrentNextIndicator(0);
PMT.setSectionNumber(0);
PMT.setLastSectionNumber(0);
PMT.setPCRPID(0x100 + (*(selectedTracks.begin())) - 1);
PMT.setProgramInfoLength(0);
short id = 0;
//for all selected tracks
for (std::set<long unsigned int>::iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
if (myMeta.tracks[*it].codec == "H264"){
PMT.setStreamType(0x1B,id);
}else if (myMeta.tracks[*it].codec == "AAC"){
PMT.setStreamType(0x0F,id);
}else if (myMeta.tracks[*it].codec == "MP3"){
PMT.setStreamType(0x03,id);
}
PMT.setElementaryPID(0x100 + (*it) - 1, id);
PMT.setESInfoLength(0,id);
id++;
}
PMT.calcCRC();
return PMT.getStrBuf();
}
void OutTS::sendHeader(){
myConn.SendNow(TS::PAT, 188);
myConn.SendNow(createPMT());
myConn.SendNow(TS::createPMT(selectedTracks, myMeta));
sentHeader = true;
}