Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1353)

Unified Diff: webrtc/media/base/codec.cc

Issue 2347863003: H264 codec: Check profile-level-id when matching (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/media/base/codec.cc
diff --git a/webrtc/media/base/codec.cc b/webrtc/media/base/codec.cc
index 01350f7123695276b735166a6517769c69d14a42..a0d9f486a5cbd58f0969e55dbf653b91f9f2bf41 100644
--- a/webrtc/media/base/codec.cc
+++ b/webrtc/media/base/codec.cc
@@ -118,6 +118,12 @@ bool Codec::GetParam(const std::string& name, int* out) const {
return rtc::FromString(iter->second, out);
}
+std::string Codec::GetParam(const std::string& name,
+ const std::string& default_value) const {
+ CodecParameterMap::const_iterator iter = params.find(name);
+ return (iter == params.end()) ? default_value : iter->second;
+}
+
void Codec::SetParam(const std::string& name, const std::string& value) {
params[name] = value;
}
@@ -245,6 +251,29 @@ bool VideoCodec::operator==(const VideoCodec& c) const {
Codec::operator==(c);
}
+bool VideoCodec::Matches(const VideoCodec& codec) const {
+ if (!Codec::Matches(codec))
+ return false;
+ if (name != kH264CodecName)
hta-webrtc 2016/09/19 06:38:36 <standard rant> This is another infection of the
magjed_webrtc 2016/09/19 12:40:30 Yes, I agree this is ugly and that it would be bet
+ return true;
+ // H264 codecs need to have matching profile-level-id.
+ const std::string our_profile_level_id =
+ GetParam(kH264FmtpProfileLevelId, kH264FmtpDefaultProfileLevelId);
+ const std::string their_profile_level_id =
+ codec.GetParam(kH264FmtpProfileLevelId, kH264FmtpDefaultProfileLevelId);
+ if (our_profile_level_id == their_profile_level_id)
+ return true;
+ // At this point, profile-level-id is not an exact match, but that is still ok
+ // if only level_idc differs and level asymmetry is allowed.
+ const bool level_asymmetry_allowed =
+ GetParam(kH264FmtpLevelAsymmetryAllowed, "0") == "1" &&
+ codec.GetParam(kH264FmtpLevelAsymmetryAllowed, "0") == "1";
+ // Ignore level_idc and compare only profile_idc and profile_iop.
+ const bool is_profile_match = (our_profile_level_id.substr(0, 4) ==
+ their_profile_level_id.substr(0, 4));
+ return level_asymmetry_allowed && is_profile_match;
+}
hta-webrtc 2016/09/19 06:38:36 Where's the test that we can successfully negotiat
magjed_webrtc 2016/09/19 12:40:30 The tests are in codec_unittest.cc and the specifi
+
VideoCodec VideoCodec::CreateRtxCodec(int rtx_payload_type,
int associated_payload_type) {
VideoCodec rtx_codec(rtx_payload_type, kRtxCodecName, 0, 0, 0);

Powered by Google App Engine
This is Rietveld 408576698