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))
44 #define GST_V4L2_ALLOCATOR_CAN_ORPHAN_BUFS(obj) \
45 (GST_OBJECT_FLAG_IS_SET (obj, GST_V4L2_ALLOCATOR_FLAG_SUPPORTS_ORPHANED_BUFS))
46 #define GST_V4L2_ALLOCATOR_IS_ORPHANED(obj) \
47 (GST_OBJECT_FLAG_IS_SET (obj, GST_V4L2_ALLOCATOR_FLAG_ORPHANED))
49 #define GST_V4L2_MEMORY_QUARK gst_v4l2_memory_quark ()
51 typedef struct _GstV4l2Allocator GstV4l2Allocator;
52 typedef struct _GstV4l2AllocatorClass GstV4l2AllocatorClass;
53 typedef struct _GstV4l2MemoryGroup GstV4l2MemoryGroup;
54 typedef struct _GstV4l2Memory GstV4l2Memory;
55 typedef enum _GstV4l2Capabilities GstV4l2Capabilities;
56 typedef enum _GstV4l2Return GstV4l2Return;
58 enum _GstV4l2AllocatorFlags
60 GST_V4L2_ALLOCATOR_FLAG_MMAP_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 0),
61 GST_V4L2_ALLOCATOR_FLAG_MMAP_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 1),
62 GST_V4L2_ALLOCATOR_FLAG_USERPTR_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 2),
63 GST_V4L2_ALLOCATOR_FLAG_USERPTR_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 3),
64 GST_V4L2_ALLOCATOR_FLAG_DMABUF_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 4),
65 GST_V4L2_ALLOCATOR_FLAG_DMABUF_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 5),
66 GST_V4L2_ALLOCATOR_FLAG_SUPPORTS_ORPHANED_BUFS = (GST_ALLOCATOR_FLAG_LAST << 6),
67 GST_V4L2_ALLOCATOR_FLAG_ORPHANED = (GST_ALLOCATOR_FLAG_LAST << 7),
81 GstV4l2MemoryGroup *group;
86 struct _GstV4l2MemoryGroup
89 GstMemory * mem[VIDEO_MAX_PLANES];
91 struct v4l2_buffer buffer;
92 struct v4l2_plane planes[VIDEO_MAX_PLANES];
95 struct _GstV4l2Allocator
101 gboolean can_allocate;
104 GstV4l2MemoryGroup * groups[VIDEO_MAX_FRAME];
105 GstAtomicQueue *free_queue;
106 GstAtomicQueue *pending_queue;
110 struct _GstV4l2AllocatorClass {
111 GstAllocatorClass parent_class;
114 GType gst_v4l2_allocator_get_type(void);
116 gboolean gst_is_v4l2_memory (GstMemory * mem);
118 GQuark gst_v4l2_memory_quark (void);
120 gboolean gst_v4l2_allocator_is_active (GstV4l2Allocator * allocator);
122 guint gst_v4l2_allocator_get_size (GstV4l2Allocator * allocator);
124 GstV4l2Allocator* gst_v4l2_allocator_new (GstObject *parent, GstV4l2Object * obj);
126 guint gst_v4l2_allocator_start (GstV4l2Allocator * allocator,
127 guint32 count, guint32 memory);
129 GstV4l2Return gst_v4l2_allocator_stop (GstV4l2Allocator * allocator);
131 gboolean gst_v4l2_allocator_orphan (GstV4l2Allocator * allocator);
133 GstV4l2MemoryGroup* gst_v4l2_allocator_alloc_mmap (GstV4l2Allocator * allocator);
135 GstV4l2MemoryGroup* gst_v4l2_allocator_alloc_dmabuf (GstV4l2Allocator * allocator,
136 GstAllocator * dmabuf_allocator);
138 GstV4l2MemoryGroup * gst_v4l2_allocator_alloc_dmabufin (GstV4l2Allocator * allocator);
140 GstV4l2MemoryGroup * gst_v4l2_allocator_alloc_userptr (GstV4l2Allocator * allocator);
142 gboolean gst_v4l2_allocator_import_dmabuf (GstV4l2Allocator * allocator,
143 GstV4l2MemoryGroup *group,
144 gint n_mem, GstMemory ** dma_mem);
146 gboolean gst_v4l2_allocator_import_userptr (GstV4l2Allocator * allocator,
147 GstV4l2MemoryGroup *group,
148 gsize img_size, int n_planes,
149 gpointer * data, gsize * size);
151 void gst_v4l2_allocator_flush (GstV4l2Allocator * allocator);
153 gboolean gst_v4l2_allocator_qbuf (GstV4l2Allocator * allocator,
154 GstV4l2MemoryGroup * group);
156 GstFlowReturn gst_v4l2_allocator_dqbuf (GstV4l2Allocator * allocator,
157 GstV4l2MemoryGroup ** group);
159 void gst_v4l2_allocator_reset_group (GstV4l2Allocator * allocator,
160 GstV4l2MemoryGroup * group);
164 #endif /* __GST_V4L2_ALLOCATOR_H__ */