ioctl VIDIOC_EXPBUF
将dma内存导出为文件描述符。我希望使用sendfile
通过网络传输这些内存(因为它与send()
或write()
相比真的很快。)
但是sendfile()
对这些filedescriptor不起作用。 sendfile()返回错误-1,Errno是:非法搜索。
如何使这个工作?
int buffer_export(int *vfd, int index, int *dmafd)
{
struct v4l2_exportbuffer expbuf;
memset(&expbuf, 0, sizeof(expbuf));
expbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
expbuf.index = index;
if (ioctl(*vfd, VIDIOC_EXPBUF, &expbuf) == -1) {
perror("VIDIOC_EXPBUF");
return -1;
}
*dmafd = expbuf.fd;
return 0;
}
这里是转移代码。
int *vfd;
//Capture Image
int dmafd, err, bytes_send;
int frame_size = 721920;
off_t offset = 0;
err = buffer_export( vfd, 0, &dmafd);
// returns 0
err = sendfile(socket_fd, dmafd ,&offset, frame_size);
//returns with -1
更新
浏览sendfile源我遇到错误时检查输入fd。
retval = -ESPIPE; //=-29
if( !(in.file->f_mode & FMODE_PREAD) )
goto in_fd; //error
f_mode=5;
/* file is open for reading */
#define FMODE_READ ((__force fmode_t)0x1)
/* file is open for writing */
#define FMODE_WRITE ((__force fmode_t)0x2)
/* file is seekable */
#define FMODE_LSEEK ((__force fmode_t)0x4)
/* file can be accessed using pread */
#define FMODE_PREAD ((__force fmode_t)0x8)
/* file can be accessed using pwrite */
失败