Merge #19 PipeWire: check whether we managed to mmap memory
This commit is contained in:
commit
fd8a3d8fd9
@ -18,6 +18,19 @@ index 2081d0c683a4..641133bf1ea4 100644
|
|||||||
'pixman.h',
|
'pixman.h',
|
||||||
'pk11func.h',
|
'pk11func.h',
|
||||||
'pk11pqg.h',
|
'pk11pqg.h',
|
||||||
|
diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn b/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn
|
||||||
|
index ba885217b3ba..201d3b755221 100644
|
||||||
|
--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn
|
||||||
|
+++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn
|
||||||
|
@@ -158,7 +158,7 @@ if (rtc_include_tests) {
|
||||||
|
if (is_linux) {
|
||||||
|
if (rtc_use_pipewire) {
|
||||||
|
pkg_config("pipewire") {
|
||||||
|
- packages = [ "libpipewire-0.2" ]
|
||||||
|
+ packages = [ "libpipewire-0.3" ]
|
||||||
|
|
||||||
|
defines = [ "WEBRTC_USE_PIPEWIRE" ]
|
||||||
|
}
|
||||||
diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
|
diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
|
||||||
index 90b40431c7e4..d844aa79d591 100644
|
index 90b40431c7e4..d844aa79d591 100644
|
||||||
--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
|
--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
|
||||||
@ -67,7 +80,7 @@ index 1eb8ead26efa..316468eed1fc 100644
|
|||||||
};
|
};
|
||||||
|
|
||||||
diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
|
diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
|
||||||
index 379341c833de..53e2683df2e8 100644
|
index 379341c833de..76349f1fbd4d 100644
|
||||||
--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
|
--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
|
||||||
+++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
|
+++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
|
||||||
@@ -15,8 +15,11 @@
|
@@ -15,8 +15,11 @@
|
||||||
@ -250,13 +263,13 @@ index 379341c833de..53e2683df2e8 100644
|
|||||||
- pw_buffer* buf = nullptr;
|
- pw_buffer* buf = nullptr;
|
||||||
+ struct pw_buffer *next_buffer;
|
+ struct pw_buffer *next_buffer;
|
||||||
+ struct pw_buffer *buffer = nullptr;
|
+ struct pw_buffer *buffer = nullptr;
|
||||||
|
+
|
||||||
- if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) {
|
|
||||||
+ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
|
+ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
|
||||||
+ while (next_buffer) {
|
+ while (next_buffer) {
|
||||||
+ buffer = next_buffer;
|
+ buffer = next_buffer;
|
||||||
+ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
|
+ next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
|
||||||
+
|
|
||||||
|
- if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) {
|
||||||
+ if (next_buffer)
|
+ if (next_buffer)
|
||||||
+ pw_stream_queue_buffer (that->pw_stream_, buffer);
|
+ pw_stream_queue_buffer (that->pw_stream_, buffer);
|
||||||
+ }
|
+ }
|
||||||
@ -365,7 +378,7 @@ index 379341c833de..53e2683df2e8 100644
|
|||||||
|
|
||||||
if (pw_thread_loop_start(pw_main_loop_) < 0) {
|
if (pw_thread_loop_start(pw_main_loop_) < 0) {
|
||||||
RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop";
|
RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop";
|
||||||
@@ -278,81 +266,120 @@ void BaseCapturerPipeWire::InitPipeWire() {
|
@@ -278,81 +266,132 @@ void BaseCapturerPipeWire::InitPipeWire() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -476,14 +489,27 @@ index 379341c833de..53e2683df2e8 100644
|
|||||||
+ map = static_cast<uint8_t*>(mmap(
|
+ map = static_cast<uint8_t*>(mmap(
|
||||||
+ nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
|
+ nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
|
||||||
+ PROT_READ, MAP_PRIVATE, spaBuffer->datas[0].fd, 0));
|
+ PROT_READ, MAP_PRIVATE, spaBuffer->datas[0].fd, 0));
|
||||||
|
+
|
||||||
|
+ if (map == MAP_FAILED) {
|
||||||
|
+ RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " << std::strerror(errno);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t);
|
+ src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t);
|
||||||
+ } else if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) {
|
+ } else if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) {
|
||||||
+ int fd;
|
+ int fd;
|
||||||
+ fd = spaBuffer->datas[0].fd;
|
+ fd = spaBuffer->datas[0].fd;
|
||||||
+
|
|
||||||
|
- if (!(src = spaBuffer->datas[0].data)) {
|
||||||
+ map = static_cast<uint8_t*>(mmap(
|
+ map = static_cast<uint8_t*>(mmap(
|
||||||
+ nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
|
+ nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
|
||||||
+ PROT_READ, MAP_PRIVATE, fd, 0));
|
+ PROT_READ, MAP_PRIVATE, fd, 0));
|
||||||
|
+
|
||||||
|
+ if (map == MAP_FAILED) {
|
||||||
|
+ RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " << std::strerror(errno);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ SyncDmaBuf(fd, DMA_BUF_SYNC_START);
|
+ SyncDmaBuf(fd, DMA_BUF_SYNC_START);
|
||||||
+
|
+
|
||||||
+ src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t);
|
+ src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t);
|
||||||
@ -491,16 +517,15 @@ index 379341c833de..53e2683df2e8 100644
|
|||||||
+ map = nullptr;
|
+ map = nullptr;
|
||||||
+ src = static_cast<uint8_t*>(spaBuffer->datas[0].data);
|
+ src = static_cast<uint8_t*>(spaBuffer->datas[0].data);
|
||||||
+ } else {
|
+ } else {
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- if (!(src = spaBuffer->datas[0].data)) {
|
|
||||||
+ if (!src) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
- uint32_t maxSize = spaBuffer->datas[0].maxsize;
|
- uint32_t maxSize = spaBuffer->datas[0].maxsize;
|
||||||
- int32_t srcStride = spaBuffer->datas[0].chunk->stride;
|
- int32_t srcStride = spaBuffer->datas[0].chunk->stride;
|
||||||
|
+ if (!src) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ DesktopSize prev_crop_size = DesktopSize(0, 0);
|
+ DesktopSize prev_crop_size = DesktopSize(0, 0);
|
||||||
+ if (video_crop_size_initialized_) {
|
+ if (video_crop_size_initialized_) {
|
||||||
+ prev_crop_size = video_crop_size_;
|
+ prev_crop_size = video_crop_size_;
|
||||||
@ -544,7 +569,7 @@ index 379341c833de..53e2683df2e8 100644
|
|||||||
if (srcStride != (desktop_size_.width() * kBytesPerPixel)) {
|
if (srcStride != (desktop_size_.width() * kBytesPerPixel)) {
|
||||||
RTC_LOG(LS_ERROR) << "Got buffer with stride different from screen stride: "
|
RTC_LOG(LS_ERROR) << "Got buffer with stride different from screen stride: "
|
||||||
<< srcStride
|
<< srcStride
|
||||||
@@ -361,21 +388,40 @@ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) {
|
@@ -361,21 +400,40 @@ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -598,7 +623,7 @@ index 379341c833de..53e2683df2e8 100644
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -725,10 +771,7 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal(
|
@@ -725,10 +783,7 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal(
|
||||||
g_variant_get(variant, "(u@a{sv})", &stream_id, &options);
|
g_variant_get(variant, "(u@a{sv})", &stream_id, &options);
|
||||||
RTC_DCHECK(options != nullptr);
|
RTC_DCHECK(options != nullptr);
|
||||||
|
|
||||||
@ -610,7 +635,7 @@ index 379341c833de..53e2683df2e8 100644
|
|||||||
g_variant_unref(options);
|
g_variant_unref(options);
|
||||||
g_variant_unref(variant);
|
g_variant_unref(variant);
|
||||||
}
|
}
|
||||||
@@ -813,10 +856,15 @@ void BaseCapturerPipeWire::CaptureFrame() {
|
@@ -813,10 +868,15 @@ void BaseCapturerPipeWire::CaptureFrame() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -629,7 +654,7 @@ index 379341c833de..53e2683df2e8 100644
|
|||||||
if (!result) {
|
if (!result) {
|
||||||
callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
|
callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
|
||||||
return;
|
return;
|
||||||
@@ -837,4 +885,22 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) {
|
@@ -837,4 +897,22 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user