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