1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
// Copyright 2019 The Chromium Authors
// 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/feature_list.h"
#include "base/memory/ptr_util.h"
#include "base/task/single_thread_task_runner.h"
#include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/page/chrome_client.h"
#include "third_party/blink/renderer/modules/mediastream/media_stream.h"
#include "third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_video_content.h"
#include "third_party/blink/renderer/modules/mediastream/media_stream_track_impl.h"
#include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_audio_source.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_component.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_component_impl.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_descriptor.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_source.h"
#include "third_party/blink/renderer/platform/mediastream/webaudio_media_stream_source.h"
#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
#include "ui/display/screen_info.h"
#include "ui/display/screen_infos.h"
namespace blink {
// Makes getDisplayMedia take into account the device's scale factor
// to compute screen sizes in calls without size constraints.
BASE_FEATURE(kGetDisplayMediaScreenScaleFactor,
"GetDisplayMediaScreenScaleFactor",
#if BUILDFLAG(IS_CHROMEOS)
// Causes crash/timeouts on some ChromeOS devices.
// See https://issuetracker.google.com/issues/284804471
base::FEATURE_DISABLED_BY_DEFAULT
#else
base::FEATURE_ENABLED_BY_DEFAULT
#endif // BUILDFLAG(IS_CHROMEOS)
);
MediaStreamTrack* MediaStreamUtils::CreateLocalAudioTrack(
ExecutionContext* execution_context,
MediaStreamSource* source) {
DCHECK_EQ(source->GetType(), MediaStreamSource::kTypeAudio);
DCHECK(!source->Remote());
auto* component = MakeGarbageCollected<MediaStreamComponentImpl>(
source, std::make_unique<MediaStreamAudioTrack>(/*is_local=*/true));
MediaStreamAudioSource::From(component->Source())
->ConnectToInitializedTrack(component);
return MakeGarbageCollected<MediaStreamTrackImpl>(execution_context,
component);
}
gfx::Size MediaStreamUtils::GetScreenSize(LocalFrame* frame) {
const gfx::Size kDefaultScreenSize(kDefaultScreenCastWidth,
kDefaultScreenCastHeight);
// Can be null in tests.
if (!frame) {
return kDefaultScreenSize;
}
int max_width = 0;
int max_height = 0;
const auto& infos = frame->GetChromeClient().GetScreenInfos(*frame);
for (const display::ScreenInfo& info : infos.screen_infos) {
int width = info.rect.width();
int height = info.rect.height();
if (base::FeatureList::IsEnabled(kGetDisplayMediaScreenScaleFactor) &&
info.device_scale_factor > 0) {
width = ceil(width * info.device_scale_factor);
height = ceil(height * info.device_scale_factor);
}
if (width > max_width) {
max_width = width;
}
if (height > max_height) {
max_height = height;
}
}
if (max_width == 0 || max_height == 0) {
return kDefaultScreenSize;
}
return gfx::Size(max_width, max_height);
}
} // namespace blink
|