blob: d7da867339c35900124b7900be909d923e29e9d6 [file] [log] [blame]
// Copyright (c) 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/mediastream/media_stream_utils.h"
#include "base/single_thread_task_runner.h"
#include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_source.h"
#include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
#include "third_party/blink/public/web/modules/mediastream/media_stream_video_track.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_component.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_descriptor.h"
#include "third_party/blink/renderer/platform/mediastream/webaudio_media_stream_source.h"
#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
namespace blink {
namespace {
void CreateNativeVideoMediaStreamTrack(blink::WebMediaStreamTrack track) {
DCHECK(!track.GetPlatformTrack());
blink::WebMediaStreamSource source = track.Source();
DCHECK_EQ(source.GetType(), blink::WebMediaStreamSource::kTypeVideo);
blink::MediaStreamVideoSource* native_source =
blink::MediaStreamVideoSource::GetVideoSource(source);
DCHECK(native_source);
track.SetPlatformTrack(std::make_unique<blink::MediaStreamVideoTrack>(
native_source, blink::MediaStreamVideoSource::ConstraintsCallback(),
track.IsEnabled()));
}
} // namespace
void MediaStreamUtils::CreateNativeAudioMediaStreamTrack(
const blink::WebMediaStreamTrack& track,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
WebMediaStreamSource source = track.Source();
MediaStreamAudioSource* media_stream_source =
blink::MediaStreamAudioSource::From(source);
// At this point, a MediaStreamAudioSource instance must exist. The one
// exception is when a WebAudio destination node is acting as a source of
// audio.
//
// TODO(miu): This needs to be moved to an appropriate location. A WebAudio
// source should have been created before this method was called so that this
// special case code isn't needed here.
if (!media_stream_source && source.RequiresAudioConsumer()) {
DVLOG(1) << "Creating WebAudio media stream source.";
media_stream_source =
new blink::WebAudioMediaStreamSource(&source, task_runner);
source.SetPlatformSource(
base::WrapUnique(media_stream_source)); // Takes ownership.
blink::WebMediaStreamSource::Capabilities capabilities;
capabilities.device_id = source.Id();
// TODO(crbug.com/704136): Switch away from std::vector.
capabilities.echo_cancellation = std::vector<bool>({false});
capabilities.auto_gain_control = std::vector<bool>({false});
capabilities.noise_suppression = std::vector<bool>({false});
capabilities.sample_size = {
media::SampleFormatToBitsPerChannel(media::kSampleFormatS16), // min
media::SampleFormatToBitsPerChannel(media::kSampleFormatS16) // max
};
auto parameters = media_stream_source->GetAudioParameters();
if (parameters.IsValid()) {
capabilities.channel_count = {1, parameters.channels()};
capabilities.sample_rate = {parameters.sample_rate(),
parameters.sample_rate()};
capabilities.latency = {parameters.GetBufferDuration().InSecondsF(),
parameters.GetBufferDuration().InSecondsF()};
}
source.SetCapabilities(capabilities);
}
if (media_stream_source)
media_stream_source->ConnectToTrack(track);
else
LOG(DFATAL) << "WebMediaStreamSource missing its MediaStreamAudioSource.";
}
// TODO(crbug.com/704136): Change this method to take the task
// runner instance, and use per thread task runner on the call site.
void MediaStreamUtils::DidCreateMediaStreamTrack(
MediaStreamComponent* component) {
WebMediaStreamTrack track(component);
DCHECK(!track.IsNull() && !track.GetPlatformTrack());
DCHECK(!track.Source().IsNull());
switch (track.Source().GetType()) {
case blink::WebMediaStreamSource::kTypeAudio:
CreateNativeAudioMediaStreamTrack(track,
Thread::MainThread()->GetTaskRunner());
break;
case blink::WebMediaStreamSource::kTypeVideo:
CreateNativeVideoMediaStreamTrack(track);
break;
}
}
} // namespace blink