回答編集履歴
8
コード修正
answer
CHANGED
@@ -23,8 +23,8 @@
|
|
23
23
|
LOGD("%s", tmp);
|
24
24
|
|
25
25
|
char filename[32];
|
26
|
-
|
26
|
+
double temp_ms = 1000 * buffer.timestamp.tv_sec + (buffer.timestamp.tv_usec / 1000.0); //★追加
|
27
|
-
sprintf(filename, "./%05d_%
|
27
|
+
sprintf(filename, "./%05d_%.2f.raw", count++, temp_ms); //★ファイル名に時間を追加
|
28
28
|
//sprintf(filename, "/sdcard/%05d.raw", count++);
|
29
29
|
//sprintf(filename, "./%05d.raw", count++); //★コメント化
|
30
30
|
//sprintf(filename, "./%05d.raw", count);
|
@@ -44,7 +44,6 @@
|
|
44
44
|
buffer->memory = V4L2_MEMORY_MMAP; //★
|
45
45
|
buffer->index = BUFFER_COUNT; //★
|
46
46
|
ret = ioctl(cam_fd, VIDIOC_DQBUF, buffer); //★
|
47
|
-
clock_gettime(CLOCK_REALTIME, (struct timespec *)&buffer->timestamp); //☆
|
48
47
|
if (ret != 0)
|
49
48
|
{
|
50
49
|
DBG("ioctl(VIDIOC_DQBUF) failed %d(%s)", errno, strerror(errno));
|
@@ -62,6 +61,8 @@
|
|
62
61
|
DBG("copy done.");
|
63
62
|
|
64
63
|
ret = ioctl(cam_fd, VIDIOC_QBUF, buffer); //★
|
64
|
+
clock_gettime(CLOCK_REALTIME, (struct timespec *)&buffer->timestamp); //☆
|
65
|
+
buffer->timestamp.tv_usec /= 1000; //ナノ->マイクロ補正
|
65
66
|
if (ret != 0)
|
66
67
|
{
|
67
68
|
DBG("ioctl(VIDIOC_QBUF) failed %d(%s)", errno, strerror(errno));
|
7
コード修正
answer
CHANGED
@@ -43,8 +43,8 @@
|
|
43
43
|
buffer->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //★
|
44
44
|
buffer->memory = V4L2_MEMORY_MMAP; //★
|
45
45
|
buffer->index = BUFFER_COUNT; //★
|
46
|
-
ret = ioctl(cam_fd, VIDIOC_DQBUF, buffer);
|
46
|
+
ret = ioctl(cam_fd, VIDIOC_DQBUF, buffer); //★
|
47
|
-
clock_gettime(CLOCK_REALTIME, &buffer->timestamp); //☆
|
47
|
+
clock_gettime(CLOCK_REALTIME, (struct timespec *)&buffer->timestamp); //☆
|
48
48
|
if (ret != 0)
|
49
49
|
{
|
50
50
|
DBG("ioctl(VIDIOC_DQBUF) failed %d(%s)", errno, strerror(errno));
|
@@ -58,10 +58,10 @@
|
|
58
58
|
}
|
59
59
|
|
60
60
|
DBG("dequeue done, index: %d", buffer->index); //★
|
61
|
-
memcpy(out_buffer, video_buffer_ptr[buffer->index], IMAGE_SIZE);
|
61
|
+
memcpy(out_buffer, video_buffer_ptr[buffer->index], IMAGE_SIZE); //★
|
62
62
|
DBG("copy done.");
|
63
63
|
|
64
|
-
ret = ioctl(cam_fd, VIDIOC_QBUF, buffer);
|
64
|
+
ret = ioctl(cam_fd, VIDIOC_QBUF, buffer); //★
|
65
65
|
if (ret != 0)
|
66
66
|
{
|
67
67
|
DBG("ioctl(VIDIOC_QBUF) failed %d(%s)", errno, strerror(errno));
|
6
clock_gettime 追加
answer
CHANGED
@@ -44,6 +44,7 @@
|
|
44
44
|
buffer->memory = V4L2_MEMORY_MMAP; //★
|
45
45
|
buffer->index = BUFFER_COUNT; //★
|
46
46
|
ret = ioctl(cam_fd, VIDIOC_DQBUF, buffer);//从?列中取出一? //★
|
47
|
+
clock_gettime(CLOCK_REALTIME, &buffer->timestamp); //☆
|
47
48
|
if (ret != 0)
|
48
49
|
{
|
49
50
|
DBG("ioctl(VIDIOC_DQBUF) failed %d(%s)", errno, strerror(errno));
|
5
バグ修正
answer
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
char filename[32];
|
26
26
|
long temp_ms = 1000 * buffer.timestamp.tv_sec + (long) round(buffer.timestamp.tv_usec / 1000.0); //★追加
|
27
|
-
sprintf(filename, "./%05d_%
|
27
|
+
sprintf(filename, "./%05d_%ld.raw", count++, temp_ms); //★ファイル名に時間を追加
|
28
28
|
//sprintf(filename, "/sdcard/%05d.raw", count++);
|
29
29
|
//sprintf(filename, "./%05d.raw", count++); //★コメント化
|
30
30
|
//sprintf(filename, "./%05d.raw", count);
|
4
コードインデント修正
answer
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
int count = 0;
|
13
13
|
for(j=0;j<optcapcnt;j++)
|
14
14
|
{
|
15
|
-
|
15
|
+
struct v4l2_buffer buffer; //★追加
|
16
16
|
ret = cam_get_image(buf, IMAGE_SIZE, &buffer); //★パラメータ追加
|
17
17
|
//ret = cam_get_image(buf, IMAGE_SIZE);
|
18
18
|
ASSERT(ret==0);
|
3
修正例コード追加
answer
CHANGED
@@ -1,1 +1,73 @@
|
|
1
|
-
cam_get_image のローカルで用意している struct v4l2_buffer buffer を外から渡すようにして、そのタイムスタンプをファイル名を作っている sprintf で使うと良さそうですね。
|
1
|
+
cam_get_image のローカルで用意している struct v4l2_buffer buffer を外から渡すようにして、そのタイムスタンプをファイル名を作っている sprintf で使うと良さそうですね。
|
2
|
+
|
3
|
+
----
|
4
|
+
以下のような感じです。
|
5
|
+
|
6
|
+
※コンパイルもしていません!!
|
7
|
+
|
8
|
+
main 書き換え(cam_get_image に struct v4l2_buffer をパラメータとして渡し、中の情報でファイル名を構成する)
|
9
|
+
```c
|
10
|
+
(略)
|
11
|
+
while (1) {
|
12
|
+
int count = 0;
|
13
|
+
for(j=0;j<optcapcnt;j++)
|
14
|
+
{
|
15
|
+
struct v4l2_buffer buffer; //★追加
|
16
|
+
ret = cam_get_image(buf, IMAGE_SIZE, &buffer); //★パラメータ追加
|
17
|
+
//ret = cam_get_image(buf, IMAGE_SIZE);
|
18
|
+
ASSERT(ret==0);
|
19
|
+
|
20
|
+
char tmp[64] = {"---\n"};
|
21
|
+
for (i=0; i<16; i++)
|
22
|
+
sprintf(&tmp[strlen(tmp)], "%02x ", buf[i]);
|
23
|
+
LOGD("%s", tmp);
|
24
|
+
|
25
|
+
char filename[32];
|
26
|
+
long temp_ms = 1000 * buffer.timestamp.tv_sec + (long) round(buffer.timestamp.tv_usec / 1000.0); //★追加
|
27
|
+
sprintf(filename, "./%05d_%g.raw", count++, temp_ms); //★ファイル名に時間を追加
|
28
|
+
//sprintf(filename, "/sdcard/%05d.raw", count++);
|
29
|
+
//sprintf(filename, "./%05d.raw", count++); //★コメント化
|
30
|
+
//sprintf(filename, "./%05d.raw", count);
|
31
|
+
int fd = open(filename,O_WRONLY|O_CREAT,00700);//保存?像数据
|
32
|
+
(略)
|
33
|
+
```
|
34
|
+
cam_get_image 書き換え(struct v4l2_buffer をパラメータとして受け取る)
|
35
|
+
```c
|
36
|
+
//int cam_get_image(u8* out_buffer, int out_buffer_size)
|
37
|
+
int cam_get_image(u8* out_buffer, int out_buffer_size, struct v4l2_buffer *buffer) //★
|
38
|
+
{
|
39
|
+
int ret;
|
40
|
+
//struct v4l2_buffer buffer; //★
|
41
|
+
|
42
|
+
memset(buffer, 0, sizeof(struct v4l2_buffer)); //★
|
43
|
+
buffer->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //★
|
44
|
+
buffer->memory = V4L2_MEMORY_MMAP; //★
|
45
|
+
buffer->index = BUFFER_COUNT; //★
|
46
|
+
ret = ioctl(cam_fd, VIDIOC_DQBUF, buffer);//从?列中取出一? //★
|
47
|
+
if (ret != 0)
|
48
|
+
{
|
49
|
+
DBG("ioctl(VIDIOC_DQBUF) failed %d(%s)", errno, strerror(errno));
|
50
|
+
return ret;
|
51
|
+
}
|
52
|
+
|
53
|
+
if (buffer->index < 0 || buffer->index >= BUFFER_COUNT) //★
|
54
|
+
{
|
55
|
+
DBG("invalid buffer index: %d", buffer->index); //★
|
56
|
+
return ret;
|
57
|
+
}
|
58
|
+
|
59
|
+
DBG("dequeue done, index: %d", buffer->index); //★
|
60
|
+
memcpy(out_buffer, video_buffer_ptr[buffer->index], IMAGE_SIZE);//?冲?数据拷?出来 //★
|
61
|
+
DBG("copy done.");
|
62
|
+
|
63
|
+
ret = ioctl(cam_fd, VIDIOC_QBUF, buffer);//?冲?放入?列 //★
|
64
|
+
if (ret != 0)
|
65
|
+
{
|
66
|
+
DBG("ioctl(VIDIOC_QBUF) failed %d(%s)", errno, strerror(errno));
|
67
|
+
return ret;
|
68
|
+
}
|
69
|
+
DBG("enqueue done.");
|
70
|
+
|
71
|
+
return 0;
|
72
|
+
}
|
73
|
+
```
|
2
修正
answer
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
cam_get_image のローカルで用意している buffer を外から渡すようにして、そのタイムスタンプをファイル名を作っている sprintf で使うと良さそうですね。
|
1
|
+
cam_get_image のローカルで用意している struct v4l2_buffer buffer を外から渡すようにして、そのタイムスタンプをファイル名を作っている sprintf で使うと良さそうですね。
|
1
回答のコメントにするつもりが間違えたので修正
answer
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
cam_get_image のローカルで用意している buffer を外から渡すようにして、そのタイムスタンプをファイル名を作っている sprintf で使うと良さそうですね。
|