162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * V4L2 JPEG helpers header 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2019 Pengutronix, Philipp Zabel <kernel@pengutronix.de> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * For reference, see JPEG ITU-T.81 (ISO/IEC 10918-1) 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef _V4L2_JPEG_H 1162306a36Sopenharmony_ci#define _V4L2_JPEG_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/v4l2-controls.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define V4L2_JPEG_MAX_COMPONENTS 4 1662306a36Sopenharmony_ci#define V4L2_JPEG_MAX_TABLES 4 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/** 1962306a36Sopenharmony_ci * struct v4l2_jpeg_reference - reference into the JPEG buffer 2062306a36Sopenharmony_ci * @start: pointer to the start of the referenced segment or table 2162306a36Sopenharmony_ci * @length: size of the referenced segment or table 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * Wnen referencing marker segments, start points right after the marker code, 2462306a36Sopenharmony_ci * and length is the size of the segment parameters, excluding the marker code. 2562306a36Sopenharmony_ci */ 2662306a36Sopenharmony_cistruct v4l2_jpeg_reference { 2762306a36Sopenharmony_ci u8 *start; 2862306a36Sopenharmony_ci size_t length; 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* B.2.2 Frame header syntax */ 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci/** 3462306a36Sopenharmony_ci * struct v4l2_jpeg_frame_component_spec - frame component-specification 3562306a36Sopenharmony_ci * @component_identifier: C[i] 3662306a36Sopenharmony_ci * @horizontal_sampling_factor: H[i] 3762306a36Sopenharmony_ci * @vertical_sampling_factor: V[i] 3862306a36Sopenharmony_ci * @quantization_table_selector: quantization table destination selector Tq[i] 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_cistruct v4l2_jpeg_frame_component_spec { 4162306a36Sopenharmony_ci u8 component_identifier; 4262306a36Sopenharmony_ci u8 horizontal_sampling_factor; 4362306a36Sopenharmony_ci u8 vertical_sampling_factor; 4462306a36Sopenharmony_ci u8 quantization_table_selector; 4562306a36Sopenharmony_ci}; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/** 4862306a36Sopenharmony_ci * struct v4l2_jpeg_frame_header - JPEG frame header 4962306a36Sopenharmony_ci * @height: Y 5062306a36Sopenharmony_ci * @width: X 5162306a36Sopenharmony_ci * @precision: P 5262306a36Sopenharmony_ci * @num_components: Nf 5362306a36Sopenharmony_ci * @component: component-specification, see v4l2_jpeg_frame_component_spec 5462306a36Sopenharmony_ci * @subsampling: decoded subsampling from component-specification 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_cistruct v4l2_jpeg_frame_header { 5762306a36Sopenharmony_ci u16 height; 5862306a36Sopenharmony_ci u16 width; 5962306a36Sopenharmony_ci u8 precision; 6062306a36Sopenharmony_ci u8 num_components; 6162306a36Sopenharmony_ci struct v4l2_jpeg_frame_component_spec component[V4L2_JPEG_MAX_COMPONENTS]; 6262306a36Sopenharmony_ci enum v4l2_jpeg_chroma_subsampling subsampling; 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* B.2.3 Scan header syntax */ 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/** 6862306a36Sopenharmony_ci * struct v4l2_jpeg_scan_component_spec - scan component-specification 6962306a36Sopenharmony_ci * @component_selector: Cs[j] 7062306a36Sopenharmony_ci * @dc_entropy_coding_table_selector: Td[j] 7162306a36Sopenharmony_ci * @ac_entropy_coding_table_selector: Ta[j] 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_cistruct v4l2_jpeg_scan_component_spec { 7462306a36Sopenharmony_ci u8 component_selector; 7562306a36Sopenharmony_ci u8 dc_entropy_coding_table_selector; 7662306a36Sopenharmony_ci u8 ac_entropy_coding_table_selector; 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci/** 8062306a36Sopenharmony_ci * struct v4l2_jpeg_scan_header - JPEG scan header 8162306a36Sopenharmony_ci * @num_components: Ns 8262306a36Sopenharmony_ci * @component: component-specification, see v4l2_jpeg_scan_component_spec 8362306a36Sopenharmony_ci */ 8462306a36Sopenharmony_cistruct v4l2_jpeg_scan_header { 8562306a36Sopenharmony_ci u8 num_components; /* Ns */ 8662306a36Sopenharmony_ci struct v4l2_jpeg_scan_component_spec component[V4L2_JPEG_MAX_COMPONENTS]; 8762306a36Sopenharmony_ci /* Ss, Se, Ah, and Al are not used by any driver */ 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/** 9162306a36Sopenharmony_ci * enum v4l2_jpeg_app14_tf - APP14 transform flag 9262306a36Sopenharmony_ci * According to Rec. ITU-T T.872 (06/2012) 6.5.3 9362306a36Sopenharmony_ci * APP14 segment is for color encoding, it contains a transform flag, 9462306a36Sopenharmony_ci * which may have values of 0, 1 and 2 and are interpreted as follows: 9562306a36Sopenharmony_ci * @V4L2_JPEG_APP14_TF_CMYK_RGB: CMYK for images encoded with four components 9662306a36Sopenharmony_ci * RGB for images encoded with three components 9762306a36Sopenharmony_ci * @V4L2_JPEG_APP14_TF_YCBCR: an image encoded with three components using YCbCr 9862306a36Sopenharmony_ci * @V4L2_JPEG_APP14_TF_YCCK: an image encoded with four components using YCCK 9962306a36Sopenharmony_ci * @V4L2_JPEG_APP14_TF_UNKNOWN: indicate app14 is not present 10062306a36Sopenharmony_ci */ 10162306a36Sopenharmony_cienum v4l2_jpeg_app14_tf { 10262306a36Sopenharmony_ci V4L2_JPEG_APP14_TF_CMYK_RGB = 0, 10362306a36Sopenharmony_ci V4L2_JPEG_APP14_TF_YCBCR = 1, 10462306a36Sopenharmony_ci V4L2_JPEG_APP14_TF_YCCK = 2, 10562306a36Sopenharmony_ci V4L2_JPEG_APP14_TF_UNKNOWN = -1, 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci/** 10962306a36Sopenharmony_ci * struct v4l2_jpeg_header - parsed JPEG header 11062306a36Sopenharmony_ci * @sof: pointer to frame header and size 11162306a36Sopenharmony_ci * @sos: pointer to scan header and size 11262306a36Sopenharmony_ci * @num_dht: number of entries in @dht 11362306a36Sopenharmony_ci * @dht: pointers to huffman tables and sizes 11462306a36Sopenharmony_ci * @num_dqt: number of entries in @dqt 11562306a36Sopenharmony_ci * @dqt: pointers to quantization tables and sizes 11662306a36Sopenharmony_ci * @frame: parsed frame header 11762306a36Sopenharmony_ci * @scan: pointer to parsed scan header, optional 11862306a36Sopenharmony_ci * @quantization_tables: references to four quantization tables, optional 11962306a36Sopenharmony_ci * @huffman_tables: references to four Huffman tables in DC0, DC1, AC0, AC1 12062306a36Sopenharmony_ci * order, optional 12162306a36Sopenharmony_ci * @restart_interval: number of MCU per restart interval, Ri 12262306a36Sopenharmony_ci * @ecs_offset: buffer offset in bytes to the entropy coded segment 12362306a36Sopenharmony_ci * @app14_tf: transform flag from app14 data 12462306a36Sopenharmony_ci * 12562306a36Sopenharmony_ci * When this structure is passed to v4l2_jpeg_parse_header, the optional scan, 12662306a36Sopenharmony_ci * quantization_tables, and huffman_tables pointers must be initialized to NULL 12762306a36Sopenharmony_ci * or point at valid memory. 12862306a36Sopenharmony_ci */ 12962306a36Sopenharmony_cistruct v4l2_jpeg_header { 13062306a36Sopenharmony_ci struct v4l2_jpeg_reference sof; 13162306a36Sopenharmony_ci struct v4l2_jpeg_reference sos; 13262306a36Sopenharmony_ci unsigned int num_dht; 13362306a36Sopenharmony_ci struct v4l2_jpeg_reference dht[V4L2_JPEG_MAX_TABLES]; 13462306a36Sopenharmony_ci unsigned int num_dqt; 13562306a36Sopenharmony_ci struct v4l2_jpeg_reference dqt[V4L2_JPEG_MAX_TABLES]; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci struct v4l2_jpeg_frame_header frame; 13862306a36Sopenharmony_ci struct v4l2_jpeg_scan_header *scan; 13962306a36Sopenharmony_ci struct v4l2_jpeg_reference *quantization_tables; 14062306a36Sopenharmony_ci struct v4l2_jpeg_reference *huffman_tables; 14162306a36Sopenharmony_ci u16 restart_interval; 14262306a36Sopenharmony_ci size_t ecs_offset; 14362306a36Sopenharmony_ci enum v4l2_jpeg_app14_tf app14_tf; 14462306a36Sopenharmony_ci}; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ciint v4l2_jpeg_parse_header(void *buf, size_t len, struct v4l2_jpeg_header *out); 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ciint v4l2_jpeg_parse_frame_header(void *buf, size_t len, 14962306a36Sopenharmony_ci struct v4l2_jpeg_frame_header *frame_header); 15062306a36Sopenharmony_ciint v4l2_jpeg_parse_scan_header(void *buf, size_t len, 15162306a36Sopenharmony_ci struct v4l2_jpeg_scan_header *scan_header); 15262306a36Sopenharmony_ciint v4l2_jpeg_parse_quantization_tables(void *buf, size_t len, u8 precision, 15362306a36Sopenharmony_ci struct v4l2_jpeg_reference *q_tables); 15462306a36Sopenharmony_ciint v4l2_jpeg_parse_huffman_tables(void *buf, size_t len, 15562306a36Sopenharmony_ci struct v4l2_jpeg_reference *huffman_tables); 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci#endif 158