summaryrefslogtreecommitdiff
path: root/src/gstreamer/gstlibcamera.cpp
blob: 52388b5eaac07ae30eb932611198fa5708ed1417 (plain)
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
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2019, Collabora Ltd.
 *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
 *
 * gstlibcamera.c - GStreamer plugin
 */

#include "gstlibcameraprovider.h"
#include "gstlibcamerasrc.h"

static gboolean
plugin_init(GstPlugin *plugin)
{
	if (!gst_element_register(plugin, "libcamerasrc", GST_RANK_PRIMARY,
				  GST_TYPE_LIBCAMERA_SRC) ||
	    !gst_device_provider_register(plugin, "libcameraprovider",
					  GST_RANK_PRIMARY,
					  GST_TYPE_LIBCAMERA_PROVIDER))
		return FALSE;

	return TRUE;
}

GST_PLUGIN_DEFINE(GST_VERSION_MAJOR, GST_VERSION_MINOR,
		  libcamera, "libcamera capture plugin",
		  plugin_init, VERSION, "LGPL", PACKAGE, "https://libcamera.org")
arg = va_arg(ap, type); \ va_end(ap); \ } extern "C" { LIBCAMERA_PUBLIC int open(const char *path, int oflag, ...) { mode_t mode = 0; if (oflag & O_CREAT || oflag & O_TMPFILE) extract_va_arg(mode_t, mode, oflag); return V4L2CompatManager::instance()->openat(AT_FDCWD, path, oflag, mode); } /* _FORTIFY_SOURCE redirects open to __open_2 */ LIBCAMERA_PUBLIC int __open_2(const char *path, int oflag) { return open(path, oflag); } #ifndef open64 LIBCAMERA_PUBLIC int open64(const char *path, int oflag, ...) { mode_t mode = 0; if (oflag & O_CREAT || oflag & O_TMPFILE) extract_va_arg(mode_t, mode, oflag); return V4L2CompatManager::instance()->openat(AT_FDCWD, path, oflag | O_LARGEFILE, mode); } LIBCAMERA_PUBLIC int __open64_2(const char *path, int oflag) { return open(path, oflag); } #endif LIBCAMERA_PUBLIC int openat(int dirfd, const char *path, int oflag, ...) { mode_t mode = 0; if (oflag & O_CREAT || oflag & O_TMPFILE) extract_va_arg(mode_t, mode, oflag); return V4L2CompatManager::instance()->openat(dirfd, path, oflag, mode); } LIBCAMERA_PUBLIC int __openat_2(int dirfd, const char *path, int oflag) { return openat(dirfd, path, oflag); } #ifndef openat64 LIBCAMERA_PUBLIC int openat64(int dirfd, const char *path, int oflag, ...) { mode_t mode = 0; if (oflag & O_CREAT || oflag & O_TMPFILE) extract_va_arg(mode_t, mode, oflag); return V4L2CompatManager::instance()->openat(dirfd, path, oflag | O_LARGEFILE, mode); } LIBCAMERA_PUBLIC int __openat64_2(int dirfd, const char *path, int oflag) { return openat(dirfd, path, oflag); } #endif LIBCAMERA_PUBLIC int dup(int oldfd) { return V4L2CompatManager::instance()->dup(oldfd); } LIBCAMERA_PUBLIC int close(int fd) { return V4L2CompatManager::instance()->close(fd); } LIBCAMERA_PUBLIC void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) { return V4L2CompatManager::instance()->mmap(addr, length, prot, flags, fd, offset); } #ifndef mmap64 LIBCAMERA_PUBLIC void *mmap64(void *addr, size_t length, int prot, int flags, int fd, off64_t offset) { return V4L2CompatManager::instance()->mmap(addr, length, prot, flags, fd, offset); } #endif LIBCAMERA_PUBLIC int munmap(void *addr, size_t length) { return V4L2CompatManager::instance()->munmap(addr, length); } LIBCAMERA_PUBLIC int ioctl(int fd, unsigned long request, ...) { void *arg; extract_va_arg(void *, arg, request); return V4L2CompatManager::instance()->ioctl(fd, request, arg); } }