Index: webrtc/media/base/codec.cc |
diff --git a/webrtc/media/base/codec.cc b/webrtc/media/base/codec.cc |
index 66bc9ff7d9d0a44f5129707c2cea06172cfe79f8..0320e58c722a9245661c257af27de37159318044 100644 |
--- a/webrtc/media/base/codec.cc |
+++ b/webrtc/media/base/codec.cc |
@@ -17,10 +17,20 @@ |
#include "webrtc/base/logging.h" |
#include "webrtc/base/stringencode.h" |
#include "webrtc/base/stringutils.h" |
+#include "webrtc/common_video/h264/profile_level_id.h" |
namespace cricket { |
-const int kMaxPayloadId = 127; |
+static bool IsSameH264Profile(const CodecParameterMap& params1, |
+ const CodecParameterMap& params2) { |
+ const rtc::Optional<webrtc::H264::ProfileLevelId> profile_level_id = |
+ webrtc::H264::ParseSdpProfileLevelId(params1); |
+ const rtc::Optional<webrtc::H264::ProfileLevelId> other_profile_level_id = |
+ webrtc::H264::ParseSdpProfileLevelId(params2); |
+ // Compare H264 profiles, but not levels. |
+ return profile_level_id && other_profile_level_id && |
+ profile_level_id->profile == other_profile_level_id->profile; |
+} |
bool FeedbackParam::operator==(const FeedbackParam& other) const { |
return _stricmp(other.id().c_str(), id().c_str()) == 0 && |
@@ -218,6 +228,14 @@ bool VideoCodec::operator==(const VideoCodec& c) const { |
return Codec::operator==(c); |
} |
+bool VideoCodec::Matches(const VideoCodec& other) const { |
+ if (!Codec::Matches(other)) |
+ return false; |
+ if (CodecNamesEq(name.c_str(), kH264CodecName)) |
+ return IsSameH264Profile(params, other.params); |
+ return true; |
+} |
+ |
VideoCodec VideoCodec::CreateRtxCodec(int rtx_payload_type, |
int associated_payload_type) { |
VideoCodec rtx_codec(rtx_payload_type, kRtxCodecName); |
@@ -317,12 +335,19 @@ webrtc::VideoCodecType CodecTypeFromName(const std::string& name) { |
return webrtc::kVideoCodecUnknown; |
} |
-bool IsCodecSupported(const std::vector<VideoCodec>& supported_codecs, |
- const VideoCodec& codec) { |
- return std::any_of(supported_codecs.begin(), supported_codecs.end(), |
- [&codec](const VideoCodec& supported_codec) -> bool { |
- return CodecNamesEq(codec.name, supported_codec.name); |
- }); |
+const VideoCodec* FindMatchingCodec( |
+ const std::vector<VideoCodec>& supported_codecs, |
+ const VideoCodec& codec) { |
+ for (const VideoCodec& supported_codec : supported_codecs) { |
+ if (!CodecNamesEq(codec.name, supported_codec.name)) |
+ continue; |
+ if (CodecNamesEq(codec.name.c_str(), kH264CodecName) && |
+ !IsSameH264Profile(codec.params, supported_codec.params)) { |
+ continue; |
+ } |
+ return &supported_codec; |
+ } |
+ return nullptr; |
} |
} // namespace cricket |