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