0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <asm/unaligned.h>
0013 #include <linux/errno.h>
0014 #include <linux/kernel.h>
0015 #include <linux/module.h>
0016 #include <linux/types.h>
0017 #include <media/v4l2-jpeg.h>
0018
0019 MODULE_DESCRIPTION("V4L2 JPEG header parser helpers");
0020 MODULE_AUTHOR("Philipp Zabel <kernel@pengutronix.de>");
0021 MODULE_LICENSE("GPL");
0022
0023
0024 #define SOF0 0xffc0
0025 #define SOF1 0xffc1
0026 #define SOF2 0xffc2
0027 #define SOF3 0xffc3
0028 #define SOF5 0xffc5
0029 #define SOF7 0xffc7
0030 #define JPG 0xffc8
0031 #define SOF9 0xffc9
0032 #define SOF11 0xffcb
0033 #define SOF13 0xffcd
0034 #define SOF15 0xffcf
0035 #define DHT 0xffc4
0036 #define DAC 0xffcc
0037 #define RST0 0xffd0
0038 #define RST7 0xffd7
0039 #define SOI 0xffd8
0040 #define EOI 0xffd9
0041 #define SOS 0xffda
0042 #define DQT 0xffdb
0043 #define DNL 0xffdc
0044 #define DRI 0xffdd
0045 #define DHP 0xffde
0046 #define EXP 0xffdf
0047 #define APP0 0xffe0
0048 #define APP14 0xffee
0049 #define APP15 0xffef
0050 #define JPG0 0xfff0
0051 #define JPG13 0xfffd
0052 #define COM 0xfffe
0053 #define TEM 0xff01
0054
0055
0056
0057
0058
0059
0060 struct jpeg_stream {
0061 u8 *curr;
0062 u8 *end;
0063 };
0064
0065
0066 static int jpeg_get_byte(struct jpeg_stream *stream)
0067 {
0068 if (stream->curr >= stream->end)
0069 return -EINVAL;
0070
0071 return *stream->curr++;
0072 }
0073
0074
0075 static int jpeg_get_word_be(struct jpeg_stream *stream)
0076 {
0077 u16 word;
0078
0079 if (stream->curr + sizeof(__be16) > stream->end)
0080 return -EINVAL;
0081
0082 word = get_unaligned_be16(stream->curr);
0083 stream->curr += sizeof(__be16);
0084
0085 return word;
0086 }
0087
0088 static int jpeg_skip(struct jpeg_stream *stream, size_t len)
0089 {
0090 if (stream->curr + len > stream->end)
0091 return -EINVAL;
0092
0093 stream->curr += len;
0094
0095 return 0;
0096 }
0097
0098 static int jpeg_next_marker(struct jpeg_stream *stream)
0099 {
0100 int byte;
0101 u16 marker = 0;
0102
0103 while ((byte = jpeg_get_byte(stream)) >= 0) {
0104 marker = (marker << 8) | byte;
0105
0106 if (marker == TEM || (marker > 0xffbf && marker < 0xffff))
0107 return marker;
0108 }
0109
0110 return byte;
0111 }
0112
0113
0114 static int jpeg_reference_segment(struct jpeg_stream *stream,
0115 struct v4l2_jpeg_reference *segment)
0116 {
0117 u16 len;
0118
0119 if (stream->curr + sizeof(__be16) > stream->end)
0120 return -EINVAL;
0121
0122 len = get_unaligned_be16(stream->curr);
0123 if (stream->curr + len > stream->end)
0124 return -EINVAL;
0125
0126 segment->start = stream->curr;
0127 segment->length = len;
0128
0129 return 0;
0130 }
0131
0132 static int v4l2_jpeg_decode_subsampling(u8 nf, u8 h_v)
0133 {
0134 if (nf == 1)
0135 return V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY;
0136
0137
0138 if (nf == 4 && h_v != 0x11)
0139 return -EINVAL;
0140
0141 switch (h_v) {
0142 case 0x11:
0143 return V4L2_JPEG_CHROMA_SUBSAMPLING_444;
0144 case 0x21:
0145 return V4L2_JPEG_CHROMA_SUBSAMPLING_422;
0146 case 0x22:
0147 return V4L2_JPEG_CHROMA_SUBSAMPLING_420;
0148 case 0x41:
0149 return V4L2_JPEG_CHROMA_SUBSAMPLING_411;
0150 default:
0151 return -EINVAL;
0152 }
0153 }
0154
0155 static int jpeg_parse_frame_header(struct jpeg_stream *stream, u16 sof_marker,
0156 struct v4l2_jpeg_frame_header *frame_header)
0157 {
0158 int len = jpeg_get_word_be(stream);
0159
0160 if (len < 0)
0161 return len;
0162
0163 if (len < 8 + 3)
0164 return -EINVAL;
0165
0166 if (frame_header) {
0167
0168 int p, y, x, nf;
0169 int i;
0170
0171 p = jpeg_get_byte(stream);
0172 if (p < 0)
0173 return p;
0174
0175
0176
0177
0178 if (p != 8 && (p != 12 || sof_marker != SOF1))
0179 return -EINVAL;
0180
0181 y = jpeg_get_word_be(stream);
0182 if (y < 0)
0183 return y;
0184 if (y == 0)
0185 return -EINVAL;
0186
0187 x = jpeg_get_word_be(stream);
0188 if (x < 0)
0189 return x;
0190 if (x == 0)
0191 return -EINVAL;
0192
0193 nf = jpeg_get_byte(stream);
0194 if (nf < 0)
0195 return nf;
0196
0197
0198
0199
0200 if (nf < 1 || nf > V4L2_JPEG_MAX_COMPONENTS)
0201 return -EINVAL;
0202 if (len != 8 + 3 * nf)
0203 return -EINVAL;
0204
0205 frame_header->precision = p;
0206 frame_header->height = y;
0207 frame_header->width = x;
0208 frame_header->num_components = nf;
0209
0210 for (i = 0; i < nf; i++) {
0211 struct v4l2_jpeg_frame_component_spec *component;
0212 int c, h_v, tq;
0213
0214 c = jpeg_get_byte(stream);
0215 if (c < 0)
0216 return c;
0217
0218 h_v = jpeg_get_byte(stream);
0219 if (h_v < 0)
0220 return h_v;
0221 if (i == 0) {
0222 int subs;
0223
0224 subs = v4l2_jpeg_decode_subsampling(nf, h_v);
0225 if (subs < 0)
0226 return subs;
0227 frame_header->subsampling = subs;
0228 } else if (h_v != 0x11) {
0229
0230 return -EINVAL;
0231 }
0232
0233 tq = jpeg_get_byte(stream);
0234 if (tq < 0)
0235 return tq;
0236
0237 component = &frame_header->component[i];
0238 component->component_identifier = c;
0239 component->horizontal_sampling_factor =
0240 (h_v >> 4) & 0xf;
0241 component->vertical_sampling_factor = h_v & 0xf;
0242 component->quantization_table_selector = tq;
0243 }
0244 } else {
0245 return jpeg_skip(stream, len - 2);
0246 }
0247
0248 return 0;
0249 }
0250
0251 static int jpeg_parse_scan_header(struct jpeg_stream *stream,
0252 struct v4l2_jpeg_scan_header *scan_header)
0253 {
0254 size_t skip;
0255 int len = jpeg_get_word_be(stream);
0256
0257 if (len < 0)
0258 return len;
0259
0260 if (len < 6 + 2)
0261 return -EINVAL;
0262
0263 if (scan_header) {
0264 int ns;
0265 int i;
0266
0267 ns = jpeg_get_byte(stream);
0268 if (ns < 0)
0269 return ns;
0270 if (ns < 1 || ns > 4 || len != 6 + 2 * ns)
0271 return -EINVAL;
0272
0273 scan_header->num_components = ns;
0274
0275 for (i = 0; i < ns; i++) {
0276 struct v4l2_jpeg_scan_component_spec *component;
0277 int cs, td_ta;
0278
0279 cs = jpeg_get_byte(stream);
0280 if (cs < 0)
0281 return cs;
0282
0283 td_ta = jpeg_get_byte(stream);
0284 if (td_ta < 0)
0285 return td_ta;
0286
0287 component = &scan_header->component[i];
0288 component->component_selector = cs;
0289 component->dc_entropy_coding_table_selector =
0290 (td_ta >> 4) & 0xf;
0291 component->ac_entropy_coding_table_selector =
0292 td_ta & 0xf;
0293 }
0294
0295 skip = 3;
0296 } else {
0297 skip = len - 2;
0298 }
0299
0300 return jpeg_skip(stream, skip);
0301 }
0302
0303
0304 static int jpeg_parse_quantization_tables(struct jpeg_stream *stream,
0305 u8 precision,
0306 struct v4l2_jpeg_reference *tables)
0307 {
0308 int len = jpeg_get_word_be(stream);
0309
0310 if (len < 0)
0311 return len;
0312
0313 if (len < 2 + 65)
0314 return -EINVAL;
0315
0316 len -= 2;
0317 while (len >= 65) {
0318 u8 pq, tq, *qk;
0319 int ret;
0320 int pq_tq = jpeg_get_byte(stream);
0321
0322 if (pq_tq < 0)
0323 return pq_tq;
0324
0325
0326 pq = (pq_tq >> 4) & 0xf;
0327
0328
0329
0330
0331
0332 if (pq != 0 && (pq != 1 || precision != 12))
0333 return -EINVAL;
0334
0335
0336 tq = pq_tq & 0xf;
0337 if (tq > 3)
0338 return -EINVAL;
0339
0340
0341 qk = stream->curr;
0342 ret = jpeg_skip(stream, pq ? 128 : 64);
0343 if (ret < 0)
0344 return -EINVAL;
0345
0346 if (tables) {
0347 tables[tq].start = qk;
0348 tables[tq].length = pq ? 128 : 64;
0349 }
0350
0351 len -= pq ? 129 : 65;
0352 }
0353
0354 return 0;
0355 }
0356
0357
0358 static int jpeg_parse_huffman_tables(struct jpeg_stream *stream,
0359 struct v4l2_jpeg_reference *tables)
0360 {
0361 int mt;
0362 int len = jpeg_get_word_be(stream);
0363
0364 if (len < 0)
0365 return len;
0366
0367 if (len < 2 + 17)
0368 return -EINVAL;
0369
0370 for (len -= 2; len >= 17; len -= 17 + mt) {
0371 u8 tc, th, *table;
0372 int tc_th = jpeg_get_byte(stream);
0373 int i, ret;
0374
0375 if (tc_th < 0)
0376 return tc_th;
0377
0378
0379 tc = (tc_th >> 4) & 0xf;
0380 if (tc > 1)
0381 return -EINVAL;
0382
0383
0384 th = tc_th & 0xf;
0385
0386 if (th > 1)
0387 return -EINVAL;
0388
0389
0390 table = stream->curr;
0391 mt = 0;
0392 for (i = 0; i < 16; i++) {
0393 int li;
0394
0395 li = jpeg_get_byte(stream);
0396 if (li < 0)
0397 return li;
0398
0399 mt += li;
0400 }
0401
0402 ret = jpeg_skip(stream, mt);
0403 if (ret < 0)
0404 return ret;
0405
0406 if (tables) {
0407 tables[(tc << 1) | th].start = table;
0408 tables[(tc << 1) | th].length = stream->curr - table;
0409 }
0410 }
0411
0412 return jpeg_skip(stream, len - 2);
0413 }
0414
0415
0416 static int jpeg_parse_restart_interval(struct jpeg_stream *stream,
0417 u16 *restart_interval)
0418 {
0419 int len = jpeg_get_word_be(stream);
0420 int ri;
0421
0422 if (len < 0)
0423 return len;
0424 if (len != 4)
0425 return -EINVAL;
0426
0427 ri = jpeg_get_word_be(stream);
0428 if (ri < 0)
0429 return ri;
0430
0431 *restart_interval = ri;
0432
0433 return 0;
0434 }
0435
0436 static int jpeg_skip_segment(struct jpeg_stream *stream)
0437 {
0438 int len = jpeg_get_word_be(stream);
0439
0440 if (len < 0)
0441 return len;
0442 if (len < 2)
0443 return -EINVAL;
0444
0445 return jpeg_skip(stream, len - 2);
0446 }
0447
0448
0449 static int jpeg_parse_app14_data(struct jpeg_stream *stream,
0450 enum v4l2_jpeg_app14_tf *tf)
0451 {
0452 int ret;
0453 int lp;
0454 int skip;
0455
0456 lp = jpeg_get_word_be(stream);
0457 if (lp < 0)
0458 return lp;
0459
0460
0461 if (stream->curr + 6 > stream->end ||
0462 strncmp(stream->curr, "Adobe\0", 6))
0463 return -EINVAL;
0464
0465
0466 ret = jpeg_skip(stream, 11);
0467 if (ret < 0)
0468 return ret;
0469
0470 ret = jpeg_get_byte(stream);
0471 if (ret < 0)
0472 return ret;
0473
0474 *tf = ret;
0475
0476
0477 skip = lp - 2 - 11;
0478 return jpeg_skip(stream, skip);
0479 }
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494 int v4l2_jpeg_parse_header(void *buf, size_t len, struct v4l2_jpeg_header *out)
0495 {
0496 struct jpeg_stream stream;
0497 int marker;
0498 int ret = 0;
0499
0500 stream.curr = buf;
0501 stream.end = stream.curr + len;
0502
0503 out->num_dht = 0;
0504 out->num_dqt = 0;
0505
0506
0507 if (jpeg_get_word_be(&stream) != SOI)
0508 return -EINVAL;
0509
0510
0511 out->app14_tf = V4L2_JPEG_APP14_TF_UNKNOWN;
0512
0513
0514 while ((marker = jpeg_next_marker(&stream)) >= 0) {
0515 switch (marker) {
0516
0517 case SOF0 ... SOF1:
0518 ret = jpeg_reference_segment(&stream, &out->sof);
0519 if (ret < 0)
0520 return ret;
0521 ret = jpeg_parse_frame_header(&stream, marker,
0522 &out->frame);
0523 break;
0524
0525 case SOF2 ... SOF3:
0526
0527 case SOF5 ... SOF7:
0528
0529 case SOF9 ... SOF11:
0530 case SOF13 ... SOF15:
0531 case DAC:
0532 case TEM:
0533 return -EINVAL;
0534
0535 case DHT:
0536 ret = jpeg_reference_segment(&stream,
0537 &out->dht[out->num_dht++ % 4]);
0538 if (ret < 0)
0539 return ret;
0540 if (!out->huffman_tables) {
0541 ret = jpeg_skip_segment(&stream);
0542 break;
0543 }
0544 ret = jpeg_parse_huffman_tables(&stream,
0545 out->huffman_tables);
0546 break;
0547 case DQT:
0548 ret = jpeg_reference_segment(&stream,
0549 &out->dqt[out->num_dqt++ % 4]);
0550 if (ret < 0)
0551 return ret;
0552 if (!out->quantization_tables) {
0553 ret = jpeg_skip_segment(&stream);
0554 break;
0555 }
0556 ret = jpeg_parse_quantization_tables(&stream,
0557 out->frame.precision,
0558 out->quantization_tables);
0559 break;
0560 case DRI:
0561 ret = jpeg_parse_restart_interval(&stream,
0562 &out->restart_interval);
0563 break;
0564 case APP14:
0565 ret = jpeg_parse_app14_data(&stream,
0566 &out->app14_tf);
0567 break;
0568 case SOS:
0569 ret = jpeg_reference_segment(&stream, &out->sos);
0570 if (ret < 0)
0571 return ret;
0572 ret = jpeg_parse_scan_header(&stream, out->scan);
0573
0574
0575
0576
0577 out->ecs_offset = stream.curr - (u8 *)buf;
0578 return ret;
0579
0580
0581 case RST0 ... RST7:
0582 case SOI:
0583 case EOI:
0584 break;
0585
0586
0587 default:
0588 ret = jpeg_skip_segment(&stream);
0589 break;
0590 }
0591 if (ret < 0)
0592 return ret;
0593 }
0594
0595 return marker;
0596 }
0597 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_header);
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607 int v4l2_jpeg_parse_frame_header(void *buf, size_t len,
0608 struct v4l2_jpeg_frame_header *frame_header)
0609 {
0610 struct jpeg_stream stream;
0611
0612 stream.curr = buf;
0613 stream.end = stream.curr + len;
0614 return jpeg_parse_frame_header(&stream, SOF0, frame_header);
0615 }
0616 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_frame_header);
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626 int v4l2_jpeg_parse_scan_header(void *buf, size_t len,
0627 struct v4l2_jpeg_scan_header *scan_header)
0628 {
0629 struct jpeg_stream stream;
0630
0631 stream.curr = buf;
0632 stream.end = stream.curr + len;
0633 return jpeg_parse_scan_header(&stream, scan_header);
0634 }
0635 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_scan_header);
0636
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647 int v4l2_jpeg_parse_quantization_tables(void *buf, size_t len, u8 precision,
0648 struct v4l2_jpeg_reference *q_tables)
0649 {
0650 struct jpeg_stream stream;
0651
0652 stream.curr = buf;
0653 stream.end = stream.curr + len;
0654 return jpeg_parse_quantization_tables(&stream, precision, q_tables);
0655 }
0656 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_quantization_tables);
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668 int v4l2_jpeg_parse_huffman_tables(void *buf, size_t len,
0669 struct v4l2_jpeg_reference *huffman_tables)
0670 {
0671 struct jpeg_stream stream;
0672
0673 stream.curr = buf;
0674 stream.end = stream.curr + len;
0675 return jpeg_parse_huffman_tables(&stream, huffman_tables);
0676 }
0677 EXPORT_SYMBOL_GPL(v4l2_jpeg_parse_huffman_tables);