It's not allowed to have multiple instances of CameraManager. This requirement is not easy for GStreamer were the device monitor and the camerasrc, or two camerasrc instances don't usually have any interaction between each other. Fix this by implementing a minimalist singleton around CameraManager constructor and start()/stop() operations. Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Tested-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
75 lines
1.5 KiB
C++
75 lines
1.5 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2020, Collabora Ltd.
|
|
* Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
|
|
*
|
|
* gstlibcamera-utils.h - GStreamer libcamera Utility Functions
|
|
*/
|
|
|
|
#ifndef __GST_LIBCAMERA_UTILS_H__
|
|
#define __GST_LIBCAMERA_UTILS_H__
|
|
|
|
#include <libcamera/camera_manager.h>
|
|
#include <libcamera/stream.h>
|
|
|
|
#include <gst/gst.h>
|
|
#include <gst/video/video.h>
|
|
|
|
GstCaps *gst_libcamera_stream_formats_to_caps(const libcamera::StreamFormats &formats);
|
|
GstCaps *gst_libcamera_stream_configuration_to_caps(const libcamera::StreamConfiguration &stream_cfg);
|
|
void gst_libcamera_configure_stream_from_caps(libcamera::StreamConfiguration &stream_cfg,
|
|
GstCaps *caps);
|
|
void gst_libcamera_resume_task(GstTask *task);
|
|
std::shared_ptr<libcamera::CameraManager> gst_libcamera_get_camera_mananger(int &ret);
|
|
|
|
/**
|
|
* \class GLibLocker
|
|
* \brief A simple scoped mutex locker for GMutex
|
|
*/
|
|
class GLibLocker
|
|
{
|
|
public:
|
|
GLibLocker(GMutex *mutex)
|
|
: mutex_(mutex)
|
|
{
|
|
g_mutex_lock(mutex_);
|
|
}
|
|
|
|
GLibLocker(GstObject *object)
|
|
: mutex_(GST_OBJECT_GET_LOCK(object))
|
|
{
|
|
g_mutex_lock(mutex_);
|
|
}
|
|
|
|
~GLibLocker()
|
|
{
|
|
g_mutex_unlock(mutex_);
|
|
}
|
|
|
|
private:
|
|
GMutex *mutex_;
|
|
};
|
|
|
|
/**
|
|
* \class GLibRecLocker
|
|
* \brief A simple scoped mutex locker for GRecMutex
|
|
*/
|
|
class GLibRecLocker
|
|
{
|
|
public:
|
|
GLibRecLocker(GRecMutex *mutex)
|
|
: mutex_(mutex)
|
|
{
|
|
g_rec_mutex_lock(mutex_);
|
|
}
|
|
|
|
~GLibRecLocker()
|
|
{
|
|
g_rec_mutex_unlock(mutex_);
|
|
}
|
|
|
|
private:
|
|
GRecMutex *mutex_;
|
|
};
|
|
|
|
#endif /* __GST_LIBCAMERA_UTILS_H__ */
|