zynq_7010/imageipc.h

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