2020-03-18 19:35:32 +01:00
/* 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 */
} ;
2021-03-11 01:28:49 +01:00
/**
* 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 ,
} ;
2020-03-18 19:35:32 +01:00
/**
* struct v4l2_jpeg_header - parsed JPEG header
* @ sof : pointer to frame header and size
* @ sos : pointer to scan header and size
2021-03-09 12:48:20 +01:00
* @ num_dht : number of entries in @ dht
2020-03-18 19:35:32 +01:00
* @ dht : pointers to huffman tables and sizes
2021-03-09 12:48:20 +01:00
* @ num_dqt : number of entries in @ dqt
2020-03-18 19:35:32 +01:00
* @ 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
2021-03-11 01:28:49 +01:00
* @ app14_tf : transform flag from app14 data
2020-03-18 19:35:32 +01:00
*
* 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 ;
2021-03-11 01:28:49 +01:00
enum v4l2_jpeg_app14_tf app14_tf ;
2020-03-18 19:35:32 +01:00
} ;
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