From c5e4b972c23dbfc6a93d31e743e33b1b2ed390e3 Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Mon, 31 May 2021 14:32:36 +0200 Subject: [PATCH 01/12] Improve capi for ssrc manipulation --- include/rtc/description.hpp | 1 + include/rtc/rtc.h | 24 ++++++ src/capi.cpp | 148 ++++++++++++++++++++++++++++++++++++ src/description.cpp | 15 +++- 4 files changed, 187 insertions(+), 1 deletion(-) diff --git a/include/rtc/description.hpp b/include/rtc/description.hpp index 7e6e5eb..ed649ef 100644 --- a/include/rtc/description.hpp +++ b/include/rtc/description.hpp @@ -150,6 +150,7 @@ public: optional msid = nullopt, optional trackID = nullopt); bool hasSSRC(uint32_t ssrc); std::vector getSSRCs(); + std::optional getCNameForSsrc(uint32_t ssrc); void setBitrate(int bitrate); int getBitrate() const; diff --git a/include/rtc/rtc.h b/include/rtc/rtc.h index c8b8856..ac12e1d 100644 --- a/include/rtc/rtc.h +++ b/include/rtc/rtc.h @@ -206,6 +206,7 @@ RTC_EXPORT int rtcSetDataChannelCallback(int pc, rtcDataChannelCallbackFunc cb); RTC_EXPORT int rtcCreateDataChannel(int pc, const char *label); // returns dc id RTC_EXPORT int rtcCreateDataChannelEx(int pc, const char *label, const rtcDataChannelInit *init); // returns dc id +RTC_EXPORT int rtcIsDataChannelOpen(int dc); RTC_EXPORT int rtcDeleteDataChannel(int dc); RTC_EXPORT int rtcGetDataChannelStream(int dc); @@ -254,6 +255,13 @@ typedef struct { uint32_t timestamp; // Start timestamp } rtcStartTime; +typedef struct { + uint32_t ssrc; + const char *name; // optional + const char *msid; // optional + const char *trackId; // optional, track ID used in MSID +} rtcSsrcForTypeInit; + // Set H264PacketizationHandler for track RTC_EXPORT int rtcSetH264PacketizationHandler(int tr, const rtcPacketizationHandlerInit *init); @@ -298,6 +306,22 @@ RTC_EXPORT int rtcGetPreviousTrackSenderReportTimestamp(int id, uint32_t *timest // Set NeedsToReport flag in RtcpSrReporter handler identified by given track id RTC_EXPORT int rtcSetNeedsToSendRtcpSr(int id); +/// Get all available payload types for given codec and stores them in buffer, does nothing if buffer is NULL +int rtcGetTrackPayloadTypesForCodec(int tr, const char * ccodec, int * buffer, int size); + +/// Get all SSRCs for given track +int rtcGetSsrcsForTrack(int tr, uint32_t * buffer, int bufferSize); + +/// Get CName for SSRC +int rtcGetCNameForSsrc(int tr, uint32_t ssrc, char * cname, int cnameSize); + +/// Get all SSRCs for given media type in given SDP +/// @param mediaType Media type (audio/video) +int rtcGetSsrcsForType(const char * mediaType, const char * sdp, uint32_t * buffer, int bufferSize); + +/// Set SSRC for given media type in given SDP +int rtcSetSsrcForType(const char * mediaType, const char * sdp, char * buffer, const int bufferSize, rtcSsrcForTypeInit * init); + #endif // RTC_ENABLE_MEDIA #if RTC_ENABLE_WEBSOCKET diff --git a/src/capi.cpp b/src/capi.cpp index 194901f..aaa64c7 100644 --- a/src/capi.cpp +++ b/src/capi.cpp @@ -268,6 +268,21 @@ int copyAndReturn(binary b, char *buffer, int size) { return int(b.size()); } +template +int copyAndReturn(std::vector b, T *buffer, int size) { + if (!buffer) + return int(b.size()); + + if (size < int(b.size())) + return RTC_ERR_TOO_SMALL; + memcpy(buffer, b.data(), size * sizeof(*buffer)); + return int(b.size()); +} + +string lowercased(string str) { + std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return std::tolower(c); }); + return str; +} } // namespace void rtcInitLogger(rtcLogLevel level, rtcLogCallbackFunc cb) { @@ -365,6 +380,12 @@ int rtcCreateDataChannelEx(int pc, const char *label, const rtcDataChannelInit * }); } +int rtcIsDataChannelOpen(int dc) { + return wrap([dc] { + return getDataChannel(dc)->isOpen() ? RTC_ERR_SUCCESS : RTC_ERR_FAILURE; + }); +} + int rtcDeleteDataChannel(int dc) { return wrap([dc] { auto dataChannel = getDataChannel(dc); @@ -380,6 +401,34 @@ int rtcDeleteDataChannel(int dc) { }); } +int rtcIsDataChannelOpen(int dc) { + return wrap([dc] { + return getDataChannel(dc)->isOpen() ? RTC_ERR_SUCCESS : RTC_ERR_FAILURE; + }); +} + +#if RTC_ENABLE_MEDIA + +void setSSRC(Description::Media *description, uint32_t ssrc, const char *_name, const char *_msid, const char *_trackID) { + + optional name = nullopt; + if (_name) { + name = string(_name); + } + + optional msid = nullopt; + if (_msid) { + msid = string(_msid); + } + + optional trackID = nullopt; + if (_trackID) { + trackID = string(_trackID); + } + + description->addSSRC(ssrc, name, msid, trackID); +} + int rtcAddTrack(int pc, const char *mediaDescriptionSdp) { return wrap([&] { if (!mediaDescriptionSdp) @@ -503,6 +552,26 @@ int rtcGetTrackDescription(int tr, char *buffer, int size) { #if RTC_ENABLE_MEDIA +void setSSRC(Description::Media *description, uint32_t ssrc, const char *_name, const char *_msid, const char *_trackID) { + + optional name = nullopt; + if (_name) { + name = string(_name); + } + + optional msid = nullopt; + if (_msid) { + msid = string(_msid); + } + + optional trackID = nullopt; + if (_trackID) { + trackID = string(_trackID); + } + + description->addSSRC(ssrc, name, msid, trackID); +} + int rtcSetH264PacketizationHandler(int tr, const rtcPacketizationHandlerInit *init) { return wrap([&] { auto track = getTrack(tr); @@ -633,6 +702,23 @@ int rtcSetNeedsToSendRtcpSr(int id) { }); } +int rtcGetTrackPayloadTypesForCodec(int tr, const char * ccodec, int * buffer, int size) { + return wrap([&] { + auto track = getTrack(tr); + auto codec = lowercased(string(ccodec)); + auto description = track->description(); + std::vector payloadTypes{}; + payloadTypes.reserve(std::max(size, 0)); + for (auto it = description.beginMaps(); it != description.endMaps(); it++) { + auto element = *it; + if (lowercased(element.second.format) == codec) { + payloadTypes.push_back(element.first); + } + } + return copyAndReturn(payloadTypes, buffer, size); + }); +} + #endif // RTC_ENABLE_MEDIA #if RTC_ENABLE_WEBSOCKET @@ -784,6 +870,68 @@ int rtcSetLocalDescription(int pc, const char *type) { }); } +int rtcGetSsrcsForTrack(int tr, uint32_t * buffer, int bufferSize) { + return wrap([&] { + auto track = getTrack(tr); + auto ssrcs = track->description().getSSRCs(); + return copyAndReturn(ssrcs, buffer, bufferSize); + }); +} + +int rtcGetCNameForSsrc(int tr, uint32_t ssrc, char * cname, int cnameSize) { + return wrap([&] { + auto track = getTrack(tr); + auto description = track->description(); + auto optCName = description.getCNameForSsrc(ssrc); + if (optCName.has_value()) { + return copyAndReturn(optCName.value(), cname, cnameSize); + } else { + return 0; + } + }); +} + +int rtcGetSsrcsForType(const char * mediaType, const char * sdp, uint32_t * buffer, int bufferSize) { + return wrap([&] { + auto type = lowercased(string(mediaType)); + auto oldSDP = string(sdp); + auto description = Description(oldSDP, "unspec"); + auto mediaCount = description.mediaCount(); + for (auto i = 0; i < mediaCount; i++) { + if (std::holds_alternative(description.media(i))) { + auto media = std::get(description.media(i)); + auto currentMediaType = lowercased(media->type()); + if (currentMediaType == type) { + auto ssrcs = media->getSSRCs(); + return copyAndReturn(ssrcs, buffer, bufferSize); + } + } + } + return 0; + }); +} + +int rtcSetSsrcForType(const char * mediaType, const char * sdp, char * buffer, const int bufferSize, + rtcSsrcForTypeInit * init) { + return wrap([&] { + auto type = lowercased(string(mediaType)); + auto prevSDP = string(sdp); + auto description = Description(prevSDP, "unspec"); + auto mediaCount = description.mediaCount(); + for (auto i = 0; i < mediaCount; i++) { + if (std::holds_alternative(description.media(i))) { + auto media = std::get(description.media(i)); + auto currentMediaType = lowercased(media->type()); + if (currentMediaType == type) { + setSSRC(media, init->ssrc, init->name, init->msid, init->trackId); + break; + } + } + } + return copyAndReturn(string(description), buffer, bufferSize); + }); +} + int rtcSetRemoteDescription(int pc, const char *sdp, const char *type) { return wrap([&] { auto peerConnection = getPeerConnection(pc); diff --git a/src/description.cpp b/src/description.cpp index e7d28b7..fd08ced 100644 --- a/src/description.cpp +++ b/src/description.cpp @@ -858,7 +858,11 @@ void Description::Media::parseSdpLine(string_view line) { } else if (key == "rtcp-mux") { // always added } else if (key == "ssrc") { - mSsrcs.emplace_back(to_integer(value)); + auto ssrc = to_integer(value); + if (!hasSSRC(ssrc)) { + mSsrcs.emplace_back(ssrc); + } + mAttributes.emplace_back(attr); } else { Entry::parseSdpLine(line); } @@ -875,6 +879,15 @@ void Description::Media::addRTPMap(const Description::Media::RTPMap &map) { std::vector Description::Media::getSSRCs() { return mSsrcs; } +std::optional Description::Media::getCNameForSsrc(uint32_t ssrc) { + for (auto &val : mAttributes) { + if (val.find("ssrc:") == 0 && val.find("cname:") != std::string::npos) { + return val.substr(val.find("cname:") + 6); + } + } + return std::nullopt; +} + std::map::iterator Description::Media::beginMaps() { return mRtpMap.begin(); } From e88197646d9e07e9315333a1c4fac40c16458266 Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Mon, 31 May 2021 14:52:55 +0200 Subject: [PATCH 02/12] Fix code duplication --- src/capi.cpp | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/src/capi.cpp b/src/capi.cpp index aaa64c7..a110953 100644 --- a/src/capi.cpp +++ b/src/capi.cpp @@ -401,34 +401,6 @@ int rtcDeleteDataChannel(int dc) { }); } -int rtcIsDataChannelOpen(int dc) { - return wrap([dc] { - return getDataChannel(dc)->isOpen() ? RTC_ERR_SUCCESS : RTC_ERR_FAILURE; - }); -} - -#if RTC_ENABLE_MEDIA - -void setSSRC(Description::Media *description, uint32_t ssrc, const char *_name, const char *_msid, const char *_trackID) { - - optional name = nullopt; - if (_name) { - name = string(_name); - } - - optional msid = nullopt; - if (_msid) { - msid = string(_msid); - } - - optional trackID = nullopt; - if (_trackID) { - trackID = string(_trackID); - } - - description->addSSRC(ssrc, name, msid, trackID); -} - int rtcAddTrack(int pc, const char *mediaDescriptionSdp) { return wrap([&] { if (!mediaDescriptionSdp) From 78ca3a318f61143e32e16dac85329c64849a2814 Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Mon, 31 May 2021 14:53:13 +0200 Subject: [PATCH 03/12] fix `getCNameForSsrc` --- src/description.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/description.cpp b/src/description.cpp index fd08ced..c6ffbe8 100644 --- a/src/description.cpp +++ b/src/description.cpp @@ -882,7 +882,10 @@ std::vector Description::Media::getSSRCs() { return mSsrcs; } std::optional Description::Media::getCNameForSsrc(uint32_t ssrc) { for (auto &val : mAttributes) { if (val.find("ssrc:") == 0 && val.find("cname:") != std::string::npos) { - return val.substr(val.find("cname:") + 6); + auto valSsrc = to_integer(val.substr(5)); + if (valSsrc == ssrc) { + return val.substr(val.find("cname:") + 6); + } } } return std::nullopt; From 8bdce69ab763d8374258752151b12a7dce69fabe Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Mon, 31 May 2021 15:09:11 +0200 Subject: [PATCH 04/12] Fix build error: comparison of integer expressions of different signedness --- src/capi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/capi.cpp b/src/capi.cpp index a110953..4f10485 100644 --- a/src/capi.cpp +++ b/src/capi.cpp @@ -869,7 +869,7 @@ int rtcGetSsrcsForType(const char * mediaType, const char * sdp, uint32_t * buff auto oldSDP = string(sdp); auto description = Description(oldSDP, "unspec"); auto mediaCount = description.mediaCount(); - for (auto i = 0; i < mediaCount; i++) { + for (unsigned int i = 0; i < mediaCount; i++) { if (std::holds_alternative(description.media(i))) { auto media = std::get(description.media(i)); auto currentMediaType = lowercased(media->type()); @@ -890,7 +890,7 @@ int rtcSetSsrcForType(const char * mediaType, const char * sdp, char * buffer, c auto prevSDP = string(sdp); auto description = Description(prevSDP, "unspec"); auto mediaCount = description.mediaCount(); - for (auto i = 0; i < mediaCount; i++) { + for (unsigned int i = 0; i < mediaCount; i++) { if (std::holds_alternative(description.media(i))) { auto media = std::get(description.media(i)); auto currentMediaType = lowercased(media->type()); From a2b019465cfb2064c64034ee0b093ece0ec1b883 Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Mon, 31 May 2021 15:20:18 +0200 Subject: [PATCH 05/12] Move ssrc manupulation functions to RTC_ENABLE_MEDIA --- src/capi.cpp | 124 +++++++++++++++++++++++++-------------------------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/src/capi.cpp b/src/capi.cpp index 4f10485..7f6d3e5 100644 --- a/src/capi.cpp +++ b/src/capi.cpp @@ -691,6 +691,68 @@ int rtcGetTrackPayloadTypesForCodec(int tr, const char * ccodec, int * buffer, i }); } +int rtcGetSsrcsForTrack(int tr, uint32_t * buffer, int bufferSize) { + return wrap([&] { + auto track = getTrack(tr); + auto ssrcs = track->description().getSSRCs(); + return copyAndReturn(ssrcs, buffer, bufferSize); + }); +} + +int rtcGetCNameForSsrc(int tr, uint32_t ssrc, char * cname, int cnameSize) { + return wrap([&] { + auto track = getTrack(tr); + auto description = track->description(); + auto optCName = description.getCNameForSsrc(ssrc); + if (optCName.has_value()) { + return copyAndReturn(optCName.value(), cname, cnameSize); + } else { + return 0; + } + }); +} + +int rtcGetSsrcsForType(const char * mediaType, const char * sdp, uint32_t * buffer, int bufferSize) { + return wrap([&] { + auto type = lowercased(string(mediaType)); + auto oldSDP = string(sdp); + auto description = Description(oldSDP, "unspec"); + auto mediaCount = description.mediaCount(); + for (unsigned int i = 0; i < mediaCount; i++) { + if (std::holds_alternative(description.media(i))) { + auto media = std::get(description.media(i)); + auto currentMediaType = lowercased(media->type()); + if (currentMediaType == type) { + auto ssrcs = media->getSSRCs(); + return copyAndReturn(ssrcs, buffer, bufferSize); + } + } + } + return 0; + }); +} + +int rtcSetSsrcForType(const char * mediaType, const char * sdp, char * buffer, const int bufferSize, + rtcSsrcForTypeInit * init) { + return wrap([&] { + auto type = lowercased(string(mediaType)); + auto prevSDP = string(sdp); + auto description = Description(prevSDP, "unspec"); + auto mediaCount = description.mediaCount(); + for (unsigned int i = 0; i < mediaCount; i++) { + if (std::holds_alternative(description.media(i))) { + auto media = std::get(description.media(i)); + auto currentMediaType = lowercased(media->type()); + if (currentMediaType == type) { + setSSRC(media, init->ssrc, init->name, init->msid, init->trackId); + break; + } + } + } + return copyAndReturn(string(description), buffer, bufferSize); + }); +} + #endif // RTC_ENABLE_MEDIA #if RTC_ENABLE_WEBSOCKET @@ -842,68 +904,6 @@ int rtcSetLocalDescription(int pc, const char *type) { }); } -int rtcGetSsrcsForTrack(int tr, uint32_t * buffer, int bufferSize) { - return wrap([&] { - auto track = getTrack(tr); - auto ssrcs = track->description().getSSRCs(); - return copyAndReturn(ssrcs, buffer, bufferSize); - }); -} - -int rtcGetCNameForSsrc(int tr, uint32_t ssrc, char * cname, int cnameSize) { - return wrap([&] { - auto track = getTrack(tr); - auto description = track->description(); - auto optCName = description.getCNameForSsrc(ssrc); - if (optCName.has_value()) { - return copyAndReturn(optCName.value(), cname, cnameSize); - } else { - return 0; - } - }); -} - -int rtcGetSsrcsForType(const char * mediaType, const char * sdp, uint32_t * buffer, int bufferSize) { - return wrap([&] { - auto type = lowercased(string(mediaType)); - auto oldSDP = string(sdp); - auto description = Description(oldSDP, "unspec"); - auto mediaCount = description.mediaCount(); - for (unsigned int i = 0; i < mediaCount; i++) { - if (std::holds_alternative(description.media(i))) { - auto media = std::get(description.media(i)); - auto currentMediaType = lowercased(media->type()); - if (currentMediaType == type) { - auto ssrcs = media->getSSRCs(); - return copyAndReturn(ssrcs, buffer, bufferSize); - } - } - } - return 0; - }); -} - -int rtcSetSsrcForType(const char * mediaType, const char * sdp, char * buffer, const int bufferSize, - rtcSsrcForTypeInit * init) { - return wrap([&] { - auto type = lowercased(string(mediaType)); - auto prevSDP = string(sdp); - auto description = Description(prevSDP, "unspec"); - auto mediaCount = description.mediaCount(); - for (unsigned int i = 0; i < mediaCount; i++) { - if (std::holds_alternative(description.media(i))) { - auto media = std::get(description.media(i)); - auto currentMediaType = lowercased(media->type()); - if (currentMediaType == type) { - setSSRC(media, init->ssrc, init->name, init->msid, init->trackId); - break; - } - } - } - return copyAndReturn(string(description), buffer, bufferSize); - }); -} - int rtcSetRemoteDescription(int pc, const char *sdp, const char *type) { return wrap([&] { auto peerConnection = getPeerConnection(pc); From a9057a02e5c0d765a4f405934456278ec575eda6 Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Mon, 31 May 2021 15:24:22 +0200 Subject: [PATCH 06/12] move lowercased function to RTC_ENABLE_MEDIA --- src/capi.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/capi.cpp b/src/capi.cpp index 7f6d3e5..65e1fb3 100644 --- a/src/capi.cpp +++ b/src/capi.cpp @@ -279,10 +279,13 @@ int copyAndReturn(std::vector b, T *buffer, int size) { return int(b.size()); } +#if RTC_ENABLE_MEDIA +// function is used in RTC_ENABLE_MEDIA only string lowercased(string str) { std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return std::tolower(c); }); return str; } +#endif // RTC_ENABLE_MEDIA } // namespace void rtcInitLogger(rtcLogLevel level, rtcLogCallbackFunc cb) { From e6a96505232e1921b0c162a4495d8a6500fc3685 Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Tue, 1 Jun 2021 11:26:32 +0200 Subject: [PATCH 07/12] Fix incorrect size in memcpy (copyAndReturn) --- src/capi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/capi.cpp b/src/capi.cpp index 65e1fb3..89e6e5f 100644 --- a/src/capi.cpp +++ b/src/capi.cpp @@ -275,7 +275,7 @@ int copyAndReturn(std::vector b, T *buffer, int size) { if (size < int(b.size())) return RTC_ERR_TOO_SMALL; - memcpy(buffer, b.data(), size * sizeof(*buffer)); + memcpy(buffer, b.data(), b.size() * sizeof(*buffer)); return int(b.size()); } From 34469d16ae66e90f4033bb7f9acb211f28ccd403 Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Tue, 1 Jun 2021 11:27:41 +0200 Subject: [PATCH 08/12] Add CName parsing from ssrc --- include/rtc/description.hpp | 1 + src/description.cpp | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/rtc/description.hpp b/include/rtc/description.hpp index ed649ef..49ab1d3 100644 --- a/include/rtc/description.hpp +++ b/include/rtc/description.hpp @@ -196,6 +196,7 @@ public: std::map mRtpMap; std::vector mSsrcs; + std::map mCNameMap; public: void addRTPMap(const RTPMap &map); diff --git a/src/description.cpp b/src/description.cpp index c6ffbe8..6c28541 100644 --- a/src/description.cpp +++ b/src/description.cpp @@ -556,10 +556,12 @@ Description::Entry::removeAttribute(std::vector::iterator it) { void Description::Media::addSSRC(uint32_t ssrc, optional name, optional msid, optional trackID) { - if (name) + if (name) { mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " cname:" + *name); - else + mCNameMap.emplace(ssrc, *name); + } else { mAttributes.emplace_back("ssrc:" + std::to_string(ssrc)); + } if (msid) mAttributes.emplace_back("ssrc:" + std::to_string(ssrc) + " msid:" + *msid + " " + @@ -862,6 +864,11 @@ void Description::Media::parseSdpLine(string_view line) { if (!hasSSRC(ssrc)) { mSsrcs.emplace_back(ssrc); } + auto cnamePos = value.find("cname:"); + if (cnamePos != std::string::npos) { + auto cname = value.substr(cnamePos); + mCNameMap.emplace(ssrc, cname); + } mAttributes.emplace_back(attr); } else { Entry::parseSdpLine(line); @@ -880,14 +887,10 @@ void Description::Media::addRTPMap(const Description::Media::RTPMap &map) { std::vector Description::Media::getSSRCs() { return mSsrcs; } std::optional Description::Media::getCNameForSsrc(uint32_t ssrc) { - for (auto &val : mAttributes) { - if (val.find("ssrc:") == 0 && val.find("cname:") != std::string::npos) { - auto valSsrc = to_integer(val.substr(5)); - if (valSsrc == ssrc) { - return val.substr(val.find("cname:") + 6); - } - } - } + auto it = mCNameMap.find(ssrc); + if (it != mCNameMap.end()) { + return it->second; + } return std::nullopt; } From f4aae34874f30232ecacc1c7d0a204fb1764cd25 Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Tue, 1 Jun 2021 11:28:15 +0200 Subject: [PATCH 09/12] Refactor rtcIsDataChannelOpen to rtcIsOpen --- include/rtc/rtc.h | 2 +- src/capi.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/rtc/rtc.h b/include/rtc/rtc.h index ac12e1d..0098eb3 100644 --- a/include/rtc/rtc.h +++ b/include/rtc/rtc.h @@ -206,7 +206,7 @@ RTC_EXPORT int rtcSetDataChannelCallback(int pc, rtcDataChannelCallbackFunc cb); RTC_EXPORT int rtcCreateDataChannel(int pc, const char *label); // returns dc id RTC_EXPORT int rtcCreateDataChannelEx(int pc, const char *label, const rtcDataChannelInit *init); // returns dc id -RTC_EXPORT int rtcIsDataChannelOpen(int dc); +RTC_EXPORT int rtcIsOpen(int dc); RTC_EXPORT int rtcDeleteDataChannel(int dc); RTC_EXPORT int rtcGetDataChannelStream(int dc); diff --git a/src/capi.cpp b/src/capi.cpp index 89e6e5f..9887810 100644 --- a/src/capi.cpp +++ b/src/capi.cpp @@ -383,9 +383,9 @@ int rtcCreateDataChannelEx(int pc, const char *label, const rtcDataChannelInit * }); } -int rtcIsDataChannelOpen(int dc) { - return wrap([dc] { - return getDataChannel(dc)->isOpen() ? RTC_ERR_SUCCESS : RTC_ERR_FAILURE; +int rtcIsOpen(int cid) { + return wrap([cid] { + return getChannel(cid)->isOpen(); }); } From 39e51a8345b4933ab36b99be00b67a4fbe194799 Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Tue, 1 Jun 2021 11:28:44 +0200 Subject: [PATCH 10/12] Rename bufferSize parameter to count --- include/rtc/rtc.h | 2 +- src/capi.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/rtc/rtc.h b/include/rtc/rtc.h index 0098eb3..8a9e80c 100644 --- a/include/rtc/rtc.h +++ b/include/rtc/rtc.h @@ -310,7 +310,7 @@ RTC_EXPORT int rtcSetNeedsToSendRtcpSr(int id); int rtcGetTrackPayloadTypesForCodec(int tr, const char * ccodec, int * buffer, int size); /// Get all SSRCs for given track -int rtcGetSsrcsForTrack(int tr, uint32_t * buffer, int bufferSize); +int rtcGetSsrcsForTrack(int tr, uint32_t * buffer, int count); /// Get CName for SSRC int rtcGetCNameForSsrc(int tr, uint32_t ssrc, char * cname, int cnameSize); diff --git a/src/capi.cpp b/src/capi.cpp index 9887810..30c3b7f 100644 --- a/src/capi.cpp +++ b/src/capi.cpp @@ -694,11 +694,11 @@ int rtcGetTrackPayloadTypesForCodec(int tr, const char * ccodec, int * buffer, i }); } -int rtcGetSsrcsForTrack(int tr, uint32_t * buffer, int bufferSize) { +int rtcGetSsrcsForTrack(int tr, uint32_t * buffer, int count) { return wrap([&] { auto track = getTrack(tr); auto ssrcs = track->description().getSSRCs(); - return copyAndReturn(ssrcs, buffer, bufferSize); + return copyAndReturn(ssrcs, buffer, count); }); } From 79242e27ed064e93e69d600f60045e9e08fd055c Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Thu, 3 Jun 2021 09:29:45 +0200 Subject: [PATCH 11/12] Fix cname parsing bug in `parseSdpLine` --- src/description.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/description.cpp b/src/description.cpp index 6c28541..8f2d6d9 100644 --- a/src/description.cpp +++ b/src/description.cpp @@ -866,7 +866,7 @@ void Description::Media::parseSdpLine(string_view line) { } auto cnamePos = value.find("cname:"); if (cnamePos != std::string::npos) { - auto cname = value.substr(cnamePos); + auto cname = value.substr(cnamePos + 6); mCNameMap.emplace(ssrc, cname); } mAttributes.emplace_back(attr); From 983b5759f31ee1978ae4e72e766f70f429acad2c Mon Sep 17 00:00:00 2001 From: Filip Klembara Date: Thu, 3 Jun 2021 09:30:17 +0200 Subject: [PATCH 12/12] Replace memcpy with std::copy in `copyAndReturn` --- src/capi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/capi.cpp b/src/capi.cpp index 30c3b7f..f1e08ec 100644 --- a/src/capi.cpp +++ b/src/capi.cpp @@ -275,7 +275,7 @@ int copyAndReturn(std::vector b, T *buffer, int size) { if (size < int(b.size())) return RTC_ERR_TOO_SMALL; - memcpy(buffer, b.data(), b.size() * sizeof(*buffer)); + std::copy(b.begin(), b.end(), buffer); return int(b.size()); }