[libcamera-devel] [PATCH v1 13/23] gst: libcamerasrc: Send stream start event
Nicolas Dufresne
nicolas at ndufresne.ca
Wed Jan 29 19:11:50 CET 2020
Le mercredi 29 janvier 2020 à 12:35 +0000, Kieran Bingham a écrit :
> Hi Nicolas,
>
> On 29/01/2020 03:32, Nicolas Dufresne wrote:
> > From: Nicolas Dufresne <nicolas.dufresne at collabora.com>
> >
> > Prior to sending caps, we need to send a stream-start event. This requires
> > generating a stream and a group id. The stream id is random for live sources
> > and
> > the group id is shared across all pads.
>
> Interestingly, I can compile against gstreamer1.0 1.14 up until this
> patch, but then I hit another dependency.
>
> The target I'm building on has glib-2.0 version 2.59, and
> GRecMutexLocker was introduced in 2.60 :S
Good catch, 2.60 is a bit aggressive. I have considered just implementing my own
locker in C++, since this is trivial, no I have a rationale to do so. With C++ I
can use the same locker for Mutex and RecMutex.
>
> Perhaps this patch might also need to add something like the (untested)
> following:
>
> diff --git a/src/gstreamer/meson.build b/src/gstreamer/meson.build
> index 9d273437..58cf0009 100644
> --- a/src/gstreamer/meson.build
> +++ b/src/gstreamer/meson.build
> @@ -11,6 +11,9 @@ libcamera_gst_c_args = [
> '-DPACKAGE="@0@"'.format(meson.project_name()),
> ]
>
> +glib_dep = dependency('glib-2.0', version : '>=2.60',
> + required : get_option('gstreamer'))
> +
I wanted to rely on GStreamer own restriction, to keep things simplier. So I'll
check what 1.14 requires, and craft a test with such an old GLib.
> gst_dep = dependency('gstreamer-video-1.0', version : '>=1.14',
> required : get_option('gstreamer'))
>
>
> > Signed-off-by: Nicolas Dufresne <nicolas.dufresne at collabora.com>
> > ---
> > src/gstreamer/gstlibcamerasrc.cpp | 13 +++++++++++++
> > 1 file changed, 13 insertions(+)
> >
> > diff --git a/src/gstreamer/gstlibcamerasrc.cpp
> > b/src/gstreamer/gstlibcamerasrc.cpp
> > index be32a11..b1a21dc 100644
> > --- a/src/gstreamer/gstlibcamerasrc.cpp
> > +++ b/src/gstreamer/gstlibcamerasrc.cpp
> > @@ -18,6 +18,8 @@ using namespace libcamera;
> > GST_DEBUG_CATEGORY_STATIC(source_debug);
> > #define GST_CAT_DEFAULT source_debug
> >
> > +#define STREAM_LOCKER(obj) g_autoptr(GRecMutexLocker) stream_locker =
> > g_rec_mutex_locker_new(&GST_LIBCAMERA_SRC(obj)->stream_lock)
> > +
> > /* Used for C++ object with destructors */
> > struct GstLibcameraSrcState {
> > std::shared_ptr<CameraManager> cm;
> > @@ -127,9 +129,20 @@ gst_libcamera_src_task_run(gpointer user_data)
> > static void
> > gst_libcamera_src_task_enter(GstTask *task, GThread *thread, gpointer
> > user_data)
> > {
> > + STREAM_LOCKER(user_data);
> > GstLibcameraSrc *self = GST_LIBCAMERA_SRC(user_data);
> > + GstLibcameraSrcState *state = self->state;
> >
> > GST_DEBUG_OBJECT(self, "Streaming thread has started");
> > +
> > + guint group_id = gst_util_group_id_next();
> > + for (GstPad *srcpad : state->srcpads) {
> > + /* Create stream-id and push stream-start */
> > + g_autofree gchar *stream_id = gst_pad_create_stream_id(srcpad,
> > GST_ELEMENT(self), nullptr);
> > + GstEvent *event = gst_event_new_stream_start(stream_id);
> > + gst_event_set_group_id(event, group_id);
> > + gst_pad_push_event(srcpad, event);
> > + }
> > }
> >
> > static void
> >
More information about the libcamera-devel
mailing list