v4l2-ruby 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/README.md +1 -1
- data/Rakefile +12 -3
- data/ext/v4l2/camera.c +42 -5
- data/ext/v4l2/camera.h +10 -5
- data/ext/v4l2/v4l2.c +146 -80
- data/lib/v4l2/version.rb +1 -1
- data/pkg/.gitkeep +0 -0
- data/tests/config.yml +5 -0
- data/tests/lib/config.rb +21 -0
- data/tests/lib/test_util.rb +10 -0
- data/tests/run_unit.rb +24 -0
- data/tests/template.rb +30 -0
- data/tests/unit/capture/test_start.rb +49 -0
- data/tests/unit/config/test_set_format.rb +48 -0
- data/tests/unit/config/test_set_framerate.rb +57 -0
- data/tests/unit/config/test_set_image_size.rb +85 -0
- data/tests/unit/create_object/test_simple_create.rb +53 -0
- data/tests/unit/device_info/.test_get_bus_name.rb.swp +0 -0
- data/tests/unit/device_info/test_get_bus_name.rb +34 -0
- data/tests/unit/device_info/test_get_controls.rb +92 -0
- data/tests/unit/device_info/test_get_device_name.rb +34 -0
- data/tests/unit/device_info/test_get_driver_name.rb +34 -0
- data/tests/unit/device_info/test_get_formats.rb +58 -0
- data/tests/unit/device_info/test_get_framecap.rb +56 -0
- data/tests/unit/ractor/test_ractor.rb +67 -0
- data/v4l2-ruby.gemspec +3 -3
- metadata +36 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8cd2fedcc6514a3b25e69d923538b2c044ccca1a6883ce5320fe7b2e22f4819b
|
4
|
+
data.tar.gz: 0b90ab5883e8c9835477e91e411e75a9b657b32e91a66ea52768271313af6634
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7f1da3bad3e6f4d1b45b5d8cf6c47765880ad557936de1a5fca4a829ea18930f208deb9382fbff57bab13bb33d6a74281df82226d08d00058a904ceb8d48173
|
7
|
+
data.tar.gz: e2631f2c448cd16b2ca1cb8de0ebe83e686b17397d0f56301b3b06824f6decfa120d2800d59729f3f44ab5b62b691bc0e8d52eec4c3d141fea38a99074c11ea0
|
data/.gitignore
ADDED
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -3,6 +3,15 @@ require "rake/extensiontask"
|
|
3
3
|
|
4
4
|
task :default => :spec
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
spec = Gem::Specification.load("v4l2-ruby.gemspec")
|
7
|
+
|
8
|
+
# add your default gem packing task
|
9
|
+
Gem::PackageTask.new(spec) {|pkg|}
|
10
|
+
|
11
|
+
# feed the ExtensionTask with your spec
|
12
|
+
Rake::ExtensionTask.new('v4l2-ruby', spec) { |ext|
|
13
|
+
ext.name = "v4l2"
|
14
|
+
ext.ext_dir = "ext/v4l2"
|
15
|
+
ext.cross_compile = true
|
16
|
+
ext.lib_dir = File.join(*["lib", "v4l2", ENV["FAT_DIR"]].compact)
|
17
|
+
}
|
data/ext/v4l2/camera.c
CHANGED
@@ -61,7 +61,7 @@
|
|
61
61
|
#define ST_STOPPING (6)
|
62
62
|
#define ST_FINALIZED (7)
|
63
63
|
|
64
|
-
static int xioctl(int fh,
|
64
|
+
static int xioctl(int fh, unsigned long request, void *arg)
|
65
65
|
{
|
66
66
|
int r;
|
67
67
|
|
@@ -154,7 +154,7 @@ set_format(int fd, uint32_t fcc, int wd, int ht)
|
|
154
154
|
fmt.fmt.pix.width = wd;
|
155
155
|
fmt.fmt.pix.height = ht;
|
156
156
|
fmt.fmt.pix.pixelformat = fcc;
|
157
|
-
fmt.fmt.pix.field =
|
157
|
+
fmt.fmt.pix.field = V4L2_FIELD_ANY;
|
158
158
|
|
159
159
|
err = xioctl(fd, VIDIOC_S_FMT, &fmt);
|
160
160
|
if (err < 0) {
|
@@ -1262,8 +1262,15 @@ camera_stop(camera_t* cam)
|
|
1262
1262
|
for (i = 0; i < NUM_PLANE; i++) mb_discard(cam->mb + i);
|
1263
1263
|
|
1264
1264
|
cam->fd = open(cam->device, O_RDWR);
|
1265
|
-
cam->
|
1266
|
-
|
1265
|
+
if (cam->fd >= 0) {
|
1266
|
+
cam->state = ST_INITIALIZED;
|
1267
|
+
cam->latest = -1;
|
1268
|
+
|
1269
|
+
} else {
|
1270
|
+
cam->state = ST_ERROR;
|
1271
|
+
cam->latest = -1;
|
1272
|
+
break;
|
1273
|
+
}
|
1267
1274
|
|
1268
1275
|
} else {
|
1269
1276
|
/*
|
@@ -1378,7 +1385,7 @@ camera_check_busy(camera_t* cam, int* busy)
|
|
1378
1385
|
fmt.fmt.pix.width = cam->width;
|
1379
1386
|
fmt.fmt.pix.height = cam->height;
|
1380
1387
|
fmt.fmt.pix.pixelformat = cam->format;
|
1381
|
-
fmt.fmt.pix.field =
|
1388
|
+
fmt.fmt.pix.field = V4L2_FIELD_ANY;
|
1382
1389
|
|
1383
1390
|
err = xioctl(cam->fd, VIDIOC_S_FMT, &fmt);
|
1384
1391
|
if (err >= 0) {
|
@@ -1397,6 +1404,36 @@ camera_check_busy(camera_t* cam, int* busy)
|
|
1397
1404
|
return ret;
|
1398
1405
|
}
|
1399
1406
|
|
1407
|
+
int
|
1408
|
+
camera_check_ready(camera_t* cam, int* ready)
|
1409
|
+
{
|
1410
|
+
int ret;
|
1411
|
+
int err;
|
1412
|
+
struct v4l2_format fmt;
|
1413
|
+
|
1414
|
+
do {
|
1415
|
+
/*
|
1416
|
+
* entry process
|
1417
|
+
*/
|
1418
|
+
ret = !0;
|
1419
|
+
|
1420
|
+
/*
|
1421
|
+
* check arguments
|
1422
|
+
*/
|
1423
|
+
if (cam == NULL) break;
|
1424
|
+
if (ready == NULL) break;
|
1425
|
+
|
1426
|
+
/*
|
1427
|
+
* do check (check state)
|
1428
|
+
*/
|
1429
|
+
*ready = (cam->state == ST_READY);
|
1430
|
+
|
1431
|
+
ret = 0;
|
1432
|
+
} while(0);
|
1433
|
+
|
1434
|
+
return ret;
|
1435
|
+
}
|
1436
|
+
|
1400
1437
|
int
|
1401
1438
|
camera_check_error(camera_t* cam, int* error)
|
1402
1439
|
{
|
data/ext/v4l2/camera.h
CHANGED
@@ -23,7 +23,11 @@
|
|
23
23
|
#include <pthread.h>
|
24
24
|
#endif /* !defined(RUBY_EXTLIB) */
|
25
25
|
|
26
|
+
#ifdef __OpenBSD__
|
27
|
+
#include <sys/videoio.h>
|
28
|
+
#else
|
26
29
|
#include <linux/videodev2.h>
|
30
|
+
#endif
|
27
31
|
|
28
32
|
#define MAX_PLANE 3
|
29
33
|
|
@@ -68,13 +72,13 @@ typedef struct __camera__ {
|
|
68
72
|
#ifndef V4L2_CTRL_TYPE_INTEGER_MENU
|
69
73
|
#define V4L2_CTRL_TYPE_INTEGER_MENU 9
|
70
74
|
struct __v4l2_querymenu_substitute_ {
|
71
|
-
|
72
|
-
|
75
|
+
uint32_t id;
|
76
|
+
uint32_t index;
|
73
77
|
union {
|
74
|
-
|
75
|
-
|
78
|
+
uint8_t name[32];
|
79
|
+
int64_t value;
|
76
80
|
};
|
77
|
-
|
81
|
+
uint32_t reserved;
|
78
82
|
} __attribute__ ((packed));
|
79
83
|
|
80
84
|
#define v4l2_querymenu __v4l2_querymenu_substitute_
|
@@ -109,6 +113,7 @@ extern int camera_set_framerate(camera_t* cam, int num, int denom);
|
|
109
113
|
extern int camera_get_image_size(camera_t* cam, size_t* sz);
|
110
114
|
extern int camera_get_image(camera_t* cam, void* ptr, size_t* used);
|
111
115
|
extern int camera_check_busy(camera_t* cam, int *busy);
|
116
|
+
extern int camera_check_ready(camera_t* cam, int *ready);
|
112
117
|
extern int camera_check_error(camera_t* cam, int *error);
|
113
118
|
|
114
119
|
extern int camera_get_format_desc(camera_t* cam, int i,
|
data/ext/v4l2/v4l2.c
CHANGED
@@ -15,6 +15,8 @@
|
|
15
15
|
|
16
16
|
#define N(x) (sizeof((x))/sizeof(*(x)))
|
17
17
|
|
18
|
+
#define EQ_STR(val,str) (rb_to_id(val) == rb_intern(str))
|
19
|
+
|
18
20
|
extern rb_encoding* rb_utf8_encoding(void);
|
19
21
|
extern rb_encoding* rb_default_internal_encoding(void);
|
20
22
|
|
@@ -29,14 +31,6 @@ static VALUE menu_item_klass;
|
|
29
31
|
static VALUE frame_cap_klass;
|
30
32
|
static VALUE fmt_desc_klass;
|
31
33
|
|
32
|
-
static ID id_yuyv;
|
33
|
-
static ID id_yuv422;
|
34
|
-
static ID id_nv21;
|
35
|
-
static ID id_nv12;
|
36
|
-
static ID id_nv16;
|
37
|
-
static ID id_rgb565;
|
38
|
-
static ID id_mjpeg;
|
39
|
-
static ID id_h264;
|
40
34
|
static ID id_iv_name;
|
41
35
|
static ID id_iv_driver;
|
42
36
|
static ID id_iv_bus;
|
@@ -53,6 +47,21 @@ static ID id_iv_rate;
|
|
53
47
|
static ID id_iv_fcc;
|
54
48
|
static ID id_iv_desc;
|
55
49
|
|
50
|
+
static void rb_camera_free(void* ptr);
|
51
|
+
static size_t rb_camera_size(const void* ptr);
|
52
|
+
|
53
|
+
static const rb_data_type_t camera_data_type = {
|
54
|
+
"V4L2 for ruby", // wrap_struct_name
|
55
|
+
NULL, // function.dmark
|
56
|
+
rb_camera_free, // function.dfree
|
57
|
+
rb_camera_size, // function.dsize
|
58
|
+
NULL, // function.dcompact
|
59
|
+
NULL, // reserved[0]
|
60
|
+
NULL, // parent
|
61
|
+
NULL, // data
|
62
|
+
(VALUE)RUBY_TYPED_FREE_IMMEDIATELY // flags
|
63
|
+
};
|
64
|
+
|
56
65
|
static void
|
57
66
|
rb_camera_free(void* ptr)
|
58
67
|
{
|
@@ -63,12 +72,18 @@ rb_camera_free(void* ptr)
|
|
63
72
|
free( ptr);
|
64
73
|
}
|
65
74
|
|
75
|
+
static size_t
|
76
|
+
rb_camera_size(const void* ptr)
|
77
|
+
{
|
78
|
+
return sizeof(camera_t);
|
79
|
+
}
|
80
|
+
|
66
81
|
static VALUE
|
67
82
|
rb_camera_alloc(VALUE self)
|
68
83
|
{
|
69
84
|
camera_t* ptr;
|
70
85
|
|
71
|
-
return
|
86
|
+
return TypedData_Make_Struct(camera_klass, camera_t, &camera_data_type, ptr);
|
72
87
|
}
|
73
88
|
|
74
89
|
static VALUE
|
@@ -96,7 +111,7 @@ rb_camera_initialize(VALUE self, VALUE dev)
|
|
96
111
|
/*
|
97
112
|
* strip object
|
98
113
|
*/
|
99
|
-
|
114
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
100
115
|
|
101
116
|
/*
|
102
117
|
* initialize struct
|
@@ -111,8 +126,10 @@ rb_camera_initialize(VALUE self, VALUE dev)
|
|
111
126
|
*/
|
112
127
|
rb_ivar_set(self, id_iv_name,
|
113
128
|
rb_enc_str_new_cstr(ptr->name, rb_utf8_encoding()));
|
129
|
+
|
114
130
|
rb_ivar_set(self, id_iv_driver,
|
115
131
|
rb_enc_str_new_cstr(ptr->driver, rb_utf8_encoding()));
|
132
|
+
|
116
133
|
rb_ivar_set(self, id_iv_bus,
|
117
134
|
rb_enc_str_new_cstr(ptr->bus, rb_utf8_encoding()));
|
118
135
|
|
@@ -124,19 +141,34 @@ rb_camera_close( VALUE self)
|
|
124
141
|
{
|
125
142
|
int err;
|
126
143
|
camera_t* ptr;
|
144
|
+
int ready;
|
127
145
|
|
128
146
|
/*
|
129
147
|
* strip object
|
130
148
|
*/
|
131
|
-
|
149
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
132
150
|
|
133
151
|
/*
|
134
|
-
*
|
152
|
+
* do close
|
135
153
|
*/
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
154
|
+
do {
|
155
|
+
err = camera_check_ready(ptr, &ready);
|
156
|
+
if (err) {
|
157
|
+
rb_raise(rb_eRuntimeError, "camera_check_ready() failed.");
|
158
|
+
}
|
159
|
+
|
160
|
+
if (ready) {
|
161
|
+
err = camera_stop(ptr);
|
162
|
+
if (err) {
|
163
|
+
rb_raise(rb_eRuntimeError, "camera_stop() failed.");
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
err = camera_finalize(ptr);
|
168
|
+
if (err) {
|
169
|
+
rb_raise(rb_eRuntimeError, "finalize camera context failed.");
|
170
|
+
}
|
171
|
+
} while (0);
|
140
172
|
|
141
173
|
return Qnil;
|
142
174
|
}
|
@@ -204,9 +236,11 @@ get_control_info(camera_t* ptr, int ctrl)
|
|
204
236
|
VALUE name;
|
205
237
|
int err;
|
206
238
|
struct v4l2_queryctrl info;
|
239
|
+
VALUE list;
|
207
240
|
|
208
241
|
ret = Qnil;
|
209
242
|
err = camera_get_control_info(ptr, ctrl, &info);
|
243
|
+
|
210
244
|
if (!err) {
|
211
245
|
switch (info.type) {
|
212
246
|
case V4L2_CTRL_TYPE_INTEGER:
|
@@ -236,24 +270,24 @@ get_control_info(camera_t* ptr, int ctrl)
|
|
236
270
|
ret = rb_obj_alloc(menu_klass);
|
237
271
|
name = rb_enc_str_new_cstr((const char*)info.name,
|
238
272
|
rb_utf8_encoding());
|
273
|
+
list = get_menu_list(ptr, ctrl, info.minimum, info.maximum);
|
239
274
|
|
240
275
|
rb_ivar_set(ret, id_iv_name, name);
|
241
276
|
rb_ivar_set(ret, id_iv_id, INT2NUM(info.id));
|
242
277
|
rb_ivar_set(ret, id_iv_default, INT2FIX(info.default_value));
|
243
|
-
rb_ivar_set(ret, id_iv_items,
|
244
|
-
get_menu_list(ptr, ctrl, info.minimum, info.maximum));
|
278
|
+
rb_ivar_set(ret, id_iv_items, list);
|
245
279
|
break;
|
246
280
|
|
247
281
|
case V4L2_CTRL_TYPE_INTEGER_MENU:
|
248
282
|
ret = rb_obj_alloc(menu_klass);
|
249
283
|
name = rb_enc_str_new_cstr((const char*)info.name,
|
250
284
|
rb_utf8_encoding());
|
285
|
+
list = get_int_menu_list(ptr, ctrl, info.minimum, info.maximum);
|
251
286
|
|
252
287
|
rb_ivar_set(ret, id_iv_name, name);
|
253
288
|
rb_ivar_set(ret, id_iv_id, INT2NUM(info.id));
|
254
289
|
rb_ivar_set(ret, id_iv_default, INT2FIX(info.default_value));
|
255
|
-
rb_ivar_set(ret, id_iv_items,
|
256
|
-
get_int_menu_list(ptr, ctrl, info.minimum, info.maximum));
|
290
|
+
rb_ivar_set(ret, id_iv_items, list);
|
257
291
|
break;
|
258
292
|
|
259
293
|
default:
|
@@ -274,7 +308,7 @@ rb_camera_get_controls(VALUE self)
|
|
274
308
|
int i;
|
275
309
|
VALUE info;
|
276
310
|
|
277
|
-
|
311
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
278
312
|
|
279
313
|
ret = rb_ary_new();
|
280
314
|
|
@@ -350,29 +384,35 @@ static uint32_t
|
|
350
384
|
to_pixfmt(VALUE fmt)
|
351
385
|
{
|
352
386
|
uint32_t ret;
|
353
|
-
ID sym;
|
354
|
-
|
355
|
-
sym = rb_to_id(fmt);
|
356
387
|
|
357
|
-
if (
|
388
|
+
if (EQ_STR(fmt, "YUYV") || EQ_STR(fmt, "YUV422")) {
|
358
389
|
ret = V4L2_PIX_FMT_YUYV;
|
359
390
|
|
360
|
-
} else if (
|
391
|
+
} else if (EQ_STR(fmt, "NV12")) {
|
361
392
|
ret = V4L2_PIX_FMT_NV12;
|
362
393
|
|
363
|
-
} else if (
|
394
|
+
} else if (EQ_STR(fmt, "NV21")) {
|
364
395
|
ret = V4L2_PIX_FMT_NV21;
|
365
396
|
|
366
|
-
} else if (
|
397
|
+
} else if (EQ_STR(fmt, "NV16")) {
|
367
398
|
ret = V4L2_PIX_FMT_NV16;
|
368
399
|
|
369
|
-
} else if (
|
400
|
+
} else if (EQ_STR(fmt, "YUV420") || EQ_STR(fmt, "YU12")) {
|
401
|
+
ret = V4L2_PIX_FMT_YUV420;
|
402
|
+
|
403
|
+
} else if (EQ_STR(fmt, "YVU420") || EQ_STR(fmt, "YV12")) {
|
404
|
+
ret = V4L2_PIX_FMT_YVU420;
|
405
|
+
|
406
|
+
} else if (EQ_STR(fmt, "NV16")) {
|
407
|
+
ret = V4L2_PIX_FMT_NV16;
|
408
|
+
|
409
|
+
} else if (EQ_STR(fmt, "RGB565") || EQ_STR(fmt, "RGBP")) {
|
370
410
|
ret = V4L2_PIX_FMT_RGB565;
|
371
411
|
|
372
|
-
} else if (
|
412
|
+
} else if (EQ_STR(fmt, "MJPEG") || EQ_STR(fmt, "MJPG")) {
|
373
413
|
ret = V4L2_PIX_FMT_MJPEG;
|
374
414
|
|
375
|
-
} else if (
|
415
|
+
} else if (EQ_STR(fmt, "H264")) {
|
376
416
|
ret = V4L2_PIX_FMT_H264;
|
377
417
|
|
378
418
|
} else {
|
@@ -396,7 +436,7 @@ rb_camera_get_support_formats(VALUE self)
|
|
396
436
|
VALUE fcc;
|
397
437
|
VALUE str;
|
398
438
|
|
399
|
-
|
439
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
400
440
|
|
401
441
|
ret = rb_ary_new();
|
402
442
|
|
@@ -501,9 +541,7 @@ rb_camera_get_frame_capabilities(VALUE self, VALUE _fmt)
|
|
501
541
|
VALUE list;
|
502
542
|
VALUE rate;
|
503
543
|
|
504
|
-
|
505
|
-
|
506
|
-
Data_Get_Struct(self, camera_t, ptr);
|
544
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
507
545
|
|
508
546
|
ret = rb_ary_new();
|
509
547
|
fmt = to_pixfmt(_fmt);
|
@@ -542,7 +580,7 @@ rb_camera_set_control(VALUE self, VALUE id, VALUE _val)
|
|
542
580
|
int err;
|
543
581
|
int val;
|
544
582
|
|
545
|
-
|
583
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
546
584
|
|
547
585
|
switch (TYPE(_val)) {
|
548
586
|
case T_TRUE:
|
@@ -576,7 +614,7 @@ rb_camera_get_control(VALUE self, VALUE id)
|
|
576
614
|
int err;
|
577
615
|
int32_t value;
|
578
616
|
|
579
|
-
|
617
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
580
618
|
|
581
619
|
err = camera_get_control(ptr, FIX2INT(id), &value);
|
582
620
|
if (err) {
|
@@ -592,15 +630,10 @@ rb_camera_set_format(VALUE self, VALUE fmt)
|
|
592
630
|
camera_t* ptr;
|
593
631
|
int err;
|
594
632
|
|
595
|
-
/*
|
596
|
-
* argument check
|
597
|
-
*/
|
598
|
-
Check_Type(fmt, T_SYMBOL);
|
599
|
-
|
600
633
|
/*
|
601
634
|
* strip object
|
602
635
|
*/
|
603
|
-
|
636
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
604
637
|
|
605
638
|
/*
|
606
639
|
* set parameter
|
@@ -623,7 +656,7 @@ rb_camera_get_image_width(VALUE self)
|
|
623
656
|
/*
|
624
657
|
* strip object
|
625
658
|
*/
|
626
|
-
|
659
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
627
660
|
|
628
661
|
/*
|
629
662
|
* get parameter
|
@@ -642,20 +675,15 @@ rb_camera_set_image_width(VALUE self, VALUE val)
|
|
642
675
|
camera_t* ptr;
|
643
676
|
int err;
|
644
677
|
|
645
|
-
/*
|
646
|
-
* argument check
|
647
|
-
*/
|
648
|
-
Check_Type(val, T_FIXNUM);
|
649
|
-
|
650
678
|
/*
|
651
679
|
* strip object
|
652
680
|
*/
|
653
|
-
|
681
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
654
682
|
|
655
683
|
/*
|
656
684
|
* set parameter
|
657
685
|
*/
|
658
|
-
err = camera_set_image_width(ptr,
|
686
|
+
err = camera_set_image_width(ptr, NUM2INT(val));
|
659
687
|
if (err) {
|
660
688
|
rb_raise(rb_eRuntimeError, "set image width failed.");
|
661
689
|
}
|
@@ -673,7 +701,7 @@ rb_camera_get_image_height(VALUE self)
|
|
673
701
|
/*
|
674
702
|
* strip object
|
675
703
|
*/
|
676
|
-
|
704
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
677
705
|
|
678
706
|
/*
|
679
707
|
* get parameter
|
@@ -692,20 +720,15 @@ rb_camera_set_image_height(VALUE self, VALUE val)
|
|
692
720
|
camera_t* ptr;
|
693
721
|
int err;
|
694
722
|
|
695
|
-
/*
|
696
|
-
* argument check
|
697
|
-
*/
|
698
|
-
Check_Type(val, T_FIXNUM);
|
699
|
-
|
700
723
|
/*
|
701
724
|
* strip object
|
702
725
|
*/
|
703
|
-
|
726
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
704
727
|
|
705
728
|
/*
|
706
729
|
* set parameter
|
707
730
|
*/
|
708
|
-
err = camera_set_image_height(ptr,
|
731
|
+
err = camera_set_image_height(ptr, NUM2INT(val));
|
709
732
|
if (err) {
|
710
733
|
rb_raise(rb_eRuntimeError, "set image height failed.");
|
711
734
|
}
|
@@ -716,7 +739,21 @@ rb_camera_set_image_height(VALUE self, VALUE val)
|
|
716
739
|
static VALUE
|
717
740
|
rb_camera_get_framerate(VALUE self)
|
718
741
|
{
|
719
|
-
|
742
|
+
VALUE ret;
|
743
|
+
camera_t* ptr;
|
744
|
+
|
745
|
+
/*
|
746
|
+
* strip object
|
747
|
+
*/
|
748
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
749
|
+
|
750
|
+
/*
|
751
|
+
* create return object
|
752
|
+
*/
|
753
|
+
ret = rb_rational_new(INT2FIX(ptr->framerate.num),
|
754
|
+
INT2FIX(ptr->framerate.denom));
|
755
|
+
|
756
|
+
return ret;
|
720
757
|
}
|
721
758
|
|
722
759
|
static VALUE
|
@@ -747,13 +784,13 @@ rb_camera_set_framerate(VALUE self, VALUE val)
|
|
747
784
|
break;
|
748
785
|
|
749
786
|
default:
|
750
|
-
rb_raise(
|
787
|
+
rb_raise(rb_eTypeError, "illeagal framerate value.");
|
751
788
|
}
|
752
789
|
|
753
790
|
/*
|
754
791
|
* strip object
|
755
792
|
*/
|
756
|
-
|
793
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
757
794
|
|
758
795
|
/*
|
759
796
|
* set framerate
|
@@ -775,7 +812,7 @@ rb_camera_state( VALUE self)
|
|
775
812
|
/*
|
776
813
|
* strip object
|
777
814
|
*/
|
778
|
-
|
815
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
779
816
|
|
780
817
|
/*
|
781
818
|
* convert state code
|
@@ -818,21 +855,31 @@ rb_camera_start(VALUE self)
|
|
818
855
|
{
|
819
856
|
int err;
|
820
857
|
camera_t* ptr;
|
858
|
+
int state;
|
821
859
|
|
822
860
|
/*
|
823
861
|
* strip object
|
824
862
|
*/
|
825
|
-
|
863
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
826
864
|
|
827
865
|
/*
|
828
|
-
*
|
866
|
+
* do start
|
829
867
|
*/
|
830
868
|
err = camera_start(ptr);
|
831
869
|
if (err) {
|
832
870
|
rb_raise(rb_eRuntimeError, "start capture failed.");
|
833
871
|
}
|
834
872
|
|
835
|
-
|
873
|
+
/*
|
874
|
+
*
|
875
|
+
*/
|
876
|
+
if (rb_block_given_p()) {
|
877
|
+
rb_protect(rb_yield, self, &state);
|
878
|
+
camera_stop(ptr);
|
879
|
+
if (state) rb_jump_tag(state);
|
880
|
+
}
|
881
|
+
|
882
|
+
return self;
|
836
883
|
}
|
837
884
|
|
838
885
|
static VALUE
|
@@ -844,7 +891,7 @@ rb_camera_stop(VALUE self)
|
|
844
891
|
/*
|
845
892
|
* strip object
|
846
893
|
*/
|
847
|
-
|
894
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
848
895
|
|
849
896
|
/*
|
850
897
|
* convert
|
@@ -854,7 +901,7 @@ rb_camera_stop(VALUE self)
|
|
854
901
|
rb_raise(rb_eRuntimeError, "stop capture failed.");
|
855
902
|
}
|
856
903
|
|
857
|
-
return
|
904
|
+
return self;
|
858
905
|
}
|
859
906
|
|
860
907
|
|
@@ -869,7 +916,7 @@ rb_camera_capture(VALUE self)
|
|
869
916
|
/*
|
870
917
|
* strip object
|
871
918
|
*/
|
872
|
-
|
919
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
873
920
|
|
874
921
|
/*
|
875
922
|
* allocate return value.
|
@@ -902,7 +949,7 @@ rb_camera_is_busy(VALUE self)
|
|
902
949
|
/*
|
903
950
|
* strip object
|
904
951
|
*/
|
905
|
-
|
952
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
906
953
|
|
907
954
|
/*
|
908
955
|
* do check
|
@@ -915,6 +962,29 @@ rb_camera_is_busy(VALUE self)
|
|
915
962
|
return (busy)? Qtrue: Qfalse;
|
916
963
|
}
|
917
964
|
|
965
|
+
static VALUE
|
966
|
+
rb_camera_is_ready(VALUE self)
|
967
|
+
{
|
968
|
+
camera_t* ptr;
|
969
|
+
int err;
|
970
|
+
int ready;
|
971
|
+
|
972
|
+
/*
|
973
|
+
* strip object
|
974
|
+
*/
|
975
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
976
|
+
|
977
|
+
/*
|
978
|
+
* do check
|
979
|
+
*/
|
980
|
+
err = camera_check_ready(ptr, &ready);
|
981
|
+
if (err) {
|
982
|
+
rb_raise(rb_eRuntimeError, "check failed.");
|
983
|
+
}
|
984
|
+
|
985
|
+
return (ready)? Qtrue: Qfalse;
|
986
|
+
}
|
987
|
+
|
918
988
|
static VALUE
|
919
989
|
rb_camera_is_error(VALUE self)
|
920
990
|
{
|
@@ -925,7 +995,7 @@ rb_camera_is_error(VALUE self)
|
|
925
995
|
/*
|
926
996
|
* strip object
|
927
997
|
*/
|
928
|
-
|
998
|
+
TypedData_Get_Struct(self, camera_t, &camera_data_type, ptr);
|
929
999
|
|
930
1000
|
/*
|
931
1001
|
* do check
|
@@ -941,6 +1011,10 @@ rb_camera_is_error(VALUE self)
|
|
941
1011
|
void
|
942
1012
|
Init_v4l2()
|
943
1013
|
{
|
1014
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
1015
|
+
rb_ext_ractor_safe(true);
|
1016
|
+
#endif /* defined(HAVE_RB_EXT_RACTOR_SAFE) */
|
1017
|
+
|
944
1018
|
rb_require("monitor");
|
945
1019
|
|
946
1020
|
module = rb_define_module("Video4Linux2");
|
@@ -968,6 +1042,7 @@ Init_v4l2()
|
|
968
1042
|
rb_define_method(camera_klass, "stop", rb_camera_stop, 0);
|
969
1043
|
rb_define_method(camera_klass, "capture", rb_camera_capture, 0);
|
970
1044
|
rb_define_method(camera_klass, "busy?", rb_camera_is_busy, 0);
|
1045
|
+
rb_define_method(camera_klass, "ready?", rb_camera_is_ready, 0);
|
971
1046
|
rb_define_method(camera_klass, "error?", rb_camera_is_error, 0);
|
972
1047
|
|
973
1048
|
rb_define_attr(camera_klass, "name", !0, 0);
|
@@ -980,7 +1055,6 @@ Init_v4l2()
|
|
980
1055
|
"Control", rb_cObject);
|
981
1056
|
rb_define_attr(control_klass, "name", !0, 0);
|
982
1057
|
rb_define_attr(control_klass, "id", !0, 0);
|
983
|
-
rb_define_attr(control_klass, "value", !0, 0);
|
984
1058
|
|
985
1059
|
integer_klass = rb_define_class_under(camera_klass,
|
986
1060
|
"IntegerControl", control_klass);
|
@@ -1014,14 +1088,6 @@ Init_v4l2()
|
|
1014
1088
|
rb_define_attr(fmt_desc_klass, "fcc", !0, 0);
|
1015
1089
|
rb_define_attr(fmt_desc_klass, "description", !0, 0);
|
1016
1090
|
|
1017
|
-
id_yuyv = rb_intern_const("YUYV");
|
1018
|
-
id_yuv422 = rb_intern_const("YUV422");
|
1019
|
-
id_nv12 = rb_intern_const("NV12");
|
1020
|
-
id_nv21 = rb_intern_const("NV21");
|
1021
|
-
id_nv16 = rb_intern_const("NV16");
|
1022
|
-
id_rgb565 = rb_intern_const("RGB565");
|
1023
|
-
id_mjpeg = rb_intern_const("MJPEG");
|
1024
|
-
id_h264 = rb_intern_const("H264");
|
1025
1091
|
id_iv_name = rb_intern_const("@name");
|
1026
1092
|
id_iv_driver = rb_intern_const("@driver");
|
1027
1093
|
id_iv_bus = rb_intern_const("@bus");
|
data/lib/v4l2/version.rb
CHANGED
data/pkg/.gitkeep
ADDED
File without changes
|