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 欄位無效。