linux/include/media/v4l2-jpeg.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * V4L2 JPEG helpers header
   4 *
   5 * Copyright (C) 2019 Pengutronix, Philipp Zabel <kernel@pengutronix.de>
   6 *
   7 * For reference, see JPEG ITU-T.81 (ISO/IEC 10918-1)
   8 */
   9
  10#ifndef _V4L2_JPEG_H
  11#define _V4L2_JPEG_H
  12
  13#include <linux/v4l2-controls.h>
  14
  15#define V4L2_JPEG_MAX_COMPONENTS        4
  16#define V4L2_JPEG_MAX_TABLES            4
  17
  18/**
  19 * struct v4l2_jpeg_reference - reference into the JPEG buffer
  20 * @start: pointer to the start of the referenced segment or table
  21 * @length: size of the referenced segment or table
  22 *
  23 * Wnen referencing marker segments, start points right after the marker code,
  24 * and length is the size of the segment parameters, excluding the marker code.
  25 */
  26struct v4l2_jpeg_reference {
  27        u8 *start;
  28        size_t length;
  29};
  30
  31/* B.2.2 Frame header syntax */
  32
  33/**
  34 * struct v4l2_jpeg_frame_component_spec - frame component-specification
  35 * @component_identifier: C[i]
  36 * @horizontal_sampling_factor: H[i]
  37 * @vertical_sampling_factor: V[i]
  38 * @quantization_table_selector: quantization table destination selector Tq[i]
  39 */
  40struct v4l2_jpeg_frame_component_spec {
  41        u8 component_identifier;
  42        u8 horizontal_sampling_factor;
  43        u8 vertical_sampling_factor;
  44        u8 quantization_table_selector;
  45};
  46
  47/**
  48 * struct v4l2_jpeg_frame_header - JPEG frame header
  49 * @height: Y
  50 * @width: X
  51 * @precision: P
  52 * @num_components: Nf
  53 * @component: component-specification, see v4l2_jpeg_frame_component_spec
  54 * @subsampling: decoded subsampling from component-specification
  55 */
  56struct v4l2_jpeg_frame_header {
  57        u16 height;
  58        u16 width;
  59        u8 precision;
  60        u8 num_components;
  61        struct v4l2_jpeg_frame_component_spec component[V4L2_JPEG_MAX_COMPONENTS];
  62        enum v4l2_jpeg_chroma_subsampling subsampling;
  63};
  64
  65/* B.2.3 Scan header syntax */
  66
  67/**
  68 * struct v4l2_jpeg_scan_component_spec - scan component-specification
  69 * @component_selector: Cs[j]
  70 * @dc_entropy_coding_table_selector: Td[j]
  71 * @ac_entropy_coding_table_selector: Ta[j]
  72 */
  73struct v4l2_jpeg_scan_component_spec {
  74        u8 component_selector;
  75        u8 dc_entropy_coding_table_selector;
  76        u8 ac_entropy_coding_table_selector;
  77};
  78
  79/**
  80 * struct v4l2_jpeg_scan_header - JPEG scan header
  81 * @num_components: Ns
  82 * @component: component-specification, see v4l2_jpeg_scan_component_spec
  83 */
  84struct v4l2_jpeg_scan_header {
  85        u8 num_components;                              /* Ns */
  86        struct v4l2_jpeg_scan_component_spec component[V4L2_JPEG_MAX_COMPONENTS];
  87        /* Ss, Se, Ah, and Al are not used by any driver */
  88};
  89
  90/**
  91 * enum v4l2_jpeg_app14_tf - APP14 transform flag
  92 * According to Rec. ITU-T T.872 (06/2012) 6.5.3
  93 * APP14 segment is for color encoding, it contains a transform flag,
  94 * which may have values of 0, 1 and 2 and are interpreted as follows:
  95 * @V4L2_JPEG_APP14_TF_CMYK_RGB: CMYK for images encoded with four components
  96 *                               RGB for images encoded with three components
  97 * @V4L2_JPEG_APP14_TF_YCBCR: an image encoded with three components using YCbCr
  98 * @V4L2_JPEG_APP14_TF_YCCK: an image encoded with four components using YCCK
  99 * @V4L2_JPEG_APP14_TF_UNKNOWN: indicate app14 is not present
 100 */
 101enum v4l2_jpeg_app14_tf {
 102        V4L2_JPEG_APP14_TF_CMYK_RGB     = 0,
 103        V4L2_JPEG_APP14_TF_YCBCR        = 1,
 104        V4L2_JPEG_APP14_TF_YCCK         = 2,
 105        V4L2_JPEG_APP14_TF_UNKNOWN      = -1,
 106};
 107
 108/**
 109 * struct v4l2_jpeg_header - parsed JPEG header
 110 * @sof: pointer to frame header and size
 111 * @sos: pointer to scan header and size
 112 * @num_dht: number of entries in @dht
 113 * @dht: pointers to huffman tables and sizes
 114 * @num_dqt: number of entries in @dqt
 115 * @dqt: pointers to quantization tables and sizes
 116 * @frame: parsed frame header
 117 * @scan: pointer to parsed scan header, optional
 118 * @quantization_tables: references to four quantization tables, optional
 119 * @huffman_tables: references to four Huffman tables in DC0, DC1, AC0, AC1
 120 *                  order, optional
 121 * @restart_interval: number of MCU per restart interval, Ri
 122 * @ecs_offset: buffer offset in bytes to the entropy coded segment
 123 * @app14_tf: transform flag from app14 data
 124 *
 125 * When this structure is passed to v4l2_jpeg_parse_header, the optional scan,
 126 * quantization_tables, and huffman_tables pointers must be initialized to NULL
 127 * or point at valid memory.
 128 */
 129struct v4l2_jpeg_header {
 130        struct v4l2_jpeg_reference sof;
 131        struct v4l2_jpeg_reference sos;
 132        unsigned int num_dht;
 133        struct v4l2_jpeg_reference dht[V4L2_JPEG_MAX_TABLES];
 134        unsigned int num_dqt;
 135        struct v4l2_jpeg_reference dqt[V4L2_JPEG_MAX_TABLES];
 136
 137        struct v4l2_jpeg_frame_header frame;
 138        struct v4l2_jpeg_scan_header *scan;
 139        struct v4l2_jpeg_reference *quantization_tables;
 140        struct v4l2_jpeg_reference *huffman_tables;
 141        u16 restart_interval;
 142        size_t ecs_offset;
 143        enum v4l2_jpeg_app14_tf app14_tf;
 144};
 145
 146int v4l2_jpeg_parse_header(void *buf, size_t len, struct v4l2_jpeg_header *out);
 147
 148int v4l2_jpeg_parse_frame_header(void *buf, size_t len,
 149                                 struct v4l2_jpeg_frame_header *frame_header);
 150int v4l2_jpeg_parse_scan_header(void *buf, size_t len,
 151                                struct v4l2_jpeg_scan_header *scan_header);
 152int v4l2_jpeg_parse_quantization_tables(void *buf, size_t len, u8 precision,
 153                                        struct v4l2_jpeg_reference *q_tables);
 154int v4l2_jpeg_parse_huffman_tables(void *buf, size_t len,
 155                                   struct v4l2_jpeg_reference *huffman_tables);
 156
 157#endif
 158