From patchwork Fri Mar 6 20:26:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicolas Dufresne X-Patchwork-Id: 3006 Return-Path: Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id EBC0260424 for ; Fri, 6 Mar 2020 21:26:54 +0100 (CET) Received: from nicolas-tpx395.localdomain (unknown [IPv6:2610:98:8005::527]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: nicolas) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id 5590D2970E7; Fri, 6 Mar 2020 20:26:54 +0000 (GMT) From: Nicolas Dufresne To: libcamera-devel@lists.libcamera.org Cc: Nicolas Dufresne Date: Fri, 6 Mar 2020 15:26:10 -0500 Message-Id: <20200306202637.525587-1-nicolas@ndufresne.ca> X-Mailer: git-send-email 2.24.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v3 00/27] GStreamer Element for libcamera X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Mar 2020 20:26:55 -0000 From: Nicolas Dufresne This patchset introduces two GStreamer features for libcamera. A GstDeviceProvider that allow enumerating the cameras and a libcamerasrc element the allow streaming from a selected camera. This is an early implementation that is not feature complete. It is designed to support multiple streams even though it currently only allow one srcpad. The goal of this submission is to get an inital element merged so that further improvement can happen incrementally. To test these features, you'll need GStreamer 1.14 or more. To get the list of cameras you can run the following. Regression exist in the monitor of GStreamer 1.16.2 that may cause a crash, and also in master that may show nothing. This will be addressed in later release of GStreamer. gst-device-monitor-1.0 Video/Source To stream from a camera, you can use the following pipeline: gst-launch-1.0 libcamerasrc ! videoconvert ! autovideosink Changes since v2: - Fixed review comments - Fix include order and seperation - Fixed C++ member naming in C++ wrappers - Fixed (provided by Jakub) a crash in caps generator - Moved from custom callback to GObject signal in buffer pool Changes since v1: - Fixed review comments - Use a C++ class for glib mutex scoped locker - Fixed a potential deadlock on exhausted buffer pool - Minimum GStreamer requirement now set to 1.14 Jakub Adam (2): gst: utils: Factor-out the task resume helper gst: libcamerasrc: Prevent src task deadlock on exhausted buffer pool Nicolas Dufresne (25): Add GStreamer plugin and element skeleton gst: Add utility to convert StreamFormats to GstCaps gst: Add initial device provider gst: utils: Add simple scoped lockers for GMutex and GRectMutex gst: Add pads to the source gst: libcamerasrc: Allocate and add static pad gst: libcamerasrc: Add camera-name property gst: libcamerasrc: Add a debug category gst: libcamerasrc: Implement selection and acquisition gst: libcamerasrc: Add a task for the streaming thread gst: libcamerapad: Add a method to access the role gst: libcamerasrc: Store the srcpad in a vector gst: libcamerasrc: Send stream start event gst: utils: Add StreamConfiguration helpers gst: libcamerasrc: Implement minimal caps negotiation gst: libcamerasrc: Push segment event gst: Add a pool and an allocator implementation gst: libcamerapad: Allow storing a pool gst: libcamerasrc: Allocate and release buffers gst: Add getters for Stream and FrameBuffer gst: pad: Add method to store retrieve pending buffers gst: libcamerasrc: Implement initial streaming gst: libcamerasrc: Implement timestamp support gst: libcamerasrc: Add a TODO comment gst: Document dependencies and quick usage README.rst | 19 + meson_options.txt | 5 + src/gstreamer/gstlibcamera-utils.cpp | 180 +++++++ src/gstreamer/gstlibcamera-utils.h | 73 +++ src/gstreamer/gstlibcamera.c | 27 + src/gstreamer/gstlibcameraallocator.cpp | 253 +++++++++ src/gstreamer/gstlibcameraallocator.h | 32 ++ src/gstreamer/gstlibcamerapad.cpp | 198 +++++++ src/gstreamer/gstlibcamerapad.h | 37 ++ src/gstreamer/gstlibcamerapool.cpp | 147 ++++++ src/gstreamer/gstlibcamerapool.h | 34 ++ src/gstreamer/gstlibcameraprovider.cpp | 238 +++++++++ src/gstreamer/gstlibcameraprovider.h | 23 + src/gstreamer/gstlibcamerasrc.cpp | 654 ++++++++++++++++++++++++ src/gstreamer/gstlibcamerasrc.h | 22 + src/gstreamer/meson.build | 30 ++ src/meson.build | 2 + 17 files changed, 1974 insertions(+) create mode 100644 src/gstreamer/gstlibcamera-utils.cpp create mode 100644 src/gstreamer/gstlibcamera-utils.h create mode 100644 src/gstreamer/gstlibcamera.c create mode 100644 src/gstreamer/gstlibcameraallocator.cpp create mode 100644 src/gstreamer/gstlibcameraallocator.h create mode 100644 src/gstreamer/gstlibcamerapad.cpp create mode 100644 src/gstreamer/gstlibcamerapad.h create mode 100644 src/gstreamer/gstlibcamerapool.cpp create mode 100644 src/gstreamer/gstlibcamerapool.h create mode 100644 src/gstreamer/gstlibcameraprovider.cpp create mode 100644 src/gstreamer/gstlibcameraprovider.h create mode 100644 src/gstreamer/gstlibcamerasrc.cpp create mode 100644 src/gstreamer/gstlibcamerasrc.h create mode 100644 src/gstreamer/meson.build