Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] v4l2-dev: add cross-references and improve markup

Add cross-references for the functions/structs and add
the markup tags to improve its display.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

+181 -157
+177 -157
Documentation/media/kapi/v4l2-dev.rst
··· 1 1 Video device creation 2 2 ===================== 3 3 4 - The actual device nodes in the /dev directory are created using the 5 - video_device struct (v4l2-dev.h). This struct can either be allocated 6 - dynamically or embedded in a larger struct. 4 + The actual device nodes in the ``/dev`` directory are created using the 5 + :c:type:`video_device` struct (``v4l2-dev.h``). This struct can either be 6 + allocated dynamically or embedded in a larger struct. 7 7 8 - To allocate it dynamically use: 8 + To allocate it dynamically use :cpp:func:`video_device_alloc`: 9 9 10 - .. code-block:: none 10 + .. code-block:: c 11 11 12 12 struct video_device *vdev = video_device_alloc(); 13 13 ··· 16 16 17 17 vdev->release = video_device_release; 18 18 19 - If you embed it in a larger struct, then you must set the release() 19 + If you embed it in a larger struct, then you must set the ``release()`` 20 20 callback to your own function: 21 21 22 - .. code-block:: none 22 + .. code-block:: c 23 23 24 24 struct video_device *vdev = &my_vdev->vdev; 25 25 26 26 vdev->release = my_vdev_release; 27 27 28 - The release callback must be set and it is called when the last user 28 + The ``release()`` callback must be set and it is called when the last user 29 29 of the video device exits. 30 30 31 - The default video_device_release() callback just calls kfree to free the 32 - allocated memory. 31 + The default :cpp:func:`video_device_release` callback currently 32 + just calls ``kfree`` to free the allocated memory. 33 33 34 - There is also a video_device_release_empty() function that does nothing 35 - (is empty) and can be used if the struct is embedded and there is nothing 36 - to do when it is released. 34 + There is also a ::cpp:func:`video_device_release_empty` function that does 35 + nothing (is empty) and should be used if the struct is embedded and there 36 + is nothing to do when it is released. 37 37 38 - You should also set these fields: 38 + You should also set these fields of :c:type:`video_device`: 39 39 40 - - v4l2_dev: must be set to the v4l2_device parent device. 40 + - :c:type:`video_device`->v4l2_dev: must be set to the :c:type:`v4l2_device` 41 + parent device. 41 42 42 - - name: set to something descriptive and unique. 43 + - :c:type:`video_device`->name: set to something descriptive and unique. 43 44 44 - - vfl_dir: set this to VFL_DIR_RX for capture devices (VFL_DIR_RX has value 0, 45 - so this is normally already the default), set to VFL_DIR_TX for output 46 - devices and VFL_DIR_M2M for mem2mem (codec) devices. 45 + - :c:type:`video_device`->vfl_dir: set this to ``VFL_DIR_RX`` for capture 46 + devices (``VFL_DIR_RX`` has value 0, so this is normally already the 47 + default), set to ``VFL_DIR_TX`` for output devices and ``VFL_DIR_M2M`` for mem2mem (codec) devices. 47 48 48 - - fops: set to the v4l2_file_operations struct. 49 + - :c:type:`video_device`->fops: set to the :c:type:`v4l2_file_operations` 50 + struct. 49 51 50 - - ioctl_ops: if you use the v4l2_ioctl_ops to simplify ioctl maintenance 51 - (highly recommended to use this and it might become compulsory in the 52 - future!), then set this to your v4l2_ioctl_ops struct. The vfl_type and 53 - vfl_dir fields are used to disable ops that do not match the type/dir 54 - combination. E.g. VBI ops are disabled for non-VBI nodes, and output ops 55 - are disabled for a capture device. This makes it possible to provide 56 - just one v4l2_ioctl_ops struct for both vbi and video nodes. 52 + - :c:type:`video_device`->ioctl_ops: if you use the :c:type:`v4l2_ioctl_ops` 53 + to simplify ioctl maintenance (highly recommended to use this and it might 54 + become compulsory in the future!), then set this to your 55 + :c:type:`v4l2_ioctl_ops` struct. The :c:type:`video_device`->vfl_type and 56 + :c:type:`video_device`->vfl_dir fields are used to disable ops that do not 57 + match the type/dir combination. E.g. VBI ops are disabled for non-VBI nodes, 58 + and output ops are disabled for a capture device. This makes it possible to 59 + provide just one :c:type:`v4l2_ioctl_ops struct` for both vbi and 60 + video nodes. 57 61 58 - - lock: leave to NULL if you want to do all the locking in the driver. 59 - Otherwise you give it a pointer to a struct mutex_lock and before the 60 - unlocked_ioctl file operation is called this lock will be taken by the 61 - core and released afterwards. See the next section for more details. 62 + - :c:type:`video_device`->lock: leave to ``NULL`` if you want to do all the 63 + locking in the driver. Otherwise you give it a pointer to a struct 64 + ``mutex_lock`` and before the :c:type:`video_device`->unlocked_ioctl 65 + file operation is called this lock will be taken by the core and released 66 + afterwards. See the next section for more details. 62 67 63 - - queue: a pointer to the struct vb2_queue associated with this device node. 64 - If queue is non-NULL, and queue->lock is non-NULL, then queue->lock is 65 - used for the queuing ioctls (VIDIOC_REQBUFS, CREATE_BUFS, QBUF, DQBUF, 66 - QUERYBUF, PREPARE_BUF, STREAMON and STREAMOFF) instead of the lock above. 67 - That way the vb2 queuing framework does not have to wait for other ioctls. 68 - This queue pointer is also used by the vb2 helper functions to check for 68 + - :c:type:`video_device`->queue: a pointer to the struct :c:type:`vb2_queue` 69 + associated with this device node. 70 + If queue is not ``NULL``, and queue->lock is not ``NULL``, then queue->lock 71 + is used for the queuing ioctls (``VIDIOC_REQBUFS``, ``CREATE_BUFS``, 72 + ``QBUF``, ``DQBUF``, ``QUERYBUF``, ``PREPARE_BUF``, ``STREAMON`` and 73 + ``STREAMOFF``) instead of the lock above. 74 + That way the :ref:`vb2 <vb2_framework>` queuing framework does not have 75 + to wait for other ioctls. This queue pointer is also used by the 76 + :ref:`vb2 <vb2_framework>` helper functions to check for 69 77 queuing ownership (i.e. is the filehandle calling it allowed to do the 70 78 operation). 71 79 72 - - prio: keeps track of the priorities. Used to implement VIDIOC_G/S_PRIORITY. 73 - If left to NULL, then it will use the struct v4l2_prio_state in v4l2_device. 74 - If you want to have a separate priority state per (group of) device node(s), 75 - then you can point it to your own struct v4l2_prio_state. 80 + - :c:type:`video_device`->prio: keeps track of the priorities. Used to 81 + implement ``VIDIOC_G_PRIORITY`` and ``VIDIOC_S_PRIORITY``. 82 + If left to ``NULL``, then it will use the struct :c:type:`v4l2_prio_state` 83 + in :c:type:`v4l2_device`. If you want to have a separate priority state per 84 + (group of) device node(s), then you can point it to your own struct 85 + :c:type:`v4l2_prio_state`. 76 86 77 - - dev_parent: you only set this if v4l2_device was registered with NULL as 78 - the parent device struct. This only happens in cases where one hardware 79 - device has multiple PCI devices that all share the same v4l2_device core. 87 + - :c:type:`video_device`->dev_parent: you only set this if v4l2_device was 88 + registered with ``NULL`` as the parent ``device`` struct. This only happens 89 + in cases where one hardware device has multiple PCI devices that all share 90 + the same :c:type:`v4l2_device` core. 80 91 81 - The cx88 driver is an example of this: one core v4l2_device struct, but 82 - it is used by both a raw video PCI device (cx8800) and a MPEG PCI device 83 - (cx8802). Since the v4l2_device cannot be associated with two PCI devices 84 - at the same time it is setup without a parent device. But when the struct 85 - video_device is initialized you *do* know which parent PCI device to use and 86 - so you set dev_device to the correct PCI device. 92 + The cx88 driver is an example of this: one core :c:type:`v4l2_device` struct, 93 + but it is used by both a raw video PCI device (cx8800) and a MPEG PCI device 94 + (cx8802). Since the :c:type:`v4l2_device` cannot be associated with two PCI 95 + devices at the same time it is setup without a parent device. But when the 96 + struct :c:type:`video_device` is initialized you **do** know which parent 97 + PCI device to use and so you set ``dev_device`` to the correct PCI device. 87 98 88 - If you use v4l2_ioctl_ops, then you should set .unlocked_ioctl to video_ioctl2 89 - in your v4l2_file_operations struct. 90 - 91 - Do not use .ioctl! This is deprecated and will go away in the future. 99 + If you use :c:type:`v4l2_ioctl_ops`, then you should set 100 + :c:type:`video_device`->unlocked_ioctl to :cpp:func:`video_ioctl2` in your 101 + :c:type:`v4l2_file_operations` struct. 92 102 93 103 In some cases you want to tell the core that a function you had specified in 94 - your v4l2_ioctl_ops should be ignored. You can mark such ioctls by calling this 95 - function before video_device_register is called: 104 + your :c:type:`v4l2_ioctl_ops` should be ignored. You can mark such ioctls by 105 + calling this function before :cpp:func:`video_register_device` is called: 96 106 97 - .. code-block:: none 98 - 99 - void v4l2_disable_ioctl(struct video_device *vdev, unsigned int cmd); 107 + :cpp:func:`v4l2_disable_ioctl <v4l2_disable_ioctl>` 108 + (:c:type:`vdev <video_device>`, cmd). 100 109 101 110 This tends to be needed if based on external factors (e.g. which card is 102 - being used) you want to turns off certain features in v4l2_ioctl_ops without 103 - having to make a new struct. 111 + being used) you want to turns off certain features in :c:type:`v4l2_ioctl_ops` 112 + without having to make a new struct. 104 113 105 - The v4l2_file_operations struct is a subset of file_operations. The main 106 - difference is that the inode argument is omitted since it is never used. 114 + The :c:type:`v4l2_file_operations` struct is a subset of file_operations. 115 + The main difference is that the inode argument is omitted since it is never 116 + used. 107 117 108 118 If integration with the media framework is needed, you must initialize the 109 - media_entity struct embedded in the video_device struct (entity field) by 110 - calling media_entity_pads_init(): 119 + :c:type:`media_entity` struct embedded in the :c:type:`video_device` struct 120 + (entity field) by calling :cpp:func:`media_entity_pads_init`: 111 121 112 - .. code-block:: none 122 + .. code-block:: c 113 123 114 124 struct media_pad *pad = &my_vdev->pad; 115 125 int err; ··· 136 126 ------------------ 137 127 138 128 The V4L core provides optional locking services. The main service is the 139 - lock field in struct video_device, which is a pointer to a mutex. If you set 140 - this pointer, then that will be used by unlocked_ioctl to serialize all ioctls. 129 + lock field in struct :c:type:`video_device`, which is a pointer to a mutex. 130 + If you set this pointer, then that will be used by unlocked_ioctl to 131 + serialize all ioctls. 141 132 142 - If you are using the videobuf2 framework, then there is a second lock that you 143 - can set: video_device->queue->lock. If set, then this lock will be used instead 144 - of video_device->lock to serialize all queuing ioctls (see the previous section 133 + If you are using the :ref:`videobuf2 framework <vb2_framework>`, then there 134 + is a second lock that you can set: :c:type:`video_device`->queue->lock. If 135 + set, then this lock will be used instead of :c:type:`video_device`->lock 136 + to serialize all queuing ioctls (see the previous section 145 137 for the full list of those ioctls). 146 138 147 139 The advantage of using a different lock for the queuing ioctls is that for some 148 140 drivers (particularly USB drivers) certain commands such as setting controls 149 141 can take a long time, so you want to use a separate lock for the buffer queuing 150 - ioctls. That way your VIDIOC_DQBUF doesn't stall because the driver is busy 142 + ioctls. That way your ``VIDIOC_DQBUF`` doesn't stall because the driver is busy 151 143 changing the e.g. exposure of the webcam. 152 144 153 145 Of course, you can always do all the locking yourself by leaving both lock 154 - pointers at NULL. 146 + pointers at ``NULL``. 155 147 156 - If you use the old videobuf then you must pass the video_device lock to the 157 - videobuf queue initialize function: if videobuf has to wait for a frame to 158 - arrive, then it will temporarily unlock the lock and relock it afterwards. If 159 - your driver also waits in the code, then you should do the same to allow other 148 + If you use the old :ref:`videobuf framework <vb_framework>` then you must 149 + pass the :c:type:`video_device`->lock to the videobuf queue initialize 150 + function: if videobuf has to wait for a frame to arrive, then it will 151 + temporarily unlock the lock and relock it afterwards. If your driver also 152 + waits in the code, then you should do the same to allow other 160 153 processes to access the device node while the first process is waiting for 161 154 something. 162 155 163 - In the case of videobuf2 you will need to implement the wait_prepare and 164 - wait_finish callbacks to unlock/lock if applicable. If you use the queue->lock 165 - pointer, then you can use the helper functions vb2_ops_wait_prepare/finish. 156 + In the case of :ref:`videobuf2 <vb2_framework>` you will need to implement the 157 + ``wait_prepare()`` and ``wait_finish()`` callbacks to unlock/lock if applicable. 158 + If you use the ``queue->lock`` pointer, then you can use the helper functions 159 + :cpp:func:`vb2_ops_wait_prepare` and :cpp:func:`vb2_ops_wait_finish`. 166 160 167 161 The implementation of a hotplug disconnect should also take the lock from 168 - video_device before calling v4l2_device_disconnect. If you are also using 169 - video_device->queue->lock, then you have to first lock video_device->queue->lock 170 - followed by video_device->lock. That way you can be sure no ioctl is running 171 - when you call v4l2_device_disconnect. 162 + :c:type:`video_device` before calling v4l2_device_disconnect. If you are also 163 + using :c:type:`video_device`->queue->lock, then you have to first lock 164 + :c:type:`video_device`->queue->lock followed by :c:type:`video_device`->lock. 165 + That way you can be sure no ioctl is running when you call 166 + :c:type:`v4l2_device_disconnect`. 172 167 173 - video_device registration 168 + Video device registration 174 169 ------------------------- 175 170 176 - Next you register the video device: this will create the character device 177 - for you. 171 + Next you register the video device with :cpp:func:`video_register_device`. 172 + This will create the character device for you. 178 173 179 - .. code-block:: none 174 + .. code-block:: c 180 175 181 176 err = video_register_device(vdev, VFL_TYPE_GRABBER, -1); 182 177 if (err) { ··· 189 174 return err; 190 175 } 191 176 192 - If the v4l2_device parent device has a non-NULL mdev field, the video device 193 - entity will be automatically registered with the media device. 177 + If the :c:type:`v4l2_device` parent device has a not ``NULL`` mdev field, 178 + the video device entity will be automatically registered with the media 179 + device. 194 180 195 181 Which device is registered depends on the type argument. The following 196 182 types exist: 197 183 198 - VFL_TYPE_GRABBER: videoX for video input/output devices 199 - VFL_TYPE_VBI: vbiX for vertical blank data (i.e. closed captions, teletext) 200 - VFL_TYPE_RADIO: radioX for radio tuners 201 - VFL_TYPE_SDR: swradioX for Software Defined Radio tuners 184 + - ``VFL_TYPE_GRABBER``: ``/dev/videoX`` for video input/output devices 185 + - ``VFL_TYPE_VBI``: ``/dev/vbiX`` for vertical blank data (i.e. closed captions, teletext) 186 + - ``VFL_TYPE_RADIO``: ``/dev/radioX`` for radio tuners 187 + - ``VFL_TYPE_SDR``: ``/dev/swradioX`` for Software Defined Radio tuners 202 188 203 189 The last argument gives you a certain amount of control over the device 204 - device node number used (i.e. the X in videoX). Normally you will pass -1 190 + device node number used (i.e. the X in ``videoX``). Normally you will pass -1 205 191 to let the v4l2 framework pick the first free number. But sometimes users 206 192 want to select a specific node number. It is common that drivers allow 207 193 the user to select a specific device node number through a driver module ··· 221 205 222 206 Since in this case you do not care about a warning about not being able 223 207 to select the specified device node number, you can call the function 224 - video_register_device_no_warn() instead. 208 + :cpp:func:`video_register_device_no_warn` instead. 225 209 226 210 Whenever a device node is created some attributes are also created for you. 227 - If you look in /sys/class/video4linux you see the devices. Go into e.g. 228 - video0 and you will see 'name', 'dev_debug' and 'index' attributes. The 'name' 229 - attribute is the 'name' field of the video_device struct. The 'dev_debug' attribute 230 - can be used to enable core debugging. See the next section for more detailed 231 - information on this. 211 + If you look in ``/sys/class/video4linux`` you see the devices. Go into e.g. 212 + ``video0`` and you will see 'name', 'dev_debug' and 'index' attributes. The 213 + 'name' attribute is the 'name' field of the video_device struct. The 214 + 'dev_debug' attribute can be used to enable core debugging. See the next 215 + section for more detailed information on this. 232 216 233 217 The 'index' attribute is the index of the device node: for each call to 234 - video_register_device() the index is just increased by 1. The first video 235 - device node you register always starts with index 0. 218 + :cpp:func:`video_register_device()` the index is just increased by 1. The 219 + first video device node you register always starts with index 0. 236 220 237 221 Users can setup udev rules that utilize the index attribute to make fancy 238 - device names (e.g. 'mpegX' for MPEG video capture device nodes). 222 + device names (e.g. '``mpegX``' for MPEG video capture device nodes). 239 223 240 224 After the device was successfully registered, then you can use these fields: 241 225 242 - - vfl_type: the device type passed to video_register_device. 243 - - minor: the assigned device minor number. 244 - - num: the device node number (i.e. the X in videoX). 245 - - index: the device index number. 226 + - :c:type:`video_device`->vfl_type: the device type passed to 227 + :cpp:func:`video_register_device`. 228 + - :c:type:`video_device`->minor: the assigned device minor number. 229 + - :c:type:`video_device`->num: the device node number (i.e. the X in 230 + ``videoX``). 231 + - :c:type:`video_device`->index: the device index number. 246 232 247 - If the registration failed, then you need to call video_device_release() 248 - to free the allocated video_device struct, or free your own struct if the 249 - video_device was embedded in it. The vdev->release() callback will never 250 - be called if the registration failed, nor should you ever attempt to 251 - unregister the device if the registration failed. 233 + If the registration failed, then you need to call 234 + :cpp:func:`video_device_release` to free the allocated :c:type:`video_device` 235 + struct, or free your own struct if the :c:type:`video_device` was embedded in 236 + it. The ``vdev->release()`` callback will never be called if the registration 237 + failed, nor should you ever attempt to unregister the device if the 238 + registration failed. 252 239 253 240 video device debugging 254 241 ---------------------- 255 242 256 243 The 'dev_debug' attribute that is created for each video, vbi, radio or swradio 257 - device in /sys/class/video4linux/<devX>/ allows you to enable logging of 244 + device in ``/sys/class/video4linux/<devX>/`` allows you to enable logging of 258 245 file operations. 259 246 260 247 It is a bitmask and the following bits can be set: 261 248 262 - .. code-block:: none 263 249 264 - 0x01: Log the ioctl name and error code. VIDIOC_(D)QBUF ioctls are only logged 265 - if bit 0x08 is also set. 266 - 0x02: Log the ioctl name arguments and error code. VIDIOC_(D)QBUF ioctls are 267 - only logged if bit 0x08 is also set. 268 - 0x04: Log the file operations open, release, read, write, mmap and 269 - get_unmapped_area. The read and write operations are only logged if 270 - bit 0x08 is also set. 271 - 0x08: Log the read and write file operations and the VIDIOC_QBUF and 272 - VIDIOC_DQBUF ioctls. 273 - 0x10: Log the poll file operation. 250 + ===== ================================================================ 251 + Mask Description 252 + ===== ================================================================ 253 + 0x01 Log the ioctl name and error code. VIDIOC_(D)QBUF ioctls are 254 + only logged if bit 0x08 is also set. 255 + 0x02 Log the ioctl name arguments and error code. VIDIOC_(D)QBUF 256 + ioctls are 257 + only logged if bit 0x08 is also set. 258 + 0x04 Log the file operations open, release, read, write, mmap and 259 + get_unmapped_area. The read and write operations are only 260 + logged if bit 0x08 is also set. 261 + 0x08 Log the read and write file operations and the VIDIOC_QBUF and 262 + VIDIOC_DQBUF ioctls. 263 + 0x10 Log the poll file operation. 264 + ===== ================================================================ 274 265 275 - video_device cleanup 266 + Video device cleanup 276 267 -------------------- 277 268 278 269 When the video device nodes have to be removed, either during the unload 279 270 of the driver or because the USB device was disconnected, then you should 280 - unregister them: 271 + unregister them with: 281 272 282 - .. code-block:: none 283 - 284 - video_unregister_device(vdev); 273 + :cpp:func:`video_unregister_device` 274 + (:c:type:`vdev <video_device>`); 285 275 286 276 This will remove the device nodes from sysfs (causing udev to remove them 287 - from /dev). 277 + from ``/dev``). 288 278 289 - After video_unregister_device() returns no new opens can be done. However, 290 - in the case of USB devices some application might still have one of these 291 - device nodes open. So after the unregister all file operations (except 279 + After :cpp:func:`video_unregister_device` returns no new opens can be done. 280 + However, in the case of USB devices some application might still have one of 281 + these device nodes open. So after the unregister all file operations (except 292 282 release, of course) will return an error as well. 293 283 294 - When the last user of the video device node exits, then the vdev->release() 284 + When the last user of the video device node exits, then the ``vdev->release()`` 295 285 callback is called and you can do the final cleanup there. 296 286 297 287 Don't forget to cleanup the media entity associated with the video device if 298 288 it has been initialized: 299 289 300 - .. code-block:: none 301 - 302 - media_entity_cleanup(&vdev->entity); 290 + :cpp:func:`media_entity_cleanup <media_entity_cleanup>` 291 + (&vdev->entity); 303 292 304 293 This can be done from the release callback. 305 294 ··· 314 293 315 294 There are a few useful helper functions: 316 295 317 - - file/video_device private data 296 + - file and :c:type:`video_device` private data 318 297 319 298 You can set/get driver private data in the video_device struct using: 320 299 321 - .. code-block:: none 300 + :cpp:func:`video_get_drvdata <video_get_drvdata>` 301 + (:c:type:`vdev <video_device>`); 322 302 323 - void *video_get_drvdata(struct video_device *vdev); 324 - void video_set_drvdata(struct video_device *vdev, void *data); 303 + :cpp:func:`video_set_drvdata <video_set_drvdata>` 304 + (:c:type:`vdev <video_device>`); 325 305 326 - Note that you can safely call video_set_drvdata() before calling 327 - video_register_device(). 306 + Note that you can safely call :cpp:func:`video_set_drvdata` before calling 307 + :cpp:func:`video_register_device`. 328 308 329 309 And this function: 330 310 331 - .. code-block:: none 332 - 333 - struct video_device *video_devdata(struct file *file); 311 + :cpp:func:`video_devdata <video_devdata>` 312 + (struct file \*file); 334 313 335 314 returns the video_device belonging to the file struct. 336 315 337 - The video_drvdata function combines video_get_drvdata with video_devdata: 316 + The :cpp:func:`video_devdata` function combines :cpp:func:`video_get_drvdata` 317 + with :cpp:func:`video_devdata`: 338 318 339 - .. code-block:: none 319 + :cpp:func:`video_drvdata <video_drvdata>` 320 + (struct file \*file); 340 321 341 - void *video_drvdata(struct file *file); 322 + You can go from a :c:type:`video_device` struct to the v4l2_device struct using: 342 323 343 - You can go from a video_device struct to the v4l2_device struct using: 344 - 345 - .. code-block:: none 324 + .. code-block:: c 346 325 347 326 struct v4l2_device *v4l2_dev = vdev->v4l2_dev; 348 327 349 328 - Device node name 350 329 351 - The video_device node kernel name can be retrieved using 330 + The :c:type:`video_device` node kernel name can be retrieved using: 352 331 353 - .. code-block:: none 354 - 355 - const char *video_device_node_name(struct video_device *vdev); 332 + :cpp:func:`video_device_node_name <video_device_node_name>` 333 + (:c:type:`vdev <video_device>`); 356 334 357 335 The name is used as a hint by userspace tools such as udev. The function 358 336 should be used where possible instead of accessing the video_device::num and
+2
Documentation/media/kapi/v4l2-videobuf.rst
··· 1 + .. _vb_framework: 2 + 1 3 Videobuf Framework 2 4 ================== 3 5
+2
Documentation/media/kapi/v4l2-videobuf2.rst
··· 1 + .. _vb2_framework: 2 + 1 3 V4L2 videobuf2 kAPI 2 4 ^^^^^^^^^^^^^^^^^^^ 3 5