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 方法實現記憶體處理/記憶體分配器。
注意
USERPTR 型別的必需操作:get_userptr、put_userptr。
MMAP 型別的必需操作:alloc、put、num_users、mmap。
讀/寫訪問型別的必需操作:alloc、put、num_users、vaddr。
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此平面的私有資料。
dbufdma_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 同步,因此驅動程式可以訪問/修改緩衝區內容;驅動程式可以執行使用者空間訪問緩衝區之前所需的任何操作;可選。緩衝區狀態可以是以下之一:
DONE和ERROR在流式傳輸正在進行時發生,並且當佇列已取消並且所有掛起的緩衝區都返回到其預設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_DONE或VB2_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_qbufqbuf 直接用於此佇列。第一次呼叫時設定為 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_devsstruct device記憶體型別/分配器特定的每個平面裝置
引數
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。
-
void *vb2_plane_cookie(struct vb2_buffer *vb, unsigned int plane_no)¶
返回給定平面的分配器特定 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 狀態返回緩衝區,以將其放回佇列中。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。
描述
此函式旨在與掛起/恢復操作一起使用。它會丟棄所有“完成”的緩衝區,因為它們在恢復後請求時會太舊。
驅動程式必須停止硬體並與中斷處理程式和/或延遲工作同步,然後才能呼叫此函式,以確保驅動程式和/或硬體不會觸控任何緩衝區。
引數
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。
此函式
驗證從使用者空間傳遞的流式傳輸引數;
設定佇列;
與驅動程式協商在流式傳輸期間要使用的緩衝區數和每個緩衝區的平面數;
根據商定的引數,分配內部緩衝區結構(
struct vb2_buffer);對於 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。
此函式
驗證引數的合理性;
呼叫
vb2_ops->queue_setup佇列操作;執行任何必要的記憶體分配。
返回
成功時返回零;否則返回錯誤程式碼。
-
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 回撥(如果提供),可以在其中執行特定於驅動程式的緩衝區初始化。
返回
成功時返回零;否則返回錯誤程式碼。
引數
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。
此函式
如果 req 為非 NULL,則緩衝區將繫結到此媒體請求並返回。當請求本身排隊時,將準備緩衝區並將其排隊到驅動程式(即接下來的兩個步驟)。
如有必要,在驅動程式中呼叫
vb2_ops->buf_prepare回撥(如果提供),可以在其中執行特定於驅動程式的緩衝區初始化;如果流式傳輸已開啟,則透過
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。
此函式
在驅動程式中呼叫 buf_finish 回撥(如果提供),驅動程式可以在其中執行在將緩衝區返回給使用者空間之前可能需要的任何其他操作,例如快取同步,
緩衝區結構成員填充了使用者空間的相關資訊。
返回
成功時返回零;否則返回錯誤程式碼。
引數
struct vb2_queue *q指向
struct vb2_queue的指標,其中包含 videobuf2 佇列unsigned int type要啟動的佇列的型別。對於 V4L2,這由
enum v4l2_buf_type型別定義。
描述
Videobuf2 核心幫助程式來實現 VIDIOC_STREAMON() 操作。它由 VB2 透過特定於 API 的處理程式在內部呼叫,例如 videobuf2-v4l2.h。
返回
成功時返回零;否則返回錯誤程式碼。
引數
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。
返回
成功時返回零;否則返回錯誤程式碼。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。此結構應在驅動程式中分配
描述
vb2_queue 結構應由驅動程式分配。驅動程式負責清除其內容並在呼叫此函式之前為某些必需條目設定初始值。
注意
在呼叫此函式之前,應設定 q 中的以下欄位:vb2_queue->ops、vb2_queue->mem_ops、vb2_queue->type。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。
描述
此函式停止流式傳輸並執行必要的清理,包括釋放影片緩衝區記憶體。驅動程式負責釋放 struct vb2_queue 本身。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。
描述
標記發生了無法恢復的致命錯誤,並喚醒所有在佇列上等待的程序。輪詢現在將設定 EPOLLERR,排隊和出隊緩衝區將返回 -EIO。
取消佇列時,將清除錯誤標誌,無論是在 vb2_streamoff() 還是 vb2_queue_release() 中。因此,驅動程式不應在啟動流之前呼叫此函式,否則錯誤標誌將保持設定狀態,直到關閉裝置節點時釋放佇列。
引數
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 *waitpoll_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)
-
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 fncvb2_thread_fnc回撥函式。void *priv傳遞給回撥函式的 priv 指標。
const char *thread_name執行緒的名稱。此名稱將以 “vb2-” 為字首。
描述
這將啟動一個執行緒,該執行緒將排隊和出隊,直到發生錯誤或呼叫 vb2_thread_stop()。
注意
此函式不應用於 videobuf2-dvb 支援以外的任何用途。如果您認為對此有其他好的用例,請首先聯絡 linux-media 郵件列表。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。
描述
如果使用 read() 或 write() 來流式傳輸資料而不是流 I/O,則此函式返回 true。除了極少數情況外,這幾乎不是一個重要的區別。其中一種情況是,不允許使用 read() 或 write() 流式傳輸使用 V4L2_FIELD_ALTERNATE 的格式,因為無法將每個緩衝區的欄位資訊傳遞到使用者空間/從使用者空間傳遞。支援此欄位格式的驅動程式應在 vb2_ops->queue_setup 操作中檢查此情況,如果此函式返回 true,則拒絕它。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。
引數
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應返回其大小的平面號。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。
引數
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.h 中 struct 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 處理程式中呼叫。
此函式
驗證傳遞的緩衝區,
呼叫驅動程式中的
vb2_ops->buf_prepare回撥(如果已提供),可以在其中執行特定於驅動程式的緩衝區初始化。如果 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 處理程式中呼叫。
此函式
驗證傳遞的緩衝區;
如果 b->request_fd 非零且 mdev->ops->req_queue 已設定,則將緩衝區繫結到請求。
如有必要,在驅動程式中呼叫
vb2_ops->buf_prepare回撥(如果提供),可以在其中執行特定於驅動程式的緩衝區初始化;如果流式傳輸已開啟,則透過
vb2_ops->buf_queue回撥將緩衝區排隊到驅動程式中進行處理。
此函式的返回值旨在直接從驅動程式中的 v4l2_ioctl_ops->vidioc_qbuf 處理程式返回。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。struct v4l2_exportbuffer *eb從使用者空間傳遞到驅動程式中
v4l2_ioctl_ops->vidioc_expbuf處理程式的匯出緩衝區結構
描述
此函式的返回值旨在直接從驅動程式中的 v4l2_ioctl_ops->vidioc_expbuf 處理程式返回。
引數
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 處理程式中呼叫。
此函式
驗證傳遞的緩衝區;
呼叫驅動程式中的
vb2_ops->buf_finish回撥(如果已提供),驅動程式可以在其中執行將緩衝區返回到使用者空間之前可能需要的任何其他操作,例如快取同步;緩衝區結構成員填充了使用者空間的相關資訊。
此函式的返回值旨在直接從驅動程式中的 v4l2_ioctl_ops->vidioc_dqbuf 處理程式返回。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。enum v4l2_buf_type type從使用者空間傳遞給 vidioc_streamon 處理程式的型別引數,如
enum v4l2_buf_type所定義。
描述
應從驅動程式的 v4l2_ioctl_ops->vidioc_streamon 處理程式中呼叫。
此函式
驗證當前狀態
將任何先前排隊的緩衝區傳遞給驅動程式並開始流式傳輸
此函式的返回值旨在直接從驅動程式中的 v4l2_ioctl_ops->vidioc_streamon 處理程式返回。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。enum v4l2_buf_type type從使用者空間傳遞到 vidioc_streamoff 處理程式的型別引數
描述
應該從驅動程式的 vidioc_streamoff 處理程式中呼叫。
此函式
驗證當前狀態,
停止流傳輸並取消佇列所有已排隊的緩衝區,包括之前傳遞給驅動程式的緩衝區(在等待驅動程式完成後)。
此呼叫可用於暫停播放。 此函式的返回值旨在直接從驅動程式中的 vidioc_streamoff 處理程式返回
引數
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 描述。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。const char *name佇列名稱
描述
此函式初始化 vb2_queue,與 vb2_queue_init() 完全相同,此外還設定佇列名稱。 佇列名稱用於日誌記錄目的,並且應在其所屬裝置的上下文中唯一地標識該佇列。 這對於將核心日誌訊息歸因於 m2m 裝置或處理多個佇列的其他裝置的正確佇列非常有用。
引數
struct vb2_queue *q指向帶有 videobuf2 佇列的
struct vb2_queue的指標。
描述
此函式停止流傳輸並執行必要的清理,包括釋放影片緩衝區記憶體。 驅動程式負責釋放 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(),從而“鎖定”緩衝區型別,直到緩衝區被釋放。
引數
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 處理程式返回。
引數
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的輔助函式
-
void vb2_ops_wait_finish(struct vb2_queue *vq)¶
用於解鎖
struct vb2_queue的輔助函式
-
struct vb2_vmarea_handler¶
常見的 vma refcount 跟蹤處理程式。
定義:
struct vb2_vmarea_handler {
refcount_t *refcount;
void (*put)(void *arg);
void *arg;
};
成員
refcount指向緩衝區中
refcount_t條目的指標。put回撥以執行減少緩衝區 refcount 的函式。
argput 回撥的引數。