v4l2object: Don't use mmap64 if off_t is 64-bit
[platform/upstream/gst-plugins-good.git] / sys / v4l2 / gstv4l2allocator.h
1 /*
2  * Copyright (C) 2014 Collabora Ltd.
3  *     Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
4  *
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.
9  *
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.
14  *
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.
19  *
20  */
21
22
23 #ifndef __GST_V4L2_ALLOCATOR_H__
24 #define __GST_V4L2_ALLOCATOR_H__
25
26 #include "ext/videodev2.h"
27 #include <gst/gst.h>
28 #include <gst/gstatomicqueue.h>
29
30 G_BEGIN_DECLS
31
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))
39
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
45 #define GST_V4L2_MEMORY_QUARK gst_v4l2_memory_quark ()
46
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;
54
55 enum _GstV4l2AllocatorFlags
56 {
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),
63 };
64
65 enum _GstV4l2Return
66 {
67   GST_V4L2_OK = 0,
68   GST_V4L2_ERROR = -1,
69   GST_V4L2_BUSY = -2
70 };
71
72 struct _GstV4l2Memory
73 {
74   GstMemory mem;
75   gint plane;
76   GstV4l2MemoryGroup *group;
77   gpointer data;
78   gint dmafd;
79 };
80
81 struct _GstV4l2MemoryGroup
82 {
83   gint n_mem;
84   GstMemory * mem[VIDEO_MAX_PLANES];
85   gint mems_allocated;
86   struct v4l2_buffer buffer;
87   struct v4l2_plane planes[VIDEO_MAX_PLANES];
88 };
89
90 struct _GstV4l2Allocator
91 {
92   GstAllocator parent;
93   GstV4l2Object *obj;
94   guint32 count;
95   guint32 memory;
96   gboolean can_allocate;
97   gboolean active;
98
99   GstV4l2MemoryGroup * groups[VIDEO_MAX_FRAME];
100   GstAtomicQueue *free_queue;
101   GstAtomicQueue *pending_queue;
102
103 };
104
105 struct _GstV4l2AllocatorClass {
106   GstAllocatorClass parent_class;
107 };
108
109 GType gst_v4l2_allocator_get_type(void);
110
111 gboolean             gst_is_v4l2_memory                (GstMemory * mem);
112
113 GQuark               gst_v4l2_memory_quark             (void);
114
115 gboolean             gst_v4l2_allocator_is_active      (GstV4l2Allocator * allocator);
116
117 guint                gst_v4l2_allocator_get_size       (GstV4l2Allocator * allocator);
118
119 GstV4l2Allocator*    gst_v4l2_allocator_new            (GstObject *parent, GstV4l2Object * obj);
120
121 guint                gst_v4l2_allocator_start          (GstV4l2Allocator * allocator,
122                                                         guint32 count, guint32 memory);
123
124 GstV4l2Return        gst_v4l2_allocator_stop           (GstV4l2Allocator * allocator);
125
126 GstV4l2MemoryGroup*  gst_v4l2_allocator_alloc_mmap     (GstV4l2Allocator * allocator);
127
128 GstV4l2MemoryGroup*  gst_v4l2_allocator_alloc_dmabuf   (GstV4l2Allocator * allocator,
129                                                         GstAllocator * dmabuf_allocator);
130
131 GstV4l2MemoryGroup * gst_v4l2_allocator_alloc_dmabufin (GstV4l2Allocator * allocator);
132
133 GstV4l2MemoryGroup * gst_v4l2_allocator_alloc_userptr  (GstV4l2Allocator * allocator);
134
135 gboolean             gst_v4l2_allocator_import_dmabuf  (GstV4l2Allocator * allocator,
136                                                         GstV4l2MemoryGroup *group,
137                                                         gint n_mem, GstMemory ** dma_mem);
138
139 gboolean             gst_v4l2_allocator_import_userptr (GstV4l2Allocator * allocator,
140                                                         GstV4l2MemoryGroup *group,
141                                                         gsize img_size, int n_planes,
142                                                         gpointer * data, gsize * size);
143
144 void                 gst_v4l2_allocator_flush          (GstV4l2Allocator * allocator);
145
146 gboolean             gst_v4l2_allocator_qbuf           (GstV4l2Allocator * allocator,
147                                                         GstV4l2MemoryGroup * group);
148
149 GstFlowReturn        gst_v4l2_allocator_dqbuf          (GstV4l2Allocator * allocator,
150                                                         GstV4l2MemoryGroup ** group);
151
152 void                 gst_v4l2_allocator_reset_group    (GstV4l2Allocator * allocator,
153                                                         GstV4l2MemoryGroup * group);
154
155 G_END_DECLS
156
157 #endif /* __GST_V4L2_ALLOCATOR_H__ */