TS MPEG2/MP2 support
This commit is contained in:
parent
9c2bd38611
commit
2a721f5e7f
7 changed files with 200 additions and 97 deletions
|
@ -123,8 +123,10 @@ namespace Mist {
|
|||
capa["priority"] = 9ll;
|
||||
capa["codecs"][0u][0u].append("H264");
|
||||
capa["codecs"][0u][0u].append("HEVC");
|
||||
capa["codecs"][0u][0u].append("MPEG2");
|
||||
capa["codecs"][0u][1u].append("AAC");
|
||||
capa["codecs"][0u][1u].append("AC3");
|
||||
capa["codecs"][0u][1u].append("MP2");
|
||||
inFile = NULL;
|
||||
inputProcess = 0;
|
||||
}
|
||||
|
|
|
@ -40,9 +40,11 @@ namespace Mist {
|
|||
capa["socket"] = "http_ts";
|
||||
capa["codecs"][0u][0u].append("H264");
|
||||
capa["codecs"][0u][0u].append("HEVC");
|
||||
capa["codecs"][0u][0u].append("MPEG2");
|
||||
capa["codecs"][0u][1u].append("AAC");
|
||||
capa["codecs"][0u][1u].append("MP3");
|
||||
capa["codecs"][0u][1u].append("AC3");
|
||||
capa["codecs"][0u][1u].append("MP2");
|
||||
capa["methods"][0u]["handler"] = "http";
|
||||
capa["methods"][0u]["type"] = "html5/video/mpeg";
|
||||
capa["methods"][0u]["priority"] = 1ll;
|
||||
|
|
|
@ -80,9 +80,11 @@ namespace Mist {
|
|||
capa["optional"]["tracks"]["default"] = "";
|
||||
capa["codecs"][0u][0u].append("HEVC");
|
||||
capa["codecs"][0u][0u].append("H264");
|
||||
capa["codecs"][0u][0u].append("MPEG2");
|
||||
capa["codecs"][0u][1u].append("AAC");
|
||||
capa["codecs"][0u][1u].append("MP3");
|
||||
capa["codecs"][0u][1u].append("AC3");
|
||||
capa["codecs"][0u][1u].append("MP2");
|
||||
cfg->addConnectorOptions(8888, capa);
|
||||
config = cfg;
|
||||
capa["push_urls"].append("tsudp://*");
|
||||
|
|
|
@ -81,115 +81,123 @@ namespace Mist {
|
|||
std::string bs;
|
||||
//prepare bufferstring
|
||||
if (video){
|
||||
unsigned int extraSize = 0;
|
||||
//dataPointer[4] & 0x1f is used to check if this should be done later: fillPacket("\000\000\000\001\011\360", 6);
|
||||
if (Trk.codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){
|
||||
extraSize += 6;
|
||||
}
|
||||
if (keyframe){
|
||||
if (Trk.codec == "H264"){
|
||||
if (!haveAvcc){
|
||||
avccbox.setPayload(Trk.init);
|
||||
haveAvcc = true;
|
||||
}
|
||||
bs = avccbox.asAnnexB();
|
||||
extraSize += bs.size();
|
||||
if (Trk.codec == "H264" || Trk.codec == "HEVC"){
|
||||
unsigned int extraSize = 0;
|
||||
//dataPointer[4] & 0x1f is used to check if this should be done later: fillPacket("\000\000\000\001\011\360", 6);
|
||||
if (Trk.codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){
|
||||
extraSize += 6;
|
||||
}
|
||||
/*LTS-START*/
|
||||
if (Trk.codec == "HEVC"){
|
||||
if (!haveHvcc){
|
||||
hvccbox.setPayload(Trk.init);
|
||||
haveHvcc = true;
|
||||
if (keyframe){
|
||||
if (Trk.codec == "H264"){
|
||||
if (!haveAvcc){
|
||||
avccbox.setPayload(Trk.init);
|
||||
haveAvcc = true;
|
||||
}
|
||||
bs = avccbox.asAnnexB();
|
||||
extraSize += bs.size();
|
||||
}
|
||||
bs = hvccbox.asAnnexB();
|
||||
extraSize += bs.size();
|
||||
/*LTS-START*/
|
||||
if (Trk.codec == "HEVC"){
|
||||
if (!haveHvcc){
|
||||
hvccbox.setPayload(Trk.init);
|
||||
haveHvcc = true;
|
||||
}
|
||||
bs = hvccbox.asAnnexB();
|
||||
extraSize += bs.size();
|
||||
}
|
||||
/*LTS-END*/
|
||||
}
|
||||
/*LTS-END*/
|
||||
}
|
||||
|
||||
unsigned int watKunnenWeIn1Ding = 65490-13;
|
||||
unsigned int splitCount = (dataLen+extraSize) / watKunnenWeIn1Ding;
|
||||
unsigned int currPack = 0;
|
||||
unsigned int ThisNaluSize = 0;
|
||||
unsigned int i = 0;
|
||||
unsigned int nalLead = 0;
|
||||
uint64_t offset = thisPacket.getInt("offset") * 90;
|
||||
|
||||
unsigned int watKunnenWeIn1Ding = 65490-13;
|
||||
unsigned int splitCount = (dataLen+extraSize) / watKunnenWeIn1Ding;
|
||||
unsigned int currPack = 0;
|
||||
unsigned int ThisNaluSize = 0;
|
||||
unsigned int i = 0;
|
||||
unsigned int nalLead = 0;
|
||||
uint64_t offset = thisPacket.getInt("offset") * 90;
|
||||
|
||||
while (currPack <= splitCount){
|
||||
unsigned int alreadySent = 0;
|
||||
bs = TS::Packet::getPESVideoLeadIn((currPack != splitCount ? watKunnenWeIn1Ding : dataLen+extraSize - currPack*watKunnenWeIn1Ding), packTime, offset, !currPack, Trk.bps);
|
||||
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
|
||||
if (!currPack){
|
||||
if (Trk.codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){
|
||||
//End of previous nal unit, if not already present
|
||||
fillPacket("\000\000\000\001\011\360", 6, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
alreadySent += 6;
|
||||
}
|
||||
if (keyframe){
|
||||
if (Trk.codec == "H264"){
|
||||
bs = avccbox.asAnnexB();
|
||||
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
|
||||
alreadySent += bs.size();
|
||||
while (currPack <= splitCount){
|
||||
unsigned int alreadySent = 0;
|
||||
bs = TS::Packet::getPESVideoLeadIn((currPack != splitCount ? watKunnenWeIn1Ding : dataLen+extraSize - currPack*watKunnenWeIn1Ding), packTime, offset, !currPack, Trk.bps);
|
||||
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
|
||||
if (!currPack){
|
||||
if (Trk.codec == "H264" && (dataPointer[4] & 0x1f) != 0x09){
|
||||
//End of previous nal unit, if not already present
|
||||
fillPacket("\000\000\000\001\011\360", 6, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
alreadySent += 6;
|
||||
}
|
||||
/*LTS-START*/
|
||||
if (Trk.codec == "HEVC"){
|
||||
bs = hvccbox.asAnnexB();
|
||||
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
|
||||
alreadySent += bs.size();
|
||||
if (keyframe){
|
||||
if (Trk.codec == "H264"){
|
||||
bs = avccbox.asAnnexB();
|
||||
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
|
||||
alreadySent += bs.size();
|
||||
}
|
||||
/*LTS-START*/
|
||||
if (Trk.codec == "HEVC"){
|
||||
bs = hvccbox.asAnnexB();
|
||||
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
|
||||
alreadySent += bs.size();
|
||||
}
|
||||
/*LTS-END*/
|
||||
}
|
||||
/*LTS-END*/
|
||||
}
|
||||
}
|
||||
while (i + 4 < (unsigned int)dataLen){
|
||||
if (nalLead){
|
||||
fillPacket("\000\000\000\001"+4-nalLead,nalLead, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
i += nalLead;
|
||||
alreadySent += nalLead;
|
||||
nalLead = 0;
|
||||
}
|
||||
if (!ThisNaluSize){
|
||||
ThisNaluSize = (dataPointer[i] << 24) + (dataPointer[i+1] << 16) + (dataPointer[i+2] << 8) + dataPointer[i+3];
|
||||
if (ThisNaluSize + i + 4 > (unsigned int)dataLen){
|
||||
DEBUG_MSG(DLVL_WARN, "Too big NALU detected (%u > %d) - skipping!", ThisNaluSize + i + 4, dataLen);
|
||||
break;
|
||||
while (i + 4 < (unsigned int)dataLen){
|
||||
if (nalLead){
|
||||
fillPacket("\000\000\000\001"+4-nalLead,nalLead, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
i += nalLead;
|
||||
alreadySent += nalLead;
|
||||
nalLead = 0;
|
||||
}
|
||||
if (alreadySent + 4 > watKunnenWeIn1Ding){
|
||||
nalLead = 4 - (watKunnenWeIn1Ding-alreadySent);
|
||||
fillPacket("\000\000\000\001",watKunnenWeIn1Ding-alreadySent, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
if (!ThisNaluSize){
|
||||
ThisNaluSize = (dataPointer[i] << 24) + (dataPointer[i+1] << 16) + (dataPointer[i+2] << 8) + dataPointer[i+3];
|
||||
if (ThisNaluSize + i + 4 > (unsigned int)dataLen){
|
||||
DEBUG_MSG(DLVL_WARN, "Too big NALU detected (%u > %d) - skipping!", ThisNaluSize + i + 4, dataLen);
|
||||
break;
|
||||
}
|
||||
if (alreadySent + 4 > watKunnenWeIn1Ding){
|
||||
nalLead = 4 - (watKunnenWeIn1Ding-alreadySent);
|
||||
fillPacket("\000\000\000\001",watKunnenWeIn1Ding-alreadySent, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
i += watKunnenWeIn1Ding-alreadySent;
|
||||
alreadySent += watKunnenWeIn1Ding-alreadySent;
|
||||
}else{
|
||||
fillPacket("\000\000\000\001",4, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
alreadySent += 4;
|
||||
i += 4;
|
||||
}
|
||||
}
|
||||
if (alreadySent + ThisNaluSize > watKunnenWeIn1Ding){
|
||||
fillPacket(dataPointer+i,watKunnenWeIn1Ding-alreadySent, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
i += watKunnenWeIn1Ding-alreadySent;
|
||||
ThisNaluSize -= watKunnenWeIn1Ding-alreadySent;
|
||||
alreadySent += watKunnenWeIn1Ding-alreadySent;
|
||||
}else{
|
||||
fillPacket("\000\000\000\001",4, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
alreadySent += 4;
|
||||
i += 4;
|
||||
fillPacket(dataPointer+i,ThisNaluSize, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
alreadySent += ThisNaluSize;
|
||||
i += ThisNaluSize;
|
||||
ThisNaluSize = 0;
|
||||
}
|
||||
if (alreadySent == watKunnenWeIn1Ding){
|
||||
packData.addStuffing();
|
||||
fillPacket(0, 0, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
firstPack = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (alreadySent + ThisNaluSize > watKunnenWeIn1Ding){
|
||||
fillPacket(dataPointer+i,watKunnenWeIn1Ding-alreadySent, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
i += watKunnenWeIn1Ding-alreadySent;
|
||||
ThisNaluSize -= watKunnenWeIn1Ding-alreadySent;
|
||||
alreadySent += watKunnenWeIn1Ding-alreadySent;
|
||||
}else{
|
||||
fillPacket(dataPointer+i,ThisNaluSize, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
alreadySent += ThisNaluSize;
|
||||
i += ThisNaluSize;
|
||||
ThisNaluSize = 0;
|
||||
}
|
||||
if (alreadySent == watKunnenWeIn1Ding){
|
||||
packData.addStuffing();
|
||||
fillPacket(0, 0, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
firstPack = true;
|
||||
break;
|
||||
}
|
||||
currPack++;
|
||||
}
|
||||
currPack++;
|
||||
}else{
|
||||
uint64_t offset = thisPacket.getInt("offset") * 90;
|
||||
bs = TS::Packet::getPESVideoLeadIn(0, packTime, offset, true, Trk.bps);
|
||||
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
|
||||
|
||||
fillPacket(dataPointer, dataLen, firstPack, video, keyframe, pkgPid, contPkg);
|
||||
}
|
||||
}else if (Trk.type == "audio"){
|
||||
long unsigned int tempLen = dataLen;
|
||||
if (Trk.codec == "AAC"){
|
||||
tempLen += 7;
|
||||
}
|
||||
bs = TS::Packet::getPESAudioLeadIn(tempLen, packTime, Trk.bps);// myMeta.tracks[thisPacket.getTrackId()].rate / 1000 );
|
||||
bs = TS::Packet::getPESAudioLeadIn(tempLen, packTime, Trk.bps);
|
||||
fillPacket(bs.data(), bs.size(), firstPack, video, keyframe, pkgPid, contPkg);
|
||||
if (Trk.codec == "AAC"){
|
||||
bs = TS::getAudioHeader(dataLen, Trk.init);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue