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); + } } }