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;
54 enum _GstV4l2AllocatorFlags
56 GST_V4L2_ALLOCATOR_FLAG_MMAP_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 0),
57 GST_V4L2_ALLOCATOR_FLAG_MMAP_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 1),
58 GST_V4L2_ALLOCATOR_FLAG_USERPTR_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 2),
59 GST_V4L2_ALLOCATOR_FLAG_USERPTR_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 3),
60 GST_V4L2_ALLOCATOR_FLAG_DMABUF_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 4),
61 GST_V4L2_ALLOCATOR_FLAG_DMABUF_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 5),
75 GstV4l2MemoryGroup *group;
80 struct _GstV4l2MemoryGroup
83 GstMemory * mem[VIDEO_MAX_PLANES];
85 struct v4l2_buffer buffer;
86 struct v4l2_plane planes[VIDEO_MAX_PLANES];
89 struct _GstV4l2Allocator
96 struct v4l2_format format;
97 gboolean can_allocate;
100 GstV4l2MemoryGroup * groups[VIDEO_MAX_FRAME];
101 GstAtomicQueue *free_queue;
102 GstAtomicQueue *pending_queue;
106 struct _GstV4l2AllocatorClass {
107 GstAllocatorClass parent_class;
110 GType gst_v4l2_allocator_get_type(void);
112 gboolean gst_is_v4l2_memory (GstMemory * mem);
114 GQuark gst_v4l2_memory_quark (void);
116 gboolean gst_v4l2_allocator_is_active (GstV4l2Allocator * allocator);
118 guint gst_v4l2_allocator_get_size (GstV4l2Allocator * allocator);
120 GstV4l2Allocator* gst_v4l2_allocator_new (GstObject *parent, gint video_fd,
121 struct v4l2_format * format);
123 guint gst_v4l2_allocator_start (GstV4l2Allocator * allocator,
124 guint32 count, guint32 memory);
126 GstV4l2Return gst_v4l2_allocator_stop (GstV4l2Allocator * allocator);
128 GstV4l2MemoryGroup* gst_v4l2_allocator_alloc_mmap (GstV4l2Allocator * allocator);
130 GstV4l2MemoryGroup* gst_v4l2_allocator_alloc_dmabuf (GstV4l2Allocator * allocator,
131 GstAllocator * dmabuf_allocator);
133 GstV4l2MemoryGroup * gst_v4l2_allocator_alloc_dmabufin (GstV4l2Allocator * allocator);
135 GstV4l2MemoryGroup * gst_v4l2_allocator_alloc_userptr (GstV4l2Allocator * allocator);
137 gboolean gst_v4l2_allocator_import_dmabuf (GstV4l2Allocator * allocator,
138 GstV4l2MemoryGroup *group,
139 gint n_mem, GstMemory ** dma_mem);
141 gboolean gst_v4l2_allocator_import_userptr (GstV4l2Allocator * allocator,
142 GstV4l2MemoryGroup *group,
143 gsize img_size, int n_planes,
144 gpointer * data, gsize * size);
146 void gst_v4l2_allocator_flush (GstV4l2Allocator * allocator);
148 gboolean gst_v4l2_allocator_qbuf (GstV4l2Allocator * allocator,
149 GstV4l2MemoryGroup * group);
151 GstFlowReturn gst_v4l2_allocator_dqbuf (GstV4l2Allocator * allocator,
152 GstV4l2MemoryGroup ** group);
154 void gst_v4l2_allocator_reset_group (GstV4l2Allocator * allocator,
155 GstV4l2MemoryGroup * group);
159 #endif /* __GST_V4L2_ALLOCATOR_H__ */