15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/rtc_media_constraints.h" 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include <string> 70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/media/media_stream_options.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/renderer/media/media_stream_video_source.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaConstraints.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCString.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetNativeMediaConstraints( 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebVector<blink::WebMediaConstraint>& constraints, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webrtc::MediaConstraintsInterface::Constraints* native_constraints) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(native_constraints); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < constraints.size(); ++i) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) webrtc::MediaConstraintsInterface::Constraint new_constraint; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_constraint.key = constraints[i].m_name.utf8(); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_constraint.value = constraints[i].m_value.utf8(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignore Chrome specific Tab capture constraints. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (new_constraint.key == kMediaStreamSource || 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_constraint.key == kMediaStreamSourceId) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Ignore sourceId constraint since that has nothing to do with webrtc. 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_constraint.key == kMediaStreamSourceInfoId) 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) continue; 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Ignore constraints that are handled by Chrome in MediaStreamVideoSource. 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (MediaStreamVideoSource::IsConstraintSupported(new_constraint.key)) 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch continue; 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(3) << "MediaStreamConstraints:" << new_constraint.key 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " : " << new_constraint.value; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_constraints->push_back(new_constraint); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)RTCMediaConstraints::RTCMediaConstraints() {} 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RTCMediaConstraints::RTCMediaConstraints( 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaConstraints& constraints) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (constraints.isNull()) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Will happen in unit tests. 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaConstraint> mandatory; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) constraints.getMandatoryConstraints(mandatory); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNativeMediaConstraints(mandatory, &mandatory_); 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaConstraint> optional; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) constraints.getOptionalConstraints(optional); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNativeMediaConstraints(optional, &optional_); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RTCMediaConstraints::~RTCMediaConstraints() {} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const webrtc::MediaConstraintsInterface::Constraints& 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RTCMediaConstraints::GetMandatory() const { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mandatory_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const webrtc::MediaConstraintsInterface::Constraints& 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RTCMediaConstraints::GetOptional() const { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return optional_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool RTCMediaConstraints::AddOptional(const std::string& key, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& value, 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool override_if_exists) { 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return AddConstraint(&optional_, key, value, override_if_exists); 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool RTCMediaConstraints::AddMandatory(const std::string& key, 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& value, 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool override_if_exists) { 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return AddConstraint(&mandatory_, key, value, override_if_exists); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool RTCMediaConstraints::AddConstraint(Constraints* constraints, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& key, 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& value, 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool override_if_exists) { 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (Constraints::iterator iter = constraints->begin(); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) iter != constraints->end(); 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ++iter) { 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (iter->key == key) { 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (override_if_exists) 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) iter->value = value; 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return override_if_exists; 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The key wasn't found, add it. 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) constraints->push_back(Constraint(key, value)); 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return true; 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 106