Skip to content

Commit

Permalink
Support MediaStreamTrack.getCapabilities() for echoCancellation and d…
Browse files Browse the repository at this point in the history
…eviceId

Intent to implement and ship:
https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/h4sCuIqb_78

Bug: 293292
Change-Id: Ib1869d4e940cffb3012572451268dec1ffb55a0e
Reviewed-on: https://chromium-review.googlesource.com/899402
Commit-Queue: Guido Urdaneta <guidou@chromium.org>
Reviewed-by: Kentaro Hara <haraken@chromium.org>
Reviewed-by: Guido Urdaneta <guidou@chromium.org>
Cr-Commit-Position: refs/heads/master@{#536709}
  • Loading branch information
chandanpadhi authored and Commit Bot committed Feb 14, 2018
1 parent f6e2201 commit c9a6d48
Show file tree
Hide file tree
Showing 9 changed files with 74 additions and 1 deletion.
9 changes: 9 additions & 0 deletions content/renderer/media/stream/user_media_processor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -770,7 +770,16 @@ blink::WebMediaStreamSource UserMediaProcessor::InitializeAudioSourceObject(
CreateAudioSource(device, source_ready, &has_sw_echo_cancellation);
audio_source->SetStopCallback(base::Bind(
&UserMediaProcessor::OnLocalSourceStopped, weak_factory_.GetWeakPtr()));

std::vector<bool> echo_cancellation;
echo_cancellation.push_back(true);
echo_cancellation.push_back(false);
blink::WebMediaStreamSource::Capabilities capabilities;
capabilities.echo_cancellation = echo_cancellation;
capabilities.device_id = blink::WebString::FromUTF8(device.id);

source.SetExtraData(audio_source); // Takes ownership.
source.SetCapabilities(capabilities);
// At this point it is known if software echo cancellation will be used, but
// final audio parameters for the source are not set yet, so it is not yet
// known if hardware echo cancellation will actually be used. That information
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<!doctype html>
<title>MediaStreamTrack GetCapabilities</title>
<p class="instructions">This test checks for the presence of
<code>echoCancellation</code> and <code>deviceId</code> fields
in <code>MediaStreamTrack.getCapabilities()</code> method.</p>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
promise_test(() => {
return navigator.mediaDevices.getUserMedia({audio: true})
.then(stream => {
var capabilities = stream.getAudioTracks()[0].getCapabilities();
assert_true(undefined !== capabilities.deviceId, "MediaTrackCapabilities's deviceId should exist.");
assert_true(undefined !== capabilities.echoCancellation, "MediaTrackCapabilities's echoCancellation should exist.");
});
});
</script>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<!DOCTYPE HTML>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
promise_test(function() {
return navigator.mediaDevices.getUserMedia({audio: true})
.then(function(stream) {
var capabilities = stream.getAudioTracks()[0].getCapabilities();
assert_greater_than(Object.keys(capabilities).length, 0);
assert_true(capabilities.hasOwnProperty('echoCancellation'));
assert_true(capabilities.hasOwnProperty('deviceId'));
assert_equals(Object.keys(capabilities.echoCancellation).length, 2);
});
}, 'MediaStreamTrack.getCapabilities() support for echoCancellation and deviceId');
</script>
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
#include "platform/mediastream/MediaStreamCenter.h"
#include "platform/mediastream/MediaStreamComponent.h"
#include "platform/wtf/Assertions.h"
#include "platform/wtf/Vector.h"
#include "public/platform/WebMediaStreamTrack.h"

namespace blink {
Expand Down Expand Up @@ -307,6 +308,13 @@ void MediaStreamTrack::SetConstraints(const WebMediaConstraints& constraints) {
void MediaStreamTrack::getCapabilities(MediaTrackCapabilities& capabilities) {
if (image_capture_)
capabilities = image_capture_->GetMediaTrackCapabilities();

auto platform_capabilities = component_->Source()->GetCapabilities();
capabilities.setDeviceId(platform_capabilities.device_id);
Vector<bool> echo_cancellation;
for (bool value : platform_capabilities.echo_cancellation)
echo_cancellation.push_back(value);
capabilities.setEchoCancellation(echo_cancellation);
}

void MediaStreamTrack::getConstraints(MediaTrackConstraints& constraints) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
// found in the LICENSE file.

dictionary MediaTrackCapabilities {
sequence<boolean> echoCancellation;
DOMString deviceId;
// W3C Image Capture API
// https://w3c.github.io/mediacapture-image/#mediatrackcapabilities-section
// TODO(mcasas) move out when partial dictionaries are supported
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,12 @@ WebMediaConstraints WebMediaStreamSource::Constraints() {
return private_->Constraints();
}

void WebMediaStreamSource::SetCapabilities(
const WebMediaStreamSource::Capabilities& capabilities) {
DCHECK(!private_.IsNull());
private_->SetCapabilities(capabilities);
}

bool WebMediaStreamSource::RequiresAudioConsumer() const {
DCHECK(!private_.IsNull());
return private_->RequiresAudioConsumer();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@

#include "platform/mediastream/MediaStreamSource.h"
#include "platform/wtf/Assertions.h"
#include "public/platform/WebMediaStreamSource.h"

namespace blink {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include "platform/wtf/Vector.h"
#include "platform/wtf/text/WTFString.h"
#include "public/platform/WebMediaConstraints.h"
#include "public/platform/WebMediaStreamSource.h"
#include "public/platform/WebMediaStreamTrack.h"

namespace blink {
Expand Down Expand Up @@ -103,6 +104,13 @@ class PLATFORM_EXPORT MediaStreamSource final
WebMediaConstraints Constraints() { return constraints_; }
void GetSettings(WebMediaStreamTrack::Settings&);

const WebMediaStreamSource::Capabilities& GetCapabilities() {
return capabilities_;
}
void SetCapabilities(const WebMediaStreamSource::Capabilities& capabilities) {
capabilities_ = capabilities;
}

void SetAudioFormat(size_t number_of_channels, float sample_rate);
void ConsumeAudio(AudioBus*, size_t number_of_frames);

Expand Down Expand Up @@ -138,6 +146,7 @@ class PLATFORM_EXPORT MediaStreamSource final
HashSet<AudioDestinationConsumer*> audio_consumers_;
std::unique_ptr<ExtraData> extra_data_;
WebMediaConstraints constraints_;
WebMediaStreamSource::Capabilities capabilities_;
WTF::Optional<bool> echo_cancellation_;
};

Expand Down
8 changes: 8 additions & 0 deletions third_party/WebKit/public/platform/WebMediaStreamSource.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

#include "WebCommon.h"
#include "WebMediaStreamTrack.h"
#include "WebVector.h"

#include "WebPrivatePtr.h"
#if INSIDE_BLINK
Expand Down Expand Up @@ -73,6 +74,11 @@ class WebMediaStreamSource {
kReadyStateEnded = 2
};

struct Capabilities {
WebVector<bool> echo_cancellation;
WebString device_id;
};

WebMediaStreamSource() = default;
WebMediaStreamSource(const WebMediaStreamSource& other) { Assign(other); }
~WebMediaStreamSource() { Reset(); }
Expand Down Expand Up @@ -113,6 +119,8 @@ class WebMediaStreamSource {

BLINK_PLATFORM_EXPORT WebMediaConstraints Constraints();

BLINK_PLATFORM_EXPORT void SetCapabilities(const Capabilities&);

// Only used if if this is a WebAudio source.
// The WebAudioDestinationConsumer is not owned, and has to be disposed of
// separately after calling removeAudioConsumer.
Expand Down

0 comments on commit c9a6d48

Please sign in to comment.