Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / renderer / media / rtc_media_constraints.cc
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