3.2.18. ioctl DMX_EXPBUF

3.2.18.1. 名称

DMX_EXPBUF - 将缓冲区导出为 DMABUF 文件描述符。

警告

此 API 仍处于实验阶段

3.2.18.2. 概要

DMX_EXPBUF

int ioctl(int fd, DMX_EXPBUF, struct dmx_exportbuffer *argp)

3.2.18.3. 参数

fd

open() 返回的文件描述符。

argp

指向结构体 dmx_exportbuffer 的指针。

3.2.18.4. 描述

此 ioctl 是内存映射 I/O 方法的扩展。它可以在使用 ioctl DMX_REQBUFS ioctl 分配缓冲区之后的任何时间使用,将缓冲区导出为 DMABUF 文件。

要导出缓冲区,应用程序需要填充结构体 dmx_exportbuffer。应用程序必须设置 index 字段。有效的索引号范围从零到使用 ioctl DMX_REQBUFS 分配的缓冲区数量(结构体 dmx_requestbuffers count)减一。其他标志可以发布在 flags 字段中。有关详细信息,请参阅 open() 的手册。目前仅支持 O_CLOEXEC、O_RDONLY、O_WRONLY 和 O_RDWR。所有其他字段必须设置为零。对于多平面 API,每个平面都使用多次 ioctl DMX_EXPBUF 调用单独导出。

在调用 ioctl DMX_EXPBUF 之后,驱动程序会在成功时设置 fd 字段。这是一个 DMABUF 文件描述符。应用程序可以将其传递给其他支持 DMABUF 的设备。建议在不再使用 DMABUF 文件时将其关闭,以便回收关联的内存。

3.2.18.5. 示例

int buffer_export(int v4lfd, enum dmx_buf_type bt, int index, int *dmafd)
{
    struct dmx_exportbuffer expbuf;

    memset(&expbuf, 0, sizeof(expbuf));
    expbuf.type = bt;
    expbuf.index = index;
    if (ioctl(v4lfd, DMX_EXPBUF, &expbuf) == -1) {
        perror("DMX_EXPBUF");
        return -1;
    }

    *dmafd = expbuf.fd;

    return 0;
}

3.2.18.6. 返回值

成功时返回 0,错误时返回 -1,并且会适当地设置 errno 变量。通用错误代码在 通用错误代码 章节中描述。

EINVAL

队列不在 MMAP 模式下,或者不支持 DMABUF 导出,或者 flagsindex 字段无效。