|
@@ -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) {}
|
|
|
|