blob: 7a3fa46572d0f4302013e9b44386c8030c882c70 [file] [log] [blame]
// Copyright 2018 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/input_device_info.h"
#include <algorithm>
#include "third_party/blink/public/platform/web_media_stream_track.h"
#include "third_party/blink/renderer/modules/mediastream/media_track_capabilities.h"
namespace blink {
namespace {
// TODO(c.padhi): Merge this method with ToWebFacingMode() in
// media_stream_constraints_util_video_device.h, see https://crbug.com/821668.
WebMediaStreamTrack::FacingMode ToWebFacingMode(mojom::FacingMode facing_mode) {
switch (facing_mode) {
case mojom::FacingMode::NONE:
return WebMediaStreamTrack::FacingMode::kNone;
case mojom::FacingMode::USER:
return WebMediaStreamTrack::FacingMode::kUser;
case mojom::FacingMode::ENVIRONMENT:
return WebMediaStreamTrack::FacingMode::kEnvironment;
case mojom::FacingMode::LEFT:
return WebMediaStreamTrack::FacingMode::kLeft;
case mojom::FacingMode::RIGHT:
return WebMediaStreamTrack::FacingMode::kRight;
}
NOTREACHED();
return WebMediaStreamTrack::FacingMode::kNone;
}
} // namespace
InputDeviceInfo* InputDeviceInfo::Create(const String& device_id,
const String& label,
const String& group_id,
MediaDeviceType device_type) {
return MakeGarbageCollected<InputDeviceInfo>(device_id, label, group_id,
device_type);
}
InputDeviceInfo::InputDeviceInfo(const String& device_id,
const String& label,
const String& group_id,
MediaDeviceType device_type)
: MediaDeviceInfo(device_id, label, group_id, device_type) {}
void InputDeviceInfo::SetVideoInputCapabilities(
mojom::blink::VideoInputDeviceCapabilitiesPtr video_input_capabilities) {
DCHECK_EQ(deviceId(), video_input_capabilities->device_id);
// TODO(c.padhi): Merge the common logic below with
// ComputeCapabilitiesForVideoSource() in media_stream_constraints_util.h, see
// https://crbug.com/821668.
platform_capabilities_.facing_mode =
ToWebFacingMode(video_input_capabilities->facing_mode);
if (!video_input_capabilities->formats.IsEmpty()) {
int max_width = 1;
int max_height = 1;
float min_frame_rate = 1.0f;
float max_frame_rate = min_frame_rate;
for (const auto& format : video_input_capabilities->formats) {
max_width = std::max(max_width, format->frame_size.width);
max_height = std::max(max_height, format->frame_size.height);
max_frame_rate = std::max(max_frame_rate, format->frame_rate);
}
platform_capabilities_.width = {1, max_width};
platform_capabilities_.height = {1, max_height};
platform_capabilities_.aspect_ratio = {1.0 / max_height,
static_cast<double>(max_width)};
platform_capabilities_.frame_rate = {min_frame_rate, max_frame_rate};
}
}
MediaTrackCapabilities* InputDeviceInfo::getCapabilities() const {
MediaTrackCapabilities* capabilities = MediaTrackCapabilities::Create();
// If label is null, permissions have not been given and no capabilities
// should be returned.
if (label().IsEmpty())
return capabilities;
capabilities->setDeviceId(deviceId());
capabilities->setGroupId(groupId());
if (DeviceType() == MediaDeviceType::MEDIA_AUDIO_INPUT) {
capabilities->setEchoCancellation({true, false});
capabilities->setAutoGainControl({true, false});
capabilities->setNoiseSuppression({true, false});
}
if (DeviceType() == MediaDeviceType::MEDIA_VIDEO_INPUT) {
if (!platform_capabilities_.width.empty()) {
LongRange* width = LongRange::Create();
width->setMin(platform_capabilities_.width[0]);
width->setMax(platform_capabilities_.width[1]);
capabilities->setWidth(width);
}
if (!platform_capabilities_.height.empty()) {
LongRange* height = LongRange::Create();
height->setMin(platform_capabilities_.height[0]);
height->setMax(platform_capabilities_.height[1]);
capabilities->setHeight(height);
}
if (!platform_capabilities_.aspect_ratio.empty()) {
DoubleRange* aspect_ratio = DoubleRange::Create();
aspect_ratio->setMin(platform_capabilities_.aspect_ratio[0]);
aspect_ratio->setMax(platform_capabilities_.aspect_ratio[1]);
capabilities->setAspectRatio(aspect_ratio);
}
if (!platform_capabilities_.frame_rate.empty()) {
DoubleRange* frame_rate = DoubleRange::Create();
frame_rate->setMin(platform_capabilities_.frame_rate[0]);
frame_rate->setMax(platform_capabilities_.frame_rate[1]);
capabilities->setFrameRate(frame_rate);
}
Vector<String> facing_mode;
switch (platform_capabilities_.facing_mode) {
case WebMediaStreamTrack::FacingMode::kUser:
facing_mode.push_back("user");
break;
case WebMediaStreamTrack::FacingMode::kEnvironment:
facing_mode.push_back("environment");
break;
case WebMediaStreamTrack::FacingMode::kLeft:
facing_mode.push_back("left");
break;
case WebMediaStreamTrack::FacingMode::kRight:
facing_mode.push_back("right");
break;
case WebMediaStreamTrack::FacingMode::kNone:
break;
}
capabilities->setFacingMode(facing_mode);
capabilities->setResizeMode({WebMediaStreamTrack::kResizeModeNone,
WebMediaStreamTrack::kResizeModeRescale});
}
return capabilities;
}
} // namespace blink