Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * V4L2 JPEG header parser helpers.
  4 *
  5 * Copyright (C) 2019 Pengutronix, Philipp Zabel <kernel@pengutronix.de>
  6 *
  7 * For reference, see JPEG ITU-T.81 (ISO/IEC 10918-1) [1]
  8 *
  9 * [1] https://www.w3.org/Graphics/JPEG/itu-t81.pdf
 10 */
 11
 12#include <linux/unaligned.h>
 13#include <linux/errno.h>
 14#include <linux/kernel.h>
 15#include <linux/module.h>
 16#include <linux/types.h>
 17#include <media/v4l2-jpeg.h>
 18
 19MODULE_DESCRIPTION("V4L2 JPEG header parser helpers");
 20MODULE_AUTHOR("Philipp Zabel <kernel@pengutronix.de>");
 21MODULE_LICENSE("GPL");
 22
 23/* Table B.1 - Marker code assignments */
 24#define SOF0	0xffc0	/* start of frame */
 25#define SOF1	0xffc1
 26#define SOF2	0xffc2
 27#define SOF3	0xffc3
 28#define SOF5	0xffc5
 29#define SOF7	0xffc7
 30#define JPG	0xffc8	/* extensions */
 31#define SOF9	0xffc9
 32#define SOF11	0xffcb
 33#define SOF13	0xffcd
 34#define SOF15	0xffcf
 35#define DHT	0xffc4	/* huffman table */
 36#define DAC	0xffcc	/* arithmetic coding conditioning */
 37#define RST0	0xffd0	/* restart */
 38#define RST7	0xffd7
 39#define SOI	0xffd8	/* start of image */
 40#define EOI	0xffd9	/* end of image */
 41#define SOS	0xffda	/* start of stream */
 42#define DQT	0xffdb	/* quantization table */
 43#define DNL	0xffdc	/* number of lines */
 44#define DRI	0xffdd	/* restart interval */
 45#define DHP	0xffde	/* hierarchical progression */
 46#define EXP	0xffdf	/* expand reference */
 47#define APP0	0xffe0	/* application data */
 48#define APP14	0xffee	/* application data for colour encoding */
 49#define APP15	0xffef
 50#define JPG0	0xfff0	/* extensions */
 51#define JPG13	0xfffd
 52#define COM	0xfffe	/* comment */
 53#define TEM	0xff01	/* temporary */
 54
 55/* Luma and chroma qp tables to achieve 50% compression quality
 56 * This is as per example in Annex K.1 of ITU-T.81
 57 */
 58const u8 v4l2_jpeg_ref_table_luma_qt[V4L2_JPEG_PIXELS_IN_BLOCK] = {
 59	16, 11, 10, 16, 24, 40, 51, 61,
 60	12, 12, 14, 19, 26, 58, 60, 55,
 61	14, 13, 16, 24, 40, 57, 69, 56,
 62	14, 17, 22, 29, 51, 87, 80, 62,
 63	18, 22, 37, 56, 68, 109, 103, 77,
 64	24, 35, 55, 64, 81, 104, 113, 92,
 65	49, 64, 78, 87, 103, 121, 120, 101,
 66	72, 92, 95, 98, 112, 100, 103, 99
 67};
 68EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_qt);
 69
 70const u8 v4l2_jpeg_ref_table_chroma_qt[V4L2_JPEG_PIXELS_IN_BLOCK] = {
 71	17, 18, 24, 47, 99, 99, 99, 99,
 72	18, 21, 26, 66, 99, 99, 99, 99,
 73	24, 26, 56, 99, 99, 99, 99, 99,
 74	47, 66, 99, 99, 99, 99, 99, 99,
 75	99, 99, 99, 99, 99, 99, 99, 99,
 76	99, 99, 99, 99, 99, 99, 99, 99,
 77	99, 99, 99, 99, 99, 99, 99, 99,
 78	99, 99, 99, 99, 99, 99, 99, 99
 79};
 80EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_qt);
 81
 82/* Zigzag scan pattern indexes */
 83const u8 v4l2_jpeg_zigzag_scan_index[V4L2_JPEG_PIXELS_IN_BLOCK] = {
 84	0,   1,  8, 16,  9,  2,  3, 10,
 85	17, 24, 32, 25, 18, 11,  4,  5,
 86	12, 19, 26, 33, 40, 48, 41, 34,
 87	27, 20, 13,  6,  7, 14, 21, 28,
 88	35, 42, 49, 56, 57, 50, 43, 36,
 89	29, 22, 15, 23, 30, 37, 44, 51,
 90	58, 59, 52, 45, 38, 31, 39, 46,
 91	53, 60, 61, 54, 47, 55, 62, 63
 92};
 93EXPORT_SYMBOL_GPL(v4l2_jpeg_zigzag_scan_index);
 94
 95/*
 96 * Contains the data that needs to be sent in the marker segment of an
 97 * interchange format JPEG stream or an abbreviated format table specification
 98 * data stream. Specifies the huffman table used for encoding the luminance DC
 99 * coefficient differences. The table represents Table K.3 of ITU-T.81
100 */
101const u8 v4l2_jpeg_ref_table_luma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN] = {
102	0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01,
103	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B
105};
106EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_dc_ht);
107
108/*
109 * Contains the data that needs to be sent in the marker segment of an
110 * interchange format JPEG stream or an abbreviated format table specification
111 * data stream. Specifies the huffman table used for encoding the luminance AC
112 * coefficients. The table represents Table K.5 of ITU-T.81
113 */
114const u8 v4l2_jpeg_ref_table_luma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN] = {
115	0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04,
116	0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
117	0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32,
118	0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0,
119	0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A,
120	0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
121	0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55,
122	0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
123	0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85,
124	0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
125	0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2,
126	0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5,
127	0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8,
128	0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA,
129	0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA
130};
131EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_luma_ac_ht);
132
133/*
134 * Contains the data that needs to be sent in the marker segment of an interchange format JPEG
135 * stream or an abbreviated format table specification data stream.
136 * Specifies the huffman table used for encoding the chrominance DC coefficient differences.
137 * The table represents Table K.4 of ITU-T.81
138 */
139const u8 v4l2_jpeg_ref_table_chroma_dc_ht[V4L2_JPEG_REF_HT_DC_LEN] = {
140	0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
141	0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
142	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B
143};
144EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_dc_ht);
145
146/*
147 * Contains the data that needs to be sent in the marker segment of an
148 * interchange format JPEG stream or an abbreviated format table specification
149 * data stream. Specifies the huffman table used for encoding the chrominance
150 * AC coefficients. The table represents Table K.6 of ITU-T.81
151 */
152const u8 v4l2_jpeg_ref_table_chroma_ac_ht[V4L2_JPEG_REF_HT_AC_LEN] = {
153	0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04,
154	0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
155	0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81,
156	0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0,
157	0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17,
158	0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38,
159	0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54,
160	0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
161	0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83,
162	0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
163	0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9,
164	0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3,
165	0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
166	0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
167	0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA
168};
169EXPORT_SYMBOL_GPL(v4l2_jpeg_ref_table_chroma_ac_ht);
170
171/**
172 * struct jpeg_stream - JPEG byte stream
173 * @curr: current position in stream
174 * @end: end position, after last byte
175 */
176struct jpeg_stream {
177	u8 *curr;
178	u8 *end;
179};
180
181/* returns a value that fits into u8, or negative error */
182static int jpeg_get_byte(struct jpeg_stream *stream)
183{
184	if (stream->curr >= stream->end)
185		return -EINVAL;
186
187	return *stream->curr++;
188}
189
190/* returns a value that fits into u16, or negative error */
191static int jpeg_get_word_be(struct jpeg_stream *stream)
192{
193	u16 word;
194
195	if (stream->curr + sizeof(__be16) > stream->end)
196		return -EINVAL;
197
198	word = get_unaligned_be16(stream->curr);
199	stream->curr += sizeof(__be16);
200
201	return word;
202}
203
204static int jpeg_skip(struct jpeg_stream *stream, size_t len)
205{
206	if (stream->curr + len > stream->end)
207		return -EINVAL;
208
209	stream->curr += len;
210
211	return 0;
212}
213
214static int jpeg_next_marker(struct jpeg_stream *stream)
215{
216	int byte;
217	u16 marker = 0;
218
219	while ((byte = jpeg_get_byte(stream)) >= 0) {
220		marker = (marker << 8) | byte;
221		/* skip stuffing bytes and REServed markers */
222		if (marker == TEM || (marker > 0xffbf && marker < 0xffff))
223			return marker;
224	}
225
226	return byte;
227}
228
229/* this does not advance the current position in the stream */
230static int jpeg_reference_segment(struct jpeg_stream *stream,
231				  struct v4l2_jpeg_reference *segment)
232{
233	u16 len;
234
235	if (stream->curr + sizeof(__be16) > stream->end)
236		return -EINVAL;
237
238	len = get_unaligned_be16(stream->curr);
239	if (stream->curr + len > stream->end)
240		return -EINVAL;
241
242	segment->start = stream->curr;
243	segment->length = len;
244
245	return 0;
246}
247
248static int v4l2_jpeg_decode_subsampling(u8 nf, u8 h_v)
249{
250	if (nf == 1)
251		return V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY;
252
253	/* no chroma subsampling for 4-component images */
254	if (nf == 4 && h_v != 0x11)
255		return -EINVAL;
256
257	switch (h_v) {
258	case 0x11:
259		return V4L2_JPEG_CHROMA_SUBSAMPLING_444;
260	case 0x21:
261		return V4L2_JPEG_CHROMA_SUBSAMPLING_422;
262	case 0x22:
263		return V4L2_JPEG_CHROMA_SUBSAMPLING_420;
264	case 0x41:
265		return V4L2_JPEG_CHROMA_SUBSAMPLING_411;
266	default:
267		return -EINVAL;
268	}
269}
270
271static int jpeg_parse_frame_header(struct jpeg_stream *stream, u16 sof_marker,
272				   struct v4l2_jpeg_frame_header *frame_header)
273{
274	int len = jpeg_get_word_be(stream);
275
276	if (len < 0)
277		return len;
278	/* Lf = 8 + 3 * Nf, Nf >= 1 */
279	if (len < 8 + 3)
280		return -EINVAL;
281
282	if (frame_header) {
283		/* Table B.2 - Frame header parameter sizes and values */
284		int p, y, x, nf;
285		int i;
286
287		p = jpeg_get_byte(stream);
288		if (p < 0)
289			return p;
290		/*
291		 * Baseline DCT only supports 8-bit precision.
292		 * Extended sequential DCT also supports 12-bit precision.
293		 */
294		if (p != 8 && (p != 12 || sof_marker != SOF1))
295			return -EINVAL;
296
297		y = jpeg_get_word_be(stream);
298		if (y < 0)
299			return y;
300		if (y == 0)
301			return -EINVAL;
302
303		x = jpeg_get_word_be(stream);
304		if (x < 0)
305			return x;
306		if (x == 0)
307			return -EINVAL;
308
309		nf = jpeg_get_byte(stream);
310		if (nf < 0)
311			return nf;
312		/*
313		 * The spec allows 1 <= Nf <= 255, but we only support up to 4
314		 * components.
315		 */
316		if (nf < 1 || nf > V4L2_JPEG_MAX_COMPONENTS)
317			return -EINVAL;
318		if (len != 8 + 3 * nf)
319			return -EINVAL;
320
321		frame_header->precision = p;
322		frame_header->height = y;
323		frame_header->width = x;
324		frame_header->num_components = nf;
325
326		for (i = 0; i < nf; i++) {
327			struct v4l2_jpeg_frame_component_spec *component;
328			int c, h_v, tq;
329
330			c = jpeg_get_byte(stream);
331			if (c < 0)
332				return c;
333
334			h_v = jpeg_get_byte(stream);
335			if (h_v < 0)
336				return h_v;
337			if (i == 0) {
338				int subs;
339
340				subs = v4l2_jpeg_decode_subsampling(nf, h_v);
341				if (subs < 0)
342					return subs;
343				frame_header->subsampling = subs;
344			} else if (h_v != 0x11) {
345				/* all chroma sampling factors must be 1 */
346				return -EINVAL;
347			}
348
349			tq = jpeg_get_byte(stream);
350			if (tq < 0)
351				return tq;
352
353			component = &frame_header->component[i];
354			component->component_identifier = c;
355			component->horizontal_sampling_factor =
356				(h_v >> 4) & 0xf;
357			component->vertical_sampling_factor = h_v & 0xf;
358			component->quantization_table_selector = tq;
359		}
360	} else {
361		return jpeg_skip(stream, len - 2);
362	}
363
364	return 0;
365}
366
367static int jpeg_parse_scan_header(struct jpeg_stream *stream,
368				  struct v4l2_jpeg_scan_header *scan_header)
369{
370	size_t skip;
371	int len = jpeg_get_word_be(stream);
372
373	if (len < 0)
374		return len;
375	/* Ls = 8 + 3 * Ns, Ns >= 1 */
376	if (len < 6 + 2)
377		return -EINVAL;
378
379	if (scan_header) {
380		int ns;
381		int i;
382
383		ns = jpeg_get_byte(stream);
384		if (ns < 0)
385			return ns;
386		if (ns < 1 || ns > 4 || len != 6 + 2 * ns)
387			return -EINVAL;
388
389		scan_header->num_components = ns;
390
391		for (i = 0; i < ns; i++) {
392			struct v4l2_jpeg_scan_component_spec *component;
393			int cs, td_ta;
394
395			cs = jpeg_get_byte(stream);
396			if (cs < 0)
397				return cs;
398
399			td_ta = jpeg_get_byte(stream);
400			if (td_ta < 0)
401				return td_ta;
402
403			component = &scan_header->component[i];
404			component->component_selector = cs;
405			component->dc_entropy_coding_table_selector =
406				(td_ta >> 4) & 0xf;
407			component->ac_entropy_coding_table_selector =
408				td_ta & 0xf;
409		}
410
411		skip = 3; /* skip Ss, Se, Ah, and Al */
412	} else {
413		skip = len - 2;
414	}
415
416	return jpeg_skip(stream, skip);
417}
418
419/* B.2.4.1 Quantization table-specification syntax */
420static int jpeg_parse_quantization_tables(struct jpeg_stream *stream,
421					  u8 precision,
422					  struct v4l2_jpeg_reference *tables)
423{
424	int len = jpeg_get_word_be(stream);
425
426	if (len < 0)
427		return len;
428	/* Lq = 2 + n * 65 (for baseline DCT), n >= 1 */
429	if (len < 2 + 65)
430		return -EINVAL;
431
432	len -= 2;
433	while (len >= 65) {
434		u8 pq, tq, *qk;
435		int ret;
436		int pq_tq = jpeg_get_byte(stream);
437
438		if (pq_tq < 0)
439			return pq_tq;
440
441		/* quantization table element precision */
442		pq = (pq_tq >> 4) & 0xf;
443		/*
444		 * Only 8-bit Qk values for 8-bit sample precision. Extended
445		 * sequential DCT with 12-bit sample precision also supports
446		 * 16-bit Qk values.
447		 */
448		if (pq != 0 && (pq != 1 || precision != 12))
449			return -EINVAL;
450
451		/* quantization table destination identifier */
452		tq = pq_tq & 0xf;
453		if (tq > 3)
454			return -EINVAL;
455
456		/* quantization table element */
457		qk = stream->curr;
458		ret = jpeg_skip(stream, pq ? 128 : 64);
459		if (ret < 0)
460			return -EINVAL;
461
462		if (tables) {
463			tables[tq].start = qk;
464			tables[tq].length = pq ? 128 : 64;
465		}
466
467		len -= pq ? 129 : 65;
468	}
469
470	return 0;
471}
472
473/* B.2.4.2 Huffman table-specification syntax */
474static int jpeg_parse_huffman_tables(struct jpeg_stream *stream,
475				     struct v4l2_jpeg_reference *tables)
476{
477	int mt;
478	int len = jpeg_get_word_be(stream);
479
480	if (len < 0)
481		return len;
482	/* Table B.5 - Huffman table specification parameter sizes and values */
483	if (len < 2 + 17)
484		return -EINVAL;
485
486	for (len -= 2; len >= 17; len -= 17 + mt) {
487		u8 tc, th, *table;
488		int tc_th = jpeg_get_byte(stream);
489		int i, ret;
490
491		if (tc_th < 0)
492			return tc_th;
493
494		/* table class - 0 = DC, 1 = AC */
495		tc = (tc_th >> 4) & 0xf;
496		if (tc > 1)
497			return -EINVAL;
498
499		/* huffman table destination identifier */
500		th = tc_th & 0xf;
501		/* only two Huffman tables for baseline DCT */
502		if (th > 1)
503			return -EINVAL;
504
505		/* BITS - number of Huffman codes with length i */
506		table = stream->curr;
507		mt = 0;
508		for (i = 0; i < 16; i++) {
509			int li;
510
511			li = jpeg_get_byte(stream);
512			if (li < 0)
513				return li;
514
515			mt += li;
516		}
517		/* HUFFVAL - values associated with each Huffman code */
518		ret = jpeg_skip(stream, mt);
519		if (ret < 0)
520			return ret;
521
522		if (tables) {
523			tables[(tc << 1) | th].start = table;
524			tables[(tc << 1) | th].length = stream->curr - table;
525		}
526	}
527
528	return jpeg_skip(stream, len - 2);
529}
530
531/* B.2.4.4 Restart interval definition syntax */
532static int jpeg_parse_restart_interval(struct jpeg_stream *stream,
533				       u16 *restart_interval)
534{
535	int len = jpeg_get_word_be(stream);
536	int ri;
537
538	if (len < 0)
539		return len;
540	if (len != 4)
541		return -EINVAL;
542
543	ri = jpeg_get_word_be(stream);
544	if (ri < 0)
545		return ri;
546
547	*restart_interval = ri;
548
549	return 0;
550}
551
552static int jpeg_skip_segment(struct jpeg_stream *stream)
553{
554	int len = jpeg_get_word_be(stream);
555
556	if (len < 0)
557		return len;
558	if (len < 2)
559		return -EINVAL;
560
561	return jpeg_skip(stream, len - 2);
562}
563
564/* Rec. ITU-T T.872 (06/2012) 6.5.3 */
565static int jpeg_parse_app14_data(struct jpeg_stream *stream,
566				 enum v4l2_jpeg_app14_tf *tf)
567{
568	int ret;
569	int lp;
570	int skip;
571
572	lp = jpeg_get_word_be(stream);
573	if (lp < 0)
574		return lp;
575
576	/* Check for "Adobe\0" in Ap1..6 */
577	if (stream->curr + 6 > stream->end ||
578	    strncmp(stream->curr, "Adobe\0", 6))
579		return jpeg_skip(stream, lp - 2);
580
581	/* get to Ap12 */
582	ret = jpeg_skip(stream, 11);
583	if (ret < 0)
584		return ret;
585
586	ret = jpeg_get_byte(stream);
587	if (ret < 0)
588		return ret;
589
590	*tf = ret;
591
592	/* skip the rest of the segment, this ensures at least it is complete */
593	skip = lp - 2 - 11 - 1;
594	return jpeg_skip(stream, skip);
595}
596
597/**
598 * v4l2_jpeg_parse_header - locate marker segments and optionally parse headers
599 * @buf: address of the JPEG buffer, should start with a SOI marker
600 * @len: length of the JPEG buffer
601 * @out: returns marker segment positions and optionally parsed headers
602 *
603 * The out->scan_header pointer must be initialized to NULL or point to a valid
604 * v4l2_jpeg_scan_header structure. The out->huffman_tables and
605 * out->quantization_tables pointers must be initialized to NULL or point to a
606 * valid array of 4 v4l2_jpeg_reference structures each.
607 *
608 * Returns 0 or negative error if parsing failed.
609 */
610int v4l2_jpeg_parse_header(void *buf, size_t len, struct v4l2_jpeg_header *out)
611{
612	struct jpeg_stream stream;
613	int marker;
614	int ret = 0;
615
616	stream.curr = buf;
617	stream.end = stream.curr + len;
618
619	out->num_dht = 0;
620	out->num_dqt = 0;
621
622	/* the first bytes must be SOI, B.2.1 High-level syntax */
623	if (jpeg_get_word_be(&stream) != SOI)
624		return -EINVAL;
625
626	/* init value to signal if this marker is not present */
627	out->app14_tf = V4L2_JPEG_APP14_TF_UNKNOWN;
628
629	/* loop through marker segments */
630	while ((marker = jpeg_next_marker(&stream)) >= 0) {
631		switch (marker) {
632		/* baseline DCT, extended sequential DCT */
633		case SOF0 ... SOF1:
634			ret = jpeg_reference_segment(&stream, &out->sof);
635			if (ret < 0)
636				return ret;
637			ret = jpeg_parse_frame_header(&stream, marker,
638						      &out->frame);
639			break;
640		/* progressive, lossless */
641		case SOF2 ... SOF3:
642		/* differential coding */
643		case SOF5 ... SOF7:
644		/* arithmetic coding */
645		case SOF9 ... SOF11:
646		case SOF13 ... SOF15:
647		case DAC:
648		case TEM:
649			return -EINVAL;
650
651		case DHT:
652			ret = jpeg_reference_segment(&stream,
653					&out->dht[out->num_dht++ % 4]);
654			if (ret < 0)
655				return ret;
656			if (!out->huffman_tables) {
657				ret = jpeg_skip_segment(&stream);
658				break;
659			}
660			ret = jpeg_parse_huffman_tables(&stream,
661							out->huffman_tables);
662			break;
663		case DQT:
664			ret = jpeg_reference_segment(&stream,
665					&out->dqt[out->num_dqt++ % 4]);
666			if (ret < 0)
667				return ret;
668			if (!out->quantization_tables) {
669				ret = jpeg_skip_segment(&stream);
670				break;
671			}
672			ret = jpeg_parse_quantization_tables(&stream,
673					out->frame.precision,
674					out->quantization_tables);
675			break;
676		case DRI:
677			ret = jpeg_parse_restart_interval(&stream,
678							&out->restart_interval);
679			break;
680		case APP14:
681			ret = jpeg_parse_app14_data(&stream,
682						    &out->app14_tf);
683			break;
684		case SOS:
685			ret = jpeg_reference_segment(&stream, &out->sos);
686			if (ret < 0)
687				return ret;
688			ret = jpeg_parse_scan_header(&stream, out->scan);
689			/*
690			 * stop parsing, the scan header marks the beginning of
691			 * the entropy coded segment
692			 */
693			out->ecs_offset = stream.curr - (u8 *)buf;
694			return ret;
695
696		/* markers without parameters */
697		case RST0 ... RST7: /* restart */
698		case SOI: /* start of image */
699		case EOI: /* end of image */
700			break;
701
702		/* skip unknown or unsupported marker segments */
703		default:
704			ret = jpeg_skip_segment(&stream);
705			break;
706		}
707		if (ret < 0)
708			return ret;
709	}
710
711	return marker;
712}
713EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_header);
714
715/**
716 * v4l2_jpeg_parse_frame_header - parse frame header
717 * @buf: address of the frame header, after the SOF0 marker
718 * @len: length of the frame header
719 * @frame_header: returns the parsed frame header
720 *
721 * Returns 0 or negative error if parsing failed.
722 */
723int v4l2_jpeg_parse_frame_header(void *buf, size_t len,
724				 struct v4l2_jpeg_frame_header *frame_header)
725{
726	struct jpeg_stream stream;
727
728	stream.curr = buf;
729	stream.end = stream.curr + len;
730	return jpeg_parse_frame_header(&stream, SOF0, frame_header);
731}
732EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_frame_header);
733
734/**
735 * v4l2_jpeg_parse_scan_header - parse scan header
736 * @buf: address of the scan header, after the SOS marker
737 * @len: length of the scan header
738 * @scan_header: returns the parsed scan header
739 *
740 * Returns 0 or negative error if parsing failed.
741 */
742int v4l2_jpeg_parse_scan_header(void *buf, size_t len,
743				struct v4l2_jpeg_scan_header *scan_header)
744{
745	struct jpeg_stream stream;
746
747	stream.curr = buf;
748	stream.end = stream.curr + len;
749	return jpeg_parse_scan_header(&stream, scan_header);
750}
751EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_scan_header);
752
753/**
754 * v4l2_jpeg_parse_quantization_tables - parse quantization tables segment
755 * @buf: address of the quantization table segment, after the DQT marker
756 * @len: length of the quantization table segment
757 * @precision: sample precision (P) in bits per component
758 * @q_tables: returns four references into the buffer for the
759 *            four possible quantization table destinations
760 *
761 * Returns 0 or negative error if parsing failed.
762 */
763int v4l2_jpeg_parse_quantization_tables(void *buf, size_t len, u8 precision,
764					struct v4l2_jpeg_reference *q_tables)
765{
766	struct jpeg_stream stream;
767
768	stream.curr = buf;
769	stream.end = stream.curr + len;
770	return jpeg_parse_quantization_tables(&stream, precision, q_tables);
771}
772EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_quantization_tables);
773
774/**
775 * v4l2_jpeg_parse_huffman_tables - parse huffman tables segment
776 * @buf: address of the Huffman table segment, after the DHT marker
777 * @len: length of the Huffman table segment
778 * @huffman_tables: returns four references into the buffer for the
779 *                  four possible Huffman table destinations, in
780 *                  the order DC0, DC1, AC0, AC1
781 *
782 * Returns 0 or negative error if parsing failed.
783 */
784int v4l2_jpeg_parse_huffman_tables(void *buf, size_t len,
785				   struct v4l2_jpeg_reference *huffman_tables)
786{
787	struct jpeg_stream stream;
788
789	stream.curr = buf;
790	stream.end = stream.curr + len;
791	return jpeg_parse_huffman_tables(&stream, huffman_tables);
792}
793EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_huffman_tables);