root / trunk / code / projects / colonet / server / vision / shmimgserve.cpp @ 939
History | View | Annotate | Download (1.79 KB)
1 |
#include "shmimgserve.h" |
---|---|
2 |
|
3 |
#include <stdio.h> |
4 |
#include <string.h> |
5 |
#include <stdlib.h> |
6 |
|
7 |
#include <errno.h> |
8 |
|
9 |
#include <sys/types.h> |
10 |
#include <sys/shm.h> |
11 |
|
12 |
#include "php_sysvsem.h" |
13 |
|
14 |
#define DEBUG 0 |
15 |
|
16 |
#if DEBUG
|
17 |
#define dbg_printf(...) printf(__VA_ARGS__)
|
18 |
#else
|
19 |
#define dbg_printf(...)
|
20 |
#endif
|
21 |
|
22 |
int write_JPEG_to_mem (unsigned char *storage, int length, IplImage *_img, int quality); |
23 |
|
24 |
static sysvsem *sem;
|
25 |
static int shm_id; |
26 |
|
27 |
int sendImage(IplImage *image)
|
28 |
{ |
29 |
dbg_printf("Send image\n");
|
30 |
|
31 |
if (sem->sem_acquire())
|
32 |
{ |
33 |
dbg_printf("Semaphore acquired\n");
|
34 |
|
35 |
unsigned char *p = (unsigned char *)shmat(shm_id, NULL, 0); |
36 |
if (p!=(void *)-1) |
37 |
{ |
38 |
dbg_printf("Memory mapped at %p\n", p);
|
39 |
|
40 |
int len = write_JPEG_to_mem (p+4, 150000-4, image, JPEG_QUALITY); |
41 |
|
42 |
int i;
|
43 |
int length = len;
|
44 |
dbg_printf("%d\n", length);
|
45 |
for(i=0; i < 4; i++) |
46 |
{ |
47 |
char digit = (char)(length & 0xff); |
48 |
length >>= 8;
|
49 |
memcpy(p+i, &digit, sizeof(char)); |
50 |
} |
51 |
|
52 |
dbg_printf("Memory copied\n");
|
53 |
|
54 |
sem->sem_release(); |
55 |
dbg_printf("Semaphore released\n");
|
56 |
|
57 |
shmdt(p); |
58 |
dbg_printf("Memory detached\n");
|
59 |
} |
60 |
} |
61 |
|
62 |
if (errno!=0) |
63 |
{ |
64 |
int errnum = errno;
|
65 |
errno = 0;
|
66 |
|
67 |
fprintf(stderr, "error %d %s\n", errnum, strerror(errnum));
|
68 |
return errnum;
|
69 |
} |
70 |
|
71 |
return 0; |
72 |
} |
73 |
|
74 |
int openShM()
|
75 |
{ |
76 |
shm_id = shmget(0x40305163, 150000, IPC_CREAT | 0666); |
77 |
if (shm_id > 0) |
78 |
dbg_printf("Shared memory opened\n");
|
79 |
else
|
80 |
{ |
81 |
fprintf(stderr, "Error opening shared memory\n");
|
82 |
return -1; |
83 |
} |
84 |
|
85 |
sem = new (std::nothrow)sysvsem(0x40309999); |
86 |
if (sem)
|
87 |
dbg_printf("Semaphore opened\n");
|
88 |
else
|
89 |
{ |
90 |
fprintf(stderr, "Error opening semaphore\n");
|
91 |
return -2; |
92 |
} |
93 |
} |
94 |
|
95 |
void releaseShM()
|
96 |
{ |
97 |
sem->sem_remove(); |
98 |
delete sem;
|
99 |
dbg_printf("Semaphore deleted\n");
|
100 |
|
101 |
shmctl(shm_id, IPC_RMID, NULL);
|
102 |
dbg_printf("Memory marked for deletion\n");
|
103 |
} |