diff --git a/lib/sdp.cpp b/lib/sdp.cpp index 06c2e38b..7905d0fe 100644 --- a/lib/sdp.cpp +++ b/lib/sdp.cpp @@ -149,6 +149,16 @@ namespace SDP{ mediaDesc << "a=rtpmap:101 PCMA/" << trk.rate << "/" << trk.channels << "\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"){ if (trk.size == 16 && trk.channels == 2 && trk.rate == 44100){ mediaDesc << "m=audio 0 RTP/AVP 10" @@ -221,6 +231,12 @@ namespace SDP{ }else{ 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"){ if (trk.size == 16 && trk.channels == 2 && trk.rate == 44100){ pack = RTP::Packet(10, 1, 0, mySSRC); @@ -330,16 +346,27 @@ namespace SDP{ thisTrack->trackID = trackNo; }else{ WARN_MSG("Media type not supported: %s", item.c_str()); + myMeta->tracks.erase(trackNo); + tracks.erase(trackNo); continue; } getline(words, item, ' '); if (!getline(words, item, ' ') || item != "RTP/AVP"){ WARN_MSG("Media transport not supported: %s", item.c_str()); + myMeta->tracks.erase(trackNo); + tracks.erase(trackNo); continue; } if (getline(words, item, ' ')){ uint64_t avp_type = JSON::Value(item).asInt(); 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 INFO_MSG("PCM A-law payload type"); nope = false; @@ -384,6 +411,8 @@ namespace SDP{ continue; }else{ FAIL_MSG("Payload type %llu not supported!", avp_type); + myMeta->tracks.erase(trackNo); + tracks.erase(trackNo); continue; } } @@ -424,6 +453,7 @@ namespace SDP{ 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 == "PCMU"){thisTrack->codec = "ULAW";} if (trCodec == "L8"){ thisTrack->codec = "PCM"; thisTrack->size = 8; @@ -761,7 +791,7 @@ namespace SDP{ uint32_t plSize = pkt.getPayloadSize(); INSANE_MSG("Received RTP packet for track %llu, time %llu -> %llu", track, pkt.getTimeStamp(), 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; nextPack.genericFill(millis, 0, track, pl, plSize, 0, false); if (incomingPacketCallback){incomingPacketCallback(nextPack);} diff --git a/src/output/output_rtsp.cpp b/src/output/output_rtsp.cpp index 3162d902..56f85c7d 100644 --- a/src/output/output_rtsp.cpp +++ b/src/output/output_rtsp.cpp @@ -72,6 +72,7 @@ namespace Mist{ capa["codecs"][0u][1u].append("MP3"); capa["codecs"][0u][1u].append("AC3"); capa["codecs"][0u][1u].append("ALAW"); + capa["codecs"][0u][1u].append("ULAW"); capa["codecs"][0u][1u].append("PCM"); capa["codecs"][0u][1u].append("opus"); capa["codecs"][0u][1u].append("MP2"); diff --git a/src/output/output_wav.cpp b/src/output/output_wav.cpp index e4198dd5..814c1399 100644 --- a/src/output/output_wav.cpp +++ b/src/output/output_wav.cpp @@ -12,6 +12,7 @@ namespace Mist{ capa["url_rel"] = "/$.wav"; capa["url_match"] = "/$.wav"; capa["codecs"][0u][0u].append("ALAW"); + capa["codecs"][0u][0u].append("ULAW"); capa["codecs"][0u][0u].append("MP3"); capa["codecs"][0u][0u].append("PCM"); capa["methods"][0u]["handler"] = "http"; @@ -85,6 +86,7 @@ namespace Mist{ // Send format details uint16_t fmt = 0; if (Trk.codec == "ALAW"){fmt = 6;} + if (Trk.codec == "ULAW"){fmt = 7;} if (Trk.codec == "PCM"){fmt = 1;} if (Trk.codec == "MP3"){fmt = 85;} myConn.SendNow(RIFF::fmt::generate(fmt, Trk.channels, Trk.rate, Trk.bps,