HYL_OK3568_LINUX/buildroot/package/qt5/qt5webengine-chromium/0006-media-capture-linux-Support-libv4l2-plugins.patch
2025-05-10 21:49:39 +08:00

180 lines
5.1 KiB
Diff

From 4b95dc3e44dd92bb0792a5a0c566556fc0445eeb Mon Sep 17 00:00:00 2001
From: Jeffy Chen <jeffy.chen@rock-chips.com>
Date: Mon, 1 Jul 2019 10:37:35 +0800
Subject: [PATCH 06/14] media: capture: linux: Support libv4l2 plugins
Allow using libv4l2 plugins for linux v4l2 capture devices.
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
---
chromium/media/capture/BUILD.gn | 14 +++++
.../video/linux/v4l2_capture_device_impl.cc | 53 ++++++++++++++++++-
.../video/linux/v4l2_capture_device_impl.h | 11 ++++
3 files changed, 77 insertions(+), 1 deletion(-)
diff --git a/chromium/media/capture/BUILD.gn b/chromium/media/capture/BUILD.gn
index c9986f35c..109491e1f 100644
--- a/chromium/media/capture/BUILD.gn
+++ b/chromium/media/capture/BUILD.gn
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("//build/buildflag_header.gni")
import("//build/config/features.gni")
import("//build/config/jumbo.gni")
import("//build/config/ui.gni")
@@ -25,6 +26,14 @@ group("capture") {
]
}
+buildflag_header("buildflags") {
+ header = "buildflags.h"
+
+ flags = [
+ "USE_LIBV4L2=$use_v4lplugin",
+ ]
+}
+
component("capture_switches") {
defines = [ "CAPTURE_IMPLEMENTATION" ]
sources = [
@@ -268,6 +277,11 @@ jumbo_component("capture_lib") {
"video/linux/video_capture_device_linux.cc",
"video/linux/video_capture_device_linux.h",
]
+ public_deps += [ ":buildflags" ]
+
+ if (use_v4lplugin) {
+ deps += [ "//media/gpu/v4l2:libv4l2_stubs" ]
+ }
}
if (is_chromeos) {
diff --git a/chromium/media/capture/video/linux/v4l2_capture_device_impl.cc b/chromium/media/capture/video/linux/v4l2_capture_device_impl.cc
index c9040f5de..54acdc95c 100644
--- a/chromium/media/capture/video/linux/v4l2_capture_device_impl.cc
+++ b/chromium/media/capture/video/linux/v4l2_capture_device_impl.cc
@@ -10,19 +10,62 @@
#include <sys/poll.h>
#include <unistd.h>
+#if BUILDFLAG(USE_LIBV4L2)
+// Auto-generated for dlopen libv4l2 libraries
+#include "media/gpu/v4l2/v4l2_stubs.h"
+#include "third_party/v4l-utils/lib/include/libv4l2.h"
+
+#include "base/files/file_path.h"
+
+using media_gpu_v4l2::kModuleV4l2;
+using media_gpu_v4l2::InitializeStubs;
+using media_gpu_v4l2::StubPathMap;
+
+static const base::FilePath::CharType kV4l2Lib[] =
+ FILE_PATH_LITERAL("/usr/lib/libv4l2.so");
+#endif
+
namespace media {
V4L2CaptureDeviceImpl::~V4L2CaptureDeviceImpl() = default;
+V4L2CaptureDeviceImpl::V4L2CaptureDeviceImpl() {
+#if BUILDFLAG(USE_LIBV4L2)
+ StubPathMap paths;
+ paths[kModuleV4l2].push_back(kV4l2Lib);
+
+ has_libv4l2_ = InitializeStubs(paths);
+#endif
+}
+
int V4L2CaptureDeviceImpl::open(const char* device_name, int flags) {
- return ::open(device_name, flags);
+ int fd = ::open64(device_name, flags);
+ if (fd < 0)
+ return fd;
+
+#if BUILDFLAG(USE_LIBV4L2)
+ use_libv4l2_ = false;
+ if (has_libv4l2_ && v4l2_fd_open(fd, V4L2_DISABLE_CONVERSION) != -1) {
+ VLOG(2) << "Using libv4l2 for " << device_name;
+ use_libv4l2_ = true;
+ }
+#endif
+ return fd;
}
int V4L2CaptureDeviceImpl::close(int fd) {
+#if BUILDFLAG(USE_LIBV4L2)
+ if (use_libv4l2_)
+ return v4l2_close(fd);
+#endif
return ::close(fd);
}
int V4L2CaptureDeviceImpl::ioctl(int fd, int request, void* argp) {
+#if BUILDFLAG(USE_LIBV4L2)
+ if (use_libv4l2_)
+ return v4l2_ioctl(fd, request, argp);
+#endif
return ::ioctl(fd, request, argp);
}
@@ -32,10 +75,18 @@ void* V4L2CaptureDeviceImpl::mmap(void* start,
int flags,
int fd,
off_t offset) {
+#if BUILDFLAG(USE_LIBV4L2)
+ if (use_libv4l2_)
+ return v4l2_mmap(start, length, prot, flags, fd, offset);
+#endif
return ::mmap(start, length, prot, flags, fd, offset);
}
int V4L2CaptureDeviceImpl::munmap(void* start, size_t length) {
+#if BUILDFLAG(USE_LIBV4L2)
+ if (use_libv4l2_)
+ return v4l2_munmap(start, length);
+#endif
return ::munmap(start, length);
}
diff --git a/chromium/media/capture/video/linux/v4l2_capture_device_impl.h b/chromium/media/capture/video/linux/v4l2_capture_device_impl.h
index 936c8b093..f96c2d434 100644
--- a/chromium/media/capture/video/linux/v4l2_capture_device_impl.h
+++ b/chromium/media/capture/video/linux/v4l2_capture_device_impl.h
@@ -8,6 +8,7 @@
#include <poll.h>
#include <sys/fcntl.h>
+#include "media/capture/buildflags.h"
#include "media/capture/capture_export.h"
#include "media/capture/video/linux/v4l2_capture_device.h"
@@ -17,6 +18,8 @@ namespace media {
// V4L2 APIs.
class CAPTURE_EXPORT V4L2CaptureDeviceImpl : public V4L2CaptureDevice {
public:
+ V4L2CaptureDeviceImpl();
+
int open(const char* device_name, int flags) override;
int close(int fd) override;
int ioctl(int fd, int request, void* argp) override;
@@ -32,6 +35,14 @@ class CAPTURE_EXPORT V4L2CaptureDeviceImpl : public V4L2CaptureDevice {
private:
~V4L2CaptureDeviceImpl() override;
+
+#if BUILDFLAG(USE_LIBV4L2)
+ // Has libv4l2.
+ bool has_libv4l2_;
+ // Use libv4l2 when operating |fd|.
+ bool use_libv4l2_;
+#endif
+
};
} // namespace media
--
2.20.1