diff --git a/talk/media/webrtc/webrtcvideoengine2.cc b/talk/media/webrtc/webrtcvideoengine2.cc index b9816fc161..ec4f983ebd 100644 --- a/talk/media/webrtc/webrtcvideoengine2.cc +++ b/talk/media/webrtc/webrtcvideoengine2.cc @@ -718,6 +718,19 @@ bool WebRtcVideoChannel2::SetRecvCodecs(const std::vector& codecs) { return false; } + // Prevent reconfiguration when setting identical receive codecs. + if (recv_codecs_.size() == supported_codecs.size()) { + bool reconfigured = false; + for (size_t i = 0; i < supported_codecs.size(); ++i) { + if (recv_codecs_[i] != supported_codecs[i]) { + reconfigured = true; + break; + } + } + if (!reconfigured) + return true; + } + recv_codecs_ = supported_codecs; rtc::CritScope stream_lock(&stream_crit_); @@ -2250,6 +2263,11 @@ bool WebRtcVideoChannel2::VideoCodecSettings::operator==( rtx_payload_type == other.rtx_payload_type; } +bool WebRtcVideoChannel2::VideoCodecSettings::operator!=( + const WebRtcVideoChannel2::VideoCodecSettings& other) const { + return !(*this == other); +} + std::vector WebRtcVideoChannel2::MapCodecs(const std::vector& codecs) { assert(!codecs.empty()); diff --git a/talk/media/webrtc/webrtcvideoengine2.h b/talk/media/webrtc/webrtcvideoengine2.h index 927e699e3e..b8ddfc6f11 100644 --- a/talk/media/webrtc/webrtcvideoengine2.h +++ b/talk/media/webrtc/webrtcvideoengine2.h @@ -246,7 +246,9 @@ class WebRtcVideoChannel2 : public rtc::MessageHandler, struct VideoCodecSettings { VideoCodecSettings(); - bool operator ==(const VideoCodecSettings& other) const; + + bool operator==(const VideoCodecSettings& other) const; + bool operator!=(const VideoCodecSettings& other) const; VideoCodec codec; webrtc::FecConfig fec;