^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) .. SPDX-License-Identifier: GFDL-1.1-no-invariants-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) .. _mem2mem:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) ********************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) Video Memory-To-Memory Interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) ********************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) A V4L2 memory-to-memory device can compress, decompress, transform, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) otherwise convert video data from one format into another format, in memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) Such memory-to-memory devices set the ``V4L2_CAP_VIDEO_M2M`` or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) ``V4L2_CAP_VIDEO_M2M_MPLANE`` capability. Examples of memory-to-memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) devices are codecs, scalers, deinterlacers or format converters (i.e.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) converting from YUV to RGB).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) A memory-to-memory video node acts just like a normal video node, but it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) supports both output (sending frames from memory to the hardware)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) and capture (receiving the processed frames from the hardware into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) memory) stream I/O. An application will have to setup the stream I/O for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) both sides and finally call :ref:`VIDIOC_STREAMON <VIDIOC_STREAMON>`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) for both capture and output to start the hardware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) Memory-to-memory devices function as a shared resource: you can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) open the video node multiple times, each application setting up their
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) own properties that are local to the file handle, and each can use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) it independently from the others. The driver will arbitrate access to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) the hardware and reprogram it whenever another file handler gets access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) This is different from the usual video node behavior where the video
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) properties are global to the device (i.e. changing something through one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) file handle is visible through another file handle).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) One of the most common memory-to-memory device is the codec. Codecs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) are more complicated than most and require additional setup for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) their codec parameters. This is done through codec controls.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) See :ref:`mpeg-controls`. More details on how to use codec memory-to-memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) devices are given in the following sections.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .. toctree::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) :maxdepth: 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) dev-decoder
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) dev-encoder
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) dev-stateless-decoder