Index: webrtc/media/engine/webrtcvideoengine2.cc |
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc |
index e37bf94a651cc517676c484861ee063ebc1b1aca..8fc97d6082def0f09c1a0dd581e12c9b6528d87d 100644 |
--- a/webrtc/media/engine/webrtcvideoengine2.cc |
+++ b/webrtc/media/engine/webrtcvideoengine2.cc |
@@ -561,7 +561,7 @@ WebRtcVideoChannel2* WebRtcVideoEngine2::CreateChannel( |
const VideoOptions& options) { |
RTC_DCHECK(initialized_); |
LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString(); |
- return new WebRtcVideoChannel2(call, config, options, video_codecs_, |
+ return new WebRtcVideoChannel2(call, config, options, |
external_encoder_factory_, |
external_decoder_factory_); |
} |
@@ -668,7 +668,6 @@ WebRtcVideoChannel2::WebRtcVideoChannel2( |
webrtc::Call* call, |
const MediaConfig& config, |
const VideoOptions& options, |
- const std::vector<VideoCodec>& recv_codecs, |
WebRtcVideoEncoderFactory* external_encoder_factory, |
WebRtcVideoDecoderFactory* external_decoder_factory) |
: VideoMediaChannel(config), |
@@ -684,8 +683,7 @@ WebRtcVideoChannel2::WebRtcVideoChannel2( |
rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc; |
sending_ = false; |
- RTC_DCHECK(ValidateCodecFormats(recv_codecs)); |
- recv_codecs_ = FilterSupportedCodecs(MapCodecs(recv_codecs)); |
+ recv_codecs_ = MapCodecs(GetSupportedCodecs(external_encoder_factory)); |
} |
WebRtcVideoChannel2::~WebRtcVideoChannel2() { |
@@ -695,17 +693,18 @@ WebRtcVideoChannel2::~WebRtcVideoChannel2() { |
delete kv.second; |
} |
-std::vector<WebRtcVideoChannel2::VideoCodecSettings> |
-WebRtcVideoChannel2::FilterSupportedCodecs( |
- const std::vector<VideoCodecSettings>& mapped_codecs) const { |
- const std::vector<VideoCodec> supported_codecs = |
+rtc::Optional<WebRtcVideoChannel2::VideoCodecSettings> |
+WebRtcVideoChannel2::SelectSendVideoCodec( |
+ const std::vector<VideoCodecSettings>& remote_mapped_codecs) const { |
+ const std::vector<VideoCodec> local_supported_codecs = |
GetSupportedCodecs(external_encoder_factory_); |
- std::vector<VideoCodecSettings> filtered_codecs; |
- for (const VideoCodecSettings& mapped_codec : mapped_codecs) { |
- if (IsCodecSupported(supported_codecs, mapped_codec.codec)) |
- filtered_codecs.push_back(mapped_codec); |
+ // Select the first remote codec that is supported locally. |
+ for (const VideoCodecSettings& remote_mapped_codec : remote_mapped_codecs) { |
+ if (IsCodecSupported(local_supported_codecs, remote_mapped_codec.codec)) |
+ return rtc::Optional<VideoCodecSettings>(remote_mapped_codec); |
} |
- return filtered_codecs; |
+ // No remote codec was supported. |
+ return rtc::Optional<VideoCodecSettings>(); |
} |
bool WebRtcVideoChannel2::ReceiveCodecsHaveChanged( |
@@ -739,19 +738,17 @@ bool WebRtcVideoChannel2::GetChangedSendParameters( |
return false; |
} |
- // Handle send codec. |
- const std::vector<VideoCodecSettings> supported_codecs = |
- FilterSupportedCodecs(MapCodecs(params.codecs)); |
+ // Select one of the remote codecs that will be used as send codec. |
+ const rtc::Optional<VideoCodecSettings> selected_send_codec = |
+ SelectSendVideoCodec(MapCodecs(params.codecs)); |
- if (supported_codecs.empty()) { |
+ if (!selected_send_codec) { |
LOG(LS_ERROR) << "No video codecs supported."; |
return false; |
} |
- if (!send_codec_ || supported_codecs.front() != *send_codec_) { |
- changed_params->codec = |
- rtc::Optional<VideoCodecSettings>(supported_codecs.front()); |
- } |
+ if (!send_codec_ || *selected_send_codec != *send_codec_) |
+ changed_params->codec = selected_send_codec; |
// Handle RTP header extensions. |
std::vector<webrtc::RtpExtension> filtered_extensions = FilterRtpExtensions( |
@@ -968,17 +965,20 @@ bool WebRtcVideoChannel2::GetChangedRecvParameters( |
return false; |
} |
- std::vector<VideoCodecSettings> supported_codecs = |
- FilterSupportedCodecs(mapped_codecs); |
- |
- if (mapped_codecs.size() != supported_codecs.size()) { |
- LOG(LS_ERROR) << "SetRecvParameters called with unsupported video codecs."; |
- return false; |
+ // Verify that every mapped codec is supported locally. |
+ const std::vector<VideoCodec> local_supported_codecs = |
+ GetSupportedCodecs(external_encoder_factory_); |
+ for (const VideoCodecSettings& mapped_codec : mapped_codecs) { |
+ if (!IsCodecSupported(local_supported_codecs, mapped_codec.codec)) { |
+ LOG(LS_ERROR) << "SetRecvParameters called with unsupported video codec: " |
+ << mapped_codec.codec.ToString(); |
+ return false; |
+ } |
} |
- if (ReceiveCodecsHaveChanged(recv_codecs_, supported_codecs)) { |
+ if (ReceiveCodecsHaveChanged(recv_codecs_, mapped_codecs)) { |
changed_params->codec_settings = |
- rtc::Optional<std::vector<VideoCodecSettings>>(supported_codecs); |
+ rtc::Optional<std::vector<VideoCodecSettings>>(mapped_codecs); |
} |
// Handle RTP header extensions. |