Skip to content

Commit 8098819

Browse files
committed
Merge branch 'icam_app-communication'
* icam_app-communication: iCamera_appの負荷が高いときに、get_jpegの応答が遅れてget_jpeg.cgiのプロセスが大量に残ることがある問題の対応 複数のコマンド処理を並行してできるように修正
2 parents a701015 + 6546a99 commit 8098819

File tree

4 files changed

+77
-79
lines changed

4 files changed

+77
-79
lines changed

configs/overlay_rootfs/var/www/cgi-bin/get_jpeg.cgi

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#!/bin/sh
22

33
res=`/scripts/cmd jpeg`
4-
[ "$res" = "error" ] && exit 1
54

65
echo "Cache-Control: no-cache"
76
echo "Content-Type: image/jpeg"

libcallback/audio_callback.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ struct frames_st {
1515
};
1616
typedef int (* framecb)(struct frames_st *);
1717

18-
extern int audio_enable;
18+
extern int AudioCaptureEnable;
1919

2020
static uint32_t (*real_local_sdk_audio_set_pcm_frame_callback)(int ch, void *callback);
2121
static void *audio_pcm_cb = NULL;
@@ -54,7 +54,7 @@ static uint32_t audio_pcm_capture(struct frames_st *frames) {
5454
}
5555
}
5656

57-
if(pcm && audio_enable) {
57+
if(pcm && AudioCaptureEnable) {
5858
int avail = pcm_mmap_avail(pcm);
5959
int delay = pcm_get_delay(pcm);
6060
int ready = pcm_is_ready(pcm);

libcallback/command.c

+68-69
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,35 @@
1111
#include <netdb.h>
1212
#include <errno.h>
1313

14-
static const unsigned short commandPort = 4000;
14+
static const unsigned short CommandPort = 4000;
1515

16-
int video_enable = 0;
17-
int audio_enable = 0;
18-
int jpeg_capture = 0;
19-
static int SelfPipe[2];
20-
21-
static char *token_ptr;
16+
int VideoCaptureEnable = 0;
17+
int AudioCaptureEnable = 0;
18+
int JpegCaptureTriggler = 0;
2219

23-
struct commandTableSt {
24-
const char *cmd;
25-
char * (*func)(int);
26-
};
20+
static int SelfPipe[2];
21+
static char *TokenPtr;
2722

28-
void commandResponse(int fd, const char *res) {
23+
void CommandResponse(int fd, const char *res) {
2924

3025
unsigned char buf[256];
31-
buf[0] = fd;
32-
strcpy((char *)buf + 1, res);
33-
write(SelfPipe[1], &buf, strlen(res) + 2);
26+
buf[0] = strlen(res) + 1;
27+
buf[1] = fd;
28+
strncpy((char *)buf + 2, res, 253);
29+
write(SelfPipe[1], &buf, buf[0] + 2);
3430
}
3531

3632
char *VideoCapture(int fd) {
3733

38-
char *p = strtok_r(NULL, " \t\r\n", &token_ptr);
34+
char *p = strtok_r(NULL, " \t\r\n", &TokenPtr);
3935
if(!p) return "error";
4036
if(!strcmp(p, "on")) {
41-
video_enable = 1;
37+
VideoCaptureEnable = 1;
4238
fprintf(stderr, "[command] video capute on\n", p);
4339
return "ok";
4440
}
4541
if(!strcmp(p, "off")) {
46-
video_enable = 0;
42+
VideoCaptureEnable = 0;
4743
fprintf(stderr, "[command] video capute off\n", p);
4844
return "ok";
4945
}
@@ -52,15 +48,15 @@ char *VideoCapture(int fd) {
5248

5349
char *AudioCapture(int fd) {
5450

55-
char *p = strtok_r(NULL, " \t\r\n", &token_ptr);
51+
char *p = strtok_r(NULL, " \t\r\n", &TokenPtr);
5652
if(!p) return "error";
5753
if(!strcmp(p, "on")) {
58-
audio_enable = 1;
54+
AudioCaptureEnable = 1;
5955
fprintf(stderr, "[command] audio capute on\n", p);
6056
return "ok";
6157
}
6258
if(!strcmp(p, "off")) {
63-
audio_enable = 0;
59+
AudioCaptureEnable = 0;
6460
fprintf(stderr, "[command] audio capute off\n", p);
6561
return "ok";
6662
}
@@ -69,23 +65,30 @@ char *AudioCapture(int fd) {
6965

7066
char *JpegCapture(int fd) {
7167

72-
if(jpeg_capture) commandResponse(jpeg_capture, "error");
73-
jpeg_capture = fd;
68+
if(JpegCaptureTriggler) {
69+
fprintf(stderr, "[command] jpeg error %d\n", JpegCaptureTriggler);
70+
CommandResponse(JpegCaptureTriggler, "error");
71+
}
72+
JpegCaptureTriggler = fd;
7473
return NULL;
7574
}
7675

77-
struct commandTableSt commandTable[] = {
76+
struct CommandTableSt {
77+
const char *cmd;
78+
char * (*func)(int);
79+
};
80+
81+
struct CommandTableSt CommandTable[] = {
7882
{ "video", &VideoCapture },
7983
{ "audio", &AudioCapture },
8084
{ "jpeg", &JpegCapture },
8185
};
8286

83-
static void *command_thread(void *arg) {
87+
static void *CommandThread(void *arg) {
8488

8589
static const int MaxConnect = 255;
86-
int MaxFd = 0;
87-
int PortTable[MaxConnect];
88-
fd_set TargetFd;
90+
int maxFd = 0;
91+
fd_set targetFd;
8992

9093
int listenSocket = socket(AF_INET, SOCK_STREAM, 0);
9194
if(listenSocket < 0) {
@@ -102,7 +105,7 @@ static void *command_thread(void *arg) {
102105

103106
struct sockaddr_in saddr;
104107
saddr.sin_family = AF_INET;
105-
saddr.sin_port = htons(commandPort);
108+
saddr.sin_port = htons(CommandPort);
106109
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
107110
if(bind(listenSocket, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
108111
fprintf(stderr, "bind : %s\n", strerror(errno));
@@ -116,36 +119,36 @@ static void *command_thread(void *arg) {
116119
return NULL;
117120
}
118121

119-
FD_ZERO(&TargetFd);
120-
for(int i = 0; i < MaxConnect; i++) {
121-
PortTable[i] = 0;
122-
}
123-
124-
PortTable[listenSocket] = 0;
125-
FD_SET(listenSocket, &TargetFd);
126-
MaxFd = listenSocket;
127-
FD_SET(SelfPipe[0], &TargetFd);
128-
MaxFd = (SelfPipe[0] > MaxFd) ? SelfPipe[0] : MaxFd;
129-
if(MaxFd >= MaxConnect) MaxFd = MaxConnect - 1;
122+
FD_ZERO(&targetFd);
123+
FD_SET(listenSocket, &targetFd);
124+
maxFd = listenSocket;
125+
FD_SET(SelfPipe[0], &targetFd);
126+
maxFd = (SelfPipe[0] > maxFd) ? SelfPipe[0] : maxFd;
127+
if(maxFd >= MaxConnect) maxFd = MaxConnect - 1;
130128

131129
while(1) {
132130
fd_set checkFDs;
133-
memcpy(&checkFDs, &TargetFd, sizeof(TargetFd));
134-
if(select(MaxFd + 1, &checkFDs, NULL, NULL, NULL) == -1) {
131+
memcpy(&checkFDs, &targetFd, sizeof(targetFd));
132+
if(select(maxFd + 1, &checkFDs, NULL, NULL, NULL) == -1) {
135133
fprintf(stderr, "select error : %s\n", strerror(errno));
136134
} else {
137-
for(int fd = MaxFd; fd >= 0; fd--) {
135+
for(int fd = maxFd; fd >= 0; fd--) {
138136
if(FD_ISSET(fd, &checkFDs)) {
139137
if(fd == SelfPipe[0]) {
140-
unsigned char buf[256];
141-
read(SelfPipe[0], buf, 256);
142-
int resFd = buf[0];
143-
char *res = (char *)buf + 1;
144-
strcat(res, "\n");
145-
send(resFd, res, strlen(res) + 1, 0);
146-
close(resFd);
147-
FD_CLR(resFd, &TargetFd);
148-
PortTable[resFd] = 0;
138+
while(1) {
139+
unsigned char buf[256];
140+
int length = read(SelfPipe[0], buf, 2);
141+
if(length <= 1) break;
142+
int resSize = buf[0];
143+
int resFd = buf[1];
144+
length = read(SelfPipe[0], buf, resSize);
145+
if(length < resSize) break;
146+
char *res = (char *)buf;
147+
strcat(res, "\n");
148+
send(resFd, res, strlen(res) + 1, 0);
149+
close(resFd);
150+
FD_CLR(resFd, &targetFd);
151+
}
149152
} else if(fd == listenSocket) {
150153
struct sockaddr_in dstAddr;
151154
int len = sizeof(dstAddr);
@@ -161,35 +164,32 @@ static void *command_thread(void *arg) {
161164
}
162165
int flag = fcntl(newSocket, F_GETFL, 0);
163166
fcntl(newSocket, F_SETFL, O_NONBLOCK|flag);
164-
PortTable[newSocket] = 1;
165-
FD_SET(newSocket, &TargetFd);
166-
MaxFd = (newSocket > MaxFd) ? newSocket : MaxFd;
167-
if(MaxFd >= MaxConnect) MaxFd = MaxConnect - 1;
168-
} else if(PortTable[fd] > 0) {
167+
FD_SET(newSocket, &targetFd);
168+
maxFd = (newSocket > maxFd) ? newSocket : maxFd;
169+
if(maxFd >= MaxConnect) maxFd = MaxConnect - 1;
170+
} else {
169171
char buf[256];
170172
int size = recv(fd, buf, 255, 0);
171173
if(!size) {
172-
FD_CLR(fd, &TargetFd);
174+
FD_CLR(fd, &targetFd);
173175
break;
174176
}
175177
if(size < 0) {
176178
close(fd);
177-
FD_CLR(fd, &TargetFd);
178-
PortTable[fd] = 0;
179+
FD_CLR(fd, &targetFd);
179180
break;
180181
}
181182
buf[size] = 0;
182-
char *p = strtok_r(buf, " \t\r\n", &token_ptr);
183+
char *p = strtok_r(buf, " \t\r\n", &TokenPtr);
183184
if(!p) continue;
184185
int executed = 0;
185-
for(int i = 0; i < sizeof(commandTable) / sizeof(struct commandTableSt); i++) {
186-
if(!strcmp(p, commandTable[i].cmd)) {
187-
char *res = (*commandTable[i].func)(fd);
186+
for(int i = 0; i < sizeof(CommandTable) / sizeof(struct CommandTableSt); i++) {
187+
if(!strcmp(p, CommandTable[i].cmd)) {
188+
char *res = (*CommandTable[i].func)(fd);
188189
if(res) {
189190
send(fd, res, strlen(res) + 1, 0);
190191
close(fd);
191-
FD_CLR(fd, &TargetFd);
192-
PortTable[fd] = 0;
192+
FD_CLR(fd, &targetFd);
193193
}
194194
executed = 1;
195195
break;
@@ -199,8 +199,7 @@ static void *command_thread(void *arg) {
199199
char *res = "error";
200200
send(fd, res, strlen(res) + 1, 0);
201201
close(fd);
202-
FD_CLR(fd, &TargetFd);
203-
PortTable[fd] = 0;
202+
FD_CLR(fd, &targetFd);
204203
fprintf(stderr, "command error : %s\n", p);
205204
}
206205
}
@@ -222,5 +221,5 @@ static void __attribute ((constructor)) command_init(void) {
222221
fcntl(SelfPipe[1], F_SETFL, O_NONBLOCK|flag);
223222

224223
pthread_t thread;
225-
pthread_create(&thread, NULL, command_thread, NULL);
224+
pthread_create(&thread, NULL, CommandThread, NULL);
226225
}

libcallback/video_callback.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
#include <sys/time.h>
1111
#include <pthread.h>
1212

13-
extern int video_enable;
14-
extern int jpeg_capture;
13+
extern int VideoCaptureEnable;
14+
extern int JpegCaptureTriggler;
1515
extern void local_sdk_video_get_jpeg(int, char *);
16-
extern void commandResponse(int fd, const char *res);
16+
extern void CommandResponse(int fd, const char *res);
1717

1818
struct frames_st {
1919
void *buf;
@@ -56,13 +56,13 @@ static uint32_t video_encode_capture(struct frames_st *frames) {
5656
if(err < 0) fprintf(stderr,"Unable to perform VIDIOC_STREAMON: %d\n", err);
5757
}
5858

59-
if(jpeg_capture) {
59+
if(JpegCaptureTriggler) {
6060
local_sdk_video_get_jpeg(0, "/tmp/snapshot.jpg");
61-
commandResponse(jpeg_capture, "ok");
62-
jpeg_capture = 0;
61+
CommandResponse(JpegCaptureTriggler, "ok");
62+
JpegCaptureTriggler = 0;
6363
}
6464

65-
if( (v4l2Fd >= 0) && video_enable) {
65+
if( (v4l2Fd >= 0) && VideoCaptureEnable) {
6666
uint32_t *buf = frames->buf;
6767
int size = write(v4l2Fd, frames->buf, frames->length);
6868
if(size != frames->length) fprintf(stderr,"Stream write error: %s\n", ret);

0 commit comments

Comments
 (0)