aboutsummaryrefslogtreecommitdiff
path: root/modules/desktop_capture/linux/base_capturer_pipewire.cc
diff options
context:
space:
mode:
authorErwin Jansen <jansene@google.com>2021-06-23 05:52:25 -0700
committerErwin Jansen <jansene@google.com>2021-06-23 06:45:54 -0700
commit16be34ae72cdb525c88c2b31b21b976f35fe36d8 (patch)
tree6eacaffe4bebf8e00c290c1e1839e084b0c52e88 /modules/desktop_capture/linux/base_capturer_pipewire.cc
parent97e54a7e73c7b24e464ef06ef3c3b3716f21bb15 (diff)
parent49cb4599560d6005d5df0dadfca2db04b288f216 (diff)
downloadwebrtc-16be34ae72cdb525c88c2b31b21b976f35fe36d8.tar.gz
Merge upstream-master and enable ARM64
We bring in the latest WebRTC changes and turn on arm. This adds a new third party lib: crc32c, and includes a workaround for handling a depencency issue for arm. Bug: 191745658 Change-Id: Ic5be99911990ef14a5f733f19394032b20f85024
Diffstat (limited to 'modules/desktop_capture/linux/base_capturer_pipewire.cc')
-rw-r--r--modules/desktop_capture/linux/base_capturer_pipewire.cc67
1 files changed, 37 insertions, 30 deletions
diff --git a/modules/desktop_capture/linux/base_capturer_pipewire.cc b/modules/desktop_capture/linux/base_capturer_pipewire.cc
index c302a086ea..e5d001e476 100644
--- a/modules/desktop_capture/linux/base_capturer_pipewire.cc
+++ b/modules/desktop_capture/linux/base_capturer_pipewire.cc
@@ -772,37 +772,27 @@ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) {
// Use video metadata when video size from metadata is set and smaller than
// video stream size, so we need to adjust it.
- bool video_is_full_width = true;
- bool video_is_full_height = true;
+ bool video_metadata_use = false;
+
#if PW_CHECK_VERSION(0, 3, 0)
- if (video_metadata && video_metadata->region.size.width != 0 &&
- video_metadata->region.size.height != 0) {
- if (video_metadata->region.size.width <
- static_cast<uint32_t>(desktop_size_.width())) {
- video_is_full_width = false;
- } else if (video_metadata->region.size.height <
- static_cast<uint32_t>(desktop_size_.height())) {
- video_is_full_height = false;
- }
- }
+ const struct spa_rectangle* video_metadata_size =
+ video_metadata ? &video_metadata->region.size : nullptr;
#else
- if (video_metadata && video_metadata->width != 0 &&
- video_metadata->height != 0) {
- if (video_metadata->width < desktop_size_.width()) {
- } else if (video_metadata->height < desktop_size_.height()) {
- video_is_full_height = false;
- }
- }
+ const struct spa_meta_video_crop* video_metadata_size = video_metadata;
#endif
+ if (video_metadata_size && video_metadata_size->width != 0 &&
+ video_metadata_size->height != 0 &&
+ (static_cast<int>(video_metadata_size->width) < desktop_size_.width() ||
+ static_cast<int>(video_metadata_size->height) <
+ desktop_size_.height())) {
+ video_metadata_use = true;
+ }
+
DesktopSize video_size_prev = video_size_;
- if (!video_is_full_height || !video_is_full_width) {
-#if PW_CHECK_VERSION(0, 3, 0)
- video_size_ = DesktopSize(video_metadata->region.size.width,
- video_metadata->region.size.height);
-#else
- video_size_ = DesktopSize(video_metadata->width, video_metadata->height);
-#endif
+ if (video_metadata_use) {
+ video_size_ =
+ DesktopSize(video_metadata_size->width, video_metadata_size->height);
} else {
video_size_ = desktop_size_;
}
@@ -827,25 +817,25 @@ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) {
// Adjust source content based on metadata video position
#if PW_CHECK_VERSION(0, 3, 0)
- if (!video_is_full_height &&
+ if (video_metadata_use &&
(video_metadata->region.position.y + video_size_.height() <=
desktop_size_.height())) {
src += src_stride * video_metadata->region.position.y;
}
const int x_offset =
- !video_is_full_width &&
+ video_metadata_use &&
(video_metadata->region.position.x + video_size_.width() <=
desktop_size_.width())
? video_metadata->region.position.x * kBytesPerPixel
: 0;
#else
- if (!video_is_full_height &&
+ if (video_metadata_use &&
(video_metadata->y + video_size_.height() <= desktop_size_.height())) {
src += src_stride * video_metadata->y;
}
const int x_offset =
- !video_is_full_width &&
+ video_metadata_use &&
(video_metadata->x + video_size_.width() <= desktop_size_.width())
? video_metadata->x * kBytesPerPixel
: 0;
@@ -1036,6 +1026,23 @@ void BaseCapturerPipeWire::SourcesRequest() {
// We don't want to allow selection of multiple sources.
g_variant_builder_add(&builder, "{sv}", "multiple",
g_variant_new_boolean(false));
+
+ Scoped<GVariant> variant(
+ g_dbus_proxy_get_cached_property(proxy_, "AvailableCursorModes"));
+ if (variant.get()) {
+ uint32_t modes = 0;
+ g_variant_get(variant.get(), "u", &modes);
+ // Request mouse cursor to be embedded as part of the stream, otherwise it
+ // is hidden by default. Make request only if this mode is advertised by
+ // the portal implementation.
+ if (modes &
+ static_cast<uint32_t>(BaseCapturerPipeWire::CursorMode::kEmbedded)) {
+ g_variant_builder_add(&builder, "{sv}", "cursor_mode",
+ g_variant_new_uint32(static_cast<uint32_t>(
+ BaseCapturerPipeWire::CursorMode::kEmbedded)));
+ }
+ }
+
variant_string = g_strdup_printf("webrtc%d", g_random_int_range(0, G_MAXINT));
g_variant_builder_add(&builder, "{sv}", "handle_token",
g_variant_new_string(variant_string.get()));