如何使用iotcl VIDIOC_EXPBUF中的dmafd和sendfile?

时间:2017-05-29 06:30:37

标签: linux v4l2 sendfile

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 */

失败

0 个答案:

没有答案