Browse Source

Merge pull request #274 from stazio/newdesc

Exposed Additional rtc::Description::Media calls
Paul-Louis Ageneau 4 years ago
parent
commit
7598d992dc
2 changed files with 47 additions and 33 deletions
  1. 14 5
      include/rtc/description.hpp
  2. 33 28
      src/description.cpp

+ 14 - 5
include/rtc/description.hpp

@@ -131,9 +131,8 @@ public:
 
 		void removeFormat(const string &fmt);
 
-		void addSSRC(uint32_t ssrc, std::string name);
-		void addSSRC(uint32_t ssrc);
-		void replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, string name);
+		void addSSRC(uint32_t ssrc, std::optional<std::string> name, std::optional<std::string> msid=std::nullopt);
+		void replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, std::optional<std::string> name, std::optional<std::string> msid=std::nullopt);
 		bool hasSSRC(uint32_t ssrc);
 		std::vector<uint32_t> getSSRCs();
 
@@ -142,6 +141,8 @@ public:
 
 		bool hasPayloadType(int payloadType) const;
 
+		void addRTXCodec(unsigned int payloadType, unsigned int originalPayloadType, unsigned int clockRate);
+
 		virtual void parseSdpLine(string_view line) override;
 
 		struct RTPMap {
@@ -181,13 +182,16 @@ public:
 
 	public:
 		void addRTPMap(const RTPMap &map);
+
+		void removeSSRC(uint32_t oldSSRC);
 	};
 
 	class RTC_CPP_EXPORT Audio : public Media {
 	public:
 		Audio(string mid = "audio", Direction dir = Direction::SendOnly);
 
-		void addAudioCodec(int payloadType, const string &codec);
+		void addAudioCodec(int payloadType, const string &codec, const std::optional<std::string>& profile=
+		        "minptime=10; maxaveragebitrate=96000; stereo=1; sprop-stereo=1; useinbandfec=1");
 		void addOpusCodec(int payloadType);
 	};
 
@@ -195,7 +199,12 @@ public:
 	public:
 		Video(string mid = "video", Direction dir = Direction::SendOnly);
 
-		void addVideoCodec(int payloadType, const string &codec);
+		// Use Constrained Baseline profile Level 4.2 (necessary for Firefox)
+		// https://developer.mozilla.org/en-US/docs/Web/Media/Formats/WebRTC_codecs#Supported_video_codecs
+		// TODO: Should be 42E0 but 42C0 appears to be more compatible. Investigate this.
+		void addVideoCodec(int payloadType, const string &codec, const std::optional<std::string>&
+		        profile="profile-level-id=42e01f;packetization-mode=1;level-asymmetry-allowed=1");
+
 		void addH264Codec(int payloadType);
 		void addVP8Codec(int payloadType);
 		void addVP9Codec(int payloadType);

+ 33 - 28
src/description.cpp

@@ -519,12 +519,19 @@ Description::Entry::removeAttribute(std::vector<string>::iterator it) {
 	return mAttributes.erase(it);
 }
 
-void Description::Media::addSSRC(uint32_t ssrc, std::string name) {
-	mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + name);
+void Description::Media::addSSRC(uint32_t ssrc, std::optional<std::string> name, std::optional<std::string> msid) {
+	if (name)
+		mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + *name);
+	else
+		mAttributes.emplace_back("ssrc:" + std::to_string(ssrc));
+
+	if (msid)
+		mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " msid:" + *msid + " " + *msid);
+
 	mSsrcs.emplace_back(ssrc);
 }
 
-void Description::Media::replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, std::string name) {
+void Description::Media::replaceSSRC(uint32_t oldSSRC, uint32_t  ssrc, std::optional<std::string> name, std::optional<std::string> msid) {
 	auto it = mAttributes.begin();
 	while (it != mAttributes.end()) {
 		if (it->find("ssrc:" + std::to_string(oldSSRC)) == 0) {
@@ -532,11 +539,17 @@ void Description::Media::replaceSSRC(uint32_t oldSSRC, uint32_t ssrc, std::strin
 		} else
 			it++;
 	}
-	mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + name);
+	addSSRC(ssrc, std::move(name), std::move(msid));
 }
 
-void Description::Media::addSSRC(uint32_t ssrc) {
-	mAttributes.emplace_back("ssrc:" + std::to_string(ssrc));
+void Description::Media::removeSSRC(uint32_t oldSSRC) {
+    auto it = mAttributes.begin();
+    while (it != mAttributes.end()) {
+        if (it->find("ssrc:" + std::to_string(oldSSRC)) == 0) {
+            it = mAttributes.erase(it);
+        } else
+            it++;
+    }
 }
 
 bool Description::Media::hasSSRC(uint32_t ssrc) {
@@ -689,30 +702,15 @@ void Description::Media::removeFormat(const string &fmt) {
 	}
 }
 
-void Description::Video::addVideoCodec(int payloadType, const string &codec) {
+void Description::Video::addVideoCodec(int payloadType, const string &codec, const std::optional<std::string>& profile) {
 	RTPMap map(std::to_string(payloadType) + ' ' + codec + "/90000");
 	map.addFB("nack");
 	map.addFB("nack pli");
-	//    map.addFB("nack fir");
+	//    map.addFB("ccm fir");
 	map.addFB("goog-remb");
-	if (codec == "H264") {
-		// Use Constrained Baseline profile Level 4.2 (necessary for Firefox)
-		// https://developer.mozilla.org/en-US/docs/Web/Media/Formats/WebRTC_codecs#Supported_video_codecs
-		// TODO: Should be 42E0 but 42C0 appears to be more compatible. Investigate this.
-		map.fmtps.emplace_back(
-		    "profile-level-id=4de01f;packetization-mode=1;level-asymmetry-allowed=1");
-
-		// Because certain Android devices don't like me, let us just negotiate some random
-		{
-			RTPMap map(std::to_string(payloadType + 1) + ' ' + codec + "/90000");
-			map.addFB("nack");
-			map.addFB("nack pli");
-			//            map.addFB("nack fir");
-			map.addFB("goog-remb");
-			addRTPMap(map);
-		}
-	}
-	addRTPMap(map);
+	if (profile)
+	    map.fmtps.emplace_back(*profile);
+    addRTPMap(map);
 
 	//	// RTX Packets
 	/* TODO
@@ -728,13 +726,20 @@ void Description::Video::addVideoCodec(int payloadType, const string &codec) {
 	//    ";rtx-time=3000"); addRTPMap(rtx);
 }
 
-void Description::Audio::addAudioCodec(int payloadType, const string &codec) {
+void Description::Audio::addAudioCodec(int payloadType, const string &codec, const std::optional<std::string>& profile) {
 	// TODO This 48000/2 should be parameterized
 	RTPMap map(std::to_string(payloadType) + ' ' + codec + "/48000/2");
-	map.fmtps.emplace_back("maxaveragebitrate=96000; stereo=1; sprop-stereo=1; useinbandfec=1");
+	if (profile)
+	    map.fmtps.emplace_back(*profile);
 	addRTPMap(map);
 }
 
+void Description::Media::addRTXCodec(unsigned int payloadType, unsigned int originalPayloadType, unsigned int clockRate) {
+    RTPMap map(std::to_string(payloadType) + " RTX/" + std::to_string(clockRate));
+    map.fmtps.emplace_back("apt=" + std::to_string(originalPayloadType));
+    addRTPMap(map);
+}
+
 void Description::Video::addH264Codec(int pt) { addVideoCodec(pt, "H264"); }
 
 void Description::Video::addVP8Codec(int payloadType) { addVideoCodec(payloadType, "VP8"); }