Browse Source

Added audio controls

Staz M 4 years ago
parent
commit
1be877132c
2 changed files with 55 additions and 29 deletions
  1. 27 21
      include/rtc/description.hpp
  2. 28 8
      src/description.cpp

+ 27 - 21
include/rtc/description.hpp

@@ -71,8 +71,6 @@ public:
 		Direction direction() const { return mDirection; }
 		void setDirection(Direction dir);
 
-		void addSSRC(uint32_t ssrc, std::string name);
-
 		operator string() const;
 		string generateSdp(string_view eol) const;
 
@@ -128,12 +126,9 @@ public:
 		string description() const override;
 		Media reciprocate() const;
 
-		void removeFormat(const string &fmt);
+        void removeFormat(const string &fmt);
 
-		void addVideoCodec(int payloadType, const string &codec);
-		void addH264Codec(int payloadType);
-		void addVP8Codec(int payloadType);
-		void addVP9Codec(int payloadType);
+        void addSSRC(uint32_t ssrc, std::string name);
 
 		void setBitrate(int bitrate);
 		int getBitrate() const;
@@ -142,40 +137,51 @@ public:
 
 		virtual void parseSdpLine(string_view line) override;
 
-	private:
-		virtual string generateSdpLines(string_view eol) const override;
+        struct RTPMap {
+            RTPMap(string_view mline);
 
-		int mBas = -1;
+            void removeFB(const string &string);
+            void addFB(const string &string);
 
-		struct RTPMap {
-			RTPMap(string_view mline);
+            int pt;
+            string format;
+            int clockRate;
+            string encParams;
 
-			void removeFB(const string &string);
-			void addFB(const string &string);
+            std::vector<string> rtcpFbs;
+            std::vector<string> fmtps;
+        };
 
-			int pt;
-			string format;
-			int clockRate;
-			string encParams;
+	private:
+		virtual string generateSdpLines(string_view eol) const override;
 
-			std::vector<string> rtcpFbs;
-			std::vector<string> fmtps;
-		};
+		int mBas = -1;
 
 		Media::RTPMap &getFormat(int fmt);
 		Media::RTPMap &getFormat(const string &fmt);
 
 		std::map<int, RTPMap> mRtpMap;
+
+	public:
+        void addRTPMap(const RTPMap& map);
 	};
 
 	class Audio : public Media {
 	public:
 		Audio(string mid = "audio", Direction dir = Direction::SendOnly);
+
+        void addAudioCodec(int payloadType, const string &codec);
+        void addOpusCodec(int payloadType);
 	};
 
 	class Video : public Media {
 	public:
 		Video(string mid = "video", Direction dir = Direction::SendOnly);
+
+        void addVideoCodec(int payloadType, const string &codec);
+        void addH264Codec(int payloadType);
+        void addVP8Codec(int payloadType);
+        void addVP9Codec(int payloadType);
 	};
 
 	bool hasApplication() const;

+ 28 - 8
src/description.cpp

@@ -442,7 +442,7 @@ void Description::Entry::parseSdpLine(string_view line) {
 	}
 }
 
-void Description::Entry::addSSRC(uint32_t ssrc, std::string name) {
+void Description::Media::addSSRC(uint32_t ssrc, std::string name) {
     mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + name);
 }
 
@@ -589,9 +589,10 @@ void Description::Media::removeFormat(const string &fmt) {
 	}
 }
 
-void Description::Media::addVideoCodec(int payloadType, const string &codec) {
+void Description::Video::addVideoCodec(int payloadType, const string &codec) {
 	RTPMap map(std::to_string(payloadType) + ' ' + codec + "/90000");
-	map.addFB("nack");
+    map.addFB("nack");
+    map.addFB("nack pli");
 	map.addFB("goog-remb");
 	if (codec == "H264") {
 		// Use Constrained Baseline profile Level 4.2 (necessary for Firefox)
@@ -599,14 +600,25 @@ void Description::Media::addVideoCodec(int payloadType, const string &codec) {
 		// TODO: Should be 42E0 but 42C0 appears to be more compatible. Investigate this.
 		map.fmtps.emplace_back("profile-level-id=42E02A;level-asymmetry-allowed=1");
 	}
-	mRtpMap.emplace(map.pt, map);
+	addRTPMap(map);
+
+	// RTX Packets
+    RTPMap rtx(std::to_string(payloadType+1) + " RTP/90000");
+    // TODO rtx-time is how long can a request be stashed for before needing to resend it. Needs to be parameterized
+    rtx.addFB("apt=" + std::to_string(payloadType) + ";rtx-time=3000");
+}
+
+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");
+    addRTPMap(map);
 }
 
-void Description::Media::addH264Codec(int pt) { addVideoCodec(pt, "H264"); }
+void Description::Video::addH264Codec(int pt) { addVideoCodec(pt, "H264"); }
 
-void Description::Media::addVP8Codec(int payloadType) { addVideoCodec(payloadType, "VP8"); }
+void Description::Video::addVP8Codec(int payloadType) { addVideoCodec(payloadType, "VP8"); }
 
-void Description::Media::addVP9Codec(int payloadType) { addVideoCodec(payloadType, "VP9"); }
+void Description::Video::addVP9Codec(int payloadType) { addVideoCodec(payloadType, "VP9"); }
 
 void Description::Media::setBitrate(int bitrate) { mBas = bitrate; }
 
@@ -681,6 +693,10 @@ void Description::Media::parseSdpLine(string_view line) {
 	}
 }
 
+void Description::Media::addRTPMap(const Description::Media::RTPMap& map) {
+    mRtpMap.emplace(map.pt, map);
+}
+
 Description::Media::RTPMap::RTPMap(string_view mline) {
 	size_t p = mline.find(' ');
 
@@ -699,7 +715,7 @@ Description::Media::RTPMap::RTPMap(string_view mline) {
 		this->clockRate = to_integer<int>(line);
 	else {
 		this->clockRate = to_integer<int>(line.substr(0, spl));
-		this->encParams = line.substr(spl);
+		this->encParams = line.substr(spl+1);
 	}
 }
 
@@ -718,6 +734,10 @@ void Description::Media::RTPMap::addFB(const string &str) { rtcpFbs.emplace_back
 Description::Audio::Audio(string mid, Direction dir)
     : Media("audio 9 UDP/TLS/RTP/SAVPF", std::move(mid), dir) {}
 
+void Description::Audio::addOpusCodec(int payloadType) {
+    addAudioCodec(payloadType, "OPUS");
+}
+
 Description::Video::Video(string mid, Direction dir)
     : Media("video 9 UDP/TLS/RTP/SAVPF", std::move(mid), dir) {}