v4l2-ruby 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|