static nsresult NegotiatedDetailsToVideoCodecConfigs(const JsepTrackNegotiatedDetails& aDetails, PtrVector<VideoCodecConfig>* aConfigs) { std::vector<JsepCodecDescription*> codecs(GetCodecs(aDetails)); for (const JsepCodecDescription* codec : codecs) { VideoCodecConfig* config; if (NS_FAILED(JsepCodecDescToCodecConfig(*codec, &config))) { return NS_ERROR_INVALID_ARG; } for (size_t i = 0; i < aDetails.GetEncodingCount(); ++i) { const JsepTrackEncoding& jsepEncoding(aDetails.GetEncoding(i)); if (jsepEncoding.HasFormat(codec->mDefaultPt)) { VideoCodecConfig::SimulcastEncoding encoding; encoding.rid = jsepEncoding.mRid; encoding.constraints = jsepEncoding.mConstraints; config->mSimulcastEncodings.push_back(encoding); } } aConfigs->values.push_back(config); } return NS_OK; }
static std::vector<JsepCodecDescription*> GetCodecs(const JsepTrackNegotiatedDetails& aDetails) { // We do not try to handle cases where a codec is not used on the primary // encoding. if (aDetails.GetEncodingCount()) { return aDetails.GetEncoding(0).GetCodecs(); } return std::vector<JsepCodecDescription*>(); }
void SanityCheckNegotiatedDetails(const JsepTrackNegotiatedDetails& a, const JsepTrackNegotiatedDetails& b) const { ASSERT_EQ(a.GetEncodingCount(), b.GetEncodingCount()); for (size_t i = 0; i < a.GetEncodingCount(); ++i) { SanityCheckEncodings(a.GetEncoding(i), b.GetEncoding(i)); } ASSERT_EQ(a.GetUniquePayloadTypes().size(), b.GetUniquePayloadTypes().size()); for (size_t i = 0; i < a.GetUniquePayloadTypes().size(); ++i) { ASSERT_EQ(a.GetUniquePayloadTypes()[i], b.GetUniquePayloadTypes()[i]); } }