Fixes to AC3, MP3, 4+GiB MP4 and MP4 B-frames by Oswald de Bruin
This commit is contained in:
parent
f48cdb14a1
commit
514f0a9b2b
6 changed files with 83 additions and 45 deletions
|
@ -113,7 +113,7 @@ namespace Mist {
|
|||
hev1Box.setCLAP(hvccBox);
|
||||
stsdBox.setEntry(hev1Box, 0);
|
||||
}
|
||||
if (myMeta.tracks[tid].codec == "AAC"){
|
||||
if (myMeta.tracks[tid].codec == "AAC" || myMeta.tracks[tid].codec == "MP3"){
|
||||
MP4::AudioSampleEntry ase;
|
||||
ase.setCodec("mp4a");
|
||||
ase.setDataReferenceIndex(1);
|
||||
|
@ -284,7 +284,7 @@ namespace Mist {
|
|||
if (myMeta.tracks[tid].codec == "H264" || myMeta.tracks[tid].codec == "HEVC"){
|
||||
tfhdBox.setTrackID(1);
|
||||
}
|
||||
if (myMeta.tracks[tid].codec == "AAC"){
|
||||
if (myMeta.tracks[tid].codec == "AAC" || myMeta.tracks[tid].codec == "AC3" || myMeta.tracks[tid].codec == "MP3"){
|
||||
tfhdBox.setFlags(MP4::tfhdSampleFlag);
|
||||
tfhdBox.setTrackID(1);
|
||||
tfhdBox.setDefaultSampleFlags(MP4::isKeySample);
|
||||
|
@ -347,7 +347,7 @@ namespace Mist {
|
|||
i++;
|
||||
}
|
||||
}
|
||||
if (myMeta.tracks[tid].codec == "AAC"){
|
||||
if (myMeta.tracks[tid].codec == "AAC" || myMeta.tracks[tid].codec == "AC3" || myMeta.tracks[tid].codec == "MP3"){
|
||||
trunBox.setFlags(MP4::trundataOffset | MP4::trunsampleSize | MP4::trunsampleDuration);
|
||||
trunBox.setDataOffset(88 + (8 * myMeta.tracks[tid].keys[keyNum].getParts()) + 8);
|
||||
for (int j = 0; j < myMeta.tracks[tid].keys[keyNum].getParts(); j++){
|
||||
|
@ -434,6 +434,7 @@ namespace Mist {
|
|||
int lastAudTime = 0;
|
||||
int audKeys = 0;
|
||||
int audInitTrack = 0;
|
||||
///\todo Dash automatically selects the last audio and video track for manifest, maybe make this expandable/selectable?
|
||||
for (std::map<unsigned int, DTSC::Track>::iterator it = myMeta.tracks.begin(); it != myMeta.tracks.end(); it ++){
|
||||
if (it->second.lastms > lastTime){
|
||||
lastTime = it->second.lastms;
|
||||
|
@ -448,7 +449,7 @@ namespace Mist {
|
|||
vidKeys = it->second.keys.size();
|
||||
vidInitTrack = it->first;
|
||||
}
|
||||
if (it->second.codec == "AAC" && it->second.lastms > lastAudTime){
|
||||
if ((it->second.codec == "AAC" || it->second.codec == "MP3" || it->second.codec == "AC3")&& it->second.lastms > lastAudTime){
|
||||
lastAudTime = it->second.lastms;
|
||||
audKeys = it->second.keys.size();
|
||||
audInitTrack = it->first;
|
||||
|
@ -518,10 +519,17 @@ namespace Mist {
|
|||
r << " </SegmentTemplate>" << std::endl;
|
||||
|
||||
for (std::map<unsigned int, DTSC::Track>::iterator it = myMeta.tracks.begin(); it != myMeta.tracks.end(); it++){
|
||||
if (it->second.codec == "AAC"){
|
||||
if (it->second.codec == "AAC" || it->second.codec == "MP3" || it->second.codec == "AC3"){
|
||||
r << " <Representation ";
|
||||
r << "id=\"" << it->first << "\" ";
|
||||
r << "codecs=\"mp4a.40.2\" ";
|
||||
// (see RFC6381): sample description entry , ObjectTypeIndication [MP4RA, RFC], ObjectTypeIndication [MP4A ISO/IEC 14496-3:2009]
|
||||
if (it->second.codec == "AAC" ){
|
||||
r << "codecs=\"mp4a.40.2\" ";
|
||||
}else if (it->second.codec == "MP3" ){
|
||||
r << "codecs=\"mp4a.40.34\" ";
|
||||
}else if (it->second.codec == "AC3" ){
|
||||
r << "codecs=\"ec-3\" ";
|
||||
}
|
||||
r << "audioSamplingRate=\"" << it->second.rate << "\" ";
|
||||
r << "bandwidth=\"" << it->second.bps << "\">" << std::endl;
|
||||
r << " <AudioChannelConfiguration schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\" value=\"" << it->second.channels << "\" />" << std::endl;
|
||||
|
@ -547,6 +555,7 @@ namespace Mist {
|
|||
capa["codecs"][0u][0u].append("HEVC");
|
||||
capa["codecs"][0u][1u].append("AAC");
|
||||
capa["codecs"][0u][1u].append("AC3");
|
||||
capa["codecs"][0u][1u].append("MP3");
|
||||
capa["methods"][0u]["handler"] = "http";
|
||||
capa["methods"][0u]["type"] = "dash/video/mp4";
|
||||
capa["methods"][0u]["priority"] = 8ll;
|
||||
|
|
|
@ -87,15 +87,15 @@ namespace Mist {
|
|||
callBack = sendTCP;
|
||||
}
|
||||
|
||||
if(myMeta.tracks[tid].codec == "AAC"){
|
||||
tracks[tid].rtpPacket.setTimestamp(timestamp * ((double) myMeta.tracks[tid].rate / 1000.0));
|
||||
tracks[tid].rtpPacket.sendAAC(socket, callBack, dataPointer, dataLen, tracks[tid].channel);
|
||||
if(myMeta.tracks[tid].codec == "MP3"){
|
||||
tracks[tid].rtpPacket.setTimestamp(timestamp * 90);
|
||||
tracks[tid].rtpPacket.sendData(socket, callBack, dataPointer, dataLen, tracks[tid].channel, "MP3");
|
||||
return;
|
||||
}
|
||||
|
||||
if(myMeta.tracks[tid].codec == "MP3" || myMeta.tracks[tid].codec == "AC3"){
|
||||
if( myMeta.tracks[tid].codec == "AC3" || myMeta.tracks[tid].codec == "AAC"){
|
||||
tracks[tid].rtpPacket.setTimestamp(timestamp * ((double) myMeta.tracks[tid].rate / 1000.0));
|
||||
tracks[tid].rtpPacket.sendRaw(socket, callBack, dataPointer, dataLen, tracks[tid].channel);
|
||||
tracks[tid].rtpPacket.sendData(socket, callBack, dataPointer, dataLen, tracks[tid].channel,myMeta.tracks[tid].codec);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -220,6 +220,7 @@ namespace Mist {
|
|||
//loop over all tracks, add them to the SDP.
|
||||
/// \todo Make sure this works correctly for multibitrate streams.
|
||||
for (std::map<unsigned int, DTSC::Track>::iterator objIt = myMeta.tracks.begin(); objIt != myMeta.tracks.end(); objIt ++) {
|
||||
INFO_MSG("Codec: %s", objIt->second.codec.c_str());
|
||||
if (objIt->second.codec == "H264") {
|
||||
MP4::AVCC avccbox;
|
||||
avccbox.setPayload(objIt->second.init);
|
||||
|
@ -248,11 +249,12 @@ namespace Mist {
|
|||
transportString << "; mode=AAC-hbr; SizeLength=13; IndexLength=3; IndexDeltaLength=3;\r\n"
|
||||
"a=control:track" << objIt->second.trackID << "\r\n";
|
||||
}else if (objIt->second.codec == "MP3") {
|
||||
transportString << "m=" << objIt->second.type << " 0 RTP/AVP 96" << "\r\n"
|
||||
"a=rtpmap:14 MPA/" << objIt->second.rate << "/" << objIt->second.channels << "\r\n"
|
||||
//"a=fmtp:96 streamtype=5; profile-level-id=15;";
|
||||
//these values are described in RFC 3640
|
||||
//transportString << " mode=AAC-hbr; SizeLength=13; IndexLength=3; IndexDeltaLength=3;\r\n"
|
||||
transportString << "m=" << objIt->second.type << " 0 RTP/AVP 14" << "\r\n"
|
||||
"a=rtpmap:14 MPA/90000/" << objIt->second.channels << "\r\n"
|
||||
"a=control:track" << objIt->second.trackID << "\r\n";
|
||||
}else if ( objIt->second.codec == "AC3") {
|
||||
transportString << "m=" << objIt->second.type << " 0 RTP/AVP 100" << "\r\n"
|
||||
"a=rtpmap:100 AC3/" << objIt->second.rate << "/" << objIt->second.channels << "\r\n"
|
||||
"a=control:track" << objIt->second.trackID << "\r\n";
|
||||
}
|
||||
}//for tracks iterator
|
||||
|
@ -268,8 +270,12 @@ namespace Mist {
|
|||
unsigned int SSrc = rand();
|
||||
if (myMeta.tracks[trId].codec == "H264") {
|
||||
tracks[trId].rtpPacket = RTP::Packet(97, 1, 0, SSrc);
|
||||
}else if(myMeta.tracks[trId].codec == "AAC" || myMeta.tracks[trId].codec == "MP3"){
|
||||
}else if(myMeta.tracks[trId].codec == "AAC"){
|
||||
tracks[trId].rtpPacket = RTP::Packet(96, 1, 0, SSrc);
|
||||
}else if(myMeta.tracks[trId].codec == "AC3"){
|
||||
tracks[trId].rtpPacket = RTP::Packet(100, 1, 0, SSrc);
|
||||
}else if(myMeta.tracks[trId].codec == "MP3"){
|
||||
tracks[trId].rtpPacket = RTP::Packet(14, 1, 0, SSrc);
|
||||
}else{
|
||||
DEBUG_MSG(DLVL_FAIL,"Unsupported codec for RTSP: %s",myMeta.tracks[trId].codec.c_str());
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue