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

指向 struct dmx_exportbuffer 的指针。

3.2.18.4. 描述

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

要导出缓冲区,应用程序需要填充 struct dmx_exportbuffer。应用程序必须设置 index 字段。有效的索引号范围是从零到使用 ioctl DMX_REQBUFS 分配的缓冲区数量(struct 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 字段无效。