Browse Source

rtc add pcma/pcmu codec

weishao 2 years ago
parent
commit
45209034a2
4 changed files with 33 additions and 4 deletions
  1. 4 0
      include/rtc/description.hpp
  2. 3 1
      include/rtc/rtc.h
  3. 11 1
      src/capi.cpp
  4. 15 2
      src/description.cpp

+ 4 - 0
include/rtc/description.hpp

@@ -239,6 +239,10 @@ public:
 		void addAudioCodec(int payloadType, string codec, optional<string> profile = std::nullopt);
 		void addAudioCodec(int payloadType, string codec, optional<string> profile = std::nullopt);
 
 
 		void addOpusCodec(int payloadType, optional<string> profile = DEFAULT_OPUS_AUDIO_PROFILE);
 		void addOpusCodec(int payloadType, optional<string> profile = DEFAULT_OPUS_AUDIO_PROFILE);
+
+		void addPCMACodec(int payloadType, optional<string> profile = std::nullopt);
+
+		void addPCMUCodec(int payloadType, optional<string> profile = std::nullopt);
 	};
 	};
 
 
 	class RTC_CPP_EXPORT Video : public Media {
 	class RTC_CPP_EXPORT Video : public Media {

+ 3 - 1
include/rtc/rtc.h

@@ -102,7 +102,9 @@ typedef enum {
 	RTC_CODEC_VP9 = 2,
 	RTC_CODEC_VP9 = 2,
 
 
 	// audio
 	// audio
-	RTC_CODEC_OPUS = 128
+	RTC_CODEC_OPUS = 128,
+    RTC_CODEC_PCMU = 129,
+    RTC_CODEC_PCMA = 130
 } rtcCodec;
 } rtcCodec;
 
 
 typedef enum {
 typedef enum {

+ 11 - 1
src/capi.cpp

@@ -984,6 +984,8 @@ int rtcAddTrackEx(int pc, const rtcTrackInit *init) {
 				mid = "video";
 				mid = "video";
 				break;
 				break;
 			case RTC_CODEC_OPUS:
 			case RTC_CODEC_OPUS:
+            case RTC_CODEC_PCMU:
+            case RTC_CODEC_PCMA:
 				mid = "audio";
 				mid = "audio";
 				break;
 				break;
 			default:
 			default:
@@ -1015,12 +1017,20 @@ int rtcAddTrackEx(int pc, const rtcTrackInit *init) {
 			optDescription = desc;
 			optDescription = desc;
 			break;
 			break;
 		}
 		}
-		case RTC_CODEC_OPUS: {
+		case RTC_CODEC_OPUS:
+        case RTC_CODEC_PCMU:
+        case RTC_CODEC_PCMA:{
 			auto desc = Description::Audio(mid, direction);
 			auto desc = Description::Audio(mid, direction);
 			switch (init->codec) {
 			switch (init->codec) {
 			case RTC_CODEC_OPUS:
 			case RTC_CODEC_OPUS:
 				desc.addOpusCodec(init->payloadType);
 				desc.addOpusCodec(init->payloadType);
 				break;
 				break;
+            case RTC_CODEC_PCMU:
+                desc.addPCMUCodec(init->payloadType);
+                break;
+            case RTC_CODEC_PCMA:
+                desc.addPCMACodec(init->payloadType);
+                break;
 			default:
 			default:
 				break;
 				break;
 			}
 			}

+ 15 - 2
src/description.cpp

@@ -1086,8 +1086,13 @@ Description::Audio::Audio(string mid, Direction dir)
     : Media("audio 9 UDP/TLS/RTP/SAVPF", std::move(mid), dir) {}
     : Media("audio 9 UDP/TLS/RTP/SAVPF", std::move(mid), dir) {}
 
 
 void Description::Audio::addAudioCodec(int payloadType, string codec, optional<string> profile) {
 void Description::Audio::addAudioCodec(int payloadType, string codec, optional<string> profile) {
-	if (codec.find('/') == string::npos)
-		codec += "/48000/2";
+	if (codec.find('/') == string::npos){
+        if(0 == codec.compare("OPUS"))
+            codec += "/48000/2";
+        else if(0 == codec.compare("PCMA") || 0 == codec.compare("PCMU"))
+            codec += "/8000/1";
+    }
+
 
 
 	RtpMap map(std::to_string(payloadType) + ' ' + codec);
 	RtpMap map(std::to_string(payloadType) + ' ' + codec);
 
 
@@ -1101,6 +1106,14 @@ void Description::Audio::addOpusCodec(int payloadType, optional<string> profile)
 	addAudioCodec(payloadType, "OPUS", profile);
 	addAudioCodec(payloadType, "OPUS", profile);
 }
 }
 
 
+void Description::Audio::addPCMACodec(int payloadType, optional<string> profile) {
+    addAudioCodec(payloadType, "PCMA", profile);
+}
+
+void Description::Audio::addPCMUCodec(int payloadType, optional<string> profile) {
+    addAudioCodec(payloadType, "PCMU", profile);
+}
+
 Description::Video::Video(string mid, Direction dir)
 Description::Video::Video(string mid, Direction dir)
     : Media("video 9 UDP/TLS/RTP/SAVPF", std::move(mid), dir) {}
     : Media("video 9 UDP/TLS/RTP/SAVPF", std::move(mid), dir) {}