Browse Source

Added some more description options

Staz M 4 years ago
parent
commit
cca0742973
2 changed files with 52 additions and 27 deletions
  1. 10 5
      include/rtc/description.hpp
  2. 42 22
      src/description.cpp

+ 10 - 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,7 +182,9 @@ public:
 
 	public:
 		void addRTPMap(const RTPMap &map);
-	};
+
+        void removeSSRC(uint32_t oldSSRC);
+    };
 
 	class Audio : public Media {
 	public:
@@ -189,7 +192,9 @@ public:
 
 		void addAudioCodec(int payloadType, const string &codec);
 		void addOpusCodec(int payloadType);
-	};
+
+        void addRTXCodec(unsigned int payloadType, unsigned int originalPayloadType, unsigned int clockRate);
+    };
 
 	class Video : public Media {
 	public:

+ 42 - 22
src/description.cpp

@@ -519,24 +519,37 @@ 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) {
-	auto it = mAttributes.begin();
-	while (it != mAttributes.end()) {
-		if (it->find("ssrc:" + std::to_string(oldSSRC)) == 0) {
-			it = mAttributes.erase(it);
-		} else
-			it++;
-	}
-	mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + 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) {
+            it = mAttributes.erase(it);
+        } else
+            it++;
+    }
+    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) {
@@ -703,14 +716,14 @@ void Description::Video::addVideoCodec(int payloadType, const string &codec) {
 		    "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);
-		}
+//		{
+//			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);
 
@@ -731,10 +744,17 @@ void Description::Video::addVideoCodec(int payloadType, const string &codec) {
 void Description::Audio::addAudioCodec(int payloadType, const string &codec) {
 	// 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");
+	map.fmtps.emplace_back("minptime=10; maxaveragebitrate=96000; stereo=1; sprop-stereo=1; useinbandfec=1");
 	addRTPMap(map);
 }
 
+void Description::Media::addRTXCodec(unsigned int payloadType, unsigned int originalPayloadType, unsigned int clockRate) {
+    // TODO This 48000/2 should be parameterized
+    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"); }