QC08C and QC10C are documented as opaque formats with four planes, or eight for interlaced video. Neither is true for the drivers: Venus and Iris use a single memory plane, nothing produces interlaced buffers, and the display controller and the GPU import these buffers, so the layout is part of the contract between them.
Describe the sections of the buffer, their order, strides, line counts and alignment. The compressed contents stay opaque, they depend on the UBWC configuration of the platform. Signed-off-by: Dmitry Baryshkov <[email protected]> --- .../userspace-api/media/v4l/pixfmt-reserved.rst | 63 ++++++++++++++++++---- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst b/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst index 1cf6c59f4bc4..3ff6499970e1 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst @@ -245,20 +245,65 @@ please make a proposal on the linux-media mailing list. - ``V4L2_PIX_FMT_QC08C`` - 'QC08C' - Compressed Macro-tile 8-Bit YUV420 format used by Qualcomm platforms. - It is an opaque intermediate format. The used compression is lossless - and it is used by various multimedia hardware blocks like GPU, display - controllers, ISP and video accelerators. - It contains four planes for progressive video and eight planes for - interlaced video. + This is NV12 compressed with Universal Bandwidth Compression (UBWC), + a lossless compression used by the video accelerators, GPU, display + controller and camera. The compressed contents depend on the UBWC + version and memory configuration of the platform and are only meant + to be accessed by the hardware; the layout of the buffer is defined + below. + + The format uses a single memory plane that holds four sections in + this order: Y metadata, Y data, CbCr metadata and CbCr data. Each + section starts at the beginning of the previous section plus its + size, which is rounded up to a multiple of 4096 bytes. The metadata + holds one byte for each tile of the data. ``bytesperline`` is the + stride of the Y and CbCr data. For a ``width`` x ``height`` buffer, + with the CbCr plane being ``DIV_ROUND_UP(width, 2)`` x + ``DIV_ROUND_UP(height, 2)`` samples: + + - Y data: stride ``ALIGN(width, 128)`` bytes, + ``ALIGN(height, 32)`` lines. + - CbCr data: stride ``ALIGN(width, 128)`` bytes, + ``ALIGN(DIV_ROUND_UP(height, 2), 32)`` lines. + - Y metadata: 32x8 pixel tiles, stride + ``ALIGN(DIV_ROUND_UP(width, 32), 64)`` bytes, + ``ALIGN(DIV_ROUND_UP(height, 8), 16)`` lines. + - CbCr metadata: 16x8 sample tiles, stride + ``ALIGN(DIV_ROUND_UP(DIV_ROUND_UP(width, 2), 16), 64)`` bytes, + ``ALIGN(DIV_ROUND_UP(DIV_ROUND_UP(height, 2), 8), 16)`` lines. + + ``sizeimage`` may be larger than the sum of the sections. + The same layout is described by ``DRM_FORMAT_NV12`` with the + ``DRM_FORMAT_MOD_QCOM_COMPRESSED`` modifier, with both DRM planes + referring to the same buffer and the Y metadata at ``offsets[0]``. * .. _V4L2-PIX-FMT-QC10C: - ``V4L2_PIX_FMT_QC10C`` - 'QC10C' - Compressed Macro-tile 10-Bit YUV420 format used by Qualcomm platforms. - It is an opaque intermediate format. The used compression is lossless - and it is used by various multimedia hardware blocks like GPU, display - controllers, ISP and video accelerators. - It contains four planes for progressive video. + This is the TP10 format, YUV420 with three 10-bit samples tightly + packed in each 32-bit word, in both the Y plane and the interleaved + CbCr plane, compressed with UBWC as described for + ``V4L2_PIX_FMT_QC08C``. Each 192 samples of a line take 256 bytes. + + The format uses a single memory plane with the same four sections as + ``V4L2_PIX_FMT_QC08C``. ``bytesperline`` is the stride of the Y and + CbCr data. For a ``width`` x ``height`` buffer: + + - Y data: stride ``DIV_ROUND_UP(width, 192) * 256`` bytes, + ``ALIGN(height, 16)`` lines. + - CbCr data: stride ``DIV_ROUND_UP(width, 192) * 256`` bytes, + ``ALIGN(DIV_ROUND_UP(height, 2), 16)`` lines. + - Y metadata: 48x4 pixel tiles, stride + ``ALIGN(DIV_ROUND_UP(width, 48), 64)`` bytes, + ``ALIGN(DIV_ROUND_UP(height, 4), 16)`` lines. + - CbCr metadata: 24x4 sample tiles, stride + ``ALIGN(DIV_ROUND_UP(DIV_ROUND_UP(width, 2), 24), 64)`` bytes, + ``ALIGN(DIV_ROUND_UP(DIV_ROUND_UP(height, 2), 4), 16)`` lines. + + ``sizeimage`` may be larger than the sum of the sections. There is + no DRM equivalent: ``DRM_FORMAT_P010`` with the + ``DRM_FORMAT_MOD_QCOM_COMPRESSED`` modifier stores 16-bit samples. * .. _V4L2-PIX-FMT-AJPG: - ``V4L2_PIX_FMT_AJPG`` -- 2.47.3
