From ebffdbdfafb9a31d80b772eddd54b4b20a8908ae Mon Sep 17 00:00:00 2001 From: alexander_panaev Date: Fri, 11 Sep 2026 12:57:31 +0700 Subject: [PATCH 1/3] fix: extract rtp capabilities crash --- src/sdp/Utils.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sdp/Utils.cpp b/src/sdp/Utils.cpp index ba82c4a9..c4ac5cd6 100644 --- a/src/sdp/Utils.cpp +++ b/src/sdp/Utils.cpp @@ -32,6 +32,9 @@ namespace mediasoupclient for (const auto& m : sdpObject["media"]) { + if (m["port"] == 0) + continue; + auto kind = m["type"].get(); if (kind == "audio") From 4a137d6cf2dc958c96454cca371d69da20bc4af0 Mon Sep 17 00:00:00 2001 From: alexander_panaev Date: Sun, 13 Sep 2026 03:39:49 +0700 Subject: [PATCH 2/3] Revert "fix: extract rtp capabilities crash" This reverts commit ebffdbdfafb9a31d80b772eddd54b4b20a8908ae. --- src/sdp/Utils.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/sdp/Utils.cpp b/src/sdp/Utils.cpp index c4ac5cd6..ba82c4a9 100644 --- a/src/sdp/Utils.cpp +++ b/src/sdp/Utils.cpp @@ -32,9 +32,6 @@ namespace mediasoupclient for (const auto& m : sdpObject["media"]) { - if (m["port"] == 0) - continue; - auto kind = m["type"].get(); if (kind == "audio") From 06029c1651e5fa052c74db29b3486d087368aee7 Mon Sep 17 00:00:00 2001 From: alexander_panaev Date: Sun, 13 Sep 2026 22:36:22 +0700 Subject: [PATCH 3/3] fix: extract rtp capabilities crash --- src/sdp/Utils.cpp | 160 ++++++++++++++++++++++++++-------------------- 1 file changed, 90 insertions(+), 70 deletions(-) diff --git a/src/sdp/Utils.cpp b/src/sdp/Utils.cpp index ba82c4a9..b8d591f4 100644 --- a/src/sdp/Utils.cpp +++ b/src/sdp/Utils.cpp @@ -58,108 +58,128 @@ namespace mediasoupclient } // Get codecs. - for (const auto& rtp : m["rtp"]) - { - std::string mimeType(kind); - mimeType.append("/").append(rtp["codec"].get()); + auto jsonRtpIt = m.find("rtp"); - // clang-format off - json codec = - { - { "kind", kind }, - { "mimeType", mimeType }, - { "preferredPayloadType", rtp["payload"] }, - { "clockRate", rtp["rate"] }, - { "parameters", json::object() }, - { "rtcpFeedback", json::array() } - }; - // clang-format on - - if (kind == "audio") + if (jsonRtpIt != m.end() && jsonRtpIt->is_array()) + { + for (const auto& rtp : *jsonRtpIt) { - auto jsonEncodingIt = rtp.find("encoding"); + std::string mimeType(kind); + mimeType.append("/").append(rtp["codec"].get()); - if (jsonEncodingIt != rtp.end() && jsonEncodingIt->is_string()) + // clang-format off + json codec = { - codec["channels"] = std::stoi(jsonEncodingIt->get()); - } - else + { "kind", kind }, + { "mimeType", mimeType }, + { "preferredPayloadType", rtp["payload"] }, + { "clockRate", rtp["rate"] }, + { "parameters", json::object() }, + { "rtcpFeedback", json::array() } + }; + // clang-format on + + if (kind == "audio") { - codec["channels"] = 1; + auto jsonEncodingIt = rtp.find("encoding"); + + if (jsonEncodingIt != rtp.end() && jsonEncodingIt->is_string()) + { + codec["channels"] = std::stoi(jsonEncodingIt->get()); + } + else + { + codec["channels"] = 1; + } } - } - codecsMap[codec["preferredPayloadType"].get()] = codec; + codecsMap[codec["preferredPayloadType"].get()] = codec; + } } // Get codec parameters. - for (const auto& fmtp : m["fmtp"]) - { - auto parameters = sdptransform::parseParams(fmtp["config"]); - auto jsonPayloadIt = codecsMap.find(fmtp["payload"]); + auto jsonFmtpIt = m.find("fmtp"); - if (jsonPayloadIt == codecsMap.end()) + if (jsonFmtpIt != m.end() && jsonFmtpIt->is_array()) + { + for (const auto& fmtp : *jsonFmtpIt) { - continue; - } + auto parameters = sdptransform::parseParams(fmtp["config"]); + auto jsonPayloadIt = codecsMap.find(fmtp["payload"]); - // If preset, convert 'profile-id' parameter (VP8 and VP9) into - // integer since we define it that way in mediasoup RtpCodecParameters - // and RtpCodecCapability. - auto profileIdIt = parameters.find("profile-id"); + if (jsonPayloadIt == codecsMap.end()) + { + continue; + } - if (profileIdIt != parameters.end() && profileIdIt->is_string()) - { - parameters["profile-id"] = std::stoi(profileIdIt->get()); - } + // If preset, convert 'profile-id' parameter (VP8 and VP9) into + // integer since we define it that way in mediasoup RtpCodecParameters + // and RtpCodecCapability. + auto profileIdIt = parameters.find("profile-id"); - auto& codec = jsonPayloadIt->second; + if (profileIdIt != parameters.end() && profileIdIt->is_string()) + { + parameters["profile-id"] = std::stoi(profileIdIt->get()); + } - codec["parameters"] = parameters; + auto& codec = jsonPayloadIt->second; + + codec["parameters"] = parameters; + } } // Get RTCP feedback for each codec. - for (const auto& fb : m["rtcpFb"]) - { - auto jsonCodecIt = codecsMap.find(std::stoi(fb["payload"].get())); + auto jsonRtcpFbIt = m.find("rtcpFb"); - if (jsonCodecIt == codecsMap.end()) + if (jsonRtcpFbIt != m.end() && jsonRtcpFbIt->is_array()) + { + for (const auto& fb : *jsonRtcpFbIt) { - continue; - } + auto jsonCodecIt = codecsMap.find(std::stoi(fb["payload"].get())); - auto& codec = jsonCodecIt->second; + if (jsonCodecIt == codecsMap.end()) + { + continue; + } - // clang-format off - json feedback = - { - {"type", fb["type"]} - }; - // clang-format on + auto& codec = jsonCodecIt->second; - auto jsonSubtypeIt = fb.find("subtype"); + // clang-format off + json feedback = + { + {"type", fb["type"]} + }; + // clang-format on - if (jsonSubtypeIt != fb.end()) - { - feedback["parameter"] = *jsonSubtypeIt; - } + auto jsonSubtypeIt = fb.find("subtype"); - codec["rtcpFeedback"].push_back(feedback); + if (jsonSubtypeIt != fb.end()) + { + feedback["parameter"] = *jsonSubtypeIt; + } + + codec["rtcpFeedback"].push_back(feedback); + } } // Get RTP header extensions. - for (const auto& ext : m["ext"]) + auto jsonExtIt = m.find("ext"); + + if (jsonExtIt != m.end() && jsonExtIt->is_array()) { - // clang-format off - json headerExtension = + for (const auto& ext : *jsonExtIt) { - { "kind", kind }, - { "uri", ext["uri"] }, - { "preferredId", ext["value"] } - }; - // clang-format on + // clang-format off + json headerExtension = + { + { "kind", kind }, + { "uri", ext["uri"] }, + { "preferredId", ext["value"] } + }; + // clang-format on - headerExtensions.push_back(headerExtension); + headerExtensions.push_back(headerExtension); + } } }