2.16. V4L2 videobuf2 函式和資料結構

enum vb2_memory

用於使緩衝區在使用者空間可見的記憶體模型型別。

常量

VB2_MEMORY_UNKNOWN

緩衝區狀態未知或尚未在使用者空間中使用。

VB2_MEMORY_MMAP

緩衝區由核心分配,並透過 mmap() ioctl 進行記憶體對映。當用戶透過 read() 或 write() 系統呼叫使用緩衝區時,也使用此模型。

VB2_MEMORY_USERPTR

緩衝區在使用者空間中分配,並透過 mmap() ioctl 進行記憶體對映。

VB2_MEMORY_DMABUF

緩衝區透過 DMA 緩衝區傳遞到使用者空間。

struct vb2_mem_ops

記憶體處理/記憶體分配器操作。

定義:

struct vb2_mem_ops {
    void *(*alloc)(struct vb2_buffer *vb,struct device *dev, unsigned long size);
    void (*put)(void *buf_priv);
    struct dma_buf *(*get_dmabuf)(struct vb2_buffer *vb,void *buf_priv, unsigned long flags);
    void *(*get_userptr)(struct vb2_buffer *vb,struct device *dev,unsigned long vaddr, unsigned long size);
    void (*put_userptr)(void *buf_priv);
    void (*prepare)(void *buf_priv);
    void (*finish)(void *buf_priv);
    void *(*attach_dmabuf)(struct vb2_buffer *vb,struct device *dev,struct dma_buf *dbuf, unsigned long size);
    void (*detach_dmabuf)(void *buf_priv);
    int (*map_dmabuf)(void *buf_priv);
    void (*unmap_dmabuf)(void *buf_priv);
    void *(*vaddr)(struct vb2_buffer *vb, void *buf_priv);
    void *(*cookie)(struct vb2_buffer *vb, void *buf_priv);
    unsigned int    (*num_users)(void *buf_priv);
    int (*mmap)(void *buf_priv, struct vm_area_struct *vma);
};

成員

alloc

分配影片記憶體,並可選擇分配器私有資料,失敗時返回 ERR_PTR(),成功時返回指向分配器私有、每個緩衝區資料的指標;返回的私有結構隨後將作為 buf_priv 引數傳遞給此結構中的其他操作。此函式的 size 引數應為頁面對齊

put

通知分配器緩衝區將不再使用;通常會導致分配器釋放緩衝區(如果不存在此緩衝區的其他使用者);buf_priv 引數是先前從 alloc 回撥返回的分配器私有、每個緩衝區結構。

get_dmabuf

獲取使用者空間記憶體以進行硬體操作;用於 DMABUF 記憶體型別。

get_userptr

獲取使用者空間記憶體以進行硬體操作;用於 USERPTR 記憶體型別;vaddr 是在對 USERPTR 型別的影片緩衝區進行排隊時傳遞給 videobuf2 層的地址;成功時應返回與緩衝區關聯的分配器私有、每個緩衝區結構,失敗時返回 ERR_PTR();返回的私有結構隨後將作為 buf_priv 引數傳遞給此結構中的其他操作。

put_userptr

通知分配器 USERPTR 緩衝區將不再使用。

prepare

每次緩衝區從使用者空間傳遞到驅動程式時呼叫,對於快取同步很有用,可選。

finish

每次緩衝區從驅動程式傳遞迴使用者空間時呼叫,也是可選的。

attach_dmabuf

為硬體操作附加共享的 struct dma_buf;用於 DMABUF 記憶體型別;dev 是分配裝置,dbuf 是共享的 dma_buf;失敗時返回 ERR_PTR();成功時返回分配器私有、每個緩衝區結構;這需要用於進一步訪問緩衝區。

detach_dmabuf

通知緩衝區的匯出器當前 DMABUF 緩衝區不再使用;buf_priv 引數是先前從 attach_dmabuf 回撥返回的分配器私有、每個緩衝區結構。

map_dmabuf

請求從分配器訪問 dmabuf;dmabuf 的分配器被告知此驅動程式將使用 dmabuf。

unmap_dmabuf

釋放對 dmabuf 的訪問控制 - 分配器被通知此驅動程式現在已完成使用 dmabuf。

vaddr

返回給定記憶體緩衝區的核心虛擬地址,該緩衝區與傳遞的私有結構相關聯,如果不存在此類對映,則返回 NULL。

cookie

返回給定記憶體緩衝區的分配器特定 cookie,該緩衝區與傳遞的私有結構相關聯,如果不可用,則返回 NULL。

num_users

返回記憶體緩衝區的當前使用者數;如果 videobuf2 層(或實際使用它的驅動程式)是唯一使用者,則返回 1。

mmap

在提供的虛擬記憶體區域下,為給定記憶體緩衝區設定使用者空間對映。

描述

這些操作由 videobuf2 核心用於為每種支援的流式 I/O 方法實現記憶體處理/記憶體分配器。

注意

  1. USERPTR 型別的必需操作:get_userptr、put_userptr。

  2. MMAP 型別的必需操作:alloc、put、num_users、mmap。

  3. 讀/寫訪問型別的必需操作:alloc、put、num_users、vaddr。

  4. DMABUF 型別的必需操作:attach_dmabuf、detach_dmabuf、map_dmabuf、unmap_dmabuf。

struct vb2_plane

平面資訊。

定義:

struct vb2_plane {
    void *mem_priv;
    struct dma_buf          *dbuf;
    unsigned int            dbuf_mapped;
    bool dbuf_duplicated;
    unsigned int            bytesused;
    unsigned int            length;
    unsigned int            min_length;
    union {
        unsigned int    offset;
        unsigned long   userptr;
        int fd;
    } m;
    unsigned int            data_offset;
};

成員

mem_priv

此平面的私有資料。

dbuf

dma_buf - 共享緩衝區物件。

dbuf_mapped

標誌,用於顯示 dbuf 是否已對映

dbuf_duplicated

布林值,用於顯示 dbuf 是否與緩衝區的先前平面重複。

bytesused

平面中資料(有效負載)佔用的位元組數。

length

此平面(不是有效負載)的大小(以位元組為單位)。最大有效大小為 MAX_UINT - PAGE_SIZE。

min_length

此平面(不是有效負載)的最小所需大小(以位元組為單位)。length 始終大於或等於 min_length,並且與 length 一樣,它限制為 MAX_UINT - PAGE_SIZE。

m

具有記憶體型別特定資料的聯合。

m.offset

當關聯的 struct vb2_buffer 中的記憶體為 VB2_MEMORY_MMAP 時,等於此平面的裝置記憶體的起始偏移量(或應傳遞給在影片節點上呼叫的 mmap() 的“cookie”)。

m.userptr

當記憶體為 VB2_MEMORY_USERPTR 時,指向此平面的使用者空間指標。

m.fd

當記憶體為 VB2_MEMORY_DMABUF 時,與此平面關聯的使用者空間檔案描述符。

data_offset

平面中到資料起點的偏移量;通常為 0,除非資料前面有標頭。

描述

應包含足夠的資訊,以便能夠覆蓋 videodev2.h 中 struct v4l2_plane 的所有欄位。

enum vb2_io_modes

佇列訪問方法。

常量

VB2_MMAP

驅動程式支援帶有流式 API 的 MMAP。

VB2_USERPTR

驅動程式支援帶有流式 API 的 USERPTR。

VB2_READ

驅動程式支援 read() 樣式訪問。

VB2_WRITE

驅動程式支援 write() 樣式訪問。

VB2_DMABUF

驅動程式支援帶有流式 API 的 DMABUF。

enum vb2_buffer_state

當前影片緩衝區狀態。

常量

VB2_BUF_STATE_DEQUEUED

在使用者空間控制下的緩衝區。

VB2_BUF_STATE_IN_REQUEST

緩衝區在媒體請求中排隊。

VB2_BUF_STATE_PREPARING

緩衝區正在 videobuf2 中準備。

VB2_BUF_STATE_QUEUED

緩衝區在 videobuf2 中排隊,但不在驅動程式中。

VB2_BUF_STATE_ACTIVE

緩衝區在驅動程式中排隊,並且可能在硬體操作中使用。

VB2_BUF_STATE_DONE

緩衝區從驅動程式返回到 videobuf2,但尚未出隊到使用者空間。

VB2_BUF_STATE_ERROR

與上述相同,但緩衝區的操作以錯誤結束,該錯誤將在出隊時報告給使用者空間。

struct vb2_buffer

表示影片緩衝區。

定義:

struct vb2_buffer {
    struct vb2_queue        *vb2_queue;
    unsigned int            index;
    unsigned int            type;
    unsigned int            memory;
    unsigned int            num_planes;
    u64 timestamp;
    struct media_request    *request;
    struct media_request_object     req_obj;
};

成員

vb2_queue

指向 struct vb2_queue 的指標,其中包含此驅動程式所屬的佇列。

index

緩衝區的 ID 號。

type

緩衝區型別。

memory

傳遞實際資料的方法。

num_planes

內部驅動程式佇列中緩衝區的平面數。

timestamp

幀時間戳(以納秒為單位)。

request

此緩衝區關聯的請求。

req_obj

用於將此緩衝區繫結到請求。此請求物件具有引用計數。

struct vb2_ops

驅動程式特定的回撥。

定義:

struct vb2_ops {
    int (*queue_setup)(struct vb2_queue *q,unsigned int *num_buffers, unsigned int *num_planes, unsigned int sizes[], struct device *alloc_devs[]);
    void (*wait_prepare)(struct vb2_queue *q);
    void (*wait_finish)(struct vb2_queue *q);
    int (*buf_out_validate)(struct vb2_buffer *vb);
    int (*buf_init)(struct vb2_buffer *vb);
    int (*buf_prepare)(struct vb2_buffer *vb);
    void (*buf_finish)(struct vb2_buffer *vb);
    void (*buf_cleanup)(struct vb2_buffer *vb);
    int (*prepare_streaming)(struct vb2_queue *q);
    int (*start_streaming)(struct vb2_queue *q, unsigned int count);
    void (*stop_streaming)(struct vb2_queue *q);
    void (*unprepare_streaming)(struct vb2_queue *q);
    void (*buf_queue)(struct vb2_buffer *vb);
    void (*buf_request_complete)(struct vb2_buffer *vb);
};

成員

queue_setup

從 VIDIOC_REQBUFS() 和 VIDIOC_CREATE_BUFS() 處理程式中的記憶體分配之前呼叫。它可以被呼叫兩次:如果原始請求緩衝區數無法分配,則它將被第二次呼叫,其中包含實際分配的緩衝區數,以驗證是否可以。驅動程式應在 *num_buffers 中返回所需的緩衝區數,在 *num_planes 中返回每個緩衝區的所需平面數,每個平面的大小應在 sizes[] 陣列中設定,可選的每個平面分配器特定的裝置在 alloc_devs[] 陣列中。當從 VIDIOC_REQBUFS() 呼叫時,*num_planes == 0,驅動程式必須使用當前配置的格式來確定平面大小,並且 *num_buffers 是正在分配的緩衝區的總數。當從 VIDIOC_CREATE_BUFS() 呼叫時,*num_planes != 0,並且它描述了請求的平面數,並且 sizes[] 包含請求的平面大小。在這種情況下,*num_buffers 將新增到已分配的緩衝區中。如果 *num_planes 或請求的大小無效,回撥必須返回 -EINVAL

wait_prepare

釋放呼叫 vb2 函式時獲取的任何鎖;它在 ioctl 需要等待新緩衝區到達之前被呼叫;需要避免阻塞訪問型別中的死鎖。

wait_finish

重新獲取在上一個回撥中釋放的所有鎖;需要在休眠等待新緩衝區到達後繼續操作。

buf_out_validate

當輸出緩衝區準備好或排隊到請求時呼叫;驅動程式可以使用它來驗證使用者空間提供的資訊;這僅對 OUTPUT 佇列是必需的。

buf_init

在分配緩衝區(在 MMAP 情況下)或獲取新的 USERPTR 緩衝區之後呼叫一次;驅動程式可以執行其他與緩衝區相關的初始化;初始化失敗(返回值 != 0)將阻止佇列設定成功完成;可選。

buf_prepare

每次緩衝區從使用者空間和 VIDIOC_PREPARE_BUF() ioctl 排隊時呼叫;驅動程式可以在此回撥中執行每個硬體操作所需的任何初始化;驅動程式可以在此處訪問/修改緩衝區,因為它仍然與 CPU 同步;支援 VIDIOC_CREATE_BUFS() 的驅動程式還必須驗證緩衝區大小;如果返回錯誤,緩衝區將不會在驅動程式中排隊;可選。

buf_finish

在每次將緩衝區出隊返回到使用者空間之前呼叫;緩衝區已與 CPU 同步,因此驅動程式可以訪問/修改緩衝區內容;驅動程式可以執行使用者空間訪問緩衝區之前所需的任何操作;可選。緩衝區狀態可以是以下之一:DONEERROR 在流式傳輸正在進行時發生,並且當佇列已取消並且所有掛起的緩衝區都返回到其預設 DEQUEUED 狀態時,會發生 PREPARED 狀態。通常,您只需要在狀態為 VB2_BUF_STATE_DONE 時執行某些操作,因為在所有其他情況下,緩衝區內容都將被忽略。

buf_cleanup

在緩衝區被釋放之前呼叫一次;驅動程式可以執行任何其他清理;可選。

prepare_streaming

呼叫一次以準備“流式傳輸”狀態;這是可以進行驗證以驗證一切是否正常以及可以宣告流式傳輸資源的地方。當呼叫 VIDIOC_STREAMON ioctl 時呼叫。實際的流式傳輸在呼叫 start_streaming 時開始。可選。

start_streaming

呼叫一次以進入“流式傳輸”狀態;驅動程式可以在呼叫 start_streaming 之前透過 buf_queue 回撥接收緩衝區;驅動程式在 count 引數中獲取已排隊的緩衝區數;如果硬體失敗,驅動程式可以返回錯誤,在這種情況下,已由 buf_queue 回撥給出的所有緩衝區都將透過呼叫 vb2_buffer_done()VB2_BUF_STATE_QUEUED 返回。如果您在可以開始流式傳輸之前需要最少數量的緩衝區,則設定 vb2_queue->min_queued_buffers。如果它不是零,則在使用者空間至少排隊那麼多緩衝區之前,不會呼叫 start_streaming

stop_streaming

當必須停用“流式傳輸”狀態時呼叫;驅動程式應停止任何 DMA 事務或等待它們完成,並透過使用 VB2_BUF_STATE_DONEVB2_BUF_STATE_ERROR 呼叫 vb2_buffer_done() 來返回從 buf_queue 回撥中獲取的所有緩衝區;可以使用 vb2_wait_for_all_buffers() 函式

unprepare_streaming

作為 prepare_streaming 的對應方呼叫;可以在此處釋放任何宣告的流式傳輸資源。當呼叫 VIDIOC_STREAMOFF ioctl 時或當流式傳輸檔案控制代碼關閉時呼叫。可選。

buf_queue

將緩衝區 vb 傳遞給驅動程式;驅動程式可以對此緩衝區啟動硬體操作;驅動程式應透過呼叫 vb2_buffer_done() 函式來返回緩衝區;它始終在呼叫 VIDIOC_STREAMON() ioctl 之後呼叫;如果在呼叫 VIDIOC_STREAMON() 之前使用者預先排隊了緩衝區,則可以在 start_streaming 回撥之前呼叫。

buf_request_complete

從未排隊到驅動程式但與排隊的請求關聯的緩衝區已取消。驅動程式將必須將請求中的關聯物件標記為已完成;如果支援請求,則需要。

描述

這些操作不是從中斷上下文中呼叫的,除非特別提及。

struct vb2_buf_ops

驅動程式特定的回撥。

定義:

struct vb2_buf_ops {
    int (*verify_planes_array)(struct vb2_buffer *vb, const void *pb);
    void (*init_buffer)(struct vb2_buffer *vb);
    void (*fill_user_buffer)(struct vb2_buffer *vb, void *pb);
    int (*fill_vb2_buffer)(struct vb2_buffer *vb, struct vb2_plane *planes);
    void (*copy_timestamp)(struct vb2_buffer *vb, const void *pb);
};

成員

verify_planes_array

驗證給定的使用者空間結構是否包含足夠的緩衝區平面。這是為每個出隊的緩衝區呼叫的。

init_buffer

給定一個 vb2_buffer,在 struct vb2_buffer 之後初始化額外資料。對於 V4L2,這是一個 struct vb2_v4l2_buffer

fill_user_buffer

給定一個 vb2_buffer,填充使用者空間結構。對於 V4L2,這是一個 struct v4l2_buffer

fill_vb2_buffer

給定一個使用者空間結構,填充 vb2_buffer。如果使用者空間結構無效,則此操作將返回錯誤。

copy_timestamp

將時間戳從使用者空間結構複製到 struct vb2_buffer

struct vb2_queue

一個 videobuf2 佇列。

定義:

struct vb2_queue {
    unsigned int                    type;
    unsigned int                    io_modes;
    struct device                   *dev;
    unsigned long                   dma_attrs;
    unsigned int                    bidirectional:1;
    unsigned int                    fileio_read_once:1;
    unsigned int                    fileio_write_immediately:1;
    unsigned int                    allow_zero_bytesused:1;
    unsigned int               quirk_poll_must_check_waiting_for_buffers:1;
    unsigned int                    supports_requests:1;
    unsigned int                    requires_requests:1;
    unsigned int                    uses_qbuf:1;
    unsigned int                    uses_requests:1;
    unsigned int                    allow_cache_hints:1;
    unsigned int                    non_coherent_mem:1;
    struct mutex                    *lock;
    void *owner;
    const struct vb2_ops            *ops;
    const struct vb2_mem_ops        *mem_ops;
    const struct vb2_buf_ops        *buf_ops;
    void *drv_priv;
    u32 subsystem_flags;
    unsigned int                    buf_struct_size;
    u32 timestamp_flags;
    gfp_t gfp_flags;
    u32 min_queued_buffers;
    u32 min_reqbufs_allocation;
    struct device                   *alloc_devs[VB2_MAX_PLANES];
};

成員

type

私有緩衝區型別,其內容由 vb2-core 呼叫方定義。例如,對於 V4L2,它應與 enum v4l2_buf_type 上定義的型別匹配。

io_modes

支援的 io 方法(請參閱 enum vb2_io_modes)。

dev

如果驅動程式未填充 alloc_devs 陣列,則用於預設分配上下文的裝置。

dma_attrs

用於 DMA 的 DMA 屬性。

bidirectional

設定此標誌後,此佇列的緩衝區的 DMA 方向將被 DMA_BIDIRECTIONAL 方向覆蓋。這在硬體(韌體)寫入對映為讀取的緩衝區 (DMA_TO_DEVICE) 或從對映為寫入的緩衝區 (DMA_FROM_DEVICE) 讀取的情況下非常有用,以滿足某些內部硬體限制或新增處理演算法所需的填充。如果 DMA 對映不是雙向的,但硬體(韌體)嘗試訪問緩衝區(在相反方向),這可能會導致 IOMMU 保護錯誤。

fileio_read_once

在讀取第一個緩衝區後報告 EOF

fileio_write_immediately

在每次 write() 呼叫後對緩衝區進行排隊

allow_zero_bytesused

允許將 bytesused == 0 傳遞給驅動程式

quirk_poll_must_check_waiting_for_buffers

在 poll 處返回 EPOLLERR,前提是尚未呼叫 QBUF。這是 vb1 習語,vb2 也採用了它。

supports_requests

此佇列支援 Request API。

requires_requests

此佇列需要 Request API。如果此項設定為 1,則也必須將 supports_requests 設定為 1。

uses_qbuf

qbuf 直接用於此佇列。第一次呼叫時設定為 1。取消佇列時設定為 0。如果此項為 1,則無法從請求中對緩衝區進行排隊。

uses_requests

請求用於此佇列。第一次對請求進行排隊時設定為 1。取消佇列時設定為 0。如果此項為 1,則無法直接對緩衝區進行排隊。

allow_cache_hints

設定後,使用者空間可以傳遞快取管理提示,以便跳過 ->prepare() 或/和 ->finish() 上的快取重新整理/失效。

non_coherent_mem

設定後,佇列將嘗試使用非相干記憶體分配緩衝區。

lock

指向保護 struct vb2_queue 的互斥鎖的指標。驅動程式可以將此設定為互斥鎖,以使 v4l2 核心序列化排隊 ioctl。如果驅動程式想要自己處理鎖定,則應將其設定為 NULL。videobuf2 核心 API 不使用此鎖。

owner

“擁有”緩衝區的檔案控制代碼,即呼叫 reqbufs、create_buffers 或啟動 fileio 的檔案控制代碼。videobuf2 核心 API 不使用此欄位,但它允許驅動程式輕鬆地將所有者檔案控制代碼與佇列關聯。

ops

驅動程式特定的回撥

mem_ops

記憶體分配器特定的回撥

buf_ops

回撥以在使用者空間和核心空間之間傳遞緩衝區資訊。

drv_priv

驅動程式私有資料。

subsystem_flags

特定於子系統(V4L2/DVB/等)的標誌。vb2 核心不使用。

buf_struct_size

驅動程式特定緩衝區結構的大小;“0”表示驅動程式不想使用自定義緩衝區結構型別。在這種情況下,將使用子系統特定的結構(在 V4L2 的情況下,它是 sizeof(struct vb2_v4l2_buffer))。驅動程式特定緩衝結構的第一個欄位必須是子系統特定的結構(V4L2 的情況下為 vb2_v4l2_buffer)。

timestamp_flags

時間戳標誌;V4L2_BUF_FLAG_TIMESTAMP_*V4L2_BUF_FLAG_TSTAMP_SRC_*

gfp_flags

分配緩衝區時使用的其他 gfp 標誌。通常這是 0,但也可能是例如 GFP_DMA__GFP_DMA32 以強制緩衝區分配到特定記憶體區域。

min_queued_buffers

在可以呼叫 start_streaming 之前需要的最小排隊緩衝區數。當 DMA 引擎無法啟動,除非至少有此數量的緩衝區已排隊到驅動程式中時使用。VIDIOC_REQBUFS 將確保至少分配 min_queued_buffers + 1 個緩衝區。請注意,VIDIOC_CREATE_BUFS 不會修改請求的緩衝區計數。

min_reqbufs_allocation

呼叫 VIDIOC_REQBUFS 時要分配的最小緩衝區數。請注意,VIDIOC_CREATE_BUFS 不會修改請求的緩衝區計數,也不會使用此欄位。如果必須有一定數量的緩衝區可用於硬體才能有效地工作,則驅動程式可以設定此值。這允許呼叫 VIDIOC_REQBUFS,緩衝區計數為 1,並且它將自動調整為可工作的緩衝區計數。如果設定,則 min_reqbufs_allocation 必須大於 min_queued_buffers + 1。如果此欄位 > 3,則強烈建議驅動程式實現 V4L2_CID_MIN_BUFFERS_FOR_CAPTURE/OUTPUT 控制元件。

alloc_devs

struct device 記憶體型別/分配器特定的每個平面裝置

bool vb2_queue_allows_cache_hints(struct vb2_queue *q)

如果佇列允許快取和記憶體一致性提示,則返回 true。

引數

struct vb2_queue *q

指向 struct vb2_queue 的指標,其中包含 videobuf2 佇列

void *vb2_plane_vaddr(struct vb2_buffer *vb, unsigned int plane_no)

返回給定平面的核心虛擬地址。

引數

struct vb2_buffer *vb

指向 struct vb2_buffer 的指標,該平面屬於該指標。

unsigned int plane_no

要返回地址的平面號。

描述

如果存在此類對映,此函式將返回給定平面的核心虛擬地址,否則返回 NULL。

返回給定平面的分配器特定 cookie。

引數

struct vb2_buffer *vb

指向 struct vb2_buffer 的指標,該平面屬於該指標。

unsigned int plane_no

要返回 cookie 的平面號。

描述

如果可用,此函式會為給定的平面返回分配器特定的 Cookie,否則返回 NULL。分配器應提供一些簡單的靜態行內函數,這些函式可以將此 Cookie 轉換為分配器特定的型別,驅動程式可以直接使用該型別來訪問緩衝區。例如,可以是物理地址、散列表指標或 IOMMU 對映。

void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)

通知 videobuf2 緩衝區上的操作已完成。

引數

struct vb2_buffer *vb

要使用的 struct vb2_buffer 的指標。

enum vb2_buffer_state state

緩衝區的狀態,由 enum vb2_buffer_state 定義。如果操作成功完成,則為 VB2_BUF_STATE_DONE;如果操作完成時出錯,則為 VB2_BUF_STATE_ERROR;或者 VB2_BUF_STATE_QUEUED

描述

驅動程式應在緩衝區上的硬體操作完成後呼叫此函式,並且可以將緩衝區返回給使用者空間。在透過 vb2_ops->buf_queue 回撥將其放回佇列之前,驅動程式不能再使用此緩衝區。只有先前透過 vb2_ops->buf_queue 排隊到驅動程式的緩衝區才能傳遞給此函式。

在流式傳輸期間,緩衝區只能以 DONE 或 ERROR 狀態返回。如果由於某種原因無法啟動 DMA 引擎,vb2_ops->start_streaming 操作也可以返回它們。在這種情況下,應以 QUEUED 狀態返回緩衝區,以將其放回佇列中。

void vb2_discard_done(struct vb2_queue *q)

丟棄所有標記為 DONE 的緩衝區。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

描述

此函式旨在與掛起/恢復操作一起使用。它會丟棄所有“完成”的緩衝區,因為它們在恢復後請求時會太舊。

驅動程式必須停止硬體並與中斷處理程式和/或延遲工作同步,然後才能呼叫此函式,以確保驅動程式和/或硬體不會觸控任何緩衝區。

int vb2_wait_for_all_buffers(struct vb2_queue *q)

等待所有緩衝區返回到 vb2。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

描述

此函式將等待直到透過 vb2_ops->buf_queue 給驅動程式的所有緩衝區都透過 vb2_buffer_done() 返回到 vb2。它不呼叫 vb2_ops->wait_prepare/vb2_ops->wait_finish 對。它旨在在獲取所有鎖的情況下呼叫,例如從 vb2_ops->stop_streaming 回撥中呼叫。

void vb2_core_querybuf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb)

查詢影片緩衝區資訊。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct vb2_buffer *vb

指向 struct vb2_buffer 的指標。

void *pb

從使用者空間傳遞的緩衝區結構。

描述

Videobuf2 核心幫助程式來實現 VIDIOC_QUERYBUF() 操作。它由 VB2 透過特定於 API 的處理程式在內部呼叫,例如 videobuf2-v4l2.h

傳遞的緩衝區應已驗證。

此函式填充使用者空間的相關資訊。

返回

成功時返回零;否則返回錯誤程式碼。

int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory, unsigned int flags, unsigned int *count)

啟動流式傳輸。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

enum vb2_memory memory

記憶體型別,由 enum vb2_memory 定義。

unsigned int flags

輔助佇列/緩衝區管理標誌。目前,唯一使用的標誌是 V4L2_MEMORY_FLAG_NON_COHERENT

unsigned int *count

請求的緩衝區計數。

描述

Videobuf2 核心幫助程式來實現 VIDIOC_REQBUF() 操作。它由 VB2 透過特定於 API 的處理程式在內部呼叫,例如 videobuf2-v4l2.h

此函式

  1. 驗證從使用者空間傳遞的流式傳輸引數;

  2. 設定佇列;

  3. 與驅動程式協商在流式傳輸期間要使用的緩衝區數和每個緩衝區的平面數;

  4. 根據商定的引數,分配內部緩衝區結構(struct vb2_buffer);

  5. 對於 MMAP 記憶體型別,使用佇列初始化期間提供的記憶體處理/分配例程分配實際的影片記憶體。

如果 req->count 為 0,則將釋放所有記憶體。

如果佇列先前已透過先前的 vb2_core_reqbufs() 呼叫分配,並且佇列不忙,則將重新分配記憶體。

返回

成功時返回零;否則返回錯誤程式碼。

int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory, unsigned int flags, unsigned int *count, unsigned int requested_planes, const unsigned int requested_sizes[], unsigned int *first_index)

分配緩衝區和任何所需的輔助結構

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

enum vb2_memory memory

記憶體型別,由 enum vb2_memory 定義。

unsigned int flags

輔助佇列/緩衝區管理標誌。

unsigned int *count

請求的緩衝區計數。

unsigned int requested_planes

請求的平面數。

const unsigned int requested_sizes[]

包含平面大小的陣列。

unsigned int *first_index

第一個建立的緩衝區的索引,所有分配的緩衝區在範圍 [first_index..first_index+count-1] 中都有索引

描述

Videobuf2 核心幫助程式來實現 VIDIOC_CREATE_BUFS() 操作。它由 VB2 透過特定於 API 的處理程式在內部呼叫,例如 videobuf2-v4l2.h

此函式

  1. 驗證引數的合理性;

  2. 呼叫 vb2_ops->queue_setup 佇列操作;

  3. 執行任何必要的記憶體分配。

返回

成功時返回零;否則返回錯誤程式碼。

int vb2_core_prepare_buf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb)

將緩衝區的所有權從使用者空間傳遞到核心。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct vb2_buffer *vb

指向 struct vb2_buffer 的指標。

void *pb

從使用者空間傳遞到驅動程式中的 v4l2_ioctl_ops->vidioc_prepare_buf 處理程式的緩衝區結構。

描述

Videobuf2 核心幫助程式來實現 VIDIOC_PREPARE_BUF() 操作。它由 VB2 透過特定於 API 的處理程式在內部呼叫,例如 videobuf2-v4l2.h

傳遞的緩衝區應已驗證。

此函式在驅動程式中呼叫 vb2_ops->buf_prepare 回撥(如果提供),可以在其中執行特定於驅動程式的緩衝區初始化。

返回

成功時返回零;否則返回錯誤程式碼。

int vb2_core_remove_bufs(struct vb2_queue *q, unsigned int start, unsigned int count)

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

unsigned int start

要刪除的緩衝區範圍的第一個索引。

unsigned int count

要刪除的緩衝區數。

返回

成功時返回零;否則返回錯誤程式碼。

int vb2_core_qbuf(struct vb2_queue *q, struct vb2_buffer *vb, void *pb, struct media_request *req)

從使用者空間對緩衝區進行排隊

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct vb2_buffer *vb

指向 struct vb2_buffer 的指標。

void *pb

從使用者空間傳遞到驅動程式中的 v4l2_ioctl_ops->vidioc_qbuf 處理程式的緩衝區結構

struct media_request *req

指向 struct media_request 的指標,可以為 NULL。

描述

Videobuf2 核心幫助程式來實現 VIDIOC_QBUF() 操作。它由 VB2 透過特定於 API 的處理程式在內部呼叫,例如 videobuf2-v4l2.h

此函式

  1. 如果 req 為非 NULL,則緩衝區將繫結到此媒體請求並返回。當請求本身排隊時,將準備緩衝區並將其排隊到驅動程式(即接下來的兩個步驟)。

  2. 如有必要,在驅動程式中呼叫 vb2_ops->buf_prepare 回撥(如果提供),可以在其中執行特定於驅動程式的緩衝區初始化;

  3. 如果流式傳輸已開啟,則透過 vb2_ops->buf_queue 回撥將緩衝區排隊到驅動程式中進行處理。

返回

成功時返回零;否則返回錯誤程式碼。

int vb2_core_dqbuf(struct vb2_queue *q, unsigned int *pindex, void *pb, bool nonblocking)

將緩衝區出隊到使用者空間

引數

struct vb2_queue *q

指向 struct vb2_queue 的指標,其中包含 videobuf2 佇列

unsigned int *pindex

指向緩衝區索引的指標。可以為 NULL

void *pb

從使用者空間傳遞到驅動程式中的 v4l2_ioctl_ops->vidioc_dqbuf 處理程式的緩衝區結構。

bool nonblocking

如果為 true,則如果不存在可用於出隊的緩衝區,則此呼叫將不會休眠等待緩衝區。通常,驅動程式會在此處傳遞 (file->f_flags & O_NONBLOCK)。

描述

Videobuf2 核心幫助程式來實現 VIDIOC_DQBUF() 操作。它由 VB2 透過特定於 API 的處理程式在內部呼叫,例如 videobuf2-v4l2.h

此函式

  1. 在驅動程式中呼叫 buf_finish 回撥(如果提供),驅動程式可以在其中執行在將緩衝區返回給使用者空間之前可能需要的任何其他操作,例如快取同步,

  2. 緩衝區結構成員填充了使用者空間的相關資訊。

返回

成功時返回零;否則返回錯誤程式碼。

int vb2_core_streamon(struct vb2_queue *q, unsigned int type)

實現 VB2 流開啟邏輯

引數

struct vb2_queue *q

指向 struct vb2_queue 的指標,其中包含 videobuf2 佇列

unsigned int type

要啟動的佇列的型別。對於 V4L2,這由 enum v4l2_buf_type 型別定義。

描述

Videobuf2 核心幫助程式來實現 VIDIOC_STREAMON() 操作。它由 VB2 透過特定於 API 的處理程式在內部呼叫,例如 videobuf2-v4l2.h

返回

成功時返回零;否則返回錯誤程式碼。

int vb2_core_streamoff(struct vb2_queue *q, unsigned int type)

實現 VB2 流關閉邏輯

引數

struct vb2_queue *q

指向 struct vb2_queue 的指標,其中包含 videobuf2 佇列

unsigned int type

要啟動的佇列的型別。對於 V4L2,這由 enum v4l2_buf_type 型別定義。

描述

Videobuf2 核心幫助程式來實現 VIDIOC_STREAMOFF() 操作。它由 VB2 透過特定於 API 的處理程式在內部呼叫,例如 videobuf2-v4l2.h

返回

成功時返回零;否則返回錯誤程式碼。

int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type, struct vb2_buffer *vb, unsigned int plane, unsigned int flags)

將緩衝區匯出為檔案描述符。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

int *fd

指向與 DMABUF 關聯的檔案描述符的指標(由驅動程式設定)。

unsigned int type

緩衝區型別。

struct vb2_buffer *vb

指向 struct vb2_buffer 的指標。

unsigned int plane

要匯出的平面的索引,對於單平面佇列為 0

unsigned int flags

新建立檔案的檔案標誌,如 include/uapi/asm-generic/fcntl.h 中定義。目前,唯一使用的標誌是 O_CLOEXEC。支援 is,有關更多詳細資訊,請參閱 open syscall 的手冊。

描述

Videobuf2 核心幫助程式來實現 VIDIOC_EXPBUF() 操作。它由 VB2 透過特定於 API 的處理程式在內部呼叫,例如 videobuf2-v4l2.h

返回

成功時返回零;否則返回錯誤程式碼。

int vb2_core_queue_init(struct vb2_queue *q)

初始化 videobuf2 佇列

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。此結構應在驅動程式中分配

描述

vb2_queue 結構應由驅動程式分配。驅動程式負責清除其內容並在呼叫此函式之前為某些必需條目設定初始值。

注意

在呼叫此函式之前,應設定 q 中的以下欄位:vb2_queue->opsvb2_queue->mem_opsvb2_queue->type

void vb2_core_queue_release(struct vb2_queue *q)

停止流式傳輸,釋放佇列並釋放記憶體

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

描述

此函式停止流式傳輸並執行必要的清理,包括釋放影片緩衝區記憶體。驅動程式負責釋放 struct vb2_queue 本身。

void vb2_queue_error(struct vb2_queue *q)

發出佇列上發生致命錯誤的訊號

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

描述

標記發生了無法恢復的致命錯誤,並喚醒所有在佇列上等待的程序。輪詢現在將設定 EPOLLERR,排隊和出隊緩衝區將返回 -EIO

取消佇列時,將清除錯誤標誌,無論是在 vb2_streamoff() 還是 vb2_queue_release() 中。因此,驅動程式不應在啟動流之前呼叫此函式,否則錯誤標誌將保持設定狀態,直到關閉裝置節點時釋放佇列。

int vb2_mmap(struct vb2_queue *q, struct vm_area_struct *vma)

將影片緩衝區對映到應用程式地址空間中。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct vm_area_struct *vma

指向 struct vm_area_struct 的指標,該指標帶有傳遞給驅動程式中 mmap 檔案操作處理程式的 vma。

描述

應從驅動程式的 mmap 檔案操作處理程式中呼叫。此函式將可用影片緩衝區之一的一個平面對映到使用者空間。要對映在 reqbufs 上分配的整個影片記憶體,必須為先前分配的每個緩衝區的每個平面呼叫一次此函式。

當用戶空間應用程式呼叫 mmap 時,它會將先前透過 v4l2_ioctl_ops->vidioc_querybuf 處理程式返回給它的偏移量傳遞給它。該偏移量充當“Cookie”,然後用於標識要對映的平面。

此函式查詢具有匹配偏移量的平面,並透過提供的記憶體操作執行對映。

此函式的返回值旨在直接從驅動程式中的 mmap 處理程式返回。

unsigned long vb2_get_unmapped_area(struct vb2_queue *q, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags)

將影片緩衝區對映到應用程式地址空間中。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

unsigned long addr

記憶體地址。

unsigned long len

緩衝區大小。

unsigned long pgoff

頁面偏移量。

unsigned long flags

記憶體標誌。

描述

此函式用於 noMMU 平臺中,以建議給定緩衝區的地址對映。它旨在用作 file_operations->get_unmapped_area 操作的處理程式。

!CONFIG_MMU 時,mmap() 系統呼叫例程將呼叫此函式以獲取建議的對映地址。

__poll_t vb2_core_poll(struct vb2_queue *q, struct file *file, poll_table *wait)

實現 poll syscall() 邏輯。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct file *file

傳遞給 poll 檔案操作處理程式的 struct file 引數。

poll_table *wait

poll_table 傳遞給 poll 檔案操作處理程式的 wait 引數。

描述

此函式為驅動程式實現 poll 檔案操作處理程式。對於 CAPTURE 佇列,如果緩衝區準備好出隊,則會通知使用者空間影片裝置的檔案描述符可用於讀取。對於 OUTPUT 佇列,如果緩衝區準備好出隊,則檔案描述符將報告為可用於寫入。

此函式的返回值旨在直接從驅動程式中的 poll 處理程式返回。

size_t vb2_read(struct vb2_queue *q, char __user *data, size_t count, loff_t *ppos, int nonblock)

實現 read() 系統呼叫邏輯。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

char __user *data

指向目標使用者空間緩衝區

size_t count

要讀取的位元組數

loff_t *ppos

檔案控制代碼位置跟蹤指標

int nonblock

模式選擇器(1 表示阻塞呼叫,0 表示非阻塞)

size_t vb2_write(struct vb2_queue *q, const char __user *data, size_t count, loff_t *ppos, int nonblock)

實現 write() 系統呼叫邏輯。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

const char __user *data

指向目標使用者空間緩衝區

size_t count

要寫入的位元組數

loff_t *ppos

檔案控制代碼位置跟蹤指標

int nonblock

模式選擇器(1 表示阻塞呼叫,0 表示非阻塞)

vb2_thread_fnc

Typedef: 用於 vb2_thread 的回撥函式。

語法

int vb2_thread_fnc (struct vb2_buffer *vb, void *priv)

引數

struct vb2_buffer *vb

指向 struct vb2_buffer 的指標。

void *priv

指向私有資料的指標。

描述

每當緩衝區線上程中出隊時,都會呼叫此方法。

int vb2_thread_start(struct vb2_queue *q, vb2_thread_fnc fnc, void *priv, const char *thread_name)

為給定佇列啟動執行緒。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

vb2_thread_fnc fnc

vb2_thread_fnc 回撥函式。

void *priv

傳遞給回撥函式的 priv 指標。

const char *thread_name

執行緒的名稱。此名稱將以 “vb2-” 為字首。

描述

這將啟動一個執行緒,該執行緒將排隊和出隊,直到發生錯誤或呼叫 vb2_thread_stop()

注意

此函式不應用於 videobuf2-dvb 支援以外的任何用途。如果您認為對此有其他好的用例,請首先聯絡 linux-media 郵件列表。

int vb2_thread_stop(struct vb2_queue *q)

停止給定佇列的執行緒。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

bool vb2_is_streaming(struct vb2_queue *q)

返回佇列的流式傳輸狀態。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

bool vb2_fileio_is_active(struct vb2_queue *q)

如果 fileio 處於活動狀態,則返回 true。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

描述

如果使用 read() 或 write() 來流式傳輸資料而不是流 I/O,則此函式返回 true。除了極少數情況外,這幾乎不是一個重要的區別。其中一種情況是,不允許使用 read() 或 write() 流式傳輸使用 V4L2_FIELD_ALTERNATE 的格式,因為無法將每個緩衝區的欄位資訊傳遞到使用者空間/從使用者空間傳遞。支援此欄位格式的驅動程式應在 vb2_ops->queue_setup 操作中檢查此情況,如果此函式返回 true,則拒絕它。

unsigned int vb2_get_num_buffers(struct vb2_queue *q)

獲取佇列中的緩衝區數量

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

bool vb2_is_busy(struct vb2_queue *q)

返回佇列的繁忙狀態。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

描述

此函式檢查佇列是否已分配任何緩衝區。

void *vb2_get_drv_priv(struct vb2_queue *q)

返回與佇列關聯的驅動程式私有資料。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

void vb2_set_plane_payload(struct vb2_buffer *vb, unsigned int plane_no, unsigned long size)

設定平面 plane_no 的 bytesused。

引數

struct vb2_buffer *vb

指向 struct vb2_buffer 的指標,該平面屬於該指標。

unsigned int plane_no

應為其設定有效負載的平面號。

unsigned long size

有效負載(以位元組為單位)。

unsigned long vb2_get_plane_payload(struct vb2_buffer *vb, unsigned int plane_no)

獲取平面 plane_no 的 bytesused

引數

struct vb2_buffer *vb

指向 struct vb2_buffer 的指標,該平面屬於該指標。

unsigned int plane_no

應為其設定有效負載的平面號。

unsigned long vb2_plane_size(struct vb2_buffer *vb, unsigned int plane_no)

返回平面大小(以位元組為單位)。

引數

struct vb2_buffer *vb

指向 struct vb2_buffer 的指標,該平面屬於該指標。

unsigned int plane_no

應返回其大小的平面號。

bool vb2_start_streaming_called(struct vb2_queue *q)

返回驅動程式的流式傳輸狀態。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

void vb2_clear_last_buffer_dequeued(struct vb2_queue *q)

清除佇列的上次緩衝區出隊標誌。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct vb2_buffer *vb2_get_buffer(struct vb2_queue *q, unsigned int index)

從佇列中獲取緩衝區

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

unsigned int index

緩衝區索引

描述

此函式按索引從佇列中獲取緩衝區。請記住,此操作不涉及引用計數,因此應考慮緩衝區的生命週期。

bool vb2_buffer_in_use(struct vb2_queue *q, struct vb2_buffer *vb)

如果緩衝區正在使用中並且無法透過 VIDIOC_REQBUFS(0) 呼叫釋放佇列,則返回 true。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct vb2_buffer *vb

應返回其平面大小的緩衝區。

int vb2_verify_memory_type(struct vb2_queue *q, enum vb2_memory memory, unsigned int type)

檢查傳遞給緩衝區操作的記憶體型別和緩衝區型別是否與佇列相容。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

enum vb2_memory memory

記憶體模型,如列舉 vb2_memory 所定義。

unsigned int type

私有緩衝區型別,其內容由 vb2-core 呼叫方定義。例如,對於 V4L2,它應與列舉 v4l2_buf_type 中定義的型別匹配。

bool vb2_request_object_is_buffer(struct media_request_object *obj)

如果物件是緩衝區,則返回 true

引數

struct media_request_object *obj

請求物件。

unsigned int vb2_request_buffer_cnt(struct media_request *req)

返回請求中的緩衝區數

引數

struct media_request *req

請求。

struct vb2_v4l2_buffer

v4l2 的影片緩衝區資訊。

定義:

struct vb2_v4l2_buffer {
    struct vb2_buffer       vb2_buf;
    __u32 flags;
    __u32 field;
    struct v4l2_timecode    timecode;
    __u32 sequence;
    __s32 request_fd;
    bool is_held;
    struct vb2_plane        planes[VB2_MAX_PLANES];
};

成員

vb2_buf

嵌入式結構 vb2_buffer

flags

緩衝區資訊標誌。

field

緩衝區中影像的欄位順序,如 enum v4l2_field 所定義。

timecode

幀時間碼。

sequence

此幀的序列計數。

request_fd

與此緩衝區關聯的 request_fd

is_held

如果為 true,則保留此捕獲緩衝區

planes

平面資訊(userptr/fd、length、bytesused、data_offset)。

描述

應包含足夠的資訊以覆蓋 videodev2.hstruct v4l2_buffer 的所有欄位。

struct vb2_buffer *vb2_find_buffer(struct vb2_queue *q, u64 timestamp)

查詢具有給定時間戳的緩衝區

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

u64 timestamp

要查詢的時間戳。

描述

返回具有給定 時間戳 的緩衝區,如果未找到,則返回 NULL。

int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)

vb2_core_reqbufs() 的包裝器,該包裝器還會驗證記憶體和型別值。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct v4l2_requestbuffers *req

從使用者空間傳遞給驅動程式中 v4l2_ioctl_ops->vidioc_reqbufs 處理程式的 struct v4l2_requestbuffers

int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create)

vb2_core_create_bufs() 的包裝器,該包裝器還會驗證記憶體和型別值。

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct v4l2_create_buffers *create

建立引數,從使用者空間傳遞到驅動程式中的 v4l2_ioctl_ops->vidioc_create_bufs 處理程式

int vb2_prepare_buf(struct vb2_queue *q, struct media_device *mdev, struct v4l2_buffer *b)

將緩衝區的所有權從使用者空間傳遞到核心

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct media_device *mdev

指向 struct media_device 的指標,可以為 NULL。

struct v4l2_buffer *b

從使用者空間傳遞給驅動程式中 v4l2_ioctl_ops->vidioc_prepare_buf 處理程式的緩衝區結構

描述

應從驅動程式的 v4l2_ioctl_ops->vidioc_prepare_buf ioctl 處理程式中呼叫。

此函式

  1. 驗證傳遞的緩衝區,

  2. 呼叫驅動程式中的 vb2_ops->buf_prepare 回撥(如果已提供),可以在其中執行特定於驅動程式的緩衝區初始化。

  3. 如果 b->request_fd 非零且 mdev->ops->req_queue 已設定,則將準備好的緩衝區繫結到請求。

此函式的返回值旨在直接從驅動程式中的 v4l2_ioctl_ops->vidioc_prepare_buf 處理程式返回。

int vb2_qbuf(struct vb2_queue *q, struct media_device *mdev, struct v4l2_buffer *b)

從使用者空間對緩衝區進行排隊

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct media_device *mdev

指向 struct media_device 的指標,可以為 NULL。

struct v4l2_buffer *b

從使用者空間傳遞給驅動程式中 v4l2_ioctl_ops->vidioc_qbuf 處理程式的緩衝區結構

描述

應從驅動程式的 v4l2_ioctl_ops->vidioc_qbuf 處理程式中呼叫。

此函式

  1. 驗證傳遞的緩衝區;

  2. 如果 b->request_fd 非零且 mdev->ops->req_queue 已設定,則將緩衝區繫結到請求。

  3. 如有必要,在驅動程式中呼叫 vb2_ops->buf_prepare 回撥(如果提供),可以在其中執行特定於驅動程式的緩衝區初始化;

  4. 如果流式傳輸已開啟,則透過 vb2_ops->buf_queue 回撥將緩衝區排隊到驅動程式中進行處理。

此函式的返回值旨在直接從驅動程式中的 v4l2_ioctl_ops->vidioc_qbuf 處理程式返回。

int vb2_expbuf(struct vb2_queue *q, struct v4l2_exportbuffer *eb)

將緩衝區匯出為檔案描述符

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct v4l2_exportbuffer *eb

從使用者空間傳遞到驅動程式中 v4l2_ioctl_ops->vidioc_expbuf 處理程式的匯出緩衝區結構

描述

此函式的返回值旨在直接從驅動程式中的 v4l2_ioctl_ops->vidioc_expbuf 處理程式返回。

int vb2_dqbuf(struct vb2_queue *q, struct v4l2_buffer *b, bool nonblocking)

將緩衝區出隊到使用者空間

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct v4l2_buffer *b

從使用者空間傳遞到驅動程式中 v4l2_ioctl_ops->vidioc_dqbuf 處理程式的緩衝區結構

bool nonblocking

如果為 true,則如果不存在準備好出隊的緩衝區,則此呼叫不會休眠等待緩衝區。通常,驅動程式會在此處傳遞 (file->f_flags & O_NONBLOCK)

描述

應從驅動程式的 v4l2_ioctl_ops->vidioc_dqbuf ioctl 處理程式中呼叫。

此函式

  1. 驗證傳遞的緩衝區;

  2. 呼叫驅動程式中的 vb2_ops->buf_finish 回撥(如果已提供),驅動程式可以在其中執行將緩衝區返回到使用者空間之前可能需要的任何其他操作,例如快取同步;

  3. 緩衝區結構成員填充了使用者空間的相關資訊。

此函式的返回值旨在直接從驅動程式中的 v4l2_ioctl_ops->vidioc_dqbuf 處理程式返回。

int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type)

開始流式傳輸

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

enum v4l2_buf_type type

從使用者空間傳遞給 vidioc_streamon 處理程式的型別引數,如 enum v4l2_buf_type 所定義。

描述

應從驅動程式的 v4l2_ioctl_ops->vidioc_streamon 處理程式中呼叫。

此函式

  1. 驗證當前狀態

  2. 將任何先前排隊的緩衝區傳遞給驅動程式並開始流式傳輸

此函式的返回值旨在直接從驅動程式中的 v4l2_ioctl_ops->vidioc_streamon 處理程式返回。

int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)

停止流傳輸

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

enum v4l2_buf_type type

從使用者空間傳遞到 vidioc_streamoff 處理程式的型別引數

描述

應該從驅動程式的 vidioc_streamoff 處理程式中呼叫。

此函式

  1. 驗證當前狀態,

  2. 停止流傳輸並取消佇列所有已排隊的緩衝區,包括之前傳遞給驅動程式的緩衝區(在等待驅動程式完成後)。

此呼叫可用於暫停播放。 此函式的返回值旨在直接從驅動程式中的 vidioc_streamoff 處理程式返回

int vb2_queue_init(struct vb2_queue *q)

初始化 videobuf2 佇列

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

描述

vb2_queue 結構應由驅動程式分配。 驅動程式負責清除其內容並在呼叫此函式之前為某些必需的條目設定初始值。 q->ops、q->mem_ops、q->type 和 q->io_modes 是強制性的。 有關更多資訊,請參閱 include/media/videobuf2-core.h 中的 struct vb2_queue 描述。

int vb2_queue_init_name(struct vb2_queue *q, const char *name)

使用名稱初始化 videobuf2 佇列

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

const char *name

佇列名稱

描述

此函式初始化 vb2_queue,與 vb2_queue_init() 完全相同,此外還設定佇列名稱。 佇列名稱用於日誌記錄目的,並且應在其所屬裝置的上下文中唯一地標識該佇列。 這對於將核心日誌訊息歸因於 m2m 裝置或處理多個佇列的其他裝置的正確佇列非常有用。

void vb2_queue_release(struct vb2_queue *q)

停止流式傳輸,釋放佇列並釋放記憶體

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

描述

此函式停止流傳輸並執行必要的清理,包括釋放影片緩衝區記憶體。 驅動程式負責釋放 vb2_queue 結構本身。

int vb2_queue_change_type(struct vb2_queue *q, unsigned int type)

更改非活動 vb2_queue 的型別

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

unsigned int type

要更改的型別 (V4L2_BUF_TYPE_VIDEO_*)

描述

此函式更改 vb2_queue 的型別。 只有當佇列不忙時(即未分配緩衝區)才有可能。

vb2_queue_change_type() 可用於支援使用同一佇列的多種緩衝區型別。 驅動程式可以實現 v4l2_ioctl_ops.vidioc_reqbufs 和 v4l2_ioctl_ops.vidioc_create_bufs 函式,並在呼叫 vb2_ioctl_reqbufs() 或 vb2_ioctl_create_bufs() 之前呼叫 vb2_queue_change_type(),從而“鎖定”緩衝區型別,直到緩衝區被釋放。

__poll_t vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)

實現 poll 使用者空間操作

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct file *file

傳遞給 poll 檔案操作處理程式的檔案引數

poll_table *wait

傳遞給 poll 檔案操作處理程式的 wait 引數

描述

此函式為驅動程式實現 poll 檔案操作處理程式。對於 CAPTURE 佇列,如果緩衝區準備好出隊,則會通知使用者空間影片裝置的檔案描述符可用於讀取。對於 OUTPUT 佇列,如果緩衝區準備好出隊,則檔案描述符將報告為可用於寫入。

如果驅動程式使用 struct v4l2_fh,則 vb2_poll() 還會檢查任何掛起的事件。

此函式的返回值旨在直接從驅動程式中的 poll 處理程式返回。

bool vb2_queue_is_busy(struct vb2_queue *q, struct file *file)

檢查佇列是否繁忙

引數

struct vb2_queue *q

指向帶有 videobuf2 佇列的 struct vb2_queue 的指標。

struct file *file

執行 vb2 佇列訪問的檔案

描述

如果佇列有所有者且所有者不是 file,則認為佇列繁忙。

佇列所有權由下面的一些 v4l2_ioctl_ops 幫助程式獲取和檢查。 驅動程式也可以直接使用此函式,當他們需要開啟程式碼 ioctl 處理程式時,例如在佇列所有權測試和對相應 vb2 操作的呼叫之間新增額外的檢查。

void vb2_video_unregister_device(struct video_device *vdev)

取消註冊影片裝置並釋放佇列

引數

struct video_device *vdev

指向 struct video_device 的指標

描述

如果驅動程式使用 vb2_fop_release()/_vb2_fop_release(),則應使用 vb2_video_unregister_device() 而不是 video_unregister_device()

此函式將呼叫 video_unregister_device(),然後在流傳輸正在進行時釋放 vb2_queue。 這將停止流傳輸,並且將簡化取消繫結序列,因為在此呼叫之後,所有子裝置也將停止流傳輸。

void vb2_ops_wait_prepare(struct vb2_queue *vq)

用於鎖定 struct vb2_queue 的輔助函式

引數

struct vb2_queue *vq

指向 struct vb2_queue 的指標

描述

..note:: 僅在 vq->lock 非 NULL 時使用。

void vb2_ops_wait_finish(struct vb2_queue *vq)

用於解鎖 struct vb2_queue 的輔助函式

引數

struct vb2_queue *vq

指向 struct vb2_queue 的指標

描述

..note:: 僅在 vq->lock 非 NULL 時使用。

struct vb2_vmarea_handler

常見的 vma refcount 跟蹤處理程式。

定義:

struct vb2_vmarea_handler {
    refcount_t *refcount;
    void (*put)(void *arg);
    void *arg;
};

成員

refcount

指向緩衝區中 refcount_t 條目的指標。

put

回撥以執行減少緩衝區 refcount 的函式。

arg

put 回撥的引數。