Chromium Code Reviews| Index: webrtc/api/mediaconstraintsinterface.cc |
| diff --git a/webrtc/api/mediaconstraintsinterface.cc b/webrtc/api/mediaconstraintsinterface.cc |
| index e35c067acc06624525c1ce2dcd67cab4bff1e5f8..5467dff920027b2b591b7b1ede935384877b96ab 100644 |
| --- a/webrtc/api/mediaconstraintsinterface.cc |
| +++ b/webrtc/api/mediaconstraintsinterface.cc |
| @@ -13,6 +13,74 @@ |
| #include "webrtc/api/peerconnectioninterface.h" |
| #include "webrtc/base/stringencode.h" |
| +namespace { |
| + |
| +// Find the highest-priority instance of the T-valued constraint named by |
| +// |key| and return its value as |value|. |constraints| can be null. |
| +// If |mandatory_constraints| is non-null, it is incremented if the key appears |
| +// among the mandatory constraints. |
| +// Returns true if the key was found and has a valid value for type T. |
| +// If the key appears multiple times as an optional constraint, appearances |
| +// after the first are ignored. |
| +// Note: Because this uses FindFirst, repeated optional constraints whose |
| +// first instance has an unrecognized value are not handled precisely in |
| +// accordance with the specification. |
| +template <typename T> |
| +bool FindConstraint(const webrtc::MediaConstraintsInterface* constraints, |
| + const std::string& key, |
| + T* value, |
| + size_t* mandatory_constraints) { |
| + std::string string_value; |
| + if (!constraints) { |
| + return false; |
| + } |
| + if (constraints->GetMandatory().FindFirst(key, &string_value)) { |
| + if (mandatory_constraints) { |
| + ++*mandatory_constraints; |
| + } |
| + return rtc::FromString(string_value, value); |
| + } |
| + if (constraints->GetOptional().FindFirst(key, &string_value)) { |
| + return rtc::FromString(string_value, value); |
| + } |
|
pthatcher1
2017/01/12 23:15:26
Why doesn't this use FindConstraint with a string
Taylor Brandstetter
2017/01/12 23:38:06
Great idea, not sure why I didn't notice that.
|
| + return false; |
| +} |
| + |
| +// Specialization for std::string, since a string doesn't need conversion. |
| +template <> |
| +bool FindConstraint(const webrtc::MediaConstraintsInterface* constraints, |
| + const std::string& key, |
| + std::string* value, |
| + size_t* mandatory_constraints) { |
| + if (!constraints) { |
| + return false; |
| + } |
| + if (constraints->GetMandatory().FindFirst(key, value)) { |
| + if (mandatory_constraints) { |
| + ++*mandatory_constraints; |
| + } |
| + return true; |
| + } |
| + if (constraints->GetOptional().FindFirst(key, value)) { |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| +// Converts a constraint (mandatory takes precedence over optional) to an |
| +// rtc::Optional. |
| +template <typename T> |
| +void ConstraintToOptional(const webrtc::MediaConstraintsInterface* constraints, |
| + const std::string& key, |
| + rtc::Optional<T>* value_out) { |
| + T value; |
| + bool present = FindConstraint<T>(constraints, key, &value, nullptr); |
| + if (present) { |
| + *value_out = rtc::Optional<T>(value); |
| + } |
| +} |
| +} |
| + |
| namespace webrtc { |
| const char MediaConstraintsInterface::kValueTrue[] = "true"; |
| @@ -108,74 +176,17 @@ bool MediaConstraintsInterface::Constraints::FindFirst( |
| return false; |
| } |
| -// Find the highest-priority instance of the boolean-valued constraint) named by |
| -// |key| and return its value as |value|. |constraints| can be null. |
| -// If |mandatory_constraints| is non-null, it is incremented if the key appears |
| -// among the mandatory constraints. |
| -// Returns true if the key was found and has a valid boolean value. |
| -// If the key appears multiple times as an optional constraint, appearances |
| -// after the first are ignored. |
| -// Note: Because this uses FindFirst, repeated optional constraints whose |
| -// first instance has an unrecognized value are not handled precisely in |
| -// accordance with the specification. |
| bool FindConstraint(const MediaConstraintsInterface* constraints, |
| const std::string& key, bool* value, |
| size_t* mandatory_constraints) { |
| - std::string string_value; |
| - if (!constraints) { |
| - return false; |
| - } |
| - if (constraints->GetMandatory().FindFirst(key, &string_value)) { |
| - if (mandatory_constraints) { |
| - ++*mandatory_constraints; |
| - } |
| - return rtc::FromString(string_value, value); |
| - } |
| - if (constraints->GetOptional().FindFirst(key, &string_value)) { |
| - return rtc::FromString(string_value, value); |
| - } |
| - return false; |
| + return ::FindConstraint<bool>(constraints, key, value, mandatory_constraints); |
| } |
| -// As above, but for integers. |
| bool FindConstraint(const MediaConstraintsInterface* constraints, |
| const std::string& key, |
| int* value, |
| size_t* mandatory_constraints) { |
| - std::string string_value; |
| - if (!constraints) { |
| - return false; |
| - } |
| - if (constraints->GetMandatory().FindFirst(key, &string_value)) { |
| - if (mandatory_constraints) { |
| - ++*mandatory_constraints; |
| - } |
| - return rtc::FromString(string_value, value); |
| - } |
| - if (constraints->GetOptional().FindFirst(key, &string_value)) { |
| - return rtc::FromString(string_value, value); |
| - } |
| - return false; |
| -} |
| - |
| -void ConstraintToOptionalBool(const MediaConstraintsInterface* constraints, |
| - const std::string& key, |
| - rtc::Optional<bool>* value_out) { |
| - bool value; |
| - bool present = FindConstraint(constraints, key, &value, nullptr); |
| - if (present) { |
| - *value_out = rtc::Optional<bool>(value); |
| - } |
| -} |
| - |
| -void ConstraintToOptionalInt(const MediaConstraintsInterface* constraints, |
| - const std::string& key, |
| - rtc::Optional<int>* value_out) { |
| - int value; |
| - bool present = FindConstraint(constraints, key, &value, nullptr); |
| - if (present) { |
| - *value_out = rtc::Optional<int>(value); |
| - } |
| + return ::FindConstraint<int>(constraints, key, value, mandatory_constraints); |
| } |
| void CopyConstraintsIntoRtcConfiguration( |
| @@ -203,15 +214,71 @@ void CopyConstraintsIntoRtcConfiguration( |
| MediaConstraintsInterface::kEnableVideoSuspendBelowMinBitrate, |
| &configuration->media_config.video.suspend_below_min_bitrate, |
| nullptr); |
| - ConstraintToOptionalInt(constraints, |
| - MediaConstraintsInterface::kScreencastMinBitrate, |
| - &configuration->screencast_min_bitrate); |
| - ConstraintToOptionalBool(constraints, |
| - MediaConstraintsInterface::kCombinedAudioVideoBwe, |
| - &configuration->combined_audio_video_bwe); |
| - ConstraintToOptionalBool(constraints, |
| - MediaConstraintsInterface::kEnableDtlsSrtp, |
| - &configuration->enable_dtls_srtp); |
| + ConstraintToOptional<int>(constraints, |
| + MediaConstraintsInterface::kScreencastMinBitrate, |
| + &configuration->screencast_min_bitrate); |
| + ConstraintToOptional<bool>(constraints, |
| + MediaConstraintsInterface::kCombinedAudioVideoBwe, |
| + &configuration->combined_audio_video_bwe); |
| + ConstraintToOptional<bool>(constraints, |
| + MediaConstraintsInterface::kEnableDtlsSrtp, |
| + &configuration->enable_dtls_srtp); |
| +} |
| + |
| +void CopyConstraintsIntoAudioOptions( |
| + const MediaConstraintsInterface* constraints, |
| + cricket::AudioOptions* options) { |
| + if (!constraints) { |
| + return; |
| + } |
| + |
| + ConstraintToOptional<bool>(constraints, |
| + MediaConstraintsInterface::kGoogEchoCancellation, |
| + &options->echo_cancellation); |
| + ConstraintToOptional<bool>( |
| + constraints, MediaConstraintsInterface::kExtendedFilterEchoCancellation, |
| + &options->extended_filter_aec); |
| + ConstraintToOptional<bool>(constraints, |
| + MediaConstraintsInterface::kDAEchoCancellation, |
| + &options->delay_agnostic_aec); |
| + ConstraintToOptional<bool>(constraints, |
| + MediaConstraintsInterface::kAutoGainControl, |
| + &options->auto_gain_control); |
| + ConstraintToOptional<bool>( |
| + constraints, MediaConstraintsInterface::kExperimentalAutoGainControl, |
| + &options->experimental_agc); |
| + ConstraintToOptional<bool>(constraints, |
| + MediaConstraintsInterface::kNoiseSuppression, |
| + &options->noise_suppression); |
| + ConstraintToOptional<bool>( |
| + constraints, MediaConstraintsInterface::kExperimentalNoiseSuppression, |
| + &options->experimental_ns); |
| + ConstraintToOptional<bool>( |
| + constraints, MediaConstraintsInterface::kIntelligibilityEnhancer, |
| + &options->intelligibility_enhancer); |
| + ConstraintToOptional<bool>(constraints, |
| + MediaConstraintsInterface::kLevelControl, |
| + &options->level_control); |
| + ConstraintToOptional<bool>(constraints, |
| + MediaConstraintsInterface::kHighpassFilter, |
| + &options->highpass_filter); |
| + ConstraintToOptional<bool>(constraints, |
| + MediaConstraintsInterface::kTypingNoiseDetection, |
| + &options->typing_detection); |
| + ConstraintToOptional<bool>(constraints, |
| + MediaConstraintsInterface::kAudioMirroring, |
| + &options->stereo_swapping); |
| + ConstraintToOptional<float>( |
| + constraints, MediaConstraintsInterface::kLevelControlInitialPeakLevelDBFS, |
| + &options->level_control_initial_peak_level_dbfs); |
| + ConstraintToOptional<std::string>( |
| + constraints, MediaConstraintsInterface::kAudioNetworkAdaptorConfig, |
| + &options->audio_network_adaptor_config); |
| + // When |kAudioNetworkAdaptorConfig| is defined, it both means that audio |
| + // network adaptor is desired, and provides the config string. |
| + if (options->audio_network_adaptor_config) { |
| + options->audio_network_adaptor = rtc::Optional<bool>(true); |
| + } |
| } |
| } // namespace webrtc |