@@ -103,6 +103,38 @@ G_DEFINE_TYPE_WITH_CODE (ArvV4l2Stream, arv_v4l2_stream, ARV_TYPE_STREAM, G_ADD_
103
103
104
104
/* Acquisition thread */
105
105
106
+ static void
107
+ _queue_buffers (ArvV4l2StreamThreadData * thread_data , GHashTable * buffers )
108
+ {
109
+ ArvBuffer * arv_buffer ;
110
+ struct v4l2_buffer bufd = {0 };
111
+
112
+ do {
113
+ arv_buffer = arv_stream_pop_input_buffer (thread_data -> stream );
114
+ if (ARV_IS_BUFFER (arv_buffer )) {
115
+ memset (& bufd , 0 , sizeof bufd );
116
+ bufd .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
117
+ bufd .index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (arv_buffer ), "v4l2-index" ));
118
+ if (thread_data -> io_method == ARV_V4L2_STREAM_IO_METHOD_MMAP ) {
119
+ bufd .memory = V4L2_MEMORY_MMAP ;
120
+ } else {
121
+ bufd .memory = V4L2_MEMORY_USERPTR ;
122
+ bufd .m .userptr = (unsigned long ) arv_buffer -> priv -> data ;
123
+ bufd .length = arv_buffer -> priv -> allocated_size ;
124
+ }
125
+
126
+ if (v4l2_ioctl (thread_data -> device_fd , VIDIOC_QBUF , & bufd ) == -1 ) {
127
+ arv_warning_stream_thread ("Failed to queue v4l2 buffer (%s)" ,
128
+ strerror (errno ));
129
+ arv_stream_push_output_buffer (thread_data -> stream , arv_buffer );
130
+ } else {
131
+ arv_trace_stream_thread ("Queue buffer %d\n" , bufd .index );
132
+ g_hash_table_replace (buffers , GINT_TO_POINTER (bufd .index ), arv_buffer );
133
+ }
134
+ }
135
+ } while (arv_buffer != NULL );
136
+ }
137
+
106
138
static void *
107
139
arv_v4l2_stream_thread (void * data )
108
140
{
@@ -118,36 +150,20 @@ arv_v4l2_stream_thread (void *data)
118
150
thread_data -> callback (thread_data -> callback_data , ARV_STREAM_CALLBACK_TYPE_INIT , NULL );
119
151
120
152
buffers = g_hash_table_new (g_direct_hash , g_direct_equal );
153
+ _queue_buffers (thread_data , buffers );
121
154
122
155
g_mutex_lock (& thread_data -> thread_started_mutex );
123
156
thread_data -> thread_started = TRUE;
124
157
g_cond_signal (& thread_data -> thread_started_cond );
125
158
g_mutex_unlock (& thread_data -> thread_started_mutex );
126
159
127
- g_usleep (100000 );
128
-
129
160
while (!g_atomic_int_get (& thread_data -> cancel )) {
130
161
struct v4l2_buffer bufd = {0 };
131
162
fd_set fds ;
132
163
struct timeval tv ;
133
164
int result ;
134
165
135
- do {
136
- arv_buffer = arv_stream_pop_input_buffer (thread_data -> stream );
137
- if (ARV_IS_BUFFER (arv_buffer )) {
138
- bufd .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
139
- bufd .memory = V4L2_MEMORY_MMAP ;
140
- bufd .index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (arv_buffer ), "v4l2-index" ));
141
-
142
- if (v4l2_ioctl (thread_data -> device_fd , VIDIOC_QBUF , & bufd ) == -1 ) {
143
- arv_warning_stream_thread ("Failed to queue v4l2 buffer" );
144
- arv_stream_push_output_buffer (thread_data -> stream , arv_buffer );
145
- } else {
146
- arv_trace_stream_thread ("Queue buffer %d\n" , bufd .index );
147
- g_hash_table_replace (buffers , GINT_TO_POINTER (bufd .index ), arv_buffer );
148
- }
149
- }
150
- } while (arv_buffer != NULL );
166
+ _queue_buffers (thread_data , buffers );
151
167
152
168
FD_ZERO (& fds );
153
169
FD_SET (thread_data -> device_fd , & fds );
@@ -164,13 +180,19 @@ arv_v4l2_stream_thread (void *data)
164
180
if (result == 0 )
165
181
continue ;
166
182
183
+ memset (& bufd , 0 , sizeof bufd );
167
184
bufd .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
168
- bufd .memory = V4L2_MEMORY_MMAP ;
185
+ bufd .memory = thread_data -> io_method == ARV_V4L2_STREAM_IO_METHOD_MMAP ?
186
+ V4L2_MEMORY_MMAP : V4L2_MEMORY_USERPTR ;
169
187
bufd .index = 0 ;
170
188
171
- if (v4l2_ioctl (thread_data -> device_fd , VIDIOC_DQBUF , & bufd ) == -1 )
189
+ if (v4l2_ioctl (thread_data -> device_fd , VIDIOC_DQBUF , & bufd ) == -1 ) {
172
190
arv_warning_stream_thread ("DeQueue buffer error (%s)" , strerror (errno ));
173
- else
191
+ switch (errno ) {
192
+ case EAGAIN :
193
+ continue ;
194
+ }
195
+ } else
174
196
arv_trace_stream_thread ("Dequeued buffer %d\n" , bufd .index );
175
197
176
198
arv_buffer = g_hash_table_lookup (buffers , GINT_TO_POINTER (bufd .index ));
@@ -227,7 +249,7 @@ arv_v4l2_stream_thread (void *data)
227
249
return NULL ;
228
250
}
229
251
230
- /* ArvV4l2Stream implemenation */
252
+ /* ArvV4l2Stream implementation */
231
253
232
254
static gboolean
233
255
arv_v4l2_stream_start_acquisition (ArvStream * stream , GError * * error )
@@ -241,6 +263,7 @@ arv_v4l2_stream_start_acquisition (ArvStream *stream, GError **error)
241
263
guint32 bytes_per_line ;
242
264
guint32 payload_size ;
243
265
guint32 width_pixels ;
266
+ guint32 index = 0 ;
244
267
245
268
g_return_val_if_fail (priv -> thread == NULL , FALSE);
246
269
g_return_val_if_fail (priv -> thread_data != NULL , FALSE);
@@ -269,9 +292,11 @@ arv_v4l2_stream_start_acquisition (ArvStream *stream, GError **error)
269
292
thread_data -> io_method = ARV_V4L2_STREAM_IO_METHOD_MMAP ;
270
293
} else {
271
294
if (thread_data -> io_method != ARV_V4L2_STREAM_IO_METHOD_UNKNOWN &&
272
- thread_data -> io_method != ARV_V4L2_STREAM_IO_METHOD_READ )
295
+ thread_data -> io_method != ARV_V4L2_STREAM_IO_METHOD_USER_POINTER )
273
296
mixed_io_method = TRUE;
274
- thread_data -> io_method = ARV_V4L2_STREAM_IO_METHOD_READ ;
297
+ thread_data -> io_method = ARV_V4L2_STREAM_IO_METHOD_USER_POINTER ;
298
+ g_object_set_data (G_OBJECT (buffer ), "v4l2-index" , GINT_TO_POINTER (index ));
299
+ index ++ ;
275
300
}
276
301
277
302
arv_stream_push_buffer (stream , buffer );
@@ -284,6 +309,21 @@ arv_v4l2_stream_start_acquisition (ArvStream *stream, GError **error)
284
309
return FALSE;
285
310
}
286
311
312
+ if (thread_data -> io_method == ARV_V4L2_STREAM_IO_METHOD_USER_POINTER ) {
313
+ struct v4l2_requestbuffers req = {0 };
314
+
315
+ req .count = index ;
316
+ req .type = V4L2_BUF_TYPE_VIDEO_CAPTURE ;
317
+ req .memory = V4L2_MEMORY_USERPTR ;
318
+
319
+ if (v4l2_ioctl (priv -> thread_data -> device_fd , VIDIOC_REQBUFS , & req ) == -1 ) {
320
+ g_set_error (error , ARV_DEVICE_ERROR , ARV_DEVICE_ERROR_PROTOCOL_ERROR ,
321
+ "V4l2 user pointer method not supported (%s)" ,
322
+ strerror (errno ));
323
+ return FALSE;
324
+ }
325
+ }
326
+
287
327
if (!arv_v4l2_device_get_image_format (priv -> thread_data -> v4l2_device ,
288
328
& payload_size ,
289
329
& thread_data -> pixel_format ,
0 commit comments