Added Mu-law support to RTSP and WAV
This commit is contained in:
parent
f5c1e6b573
commit
f8766b0567
3 changed files with 34 additions and 1 deletions
32
lib/sdp.cpp
32
lib/sdp.cpp
|
@ -149,6 +149,16 @@ namespace SDP{
|
||||||
mediaDesc << "a=rtpmap:101 PCMA/" << trk.rate << "/" << trk.channels << "\r\n";
|
mediaDesc << "a=rtpmap:101 PCMA/" << trk.rate << "/" << trk.channels << "\r\n";
|
||||||
}
|
}
|
||||||
mediaDesc << "a=control:track" << trk.trackID << "\r\n";
|
mediaDesc << "a=control:track" << trk.trackID << "\r\n";
|
||||||
|
}else if (trk.codec == "ULAW"){
|
||||||
|
if (trk.channels == 1 && trk.rate == 8000){
|
||||||
|
mediaDesc << "m=audio 0 RTP/AVP 0"
|
||||||
|
<< "\r\n";
|
||||||
|
}else{
|
||||||
|
mediaDesc << "m=audio 0 RTP/AVP 104"
|
||||||
|
<< "\r\n";
|
||||||
|
mediaDesc << "a=rtpmap:104 PCMU/" << trk.rate << "/" << trk.channels << "\r\n";
|
||||||
|
}
|
||||||
|
mediaDesc << "a=control:track" << trk.trackID << "\r\n";
|
||||||
}else if (trk.codec == "PCM"){
|
}else if (trk.codec == "PCM"){
|
||||||
if (trk.size == 16 && trk.channels == 2 && trk.rate == 44100){
|
if (trk.size == 16 && trk.channels == 2 && trk.rate == 44100){
|
||||||
mediaDesc << "m=audio 0 RTP/AVP 10"
|
mediaDesc << "m=audio 0 RTP/AVP 10"
|
||||||
|
@ -221,6 +231,12 @@ namespace SDP{
|
||||||
}else{
|
}else{
|
||||||
pack = RTP::Packet(101, 1, 0, mySSRC);
|
pack = RTP::Packet(101, 1, 0, mySSRC);
|
||||||
}
|
}
|
||||||
|
}else if (trk.codec == "ULAW"){
|
||||||
|
if (trk.channels == 1 && trk.rate == 8000){
|
||||||
|
pack = RTP::Packet(0, 1, 0, mySSRC);
|
||||||
|
}else{
|
||||||
|
pack = RTP::Packet(104, 1, 0, mySSRC);
|
||||||
|
}
|
||||||
}else if (trk.codec == "PCM"){
|
}else if (trk.codec == "PCM"){
|
||||||
if (trk.size == 16 && trk.channels == 2 && trk.rate == 44100){
|
if (trk.size == 16 && trk.channels == 2 && trk.rate == 44100){
|
||||||
pack = RTP::Packet(10, 1, 0, mySSRC);
|
pack = RTP::Packet(10, 1, 0, mySSRC);
|
||||||
|
@ -330,16 +346,27 @@ namespace SDP{
|
||||||
thisTrack->trackID = trackNo;
|
thisTrack->trackID = trackNo;
|
||||||
}else{
|
}else{
|
||||||
WARN_MSG("Media type not supported: %s", item.c_str());
|
WARN_MSG("Media type not supported: %s", item.c_str());
|
||||||
|
myMeta->tracks.erase(trackNo);
|
||||||
|
tracks.erase(trackNo);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
getline(words, item, ' ');
|
getline(words, item, ' ');
|
||||||
if (!getline(words, item, ' ') || item != "RTP/AVP"){
|
if (!getline(words, item, ' ') || item != "RTP/AVP"){
|
||||||
WARN_MSG("Media transport not supported: %s", item.c_str());
|
WARN_MSG("Media transport not supported: %s", item.c_str());
|
||||||
|
myMeta->tracks.erase(trackNo);
|
||||||
|
tracks.erase(trackNo);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (getline(words, item, ' ')){
|
if (getline(words, item, ' ')){
|
||||||
uint64_t avp_type = JSON::Value(item).asInt();
|
uint64_t avp_type = JSON::Value(item).asInt();
|
||||||
switch (avp_type){
|
switch (avp_type){
|
||||||
|
case 0: // PCM Mu-law
|
||||||
|
INFO_MSG("PCM Mu-law payload type");
|
||||||
|
nope = false;
|
||||||
|
thisTrack->codec = "ULAW";
|
||||||
|
thisTrack->rate = 8000;
|
||||||
|
thisTrack->channels = 1;
|
||||||
|
break;
|
||||||
case 8: // PCM A-law
|
case 8: // PCM A-law
|
||||||
INFO_MSG("PCM A-law payload type");
|
INFO_MSG("PCM A-law payload type");
|
||||||
nope = false;
|
nope = false;
|
||||||
|
@ -384,6 +411,8 @@ namespace SDP{
|
||||||
continue;
|
continue;
|
||||||
}else{
|
}else{
|
||||||
FAIL_MSG("Payload type %llu not supported!", avp_type);
|
FAIL_MSG("Payload type %llu not supported!", avp_type);
|
||||||
|
myMeta->tracks.erase(trackNo);
|
||||||
|
tracks.erase(trackNo);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -424,6 +453,7 @@ namespace SDP{
|
||||||
thisTrack->init = std::string("OpusHead\001\002\170\000\200\273\000\000\000\000\000", 19);
|
thisTrack->init = std::string("OpusHead\001\002\170\000\200\273\000\000\000\000\000", 19);
|
||||||
}
|
}
|
||||||
if (trCodec == "PCMA"){thisTrack->codec = "ALAW";}
|
if (trCodec == "PCMA"){thisTrack->codec = "ALAW";}
|
||||||
|
if (trCodec == "PCMU"){thisTrack->codec = "ULAW";}
|
||||||
if (trCodec == "L8"){
|
if (trCodec == "L8"){
|
||||||
thisTrack->codec = "PCM";
|
thisTrack->codec = "PCM";
|
||||||
thisTrack->size = 8;
|
thisTrack->size = 8;
|
||||||
|
@ -761,7 +791,7 @@ namespace SDP{
|
||||||
uint32_t plSize = pkt.getPayloadSize();
|
uint32_t plSize = pkt.getPayloadSize();
|
||||||
INSANE_MSG("Received RTP packet for track %llu, time %llu -> %llu", track, pkt.getTimeStamp(),
|
INSANE_MSG("Received RTP packet for track %llu, time %llu -> %llu", track, pkt.getTimeStamp(),
|
||||||
millis);
|
millis);
|
||||||
if (Trk.codec == "ALAW" || Trk.codec == "opus" || Trk.codec == "PCM"){
|
if (Trk.codec == "ALAW" || Trk.codec == "opus" || Trk.codec == "PCM" || Trk.codec == "ULAW"){
|
||||||
DTSC::Packet nextPack;
|
DTSC::Packet nextPack;
|
||||||
nextPack.genericFill(millis, 0, track, pl, plSize, 0, false);
|
nextPack.genericFill(millis, 0, track, pl, plSize, 0, false);
|
||||||
if (incomingPacketCallback){incomingPacketCallback(nextPack);}
|
if (incomingPacketCallback){incomingPacketCallback(nextPack);}
|
||||||
|
|
|
@ -72,6 +72,7 @@ namespace Mist{
|
||||||
capa["codecs"][0u][1u].append("MP3");
|
capa["codecs"][0u][1u].append("MP3");
|
||||||
capa["codecs"][0u][1u].append("AC3");
|
capa["codecs"][0u][1u].append("AC3");
|
||||||
capa["codecs"][0u][1u].append("ALAW");
|
capa["codecs"][0u][1u].append("ALAW");
|
||||||
|
capa["codecs"][0u][1u].append("ULAW");
|
||||||
capa["codecs"][0u][1u].append("PCM");
|
capa["codecs"][0u][1u].append("PCM");
|
||||||
capa["codecs"][0u][1u].append("opus");
|
capa["codecs"][0u][1u].append("opus");
|
||||||
capa["codecs"][0u][1u].append("MP2");
|
capa["codecs"][0u][1u].append("MP2");
|
||||||
|
|
|
@ -12,6 +12,7 @@ namespace Mist{
|
||||||
capa["url_rel"] = "/$.wav";
|
capa["url_rel"] = "/$.wav";
|
||||||
capa["url_match"] = "/$.wav";
|
capa["url_match"] = "/$.wav";
|
||||||
capa["codecs"][0u][0u].append("ALAW");
|
capa["codecs"][0u][0u].append("ALAW");
|
||||||
|
capa["codecs"][0u][0u].append("ULAW");
|
||||||
capa["codecs"][0u][0u].append("MP3");
|
capa["codecs"][0u][0u].append("MP3");
|
||||||
capa["codecs"][0u][0u].append("PCM");
|
capa["codecs"][0u][0u].append("PCM");
|
||||||
capa["methods"][0u]["handler"] = "http";
|
capa["methods"][0u]["handler"] = "http";
|
||||||
|
@ -85,6 +86,7 @@ namespace Mist{
|
||||||
// Send format details
|
// Send format details
|
||||||
uint16_t fmt = 0;
|
uint16_t fmt = 0;
|
||||||
if (Trk.codec == "ALAW"){fmt = 6;}
|
if (Trk.codec == "ALAW"){fmt = 6;}
|
||||||
|
if (Trk.codec == "ULAW"){fmt = 7;}
|
||||||
if (Trk.codec == "PCM"){fmt = 1;}
|
if (Trk.codec == "PCM"){fmt = 1;}
|
||||||
if (Trk.codec == "MP3"){fmt = 85;}
|
if (Trk.codec == "MP3"){fmt = 85;}
|
||||||
myConn.SendNow(RIFF::fmt::generate(fmt, Trk.channels, Trk.rate, Trk.bps,
|
myConn.SendNow(RIFF::fmt::generate(fmt, Trk.channels, Trk.rate, Trk.bps,
|
||||||
|
|
Loading…
Add table
Reference in a new issue