84 lines
2.0 KiB
C++
84 lines
2.0 KiB
C++
#ifndef _IMAGE_IPC_H_
|
|
#define _IMAGE_IPC_H_
|
|
#include <sys/mman.h>
|
|
#include <memory>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <sys/stat.h>
|
|
|
|
class ImageIPC
|
|
{
|
|
public:
|
|
static const int imagesize = 3*2700*1728;
|
|
static const int imagesizes= imagesize*3;
|
|
ImageIPC(){
|
|
int fd = -1;
|
|
p = (unsigned char*)MAP_FAILED;
|
|
/* 打开文件 */
|
|
if ((fd = open ("/data/camera/data", O_RDWR | O_CREAT , 0666)) < 0) {
|
|
perror ("open");
|
|
}
|
|
|
|
struct stat sb;
|
|
/* 获取文件的属性 */
|
|
if ((fstat (fd, &sb)) == -1) {
|
|
perror ("fstat");
|
|
}
|
|
|
|
if(sb.st_size < imagesizes + sizeof(int)){
|
|
void* buf = malloc(imagesizes + sizeof(int));
|
|
::write(fd ,buf, imagesizes + sizeof(int));
|
|
free(buf);
|
|
}
|
|
|
|
|
|
/* 将文件映射至进程的地址空间 */
|
|
if ((p = (unsigned char *) mmap (NULL, imagesizes + sizeof(int),
|
|
PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {
|
|
perror ("mmap");
|
|
}
|
|
|
|
if(p != MAP_FAILED){
|
|
ixImage = (int*)p;
|
|
// *ixImage = 0;
|
|
data = p+sizeof(int);
|
|
// memset(data, 255, imagesize);
|
|
}
|
|
/* 映射完后, 关闭文件也可以操纵内存 */
|
|
close (fd);
|
|
}
|
|
|
|
~ImageIPC(){
|
|
if(p != MAP_FAILED){
|
|
munmap(p,imagesizes);
|
|
}
|
|
}
|
|
|
|
void write(void* src, int size){
|
|
if(p != MAP_FAILED) {
|
|
memcpy(data + imagesize*(index()%3), src, imagesize);
|
|
index()++;
|
|
}
|
|
}
|
|
|
|
void* getBuf(int ix){
|
|
return data + (ix%3) * imagesize;
|
|
}
|
|
|
|
void read(void* dst, int size, int index){
|
|
if(p != MAP_FAILED){
|
|
memcpy(dst, data + (index%3)*imagesize, imagesize);
|
|
}
|
|
}
|
|
|
|
int& index() {
|
|
return *ixImage;
|
|
}
|
|
|
|
protected:
|
|
int* ixImage;
|
|
unsigned char *p;
|
|
unsigned char *data;
|
|
};
|
|
|
|
#endif |