2 * Copyright (C) 2014 Collabora Ltd.
3 * Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
23 #ifndef __GST_V4L2_ALLOCATOR_H__
24 #define __GST_V4L2_ALLOCATOR_H__
26 #include "ext/videodev2.h"
28 #include <gst/gstatomicqueue.h>
32 #define GST_TYPE_V4L2_ALLOCATOR (gst_v4l2_allocator_get_type())
33 #define GST_IS_V4L2_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_ALLOCATOR))
34 #define GST_IS_V4L2_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_ALLOCATOR))
35 #define GST_V4L2_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_V4L2_ALLOCATOR, GstV4l2AllocatorClass))
36 #define GST_V4L2_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_ALLOCATOR, GstV4l2Allocator))
37 #define GST_V4L2_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_V4L2_ALLOCATOR, GstV4l2AllocatorClass))
38 #define GST_V4L2_ALLOCATOR_CAST(obj) ((GstV4l2Allocator *)(obj))
40 #define GST_V4L2_ALLOCATOR_CAN_REQUEST(obj,type) \
41 (GST_OBJECT_FLAG_IS_SET (obj, GST_V4L2_ALLOCATOR_FLAG_ ## type ## _REQBUFS))
42 #define GST_V4L2_ALLOCATOR_CAN_ALLOCATE(obj,type) \
43 (GST_OBJECT_FLAG_IS_SET (obj, GST_V4L2_ALLOCATOR_FLAG_ ## type ## _CREATE_BUFS))
45 #define GST_V4L2_MEMORY_QUARK gst_v4l2_memory_quark ()
47 typedef struct _GstV4l2Allocator GstV4l2Allocator;
48 typedef struct _GstV4l2AllocatorClass GstV4l2AllocatorClass;
49 typedef struct _GstV4l2MemoryGroup GstV4l2MemoryGroup;
50 typedef struct _GstV4l2Memory GstV4l2Memory;
51 typedef enum _GstV4l2Capabilities GstV4l2Capabilities;
52 typedef enum _GstV4l2Return GstV4l2Return;
53 typedef struct _GstV4l2Object GstV4l2Object;
55 enum _GstV4l2AllocatorFlags
57 GST_V4L2_ALLOCATOR_FLAG_MMAP_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 0),
58 GST_V4L2_ALLOCATOR_FLAG_MMAP_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 1),
59 GST_V4L2_ALLOCATOR_FLAG_USERPTR_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 2),
60 GST_V4L2_ALLOCATOR_FLAG_USERPTR_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 3),
61 GST_V4L2_ALLOCATOR_FLAG_DMABUF_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 4),
62 GST_V4L2_ALLOCATOR_FLAG_DMABUF_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 5),
76 GstV4l2MemoryGroup *group;
81 struct _GstV4l2MemoryGroup
84 GstMemory * mem[VIDEO_MAX_PLANES];
86 struct v4l2_buffer buffer;
87 struct v4l2_plane planes[VIDEO_MAX_PLANES];
90 struct _GstV4l2Allocator
96 gboolean can_allocate;
99 GstV4l2MemoryGroup * groups[VIDEO_MAX_FRAME];
100 GstAtomicQueue *free_queue;
101 GstAtomicQueue *pending_queue;
105 struct _GstV4l2AllocatorClass {
106 GstAllocatorClass parent_class;
109 GType gst_v4l2_allocator_get_type(void);
111 gboolean gst_is_v4l2_memory (GstMemory * mem);
113 GQuark gst_v4l2_memory_quark (void);
115 gboolean gst_v4l2_allocator_is_active (GstV4l2Allocator * allocator);
117 guint gst_v4l2_allocator_get_size (GstV4l2Allocator * allocator);
119 GstV4l2Allocator* gst_v4l2_allocator_new (GstObject *parent, GstV4l2Object * obj);
121 guint gst_v4l2_allocator_start (GstV4l2Allocator * allocator,
122 guint32 count, guint32 memory);
124 GstV4l2Return gst_v4l2_allocator_stop (GstV4l2Allocator * allocator);
126 GstV4l2MemoryGroup* gst_v4l2_allocator_alloc_mmap (GstV4l2Allocator * allocator);
128 GstV4l2MemoryGroup* gst_v4l2_allocator_alloc_dmabuf (GstV4l2Allocator * allocator,
129 GstAllocator * dmabuf_allocator);
131 GstV4l2MemoryGroup * gst_v4l2_allocator_alloc_dmabufin (GstV4l2Allocator * allocator);
133 GstV4l2MemoryGroup * gst_v4l2_allocator_alloc_userptr (GstV4l2Allocator * allocator);
135 gboolean gst_v4l2_allocator_import_dmabuf (GstV4l2Allocator * allocator,
136 GstV4l2MemoryGroup *group,
137 gint n_mem, GstMemory ** dma_mem);
139 gboolean gst_v4l2_allocator_import_userptr (GstV4l2Allocator * allocator,
140 GstV4l2MemoryGroup *group,
141 gsize img_size, int n_planes,
142 gpointer * data, gsize * size);
144 void gst_v4l2_allocator_flush (GstV4l2Allocator * allocator);
146 gboolean gst_v4l2_allocator_qbuf (GstV4l2Allocator * allocator,
147 GstV4l2MemoryGroup * group);
149 GstFlowReturn gst_v4l2_allocator_dqbuf (GstV4l2Allocator * allocator,
150 GstV4l2MemoryGroup ** group);
152 void gst_v4l2_allocator_reset_group (GstV4l2Allocator * allocator,
153 GstV4l2MemoryGroup * group);
157 #endif /* __GST_V4L2_ALLOCATOR_H__ */