1
2
3
4
5
6
7
8 package jpeg
9
10 import (
11 "image"
12 "image/color"
13 "image/internal/imageutil"
14 "io"
15 )
16
17
18 type FormatError string
19
20 func (e FormatError) Error() string { return "invalid JPEG format: " + string(e) }
21
22
23 type UnsupportedError string
24
25 func (e UnsupportedError) Error() string { return "unsupported JPEG feature: " + string(e) }
26
27 var errUnsupportedSubsamplingRatio = UnsupportedError("luma/chroma subsampling ratio")
28
29
30 type component struct {
31 h int
32 v int
33 c uint8
34 tq uint8
35 expandH int
36 expandV int
37 }
38
39 const (
40 dcTable = 0
41 acTable = 1
42 maxTc = 1
43 maxTh = 3
44 maxTq = 3
45
46 maxComponents = 4
47 )
48
49 const (
50 sof0Marker = 0xc0
51 sof1Marker = 0xc1
52 sof2Marker = 0xc2
53 dhtMarker = 0xc4
54 rst0Marker = 0xd0
55 rst7Marker = 0xd7
56 soiMarker = 0xd8
57 eoiMarker = 0xd9
58 sosMarker = 0xda
59 dqtMarker = 0xdb
60 driMarker = 0xdd
61 comMarker = 0xfe
62
63
64
65 app0Marker = 0xe0
66 app14Marker = 0xee
67 app15Marker = 0xef
68 )
69
70
71 const (
72 adobeTransformUnknown = 0
73 adobeTransformYCbCr = 1
74 adobeTransformYCbCrK = 2
75 )
76
77
78
79
80 var unzig = [blockSize]int{
81 0, 1, 8, 16, 9, 2, 3, 10,
82 17, 24, 32, 25, 18, 11, 4, 5,
83 12, 19, 26, 33, 40, 48, 41, 34,
84 27, 20, 13, 6, 7, 14, 21, 28,
85 35, 42, 49, 56, 57, 50, 43, 36,
86 29, 22, 15, 23, 30, 37, 44, 51,
87 58, 59, 52, 45, 38, 31, 39, 46,
88 53, 60, 61, 54, 47, 55, 62, 63,
89 }
90
91
92
93 type Reader interface {
94 io.ByteReader
95 io.Reader
96 }
97
98
99
100
101 type bits struct {
102 a uint32
103 m uint32
104 n int32
105 }
106
107 type decoder struct {
108 r io.Reader
109 bits bits
110
111
112
113 bytes struct {
114
115
116 buf [4096]byte
117 i, j int
118
119
120 nUnreadable int
121 }
122 width, height int
123
124 img1 *image.Gray
125 img3 *image.YCbCr
126 blackPix []byte
127 blackStride int
128
129
130 flex bool
131 maxH, maxV int
132
133 ri int
134 nComp int
135
136
137
138
139
140
141 baseline bool
142 progressive bool
143
144 jfif bool
145 adobeTransformValid bool
146 adobeTransform uint8
147 eobRun uint16
148
149 comp [maxComponents]component
150 progCoeffs [maxComponents][]block
151 huff [maxTc + 1][maxTh + 1]huffman
152 quant [maxTq + 1]block
153 tmp [2 * blockSize]byte
154 }
155
156
157
158 func (d *decoder) fill() error {
159 if d.bytes.i != d.bytes.j {
160 panic("jpeg: fill called when unread bytes exist")
161 }
162
163
164 if d.bytes.j > 2 {
165 d.bytes.buf[0] = d.bytes.buf[d.bytes.j-2]
166 d.bytes.buf[1] = d.bytes.buf[d.bytes.j-1]
167 d.bytes.i, d.bytes.j = 2, 2
168 }
169
170 n, err := d.r.Read(d.bytes.buf[d.bytes.j:])
171 d.bytes.j += n
172 if n > 0 {
173 return nil
174 }
175 if err == io.EOF {
176 err = io.ErrUnexpectedEOF
177 }
178 return err
179 }
180
181
182
183
184
185
186 func (d *decoder) unreadByteStuffedByte() {
187 d.bytes.i -= d.bytes.nUnreadable
188 d.bytes.nUnreadable = 0
189 if d.bits.n >= 8 {
190 d.bits.a >>= 8
191 d.bits.n -= 8
192 d.bits.m >>= 8
193 }
194 }
195
196
197
198 func (d *decoder) readByte() (x byte, err error) {
199 for d.bytes.i == d.bytes.j {
200 if err = d.fill(); err != nil {
201 return 0, err
202 }
203 }
204 x = d.bytes.buf[d.bytes.i]
205 d.bytes.i++
206 d.bytes.nUnreadable = 0
207 return x, nil
208 }
209
210
211
212 var errMissingFF00 = FormatError("missing 0xff00 sequence")
213
214
215 func (d *decoder) readByteStuffedByte() (x byte, err error) {
216
217 if d.bytes.i+2 <= d.bytes.j {
218 x = d.bytes.buf[d.bytes.i]
219 d.bytes.i++
220 d.bytes.nUnreadable = 1
221 if x != 0xff {
222 return x, err
223 }
224 if d.bytes.buf[d.bytes.i] != 0x00 {
225 return 0, errMissingFF00
226 }
227 d.bytes.i++
228 d.bytes.nUnreadable = 2
229 return 0xff, nil
230 }
231
232 d.bytes.nUnreadable = 0
233
234 x, err = d.readByte()
235 if err != nil {
236 return 0, err
237 }
238 d.bytes.nUnreadable = 1
239 if x != 0xff {
240 return x, nil
241 }
242
243 x, err = d.readByte()
244 if err != nil {
245 return 0, err
246 }
247 d.bytes.nUnreadable = 2
248 if x != 0x00 {
249 return 0, errMissingFF00
250 }
251 return 0xff, nil
252 }
253
254
255
256 func (d *decoder) readFull(p []byte) error {
257
258 if d.bytes.nUnreadable != 0 {
259 if d.bits.n >= 8 {
260 d.unreadByteStuffedByte()
261 }
262 d.bytes.nUnreadable = 0
263 }
264
265 for {
266 n := copy(p, d.bytes.buf[d.bytes.i:d.bytes.j])
267 p = p[n:]
268 d.bytes.i += n
269 if len(p) == 0 {
270 break
271 }
272 if err := d.fill(); err != nil {
273 return err
274 }
275 }
276 return nil
277 }
278
279
280 func (d *decoder) ignore(n int) error {
281
282 if d.bytes.nUnreadable != 0 {
283 if d.bits.n >= 8 {
284 d.unreadByteStuffedByte()
285 }
286 d.bytes.nUnreadable = 0
287 }
288
289 for {
290 m := d.bytes.j - d.bytes.i
291 if m > n {
292 m = n
293 }
294 d.bytes.i += m
295 n -= m
296 if n == 0 {
297 break
298 }
299 if err := d.fill(); err != nil {
300 return err
301 }
302 }
303 return nil
304 }
305
306
307 func (d *decoder) processSOF(n int) error {
308 if d.nComp != 0 {
309 return FormatError("multiple SOF markers")
310 }
311 switch n {
312 case 6 + 3*1:
313 d.nComp = 1
314 case 6 + 3*3:
315 d.nComp = 3
316 case 6 + 3*4:
317 d.nComp = 4
318 default:
319 return UnsupportedError("number of components")
320 }
321 if err := d.readFull(d.tmp[:n]); err != nil {
322 return err
323 }
324
325 if d.tmp[0] != 8 {
326 return UnsupportedError("precision")
327 }
328 d.height = int(d.tmp[1])<<8 + int(d.tmp[2])
329 d.width = int(d.tmp[3])<<8 + int(d.tmp[4])
330 if int(d.tmp[5]) != d.nComp {
331 return FormatError("SOF has wrong length")
332 }
333
334 for i := 0; i < d.nComp; i++ {
335 d.comp[i].c = d.tmp[6+3*i]
336
337
338 for j := 0; j < i; j++ {
339 if d.comp[i].c == d.comp[j].c {
340 return FormatError("repeated component identifier")
341 }
342 }
343
344 d.comp[i].tq = d.tmp[8+3*i]
345 if d.comp[i].tq > maxTq {
346 return FormatError("bad Tq value")
347 }
348
349 hv := d.tmp[7+3*i]
350 h, v := int(hv>>4), int(hv&0x0f)
351 if h < 1 || 4 < h || v < 1 || 4 < v {
352 return FormatError("luma/chroma subsampling ratio")
353 }
354 if h == 3 || v == 3 {
355 return errUnsupportedSubsamplingRatio
356 }
357 switch d.nComp {
358 case 1:
359
360
361
362
363
364
365
366
367
368
369
370 h, v = 1, 1
371
372 case 3:
373
374
375
376
377
378
379 case 4:
380
381
382
383
384
385
386
387
388
389 switch i {
390 case 0:
391 if hv != 0x11 && hv != 0x22 {
392 return errUnsupportedSubsamplingRatio
393 }
394 case 1, 2:
395 if hv != 0x11 {
396 return errUnsupportedSubsamplingRatio
397 }
398 case 3:
399 if d.comp[0].h != h || d.comp[0].v != v {
400 return errUnsupportedSubsamplingRatio
401 }
402 }
403 }
404
405 d.maxH, d.maxV = max(d.maxH, h), max(d.maxV, v)
406 d.comp[i].h = h
407 d.comp[i].v = v
408 }
409
410
411
412 if d.nComp == 3 {
413 for i := 0; i < 3; i++ {
414 if d.maxH%d.comp[i].h != 0 || d.maxV%d.comp[i].v != 0 {
415 return errUnsupportedSubsamplingRatio
416 }
417 }
418 }
419
420
421 for i := 0; i < d.nComp; i++ {
422 d.comp[i].expandH = d.maxH / d.comp[i].h
423 d.comp[i].expandV = d.maxV / d.comp[i].v
424 }
425
426 return nil
427 }
428
429
430 func (d *decoder) processDQT(n int) error {
431 loop:
432 for n > 0 {
433 n--
434 x, err := d.readByte()
435 if err != nil {
436 return err
437 }
438 tq := x & 0x0f
439 if tq > maxTq {
440 return FormatError("bad Tq value")
441 }
442 switch x >> 4 {
443 default:
444 return FormatError("bad Pq value")
445 case 0:
446 if n < blockSize {
447 break loop
448 }
449 n -= blockSize
450 if err := d.readFull(d.tmp[:blockSize]); err != nil {
451 return err
452 }
453 for i := range d.quant[tq] {
454 d.quant[tq][i] = int32(d.tmp[i])
455 }
456 case 1:
457 if n < 2*blockSize {
458 break loop
459 }
460 n -= 2 * blockSize
461 if err := d.readFull(d.tmp[:2*blockSize]); err != nil {
462 return err
463 }
464 for i := range d.quant[tq] {
465 d.quant[tq][i] = int32(d.tmp[2*i])<<8 | int32(d.tmp[2*i+1])
466 }
467 }
468 }
469 if n != 0 {
470 return FormatError("DQT has wrong length")
471 }
472 return nil
473 }
474
475
476 func (d *decoder) processDRI(n int) error {
477 if n != 2 {
478 return FormatError("DRI has wrong length")
479 }
480 if err := d.readFull(d.tmp[:2]); err != nil {
481 return err
482 }
483 d.ri = int(d.tmp[0])<<8 + int(d.tmp[1])
484 return nil
485 }
486
487 func (d *decoder) processApp0Marker(n int) error {
488 if n < 5 {
489 return d.ignore(n)
490 }
491 if err := d.readFull(d.tmp[:5]); err != nil {
492 return err
493 }
494 n -= 5
495
496 d.jfif = d.tmp[0] == 'J' && d.tmp[1] == 'F' && d.tmp[2] == 'I' && d.tmp[3] == 'F' && d.tmp[4] == '\x00'
497
498 if n > 0 {
499 return d.ignore(n)
500 }
501 return nil
502 }
503
504 func (d *decoder) processApp14Marker(n int) error {
505 if n < 12 {
506 return d.ignore(n)
507 }
508 if err := d.readFull(d.tmp[:12]); err != nil {
509 return err
510 }
511 n -= 12
512
513 if d.tmp[0] == 'A' && d.tmp[1] == 'd' && d.tmp[2] == 'o' && d.tmp[3] == 'b' && d.tmp[4] == 'e' {
514 d.adobeTransformValid = true
515 d.adobeTransform = d.tmp[11]
516 }
517
518 if n > 0 {
519 return d.ignore(n)
520 }
521 return nil
522 }
523
524
525 func (d *decoder) decode(r io.Reader, configOnly bool) (image.Image, error) {
526 d.r = r
527
528
529 if err := d.readFull(d.tmp[:2]); err != nil {
530 return nil, err
531 }
532 if d.tmp[0] != 0xff || d.tmp[1] != soiMarker {
533 return nil, FormatError("missing SOI marker")
534 }
535
536
537 for {
538 err := d.readFull(d.tmp[:2])
539 if err != nil {
540 return nil, err
541 }
542 for d.tmp[0] != 0xff {
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563 d.tmp[0] = d.tmp[1]
564 d.tmp[1], err = d.readByte()
565 if err != nil {
566 return nil, err
567 }
568 }
569 marker := d.tmp[1]
570 if marker == 0 {
571
572 continue
573 }
574 for marker == 0xff {
575
576
577 marker, err = d.readByte()
578 if err != nil {
579 return nil, err
580 }
581 }
582 if marker == eoiMarker {
583 break
584 }
585 if rst0Marker <= marker && marker <= rst7Marker {
586
587
588
589
590
591
592 continue
593 }
594
595
596
597 if err = d.readFull(d.tmp[:2]); err != nil {
598 return nil, err
599 }
600 n := int(d.tmp[0])<<8 + int(d.tmp[1]) - 2
601 if n < 0 {
602 return nil, FormatError("short segment length")
603 }
604
605 switch marker {
606 case sof0Marker, sof1Marker, sof2Marker:
607 d.baseline = marker == sof0Marker
608 d.progressive = marker == sof2Marker
609 err = d.processSOF(n)
610 if configOnly && d.jfif {
611 return nil, err
612 }
613 case dhtMarker:
614 if configOnly {
615 err = d.ignore(n)
616 } else {
617 err = d.processDHT(n)
618 }
619 case dqtMarker:
620 if configOnly {
621 err = d.ignore(n)
622 } else {
623 err = d.processDQT(n)
624 }
625 case sosMarker:
626 if configOnly {
627 return nil, nil
628 }
629 err = d.processSOS(n)
630 case driMarker:
631 if configOnly {
632 err = d.ignore(n)
633 } else {
634 err = d.processDRI(n)
635 }
636 case app0Marker:
637 err = d.processApp0Marker(n)
638 case app14Marker:
639 err = d.processApp14Marker(n)
640 default:
641 if app0Marker <= marker && marker <= app15Marker || marker == comMarker {
642 err = d.ignore(n)
643 } else if marker < 0xc0 {
644 err = FormatError("unknown marker")
645 } else {
646 err = UnsupportedError("unknown marker")
647 }
648 }
649 if err != nil {
650 return nil, err
651 }
652 }
653
654 if d.progressive {
655 if err := d.reconstructProgressiveImage(); err != nil {
656 return nil, err
657 }
658 }
659 if d.img1 != nil {
660 return d.img1, nil
661 }
662 if d.img3 != nil {
663 if d.blackPix != nil {
664 return d.applyBlack()
665 } else if d.isRGB() {
666 return d.convertToRGB()
667 }
668 return d.img3, nil
669 }
670 return nil, FormatError("missing SOS marker")
671 }
672
673
674
675
676
677
678
679
680 func (d *decoder) applyBlack() (image.Image, error) {
681 if !d.adobeTransformValid {
682 return nil, UnsupportedError("unknown color model: 4-component JPEG doesn't have Adobe APP14 metadata")
683 }
684
685
686
687
688
689 if d.adobeTransform != adobeTransformUnknown {
690
691
692
693
694 bounds := d.img3.Bounds()
695 img := image.NewRGBA(bounds)
696 imageutil.DrawYCbCr(img, bounds, d.img3, bounds.Min)
697 for iBase, y := 0, bounds.Min.Y; y < bounds.Max.Y; iBase, y = iBase+img.Stride, y+1 {
698 for i, x := iBase+3, bounds.Min.X; x < bounds.Max.X; i, x = i+4, x+1 {
699 img.Pix[i] = 255 - d.blackPix[(y-bounds.Min.Y)*d.blackStride+(x-bounds.Min.X)]
700 }
701 }
702 return &image.CMYK{
703 Pix: img.Pix,
704 Stride: img.Stride,
705 Rect: img.Rect,
706 }, nil
707 }
708
709
710
711
712
713
714 bounds := d.img3.Bounds()
715 img := image.NewCMYK(bounds)
716
717 translations := [4]struct {
718 src []byte
719 stride int
720 }{
721 {d.img3.Y, d.img3.YStride},
722 {d.img3.Cb, d.img3.CStride},
723 {d.img3.Cr, d.img3.CStride},
724 {d.blackPix, d.blackStride},
725 }
726 for t, translation := range translations {
727 subsample := d.comp[t].h != d.comp[0].h || d.comp[t].v != d.comp[0].v
728 for iBase, y := 0, bounds.Min.Y; y < bounds.Max.Y; iBase, y = iBase+img.Stride, y+1 {
729 sy := y - bounds.Min.Y
730 if subsample {
731 sy /= 2
732 }
733 for i, x := iBase+t, bounds.Min.X; x < bounds.Max.X; i, x = i+4, x+1 {
734 sx := x - bounds.Min.X
735 if subsample {
736 sx /= 2
737 }
738 img.Pix[i] = 255 - translation.src[sy*translation.stride+sx]
739 }
740 }
741 }
742 return img, nil
743 }
744
745 func (d *decoder) isRGB() bool {
746 if d.jfif {
747 return false
748 }
749 if d.adobeTransformValid && d.adobeTransform == adobeTransformUnknown {
750
751
752 return true
753 }
754 return d.comp[0].c == 'R' && d.comp[1].c == 'G' && d.comp[2].c == 'B'
755 }
756
757 func (d *decoder) convertToRGB() (image.Image, error) {
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772 h0, h1, h2 := d.comp[0].h, d.comp[1].h, d.comp[2].h
773 v0, v1, v2 := d.comp[0].v, d.comp[1].v, d.comp[2].v
774 if (h1 != h2) || (h0%h1 != 0) || (v1 != v2) || (v0%v1 != 0) {
775 return nil, errUnsupportedSubsamplingRatio
776 }
777
778 cScale := h0 / h1
779 bounds := d.img3.Bounds()
780 img := image.NewRGBA(bounds)
781 for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
782 po := img.PixOffset(bounds.Min.X, y)
783 yo := d.img3.YOffset(bounds.Min.X, y)
784 co := d.img3.COffset(bounds.Min.X, y)
785 for i, iMax := 0, bounds.Max.X-bounds.Min.X; i < iMax; i++ {
786 img.Pix[po+4*i+0] = d.img3.Y[yo+i]
787 img.Pix[po+4*i+1] = d.img3.Cb[co+i/cScale]
788 img.Pix[po+4*i+2] = d.img3.Cr[co+i/cScale]
789 img.Pix[po+4*i+3] = 255
790 }
791 }
792 return img, nil
793 }
794
795
796 func Decode(r io.Reader) (image.Image, error) {
797 var d decoder
798 return d.decode(r, false)
799 }
800
801
802
803 func DecodeConfig(r io.Reader) (image.Config, error) {
804 var d decoder
805 if _, err := d.decode(r, true); err != nil {
806 return image.Config{}, err
807 }
808 switch d.nComp {
809 case 1:
810 return image.Config{
811 ColorModel: color.GrayModel,
812 Width: d.width,
813 Height: d.height,
814 }, nil
815 case 3:
816 cm := color.YCbCrModel
817 if d.isRGB() {
818 cm = color.RGBAModel
819 }
820 return image.Config{
821 ColorModel: cm,
822 Width: d.width,
823 Height: d.height,
824 }, nil
825 case 4:
826 return image.Config{
827 ColorModel: color.CMYKModel,
828 Width: d.width,
829 Height: d.height,
830 }, nil
831 }
832 return image.Config{}, FormatError("missing SOF marker")
833 }
834
835 func init() {
836 image.RegisterFormat("jpeg", "\xff\xd8", Decode, DecodeConfig)
837 }
838
View as plain text