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 <asm/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/**
 56 * struct jpeg_stream - JPEG byte stream
 57 * @curr: current position in stream
 58 * @end: end position, after last byte
 59 */
 60struct jpeg_stream {
 61	u8 *curr;
 62	u8 *end;
 63};
 64
 65/* returns a value that fits into u8, or negative error */
 66static int jpeg_get_byte(struct jpeg_stream *stream)
 67{
 68	if (stream->curr >= stream->end)
 69		return -EINVAL;
 70
 71	return *stream->curr++;
 72}
 73
 74/* returns a value that fits into u16, or negative error */
 75static int jpeg_get_word_be(struct jpeg_stream *stream)
 76{
 77	u16 word;
 78
 79	if (stream->curr + sizeof(__be16) > stream->end)
 80		return -EINVAL;
 81
 82	word = get_unaligned_be16(stream->curr);
 83	stream->curr += sizeof(__be16);
 84
 85	return word;
 86}
 87
 88static int jpeg_skip(struct jpeg_stream *stream, size_t len)
 89{
 90	if (stream->curr + len > stream->end)
 91		return -EINVAL;
 92
 93	stream->curr += len;
 94
 95	return 0;
 96}
 97
 98static int jpeg_next_marker(struct jpeg_stream *stream)
 99{
100	int byte;
101	u16 marker = 0;
102
103	while ((byte = jpeg_get_byte(stream)) >= 0) {
104		marker = (marker << 8) | byte;
105		/* skip stuffing bytes and REServed markers */
106		if (marker == TEM || (marker > 0xffbf && marker < 0xffff))
107			return marker;
108	}
109
110	return byte;
111}
112
113/* this does not advance the current position in the stream */
114static int jpeg_reference_segment(struct jpeg_stream *stream,
115				  struct v4l2_jpeg_reference *segment)
116{
117	u16 len;
118
119	if (stream->curr + sizeof(__be16) > stream->end)
120		return -EINVAL;
121
122	len = get_unaligned_be16(stream->curr);
123	if (stream->curr + len > stream->end)
124		return -EINVAL;
125
126	segment->start = stream->curr;
127	segment->length = len;
128
129	return 0;
130}
131
132static int v4l2_jpeg_decode_subsampling(u8 nf, u8 h_v)
133{
134	if (nf == 1)
135		return V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY;
136
137	/* no chroma subsampling for 4-component images */
138	if (nf == 4 && h_v != 0x11)
139		return -EINVAL;
140
141	switch (h_v) {
142	case 0x11:
143		return V4L2_JPEG_CHROMA_SUBSAMPLING_444;
144	case 0x21:
145		return V4L2_JPEG_CHROMA_SUBSAMPLING_422;
146	case 0x22:
147		return V4L2_JPEG_CHROMA_SUBSAMPLING_420;
148	case 0x41:
149		return V4L2_JPEG_CHROMA_SUBSAMPLING_411;
150	default:
151		return -EINVAL;
152	}
153}
154
155static int jpeg_parse_frame_header(struct jpeg_stream *stream, u16 sof_marker,
156				   struct v4l2_jpeg_frame_header *frame_header)
157{
158	int len = jpeg_get_word_be(stream);
159
160	if (len < 0)
161		return len;
162	/* Lf = 8 + 3 * Nf, Nf >= 1 */
163	if (len < 8 + 3)
164		return -EINVAL;
165
166	if (frame_header) {
167		/* Table B.2 - Frame header parameter sizes and values */
168		int p, y, x, nf;
169		int i;
170
171		p = jpeg_get_byte(stream);
172		if (p < 0)
173			return p;
174		/*
175		 * Baseline DCT only supports 8-bit precision.
176		 * Extended sequential DCT also supports 12-bit precision.
177		 */
178		if (p != 8 && (p != 12 || sof_marker != SOF1))
179			return -EINVAL;
180
181		y = jpeg_get_word_be(stream);
182		if (y < 0)
183			return y;
184		if (y == 0)
185			return -EINVAL;
186
187		x = jpeg_get_word_be(stream);
188		if (x < 0)
189			return x;
190		if (x == 0)
191			return -EINVAL;
192
193		nf = jpeg_get_byte(stream);
194		if (nf < 0)
195			return nf;
196		/*
197		 * The spec allows 1 <= Nf <= 255, but we only support up to 4
198		 * components.
199		 */
200		if (nf < 1 || nf > V4L2_JPEG_MAX_COMPONENTS)
201			return -EINVAL;
202		if (len != 8 + 3 * nf)
203			return -EINVAL;
204
205		frame_header->precision = p;
206		frame_header->height = y;
207		frame_header->width = x;
208		frame_header->num_components = nf;
209
210		for (i = 0; i < nf; i++) {
211			struct v4l2_jpeg_frame_component_spec *component;
212			int c, h_v, tq;
213
214			c = jpeg_get_byte(stream);
215			if (c < 0)
216				return c;
217
218			h_v = jpeg_get_byte(stream);
219			if (h_v < 0)
220				return h_v;
221			if (i == 0) {
222				int subs;
223
224				subs = v4l2_jpeg_decode_subsampling(nf, h_v);
225				if (subs < 0)
226					return subs;
227				frame_header->subsampling = subs;
228			} else if (h_v != 0x11) {
229				/* all chroma sampling factors must be 1 */
230				return -EINVAL;
231			}
232
233			tq = jpeg_get_byte(stream);
234			if (tq < 0)
235				return tq;
236
237			component = &frame_header->component[i];
238			component->component_identifier = c;
239			component->horizontal_sampling_factor =
240				(h_v >> 4) & 0xf;
241			component->vertical_sampling_factor = h_v & 0xf;
242			component->quantization_table_selector = tq;
243		}
244	} else {
245		return jpeg_skip(stream, len - 2);
246	}
247
248	return 0;
249}
250
251static int jpeg_parse_scan_header(struct jpeg_stream *stream,
252				  struct v4l2_jpeg_scan_header *scan_header)
253{
254	size_t skip;
255	int len = jpeg_get_word_be(stream);
256
257	if (len < 0)
258		return len;
259	/* Ls = 8 + 3 * Ns, Ns >= 1 */
260	if (len < 6 + 2)
261		return -EINVAL;
262
263	if (scan_header) {
264		int ns;
265		int i;
266
267		ns = jpeg_get_byte(stream);
268		if (ns < 0)
269			return ns;
270		if (ns < 1 || ns > 4 || len != 6 + 2 * ns)
271			return -EINVAL;
272
273		scan_header->num_components = ns;
274
275		for (i = 0; i < ns; i++) {
276			struct v4l2_jpeg_scan_component_spec *component;
277			int cs, td_ta;
278
279			cs = jpeg_get_byte(stream);
280			if (cs < 0)
281				return cs;
282
283			td_ta = jpeg_get_byte(stream);
284			if (td_ta < 0)
285				return td_ta;
286
287			component = &scan_header->component[i];
288			component->component_selector = cs;
289			component->dc_entropy_coding_table_selector =
290				(td_ta >> 4) & 0xf;
291			component->ac_entropy_coding_table_selector =
292				td_ta & 0xf;
293		}
294
295		skip = 3; /* skip Ss, Se, Ah, and Al */
296	} else {
297		skip = len - 2;
298	}
299
300	return jpeg_skip(stream, skip);
301}
302
303/* B.2.4.1 Quantization table-specification syntax */
304static int jpeg_parse_quantization_tables(struct jpeg_stream *stream,
305					  u8 precision,
306					  struct v4l2_jpeg_reference *tables)
307{
308	int len = jpeg_get_word_be(stream);
309
310	if (len < 0)
311		return len;
312	/* Lq = 2 + n * 65 (for baseline DCT), n >= 1 */
313	if (len < 2 + 65)
314		return -EINVAL;
315
316	len -= 2;
317	while (len >= 65) {
318		u8 pq, tq, *qk;
319		int ret;
320		int pq_tq = jpeg_get_byte(stream);
321
322		if (pq_tq < 0)
323			return pq_tq;
324
325		/* quantization table element precision */
326		pq = (pq_tq >> 4) & 0xf;
327		/*
328		 * Only 8-bit Qk values for 8-bit sample precision. Extended
329		 * sequential DCT with 12-bit sample precision also supports
330		 * 16-bit Qk values.
331		 */
332		if (pq != 0 && (pq != 1 || precision != 12))
333			return -EINVAL;
334
335		/* quantization table destination identifier */
336		tq = pq_tq & 0xf;
337		if (tq > 3)
338			return -EINVAL;
339
340		/* quantization table element */
341		qk = stream->curr;
342		ret = jpeg_skip(stream, pq ? 128 : 64);
343		if (ret < 0)
344			return -EINVAL;
345
346		if (tables) {
347			tables[tq].start = qk;
348			tables[tq].length = pq ? 128 : 64;
349		}
350
351		len -= pq ? 129 : 65;
352	}
353
354	return 0;
355}
356
357/* B.2.4.2 Huffman table-specification syntax */
358static int jpeg_parse_huffman_tables(struct jpeg_stream *stream,
359				     struct v4l2_jpeg_reference *tables)
360{
361	int mt;
362	int len = jpeg_get_word_be(stream);
363
364	if (len < 0)
365		return len;
366	/* Table B.5 - Huffman table specification parameter sizes and values */
367	if (len < 2 + 17)
368		return -EINVAL;
369
370	for (len -= 2; len >= 17; len -= 17 + mt) {
371		u8 tc, th, *table;
372		int tc_th = jpeg_get_byte(stream);
373		int i, ret;
374
375		if (tc_th < 0)
376			return tc_th;
377
378		/* table class - 0 = DC, 1 = AC */
379		tc = (tc_th >> 4) & 0xf;
380		if (tc > 1)
381			return -EINVAL;
382
383		/* huffman table destination identifier */
384		th = tc_th & 0xf;
385		/* only two Huffman tables for baseline DCT */
386		if (th > 1)
387			return -EINVAL;
388
389		/* BITS - number of Huffman codes with length i */
390		table = stream->curr;
391		mt = 0;
392		for (i = 0; i < 16; i++) {
393			int li;
394
395			li = jpeg_get_byte(stream);
396			if (li < 0)
397				return li;
398
399			mt += li;
400		}
401		/* HUFFVAL - values associated with each Huffman code */
402		ret = jpeg_skip(stream, mt);
403		if (ret < 0)
404			return ret;
405
406		if (tables) {
407			tables[(tc << 1) | th].start = table;
408			tables[(tc << 1) | th].length = stream->curr - table;
409		}
410	}
411
412	return jpeg_skip(stream, len - 2);
413}
414
415/* B.2.4.4 Restart interval definition syntax */
416static int jpeg_parse_restart_interval(struct jpeg_stream *stream,
417				       u16 *restart_interval)
418{
419	int len = jpeg_get_word_be(stream);
420	int ri;
421
422	if (len < 0)
423		return len;
424	if (len != 4)
425		return -EINVAL;
426
427	ri = jpeg_get_word_be(stream);
428	if (ri < 0)
429		return ri;
430
431	*restart_interval = ri;
432
433	return 0;
434}
435
436static int jpeg_skip_segment(struct jpeg_stream *stream)
437{
438	int len = jpeg_get_word_be(stream);
439
440	if (len < 0)
441		return len;
442	if (len < 2)
443		return -EINVAL;
444
445	return jpeg_skip(stream, len - 2);
446}
447
448/* Rec. ITU-T T.872 (06/2012) 6.5.3 */
449static int jpeg_parse_app14_data(struct jpeg_stream *stream,
450				 enum v4l2_jpeg_app14_tf *tf)
451{
452	int ret;
453	int lp;
454	int skip;
455
456	lp = jpeg_get_word_be(stream);
457	if (lp < 0)
458		return lp;
459
460	/* Check for "Adobe\0" in Ap1..6 */
461	if (stream->curr + 6 > stream->end ||
462	    strncmp(stream->curr, "Adobe\0", 6))
463		return -EINVAL;
464
465	/* get to Ap12 */
466	ret = jpeg_skip(stream, 11);
467	if (ret < 0)
468		return ret;
469
470	ret = jpeg_get_byte(stream);
471	if (ret < 0)
472		return ret;
473
474	*tf = ret;
475
476	/* skip the rest of the segment, this ensures at least it is complete */
477	skip = lp - 2 - 11;
478	return jpeg_skip(stream, skip);
479}
480
481/**
482 * v4l2_jpeg_parse_header - locate marker segments and optionally parse headers
483 * @buf: address of the JPEG buffer, should start with a SOI marker
484 * @len: length of the JPEG buffer
485 * @out: returns marker segment positions and optionally parsed headers
486 *
487 * The out->scan_header pointer must be initialized to NULL or point to a valid
488 * v4l2_jpeg_scan_header structure. The out->huffman_tables and
489 * out->quantization_tables pointers must be initialized to NULL or point to a
490 * valid array of 4 v4l2_jpeg_reference structures each.
491 *
492 * Returns 0 or negative error if parsing failed.
493 */
494int v4l2_jpeg_parse_header(void *buf, size_t len, struct v4l2_jpeg_header *out)
495{
496	struct jpeg_stream stream;
497	int marker;
498	int ret = 0;
499
500	stream.curr = buf;
501	stream.end = stream.curr + len;
502
503	out->num_dht = 0;
504	out->num_dqt = 0;
505
506	/* the first bytes must be SOI, B.2.1 High-level syntax */
507	if (jpeg_get_word_be(&stream) != SOI)
508		return -EINVAL;
509
510	/* init value to signal if this marker is not present */
511	out->app14_tf = V4L2_JPEG_APP14_TF_UNKNOWN;
512
513	/* loop through marker segments */
514	while ((marker = jpeg_next_marker(&stream)) >= 0) {
515		switch (marker) {
516		/* baseline DCT, extended sequential DCT */
517		case SOF0 ... SOF1:
518			ret = jpeg_reference_segment(&stream, &out->sof);
519			if (ret < 0)
520				return ret;
521			ret = jpeg_parse_frame_header(&stream, marker,
522						      &out->frame);
523			break;
524		/* progressive, lossless */
525		case SOF2 ... SOF3:
526		/* differential coding */
527		case SOF5 ... SOF7:
528		/* arithmetic coding */
529		case SOF9 ... SOF11:
530		case SOF13 ... SOF15:
531		case DAC:
532		case TEM:
533			return -EINVAL;
534
535		case DHT:
536			ret = jpeg_reference_segment(&stream,
537					&out->dht[out->num_dht++ % 4]);
538			if (ret < 0)
539				return ret;
540			if (!out->huffman_tables) {
541				ret = jpeg_skip_segment(&stream);
542				break;
543			}
544			ret = jpeg_parse_huffman_tables(&stream,
545							out->huffman_tables);
546			break;
547		case DQT:
548			ret = jpeg_reference_segment(&stream,
549					&out->dqt[out->num_dqt++ % 4]);
550			if (ret < 0)
551				return ret;
552			if (!out->quantization_tables) {
553				ret = jpeg_skip_segment(&stream);
554				break;
555			}
556			ret = jpeg_parse_quantization_tables(&stream,
557					out->frame.precision,
558					out->quantization_tables);
559			break;
560		case DRI:
561			ret = jpeg_parse_restart_interval(&stream,
562							&out->restart_interval);
563			break;
564		case APP14:
565			ret = jpeg_parse_app14_data(&stream,
566						    &out->app14_tf);
567			break;
568		case SOS:
569			ret = jpeg_reference_segment(&stream, &out->sos);
570			if (ret < 0)
571				return ret;
572			ret = jpeg_parse_scan_header(&stream, out->scan);
573			/*
574			 * stop parsing, the scan header marks the beginning of
575			 * the entropy coded segment
576			 */
577			out->ecs_offset = stream.curr - (u8 *)buf;
578			return ret;
579
580		/* markers without parameters */
581		case RST0 ... RST7: /* restart */
582		case SOI: /* start of image */
583		case EOI: /* end of image */
584			break;
585
586		/* skip unknown or unsupported marker segments */
587		default:
588			ret = jpeg_skip_segment(&stream);
589			break;
590		}
591		if (ret < 0)
592			return ret;
593	}
594
595	return marker;
596}
597EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_header);
598
599/**
600 * v4l2_jpeg_parse_frame_header - parse frame header
601 * @buf: address of the frame header, after the SOF0 marker
602 * @len: length of the frame header
603 * @frame_header: returns the parsed frame header
604 *
605 * Returns 0 or negative error if parsing failed.
606 */
607int v4l2_jpeg_parse_frame_header(void *buf, size_t len,
608				 struct v4l2_jpeg_frame_header *frame_header)
609{
610	struct jpeg_stream stream;
611
612	stream.curr = buf;
613	stream.end = stream.curr + len;
614	return jpeg_parse_frame_header(&stream, SOF0, frame_header);
615}
616EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_frame_header);
617
618/**
619 * v4l2_jpeg_parse_scan_header - parse scan header
620 * @buf: address of the scan header, after the SOS marker
621 * @len: length of the scan header
622 * @scan_header: returns the parsed scan header
623 *
624 * Returns 0 or negative error if parsing failed.
625 */
626int v4l2_jpeg_parse_scan_header(void *buf, size_t len,
627				struct v4l2_jpeg_scan_header *scan_header)
628{
629	struct jpeg_stream stream;
630
631	stream.curr = buf;
632	stream.end = stream.curr + len;
633	return jpeg_parse_scan_header(&stream, scan_header);
634}
635EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_scan_header);
636
637/**
638 * v4l2_jpeg_parse_quantization_tables - parse quantization tables segment
639 * @buf: address of the quantization table segment, after the DQT marker
640 * @len: length of the quantization table segment
641 * @precision: sample precision (P) in bits per component
642 * @q_tables: returns four references into the buffer for the
643 *            four possible quantization table destinations
644 *
645 * Returns 0 or negative error if parsing failed.
646 */
647int v4l2_jpeg_parse_quantization_tables(void *buf, size_t len, u8 precision,
648					struct v4l2_jpeg_reference *q_tables)
649{
650	struct jpeg_stream stream;
651
652	stream.curr = buf;
653	stream.end = stream.curr + len;
654	return jpeg_parse_quantization_tables(&stream, precision, q_tables);
655}
656EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_quantization_tables);
657
658/**
659 * v4l2_jpeg_parse_huffman_tables - parse huffman tables segment
660 * @buf: address of the Huffman table segment, after the DHT marker
661 * @len: length of the Huffman table segment
662 * @huffman_tables: returns four references into the buffer for the
663 *                  four possible Huffman table destinations, in
664 *                  the order DC0, DC1, AC0, AC1
665 *
666 * Returns 0 or negative error if parsing failed.
667 */
668int v4l2_jpeg_parse_huffman_tables(void *buf, size_t len,
669				   struct v4l2_jpeg_reference *huffman_tables)
670{
671	struct jpeg_stream stream;
672
673	stream.curr = buf;
674	stream.end = stream.curr + len;
675	return jpeg_parse_huffman_tables(&stream, huffman_tables);
676}
677EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_huffman_tables);