1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 #include "content/renderer/media/rtc_media_constraints.h" 5 6 #include <string> 7 8 #include "base/logging.h" 9 #include "base/strings/string_util.h" 10 #include "content/common/media/media_stream_options.h" 11 #include "content/renderer/media/media_stream_video_source.h" 12 #include "third_party/WebKit/public/platform/WebMediaConstraints.h" 13 #include "third_party/WebKit/public/platform/WebCString.h" 14 #include "third_party/WebKit/public/platform/WebString.h" 15 16 namespace content { 17 namespace { 18 19 void GetNativeMediaConstraints( 20 const blink::WebVector<blink::WebMediaConstraint>& constraints, 21 webrtc::MediaConstraintsInterface::Constraints* native_constraints) { 22 DCHECK(native_constraints); 23 for (size_t i = 0; i < constraints.size(); ++i) { 24 webrtc::MediaConstraintsInterface::Constraint new_constraint; 25 new_constraint.key = constraints[i].m_name.utf8(); 26 new_constraint.value = constraints[i].m_value.utf8(); 27 28 // Ignore Chrome specific Tab capture constraints. 29 if (new_constraint.key == kMediaStreamSource || 30 new_constraint.key == kMediaStreamSourceId) 31 continue; 32 33 // Ignore sourceId constraint since that has nothing to do with webrtc. 34 if (new_constraint.key == kMediaStreamSourceInfoId) 35 continue; 36 37 // Ignore constraints that are handled by Chrome in MediaStreamVideoSource. 38 if (MediaStreamVideoSource::IsConstraintSupported(new_constraint.key)) 39 continue; 40 41 DVLOG(3) << "MediaStreamConstraints:" << new_constraint.key 42 << " : " << new_constraint.value; 43 native_constraints->push_back(new_constraint); 44 } 45 } 46 47 } // namespace 48 49 RTCMediaConstraints::RTCMediaConstraints() {} 50 51 RTCMediaConstraints::RTCMediaConstraints( 52 const blink::WebMediaConstraints& constraints) { 53 if (constraints.isNull()) 54 return; // Will happen in unit tests. 55 blink::WebVector<blink::WebMediaConstraint> mandatory; 56 constraints.getMandatoryConstraints(mandatory); 57 GetNativeMediaConstraints(mandatory, &mandatory_); 58 blink::WebVector<blink::WebMediaConstraint> optional; 59 constraints.getOptionalConstraints(optional); 60 GetNativeMediaConstraints(optional, &optional_); 61 } 62 63 RTCMediaConstraints::~RTCMediaConstraints() {} 64 65 const webrtc::MediaConstraintsInterface::Constraints& 66 RTCMediaConstraints::GetMandatory() const { 67 return mandatory_; 68 } 69 70 const webrtc::MediaConstraintsInterface::Constraints& 71 RTCMediaConstraints::GetOptional() const { 72 return optional_; 73 } 74 75 bool RTCMediaConstraints::AddOptional(const std::string& key, 76 const std::string& value, 77 bool override_if_exists) { 78 return AddConstraint(&optional_, key, value, override_if_exists); 79 } 80 81 bool RTCMediaConstraints::AddMandatory(const std::string& key, 82 const std::string& value, 83 bool override_if_exists) { 84 return AddConstraint(&mandatory_, key, value, override_if_exists); 85 } 86 87 bool RTCMediaConstraints::AddConstraint(Constraints* constraints, 88 const std::string& key, 89 const std::string& value, 90 bool override_if_exists) { 91 for (Constraints::iterator iter = constraints->begin(); 92 iter != constraints->end(); 93 ++iter) { 94 if (iter->key == key) { 95 if (override_if_exists) 96 iter->value = value; 97 return override_if_exists; 98 } 99 } 100 // The key wasn't found, add it. 101 constraints->push_back(Constraint(key, value)); 102 return true; 103 } 104 105 } // namespace content 106