2.16.V4L2 videobuf2 functions and data structures¶
- enumvb2_memory¶
type of memory model used to make the buffers visible on userspace.
Constants
VB2_MEMORY_UNKNOWNBuffer status is unknown or it is not used yet onuserspace.
VB2_MEMORY_MMAPThe buffers are allocated by the Kernel and it ismemory mapped via mmap() ioctl. This model isalso used when the user is using the buffers viaread() or write() system calls.
VB2_MEMORY_USERPTRThe buffers was allocated in userspace and it ismemory mapped via mmap() ioctl.
VB2_MEMORY_DMABUFThe buffers are passed to userspace via DMA buffer.
- structvb2_mem_ops¶
memory handling/memory allocator operations.
Definition:
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);};Members
allocallocate video memory and, optionally, allocator private data,return
ERR_PTR()on failure or a pointer to allocator private,per-buffer data on success; the returned private structurewill then be passed asbuf_priv argument to other ops in thisstructure. The size argument to this function shall bepage aligned.putinform the allocator that the buffer will no longer be used;usually will result in the allocator freeing the buffer (ifno other users of this buffer are present); thebuf_privargument is the allocator private per-buffer structurepreviously returned from the alloc callback.
get_dmabufacquire userspace memory for a hardware operation; used forDMABUF memory types.
get_userptracquire userspace memory for a hardware operation; used forUSERPTR memory types; vaddr is the address passed to thevideobuf2 layer when queuing a video buffer of USERPTR type;should return an allocator private per-buffer structureassociated with the buffer on success,
ERR_PTR()on failure;the returned private structure will then be passed asbuf_privargument to other ops in this structure.put_userptrinform the allocator that a USERPTR buffer will no longerbe used.
preparecalled every time the buffer is passed from userspace to thedriver, useful for cache synchronisation, optional.
finishcalled every time the buffer is passed back from the driverto the userspace, also optional.
attach_dmabufattach a shared
structdma_buffor a hardware operation;used for DMABUF memory types; dev is the alloc devicedbuf is the shared dma_buf; returnsERR_PTR()on failure;allocator private per-buffer structure on success;this needs to be used for further accesses to the buffer.detach_dmabufinform the exporter of the buffer that the current DMABUFbuffer is no longer used; thebuf_priv argument is theallocator private per-buffer structure previously returnedfrom the attach_dmabuf callback.
map_dmabufrequest for access to the dmabuf from allocator; the allocatorof dmabuf is informed that this driver is going to use thedmabuf.
unmap_dmabufreleases access control to the dmabuf - allocator is notifiedthat this driver is done using the dmabuf for now.
vaddrreturn a kernel virtual address to a given memory bufferassociated with the passed private structure or NULL if nosuch mapping exists.
cookiereturn allocator specific cookie for a given memory bufferassociated with the passed private structure or NULL if notavailable.
num_usersreturn the current number of users of a memory buffer;return 1 if the videobuf2 layer (or actually the driver usingit) is the only user.
mmapsetup a userspace mapping for a given memory buffer underthe provided virtual memory region.
Description
Those operations are used by the videobuf2 core to implement the memoryhandling/memory allocators for each type of supported streaming I/O method.
Note
Required ops for USERPTR types: get_userptr, put_userptr.
Required ops for MMAP types: alloc, put, num_users, mmap.
Required ops for read/write access types: alloc, put, num_users, vaddr.
Required ops for DMABUF types: attach_dmabuf, detach_dmabuf,map_dmabuf, unmap_dmabuf.
- structvb2_plane¶
plane information.
Definition:
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;};Members
mem_privprivate data with this plane.
dbufdma_buf - shared buffer object.
dbuf_mappedflag to show whether dbuf is mapped or not
dbuf_duplicatedboolean to show whether dbuf is duplicated with aprevious plane of the buffer.
bytesusednumber of bytes occupied by data in the plane (payload).
lengthsize of this plane (NOT the payload) in bytes. The maximumvalid size is MAX_UINT - PAGE_SIZE.
min_lengthminimum required size of this plane (NOT the payload) in bytes.length is always greater or equal tomin_length, and likelength, it is limited to MAX_UINT - PAGE_SIZE.
mUnion with memtype-specific data.
m.offsetwhen memory in the associated
structvb2_bufferisVB2_MEMORY_MMAP, equals the offset from the start ofthe device memory for this plane (or is a “cookie” thatshould be passed to mmap() called on the video node).m.userptrwhen memory is
VB2_MEMORY_USERPTR, a userspace pointerpointing to this plane.m.fdwhen memory is
VB2_MEMORY_DMABUF, a userspace filedescriptor associated with this plane.data_offsetoffset in the plane to the start of data; usually 0,unless there is a header in front of the data.
Description
Should contain enough information to be able to cover all the fieldsofstructv4l2_plane at videodev2.h.
- enumvb2_io_modes¶
queue access methods.
Constants
VB2_MMAPdriver supports MMAP with streaming API.
VB2_USERPTRdriver supports USERPTR with streaming API.
VB2_READdriver supports read() style access.
VB2_WRITEdriver supports write() style access.
VB2_DMABUFdriver supports DMABUF with streaming API.
- enumvb2_buffer_state¶
current video buffer state.
Constants
VB2_BUF_STATE_DEQUEUEDbuffer under userspace control.
VB2_BUF_STATE_IN_REQUESTbuffer is queued in media request.
VB2_BUF_STATE_PREPARINGbuffer is being prepared in videobuf2.
VB2_BUF_STATE_QUEUEDbuffer queued in videobuf2, but not in driver.
VB2_BUF_STATE_ACTIVEbuffer queued in driver and possibly usedin a hardware operation.
VB2_BUF_STATE_DONEbuffer returned from driver to videobuf2, butnot yet dequeued to userspace.
VB2_BUF_STATE_ERRORsame as above, but the operation on the bufferhas ended with an error, which will be reportedto the userspace when it is dequeued.
- structvb2_buffer¶
represents a video buffer.
Definition:
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;};Members
vb2_queuepointer to
structvb2_queuewith the queue towhich this driver belongs.indexid number of the buffer.
typebuffer type.
memorythe method, in which the actual data is passed.
num_planesnumber of planes in the bufferon an internal driver queue.
timestampframe timestamp in ns.
requestthe request this buffer is associated with.
req_objused to bind this buffer to a request. Thisrequest object has a refcount.
- structvb2_ops¶
driver-specific callbacks.
Definition:
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);};Members
queue_setupcalled from
VIDIOC_REQBUFS()andVIDIOC_CREATE_BUFS()handlers before memory allocation. It can be calledtwice: if the original number of requested bufferscould not be allocated, then it will be called asecond time with the actually allocated number ofbuffers to verify if that is OK.The driver should return the required number of buffersin *num_buffers, the required number of planes perbuffer in *num_planes, the size of each plane should beset in the sizes[] array and optional per-planeallocator specific device in the alloc_devs[] array.When called fromVIDIOC_REQBUFS(), *num_planes == 0,the driver has to use the currently configured format todetermine the plane sizes and *num_buffers is the totalnumber of buffers that are being allocated. When calledfromVIDIOC_CREATE_BUFS(), *num_planes != 0 and itdescribes the requested number of planes and sizes[]contains the requested plane sizes. In this case*num_buffers are being allocated additionally tothe buffers already allocated. If either *num_planesor the requested sizes are invalid callback must return-EINVAL.wait_preparerelease any locks taken while calling vb2 functions;it is called before an ioctl needs to wait for a newbuffer to arrive; required to avoid a deadlock inblocking access type.
wait_finishreacquire all locks released in the previous callback;required to continue operation after sleeping whilewaiting for a new buffer to arrive.
buf_out_validatecalled when the output buffer is prepared or queuedto a request; drivers can use this to validateuserspace-provided information; this is required onlyfor OUTPUT queues.
buf_initcalled once after allocating a buffer (in MMAP case)or after acquiring a new USERPTR buffer; drivers mayperform additional buffer-related initialization;initialization failure (return != 0) will preventqueue setup from completing successfully; optional.
buf_preparecalled every time the buffer is queued from userspaceand from the
VIDIOC_PREPARE_BUF()ioctl; drivers mayperform any initialization required before eachhardware operation in this callback; drivers canaccess/modify the buffer here as it is still synced forthe CPU; drivers that supportVIDIOC_CREATE_BUFS()mustalso validate the buffer size; if an error is returned,the buffer will not be queued in driver; optional.buf_finishcalled before every dequeue of the buffer back touserspace; the buffer is synced for the CPU, so driverscan access/modify the buffer contents; drivers mayperform any operations required before userspaceaccesses the buffer; optional. The buffer state can beone of the following:
DONEandERRORoccur whilestreaming is in progress, and thePREPAREDstate occurswhen the queue has been canceled and all pendingbuffers are being returned to their defaultDEQUEUEDstate. Typically you only have to do something if thestate isVB2_BUF_STATE_DONE, since in all other casesthe buffer contents will be ignored anyway.buf_cleanupcalled once before the buffer is freed; drivers mayperform any additional cleanup; optional.
prepare_streamingcalled once to prepare for ‘streaming’ state; this iswhere validation can be done to verify everything isokay and streaming resources can be claimed. It iscalled when the VIDIOC_STREAMON ioctl is called. Theactual streaming starts whenstart_streaming is called.Optional.
start_streamingcalled once to enter ‘streaming’ state; the driver mayreceive buffers withbuf_queue callbackbeforestart_streaming is called; the driver gets thenumber of already queued buffers in count parameter;driver can return an error if hardware fails, in thatcase all buffers that have been already given bythebuf_queue callback are to be returned by the driverby calling
vb2_buffer_done()withVB2_BUF_STATE_QUEUED.If you need a minimum number of buffers before you canstart streaming, then setvb2_queue->min_queued_buffers. If that is non-zerothenstart_streaming won’t be called until at leastthat many buffers have been queued up by userspace.stop_streamingcalled when ‘streaming’ state must be disabled; drivershould stop any DMA transactions or wait until theyfinish and give back all buffers it got from
buf_queuecallback by callingvb2_buffer_done()with eitherVB2_BUF_STATE_DONEorVB2_BUF_STATE_ERROR; may usevb2_wait_for_all_buffers()functionunprepare_streamingcalled as counterpart toprepare_streaming; any claimedstreaming resources can be released here. It iscalled when the VIDIOC_STREAMOFF ioctls is called orwhen the streaming filehandle is closed. Optional.
buf_queuepasses buffer vb to the driver; driver may starthardware operation on this buffer; driver should givethe buffer back by calling
vb2_buffer_done()function;it is always called after callingVIDIOC_STREAMON()ioctl; might be called beforestart_streaming callbackif user pre-queued buffers before callingVIDIOC_STREAMON().buf_request_completea buffer that was never queued to the driver but isassociated with a queued request was canceled.The driver will have to mark associated objects in therequest as completed; required if requests aresupported.
Description
These operations are not called from interrupt context except wherementioned specifically.
- structvb2_buf_ops¶
driver-specific callbacks.
Definition:
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);};Members
verify_planes_arrayVerify that a given user space structure containsenough planes for the buffer. This is calledfor each dequeued buffer.
init_buffergiven a
vb2_bufferinitialize the extra data afterstructvb2_buffer.For V4L2 this is astructvb2_v4l2_buffer.fill_user_buffergiven a
vb2_bufferfill in the userspace structure.For V4L2 this is astructv4l2_buffer.fill_vb2_buffergiven a userspace structure, fill in the
vb2_buffer.If the userspace structure is invalid, then this opwill return an error.copy_timestampcopy the timestamp from a userspace structure tothe
structvb2_buffer.
- structvb2_queue¶
a videobuf2 queue.
Definition:
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];};Members
typeprivate buffer type whose content is defined by the vb2-corecaller. For example, for V4L2, it should matchthe types defined on
enumv4l2_buf_type.io_modessupported io methods (see
enumvb2_io_modes).devdevice to use for the default allocation context if the driverdoesn’t fill in thealloc_devs array.
dma_attrsDMA attributes to use for the DMA.
bidirectionalwhen this flag is set the DMA direction for the buffers ofthis queue will be overridden with
DMA_BIDIRECTIONALdirection.This is useful in cases where the hardware (firmware) writes toa buffer which is mapped as read (DMA_TO_DEVICE), or reads frombuffer which is mapped for write (DMA_FROM_DEVICE) in orderto satisfy some internal hardware restrictions or adds a paddingneeded by the processing algorithm. In case the DMA mapping isnot bidirectional but the hardware (firmware) trying to accessthe buffer (in the opposite direction) this could lead to anIOMMU protection faults.fileio_read_oncereport EOF after reading the first buffer
fileio_write_immediatelyqueue buffer after each write() call
allow_zero_bytesusedallow bytesused == 0 to be passed to the driver
quirk_poll_must_check_waiting_for_buffersReturn
EPOLLERRat poll when QBUFhas not been called. This is a vb1 idiom that has been adoptedalso by vb2.supports_requeststhis queue supports the Request API.
requires_requeststhis queue requires the Request API. If this is set to 1,then supports_requests must be set to 1 as well.
uses_qbufqbuf was used directly for this queue. Set to 1 the firsttime this is called. Set to 0 when the queue is canceled.If this is 1, then you cannot queue buffers from a request.
uses_requestsrequests are used for this queue. Set to 1 the first timea request is queued. Set to 0 when the queue is canceled.If this is 1, then you cannot queue buffers directly.
allow_cache_hintswhen set user-space can pass cache management hints inorder to skip cache flush/invalidation on ->
prepare()or/and->finish().non_coherent_memwhen set queue will attempt to allocate buffers usingnon-coherent memory.
lockpointer to a mutex that protects the
structvb2_queue. Thedriver can set this to a mutex to let the v4l2 core serializethe queuing ioctls. If the driver wants to handle lockingitself, then this should be set to NULL. This lock is not usedby the videobuf2 core API.ownerThe filehandle that ‘owns’ the buffers, i.e. the filehandlethat called reqbufs, create_buffers or started fileio.This field is not used by the videobuf2 core API, but it allowsdrivers to easily associate an owner filehandle with the queue.
opsdriver-specific callbacks
mem_opsmemory allocator specific callbacks
buf_opscallbacks to deliver buffer information.between user-space and kernel-space.
drv_privdriver private data.
subsystem_flagsFlags specific to the subsystem (V4L2/DVB/etc.). Not usedby the vb2 core.
buf_struct_sizesize of the driver-specific buffer structure;“0” indicates the driver doesn’t want to use a custom bufferstructure type. In that case a subsystem-specific
structwillbe used (in the case of V4L2 that issizeof(structvb2_v4l2_buffer)). The first field of thedriver-specific buffer structure must be the subsystem-specificstruct (vb2_v4l2_buffer in the case of V4L2).timestamp_flagsTimestamp flags;
V4L2_BUF_FLAG_TIMESTAMP_*andV4L2_BUF_FLAG_TSTAMP_SRC_*gfp_flagsadditional gfp flags used when allocating the buffers.Typically this is 0, but it may be e.g.
GFP_DMAor__GFP_DMA32to force the buffer allocation to a specific memory zone.min_queued_buffersthe minimum number of queued buffers needed beforestart_streaming can be called. Used when a DMA enginecannot be started unless at least this number of buffershave been queued into the driver.VIDIOC_REQBUFS will ensure at leastmin_queued_buffers + 1buffers will be allocated. Note that VIDIOC_CREATE_BUFS will notmodify the requested buffer count.
min_reqbufs_allocationthe minimum number of buffers to be allocated whencalling VIDIOC_REQBUFS. Note that VIDIOC_CREATE_BUFS willnotmodify the requested buffer count and does not use this field.Drivers can set this if there has to be a certain number ofbuffers available for the hardware to work effectively.This allows calling VIDIOC_REQBUFS with a buffer count of 1 andit will be automatically adjusted to a workable buffer count.If set, thenmin_reqbufs_allocation must be larger thanmin_queued_buffers + 1.If this field is > 3, then it is highly recommended that thedriver implements the V4L2_CID_MIN_BUFFERS_FOR_CAPTURE/OUTPUTcontrol.
alloc_devsstructdevicememory type/allocator-specific per-plane device
- boolvb2_queue_allows_cache_hints(structvb2_queue*q)¶
Return true if the queue allows cache and memory consistency hints.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue
- void*vb2_plane_vaddr(structvb2_buffer*vb,unsignedintplane_no)¶
Return a kernel virtual address of a given plane.
Parameters
structvb2_buffer*vbpointer to
structvb2_bufferto which the plane inquestion belongs to.unsignedintplane_noplane number for which the address is to be returned.
Description
This function returns a kernel virtual address of a given plane ifsuch a mapping exist, NULL otherwise.
- void*vb2_plane_cookie(structvb2_buffer*vb,unsignedintplane_no)¶
Return allocator specific cookie for the given plane.
Parameters
structvb2_buffer*vbpointer to
structvb2_bufferto which the plane inquestion belongs to.unsignedintplane_noplane number for which the cookie is to be returned.
Description
This function returns an allocator specific cookie for a given plane ifavailable, NULL otherwise. The allocator should provide some simple staticinline function, which would convert this cookie to the allocator specifictype that can be used directly by the driver to access the buffer. This canbe for example physical address, pointer to scatter list or IOMMU mapping.
- voidvb2_buffer_done(structvb2_buffer*vb,enumvb2_buffer_statestate)¶
inform videobuf2 that an operation on a buffer is finished.
Parameters
structvb2_buffer*vbpointer to
structvb2_bufferto be used.enumvb2_buffer_statestatestate of the buffer, as defined by
enumvb2_buffer_state.EitherVB2_BUF_STATE_DONEif the operation finishedsuccessfully,VB2_BUF_STATE_ERRORif the operation finishedwith an error orVB2_BUF_STATE_QUEUED.
Description
This function should be called by the driver after a hardware operation ona buffer is finished and the buffer may be returned to userspace. The drivercannot use this buffer anymore until it is queued back to it by videobufby the means ofvb2_ops->buf_queue callback. Only buffers previously queuedto the driver byvb2_ops->buf_queue can be passed to this function.
While streaming a buffer can only be returned in state DONE or ERROR.Thevb2_ops->start_streaming op can also return them in case the DMA enginecannot be started for some reason. In that case the buffers should bereturned with state QUEUED to put them back into the queue.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Description
This function is intended to be used with suspend/resume operations. Itdiscards all ‘done’ buffers as they would be too old to be requested afterresume.
Drivers must stop the hardware and synchronize with interrupt handlers and/ordelayed works before calling this function to make sure no buffer will betouched by the driver and/or hardware.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Description
This function will wait until all buffers that have been given to the driverbyvb2_ops->buf_queue are given back to vb2 withvb2_buffer_done(). Itdoesn’t callvb2_ops->wait_prepare/vb2_ops->wait_finish pair.It is intended to be called with all locks taken, for example fromvb2_ops->stop_streaming callback.
- voidvb2_core_querybuf(structvb2_queue*q,structvb2_buffer*vb,void*pb)¶
query video buffer information.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structvb2_buffer*vbpointer to struct
vb2_buffer.void*pbbuffer
structpassedfrom userspace.
Description
Videobuf2 core helper to implementVIDIOC_QUERYBUF() operation. It is calledinternally by VB2 by an API-specific handler, likevideobuf2-v4l2.h.
The passed buffer should have been verified.
This function fills the relevant information for the userspace.
Return
returns zero on success; an error code otherwise.
- intvb2_core_reqbufs(structvb2_queue*q,enumvb2_memorymemory,unsignedintflags,unsignedint*count)¶
Initiate streaming.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.enumvb2_memorymemorymemory type, as defined by
enumvb2_memory.unsignedintflagsauxiliary queue/buffer management flags. Currently, the onlyused flag is
V4L2_MEMORY_FLAG_NON_COHERENT.unsignedint*countrequested buffer count.
Description
Videobuf2 core helper to implementVIDIOC_REQBUF() operation. It is calledinternally by VB2 by an API-specific handler, likevideobuf2-v4l2.h.
This function:
verifies streaming parameters passed from the userspace;
sets up the queue;
negotiates number of buffers and planes per buffer with the driverto be used during streaming;
allocates internal buffer structures (
structvb2_buffer), according tothe agreed parameters;for MMAP memory type, allocates actual video memory, using thememory handling/allocation routines provided during queue initialization.
If req->count is 0, all the memory will be freed instead.
If the queue has been allocated previously by a previousvb2_core_reqbufs()call and the queue is not busy, memory will be reallocated.
Return
returns zero on success; an error code otherwise.
- intvb2_core_create_bufs(structvb2_queue*q,enumvb2_memorymemory,unsignedintflags,unsignedint*count,unsignedintrequested_planes,constunsignedintrequested_sizes[],unsignedint*first_index)¶
Allocate buffers and any required auxiliary structs
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.enumvb2_memorymemorymemory type, as defined by
enumvb2_memory.unsignedintflagsauxiliary queue/buffer management flags.
unsignedint*countrequested buffer count.
unsignedintrequested_planesnumber of planes requested.
constunsignedintrequested_sizes[]array with the size of the planes.
unsignedint*first_indexindex of the first created buffer, all allocated buffers haveindices in the range [first_index..first_index+count-1]
Description
Videobuf2 core helper to implementVIDIOC_CREATE_BUFS() operation. It iscalled internally by VB2 by an API-specific handler, likevideobuf2-v4l2.h.
This function:
verifies parameter sanity;
calls the
vb2_ops->queue_setupqueue operation;performs any necessary memory allocations.
Return
returns zero on success; an error code otherwise.
- intvb2_core_prepare_buf(structvb2_queue*q,structvb2_buffer*vb,void*pb)¶
Pass ownership of a buffer from userspace to the kernel.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structvb2_buffer*vbpointer to struct
vb2_buffer.void*pbbuffer structure passed from userspace to
v4l2_ioctl_ops->vidioc_prepare_bufhandler in driver.
Description
Videobuf2 core helper to implementVIDIOC_PREPARE_BUF() operation. It iscalled internally by VB2 by an API-specific handler, likevideobuf2-v4l2.h.
The passed buffer should have been verified.
This function calls vb2_ops->buf_prepare callback in the driver(if provided), in which driver-specific buffer initialization canbe performed.
Return
returns zero on success; an error code otherwise.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.unsignedintstartfirst index of the range of buffers to remove.
unsignedintcountnumber of buffers to remove.
Return
returns zero on success; an error code otherwise.
- intvb2_core_qbuf(structvb2_queue*q,structvb2_buffer*vb,void*pb,structmedia_request*req)¶
Queue a buffer from userspace
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structvb2_buffer*vbpointer to struct
vb2_buffer.void*pbbuffer structure passed from userspace tov4l2_ioctl_ops->vidioc_qbuf handler in driver
structmedia_request*reqpointer to
structmedia_request, may be NULL.
Description
Videobuf2 core helper to implementVIDIOC_QBUF() operation. It is calledinternally by VB2 by an API-specific handler, likevideobuf2-v4l2.h.
This function:
Ifreq is non-NULL, then the buffer will be bound to thismedia request and it returns. The buffer will be prepared andqueued to the driver (i.e. the next two steps) when the requestitself is queued.
if necessary, calls
vb2_ops->buf_preparecallback in the driver(if provided), in which driver-specific buffer initialization canbe performed;if streaming is on, queues the buffer in driver by the means of
vb2_ops->buf_queuecallback for processing.
Return
returns zero on success; an error code otherwise.
- intvb2_core_dqbuf(structvb2_queue*q,unsignedint*pindex,void*pb,boolnonblocking)¶
Dequeue a buffer to the userspace
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queueunsignedint*pindexpointer to the buffer index. May be NULL
void*pbbuffer structure passed from userspace tov4l2_ioctl_ops->vidioc_dqbuf handler in driver.
boolnonblockingif true, this call will not sleep waiting for a buffer if nobuffers ready for dequeuing are present. Normally the driverwould be passing (file->f_flags & O_NONBLOCK) here.
Description
Videobuf2 core helper to implementVIDIOC_DQBUF() operation. It is calledinternally by VB2 by an API-specific handler, likevideobuf2-v4l2.h.
This function:
calls buf_finish callback in the driver (if provided), in whichdriver can perform any additional operations that may be required beforereturning the buffer to userspace, such as cache sync,
the buffer
structmembersare filled with relevant information forthe userspace.
Return
returns zero on success; an error code otherwise.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queueunsignedinttypetype of the queue to be started.For V4L2, this is defined by
enumv4l2_buf_typetype.
Description
Videobuf2 core helper to implementVIDIOC_STREAMON() operation. It is calledinternally by VB2 by an API-specific handler, likevideobuf2-v4l2.h.
Return
returns zero on success; an error code otherwise.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queueunsignedinttypetype of the queue to be started.For V4L2, this is defined by
enumv4l2_buf_typetype.
Description
Videobuf2 core helper to implementVIDIOC_STREAMOFF() operation. It iscalled internally by VB2 by an API-specific handler, likevideobuf2-v4l2.h.
Return
returns zero on success; an error code otherwise.
- intvb2_core_expbuf(structvb2_queue*q,int*fd,unsignedinttype,structvb2_buffer*vb,unsignedintplane,unsignedintflags)¶
Export a buffer as a file descriptor.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.int*fdpointer to the file descriptor associated with DMABUF(set by driver).
unsignedinttypebuffer type.
structvb2_buffer*vbpointer to struct
vb2_buffer.unsignedintplaneindex of the plane to be exported, 0 for single plane queues
unsignedintflagsfile flags for newly created file, as defined atinclude/uapi/asm-generic/fcntl.h.Currently, the only used flag is
O_CLOEXEC.is supported, refer to manual of open syscall for more details.
Description
Videobuf2 core helper to implementVIDIOC_EXPBUF() operation. It is calledinternally by VB2 by an API-specific handler, likevideobuf2-v4l2.h.
Return
returns zero on success; an error code otherwise.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.This structure should be allocated in driver
Description
Thevb2_queue structure should be allocated by the driver. The driver isresponsible of clearing it’s content and setting initial values for somerequired entries before calling this function.
Note
The following fields atq should be set before calling this function:vb2_queue->ops,vb2_queue->mem_ops,vb2_queue->type.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Description
This function stops streaming and performs necessary clean ups, includingfreeing video buffer memory. The driver is responsible for freeingthestructvb2_queue itself.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Description
Flag that a fatal unrecoverable error has occurred and wake up all processeswaiting on the queue. Polling will now setEPOLLERR and queuing and dequeuingbuffers will return-EIO.
The error flag will be cleared when canceling the queue, either fromvb2_streamoff() orvb2_queue_release(). Drivers should thus not call thisfunction before starting the stream, otherwise the error flag will remain setuntil the queue is released when closing the device node.
- intvb2_mmap(structvb2_queue*q,structvm_area_struct*vma)¶
map video buffers into application address space.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structvm_area_struct*vmapointer to
structvm_area_structwith the vma passedto the mmap file operation handler in the driver.
Description
Should be called from mmap file operation handler of a driver.This function maps one plane of one of the available video buffers touserspace. To map whole video memory allocated on reqbufs, this functionhas to be called once per each plane per each buffer previously allocated.
When the userspace application calls mmap, it passes to it an offset returnedto it earlier by the means ofv4l2_ioctl_ops->vidioc_querybuf handler.That offset acts as a “cookie”, which is then used to identify the planeto be mapped.
This function finds a plane with a matching offset and a mapping is performedby the means of a provided memory operation.
The return values from this function are intended to be directly returnedfrom the mmap handler in driver.
- unsignedlongvb2_get_unmapped_area(structvb2_queue*q,unsignedlongaddr,unsignedlonglen,unsignedlongpgoff,unsignedlongflags)¶
map video buffers into application address space.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.unsignedlongaddrmemory address.
unsignedlonglenbuffer size.
unsignedlongpgoffpage offset.
unsignedlongflagsmemory flags.
Description
This function is used in noMMU platforms to propose address mappingfor a given buffer. It’s intended to be used as a handler for thefile_operations->get_unmapped_area operation.
This is called by the mmap() syscall routines will call thisto get a proposed address for the mapping, when!CONFIG_MMU.
- __poll_tvb2_core_poll(structvb2_queue*q,structfile*file,poll_table*wait)¶
implements poll
syscall()logic.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structfile*filestructfileargument passed to the pollfile operation handler.poll_table*waitpoll_tablewait argument passed to the pollfile operation handler.
Description
This function implements poll file operation handler for a driver.For CAPTURE queues, if a buffer is ready to be dequeued, the userspace willbe informed that the file descriptor of a video device is available forreading.For OUTPUT queues, if a buffer is ready to be dequeued, the file descriptorwill be reported as available for writing.
The return values from this function are intended to be directly returnedfrom poll handler in driver.
- size_tvb2_read(structvb2_queue*q,char__user*data,size_tcount,loff_t*ppos,intnonblock)¶
implements read() syscall logic.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.char__user*datapointed to target userspace buffer
size_tcountnumber of bytes to read
loff_t*pposfile handle position tracking pointer
intnonblockmode selector (1 means blocking calls, 0 means nonblocking)
- size_tvb2_write(structvb2_queue*q,constchar__user*data,size_tcount,loff_t*ppos,intnonblock)¶
implements write() syscall logic.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.constchar__user*datapointed to target userspace buffer
size_tcountnumber of bytes to write
loff_t*pposfile handle position tracking pointer
intnonblockmode selector (1 means blocking calls, 0 means nonblocking)
- vb2_thread_fnc¶
Typedef: callback function for use with vb2_thread.
Syntax
intvb2_thread_fnc(structvb2_buffer*vb,void*priv)
Parameters
structvb2_buffer*vbpointer to struct
vb2_buffer.void*privpointer to a private data.
Description
This is called whenever a buffer is dequeued in the thread.
- intvb2_thread_start(structvb2_queue*q,vb2_thread_fncfnc,void*priv,constchar*thread_name)¶
start a thread for the given queue.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.vb2_thread_fncfncvb2_thread_fnccallback function.void*privpriv pointer passed to the callback function.
constchar*thread_namethe name of the thread. This will be prefixed with “vb2-“.
Description
This starts a thread that will queue and dequeue until an error occursorvb2_thread_stop() is called.
Attention
This function should not be used for anything else but the videobuf2-dvbsupport. If you think you have another good use-case for this, then pleasecontact the linux-media mailing list first.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Description
This returns true if read() or write() is used to stream the dataas opposed to stream I/O. This is almost never an important distinction,except in rare cases. One such case is that using read() or write() tostream a format usingV4L2_FIELD_ALTERNATE is not allowed since thereis no way you can pass the field information of each buffer to/fromuserspace. A driver that supports this field format should check forthis in thevb2_ops->queue_setup op and reject it if this function returnstrue.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Description
This function checks if queue has any buffers allocated.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
- voidvb2_set_plane_payload(structvb2_buffer*vb,unsignedintplane_no,unsignedlongsize)¶
set bytesused for the planeplane_no.
Parameters
structvb2_buffer*vbpointer to
structvb2_bufferto which the plane inquestion belongs to.unsignedintplane_noplane number for which payload should be set.
unsignedlongsizepayload in bytes.
- unsignedlongvb2_get_plane_payload(structvb2_buffer*vb,unsignedintplane_no)¶
get bytesused for the plane plane_no
Parameters
structvb2_buffer*vbpointer to
structvb2_bufferto which the plane inquestion belongs to.unsignedintplane_noplane number for which payload should be set.
- unsignedlongvb2_plane_size(structvb2_buffer*vb,unsignedintplane_no)¶
return plane size in bytes.
Parameters
structvb2_buffer*vbpointer to
structvb2_bufferto which the plane inquestion belongs to.unsignedintplane_noplane number for which size should be returned.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
- structvb2_buffer*vb2_get_buffer(structvb2_queue*q,unsignedintindex)¶
get a buffer from a queue
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.unsignedintindexbuffer index
Description
This function obtains a buffer from a queue, by its index.Keep in mind that there is no refcounting involved in thisoperation, so the buffer lifetime should be taken intoconsideration.
- boolvb2_buffer_in_use(structvb2_queue*q,structvb2_buffer*vb)¶
return true if the buffer is in use and the queue cannot be freed (by the means of VIDIOC_REQBUFS(0)) call.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structvb2_buffer*vbbuffer for which plane size should be returned.
- intvb2_verify_memory_type(structvb2_queue*q,enumvb2_memorymemory,unsignedinttype)¶
Check whether the memory type and buffer type passed to a buffer operation are compatible with the queue.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.enumvb2_memorymemorymemory model, as defined by enum
vb2_memory.unsignedinttypeprivate buffer type whose content is defined by the vb2-corecaller. For example, for V4L2, it should matchthe types defined on enum
v4l2_buf_type.
- boolvb2_request_object_is_buffer(structmedia_request_object*obj)¶
return true if the object is a buffer
Parameters
structmedia_request_object*objthe request object.
- unsignedintvb2_request_buffer_cnt(structmedia_request*req)¶
return the number of buffers in the request
Parameters
structmedia_request*reqthe request.
- structvb2_v4l2_buffer¶
video buffer information for v4l2.
Definition:
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];};Members
vb2_bufembedded struct
vb2_buffer.flagsbuffer informational flags.
fieldfield order of the image in the buffer, as defined by
enumv4l2_field.timecodeframe timecode.
sequencesequence count of this frame.
request_fdthe request_fd associated with this buffer
is_heldif true, then this capture buffer was held
planesplane information (userptr/fd, length, bytesused, data_offset).
Description
Should contain enough information to be able to cover all the fieldsofstructv4l2_buffer atvideodev2.h.
- structvb2_buffer*vb2_find_buffer(structvb2_queue*q,u64timestamp)¶
Find a buffer with given timestamp
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.u64timestampthe timestamp to find.
Description
Returns the buffer with the giventimestamp, or NULL if not found.
- intvb2_reqbufs(structvb2_queue*q,structv4l2_requestbuffers*req)¶
Wrapper for
vb2_core_reqbufs()that also verifies the memory and type values.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structv4l2_requestbuffers*reqstructv4l2_requestbufferspassed from userspace tov4l2_ioctl_ops->vidioc_reqbufshandler in driver.
- intvb2_create_bufs(structvb2_queue*q,structv4l2_create_buffers*create)¶
Wrapper for
vb2_core_create_bufs()that also verifies the memory and type values.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structv4l2_create_buffers*createcreation parameters, passed from userspace to
v4l2_ioctl_ops->vidioc_create_bufshandler in driver
- intvb2_prepare_buf(structvb2_queue*q,structmedia_device*mdev,structv4l2_buffer*b)¶
Pass ownership of a buffer from userspace to the kernel
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structmedia_device*mdevpointer to
structmedia_device, may be NULL.structv4l2_buffer*bbuffer structure passed from userspace to
v4l2_ioctl_ops->vidioc_prepare_bufhandler in driver
Description
Should be called fromv4l2_ioctl_ops->vidioc_prepare_buf ioctl handlerof a driver.
This function:
verifies the passed buffer,
calls
vb2_ops->buf_preparecallback in the driver (if provided),in which driver-specific buffer initialization can be performed.ifb->request_fd is non-zero andmdev->ops->req_queue is set,then bind the prepared buffer to the request.
The return values from this function are intended to be directly returnedfromv4l2_ioctl_ops->vidioc_prepare_buf handler in driver.
- intvb2_qbuf(structvb2_queue*q,structmedia_device*mdev,structv4l2_buffer*b)¶
Queue a buffer from userspace
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structmedia_device*mdevpointer to
structmedia_device, may be NULL.structv4l2_buffer*bbuffer structure passed from userspace to
v4l2_ioctl_ops->vidioc_qbufhandler in driver
Description
Should be called fromv4l2_ioctl_ops->vidioc_qbuf handler of a driver.
This function:
verifies the passed buffer;
ifb->request_fd is non-zero andmdev->ops->req_queue is set,then bind the buffer to the request.
if necessary, calls
vb2_ops->buf_preparecallback in the driver(if provided), in which driver-specific buffer initialization canbe performed;if streaming is on, queues the buffer in driver by the means of
vb2_ops->buf_queuecallback for processing.
The return values from this function are intended to be directly returnedfromv4l2_ioctl_ops->vidioc_qbuf handler in driver.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structv4l2_exportbuffer*ebexport buffer structure passed from userspace to
v4l2_ioctl_ops->vidioc_expbufhandler in driver
Description
The return values from this function are intended to be directly returnedfromv4l2_ioctl_ops->vidioc_expbuf handler in driver.
- intvb2_dqbuf(structvb2_queue*q,structv4l2_buffer*b,boolnonblocking)¶
Dequeue a buffer to the userspace
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structv4l2_buffer*bbuffer structure passed from userspace to
v4l2_ioctl_ops->vidioc_dqbufhandler in driverboolnonblockingif true, this call will not sleep waiting for a buffer if nobuffers ready for dequeuing are present. Normally the driverwould be passing (
file->f_flags&O_NONBLOCK) here
Description
Should be called fromv4l2_ioctl_ops->vidioc_dqbuf ioctl handlerof a driver.
This function:
verifies the passed buffer;
calls
vb2_ops->buf_finishcallback in the driver (if provided), in whichdriver can perform any additional operations that may be required beforereturning the buffer to userspace, such as cache sync;the buffer
structmembersare filled with relevant information forthe userspace.
The return values from this function are intended to be directly returnedfromv4l2_ioctl_ops->vidioc_dqbuf handler in driver.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.enumv4l2_buf_typetypetype argument passed from userspace to vidioc_streamon handler,as defined by
enumv4l2_buf_type.
Description
Should be called fromv4l2_ioctl_ops->vidioc_streamon handler of a driver.
This function:
verifies current state
passes any previously queued buffers to the driver and starts streaming
The return values from this function are intended to be directly returnedfromv4l2_ioctl_ops->vidioc_streamon handler in the driver.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.enumv4l2_buf_typetypetype argument passed from userspace to vidioc_streamoff handler
Description
Should be called from vidioc_streamoff handler of a driver.
This function:
verifies current state,
stop streaming and dequeues any queued buffers, including those previouslypassed to the driver (after waiting for the driver to finish).
This call can be used for pausing playback.The return values from this function are intended to be directly returnedfrom vidioc_streamoff handler in the driver
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Description
The vb2_queue structure should be allocated by the driver. The driver isresponsible of clearing it’s content and setting initial values for somerequired entries before calling this function.q->ops, q->mem_ops, q->type and q->io_modes are mandatory. Please referto thestructvb2_queue description in include/media/videobuf2-core.hfor more information.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.constchar*namethe queue name
Description
This function initializes the vb2_queue exactly likevb2_queue_init(),and additionally sets the queue name. The queue name is used for loggingpurpose, and should uniquely identify the queue within the context of thedevice it belongs to. This is useful to attribute kernel log messages to theright queue for m2m devices or other devices that handle multiple queues.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.
Description
This function stops streaming and performs necessary clean ups, includingfreeing video buffer memory. The driver is responsible for freeingthe vb2_queue structure itself.
- intvb2_queue_change_type(structvb2_queue*q,unsignedinttype)¶
change the type of an inactive vb2_queue
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.unsignedinttypethe type to change to (V4L2_BUF_TYPE_VIDEO_*)
Description
This function changes the type of the vb2_queue. This is only possibleif the queue is not busy (i.e. no buffers have been allocated).
vb2_queue_change_type() can be used to support multiple buffer types usingthe same queue. The driver can implement v4l2_ioctl_ops.vidioc_reqbufs andv4l2_ioctl_ops.vidioc_create_bufs functions and callvb2_queue_change_type()before callingvb2_ioctl_reqbufs() orvb2_ioctl_create_bufs(), and thus“lock” the buffer type until the buffers have been released.
- __poll_tvb2_poll(structvb2_queue*q,structfile*file,poll_table*wait)¶
implements poll userspace operation
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structfile*filefile argument passed to the poll file operation handler
poll_table*waitwait argument passed to the poll file operation handler
Description
This function implements poll file operation handler for a driver.For CAPTURE queues, if a buffer is ready to be dequeued, the userspace willbe informed that the file descriptor of a video device is available forreading.For OUTPUT queues, if a buffer is ready to be dequeued, the file descriptorwill be reported as available for writing.
If the driver usesstructv4l2_fh, thenvb2_poll() will also check for anypending events.
The return values from this function are intended to be directly returnedfrom poll handler in driver.
Parameters
structvb2_queue*qpointer to
structvb2_queuewith videobuf2 queue.structfile*filefile through which the vb2 queue access is performed
Description
The queue is considered busy if it has an owner and the owner is not thefile.
Queue ownership is acquired and checked by some of the v4l2_ioctl_ops helpersbelow. Drivers can also use this function directly when they need toopen-code ioctl handlers, for instance to add additional checks between thequeue ownership test and the call to the corresponding vb2 operation.
- voidvb2_video_unregister_device(structvideo_device*vdev)¶
unregister the video device and release queue
Parameters
structvideo_device*vdevpointer to
structvideo_device
Description
If the driver usesvb2_fop_release()/_vb2_fop_release(), then it should usevb2_video_unregister_device() instead ofvideo_unregister_device().
This function will callvideo_unregister_device() and then release thevb2_queue if streaming is in progress. This will stop streaming andthis will simplify the unbind sequence since after this call all subdevswill have stopped streaming as well.
Parameters
structvb2_queue*vqpointer to
structvb2_queue
Description
..note:: only use if vq->lock is non-NULL.
Parameters
structvb2_queue*vqpointer to
structvb2_queue
Description
..note:: only use if vq->lock is non-NULL.
- structvb2_vmarea_handler¶
common vma refcount tracking handler.
Definition:
struct vb2_vmarea_handler { refcount_t *refcount; void (*put)(void *arg); void *arg;};Members
refcountpointer to
refcount_tentry in the buffer.putcallback to function that decreases buffer refcount.
argargument forput callback.