From 225b223e4790964a04d1de64415b6b40455f9f70 Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Thu, 24 Mar 2016 15:34:45 +1100 Subject: [PATCH] image/jpeg: reconstruct progressive images even if incomplete. Fixes #14522. As I said on that issue: ---- This is a progressive JPEG image. There are two dimensions of progressivity: spectral selection (variables zs and ze in scan.go, ranging in [0, 63]) and successive approximation (variables ah and al in scan.go, ranging in [0, 8), from LSB to MSB, although ah=0 implicitly means ah=8). For this particular image, there are three components, and the SOS markers contain this progression: zs, ze, ah, al: 0 0 0 0 components: 0, 1, 2 zs, ze, ah, al: 1 63 0 0 components: 1 zs, ze, ah, al: 1 63 0 0 components: 2 zs, ze, ah, al: 1 63 0 2 components: 0 zs, ze, ah, al: 1 10 2 1 components: 0 zs, ze, ah, al: 11 63 2 1 components: 0 zs, ze, ah, al: 1 10 1 0 components: 0 The combination of all of these is complete (i.e. spectra 0 to 63 and bits 8 exclusive to 0) for components 1 and 2, but it is incomplete for component 0 (the luma component). In particular, there is no data for component 0, spectra 11 to 63 and bits 1 exclusive to 0. The image/jpeg code, as of Go 1.6, waits until both dimensions are complete before performing the de-quantization, IDCT and copy to an *image.YCbCr. This is the "if zigEnd != blockSize-1 || al != 0 { ... continue }" code and associated commentary in scan.go. Almost all progressive JPEG images end up complete in both dimensions for all components, but this particular image is incomplete for component 0, so the Go code never writes anything to the Y values of the resultant *image.YCbCr, which is why the broken output is so dark (but still looks recognizable in terms of red and blue hues). My reading of the ITU T.81 JPEG specification (Annex G) doesn't explicitly say that this is a valid image, but it also doesn't rule it out. In any case, the fix is, for progressive JPEG images, to always reconstruct the decoded blocks (by performing the de-quantization, IDCT and copy to an *image.YCbCr), regardless of whether or not they end up complete. Note that, in Go, the jpeg.Decode function does not return until the entire image is decoded, so we still only want to reconstruct each block once, not once per SOS (Start Of Scan) marker. ---- A test image was also added, based on video-001.progressive.jpeg. When decoding that image, inserting a println("nComp, zs, ze, ah, al:", nComp, zigStart, zigEnd, ah, al) into decoder.processSOS in scan.go prints: nComp, zs, ze, ah, al: 3 0 0 0 1 nComp, zs, ze, ah, al: 1 1 5 0 2 nComp, zs, ze, ah, al: 1 1 63 0 1 nComp, zs, ze, ah, al: 1 1 63 0 1 nComp, zs, ze, ah, al: 1 6 63 0 2 nComp, zs, ze, ah, al: 1 1 63 2 1 nComp, zs, ze, ah, al: 3 0 0 1 0 nComp, zs, ze, ah, al: 1 1 63 1 0 nComp, zs, ze, ah, al: 1 1 63 1 0 nComp, zs, ze, ah, al: 1 1 63 1 0 In other words, video-001.progressive.jpeg contains 10 different scans. This little program below drops half of them (remembering to keep the "\xff\xd9" End of Image marker): ---- package main import ( "bytes" "io/ioutil" "log" ) func main() { sos := []byte{0xff, 0xda} eoi := []byte{0xff, 0xd9} src, err := ioutil.ReadFile("video-001.progressive.jpeg") if err != nil { log.Fatal(err) } b := bytes.Split(src, sos) println(len(b)) // Prints 11. dst := bytes.Join(b[:5], sos) dst = append(dst, eoi...) if err := ioutil.WriteFile("video-001.progressive.truncated.jpeg", dst, 0666); err != nil { log.Fatal(err) } } ---- The video-001.progressive.truncated.jpeg was converted to png via libjpeg and ImageMagick: djpeg -nosmooth video-001.progressive.truncated.jpeg > tmp.tga convert tmp.tga video-001.progressive.truncated.png rm tmp.tga Change-Id: I72b20cd4fb6746d36d8d4d587f891fb3bc641f84 Reviewed-on: https://go-review.googlesource.com/21062 Reviewed-by: Rob Pike --- src/image/decode_test.go | 1 + src/image/jpeg/reader.go | 6 + src/image/jpeg/scan.go | 128 +++++++++++------- .../video-001.progressive.truncated.jpeg | Bin 0 -> 7456 bytes .../video-001.progressive.truncated.png | Bin 0 -> 23616 bytes 5 files changed, 86 insertions(+), 49 deletions(-) create mode 100644 src/image/testdata/video-001.progressive.truncated.jpeg create mode 100644 src/image/testdata/video-001.progressive.truncated.png diff --git a/src/image/decode_test.go b/src/image/decode_test.go index d16ef8a1a4..85e235e729 100644 --- a/src/image/decode_test.go +++ b/src/image/decode_test.go @@ -36,6 +36,7 @@ var imageTests = []imageTest{ {"testdata/video-001.221212.png", "testdata/video-001.221212.jpeg", 8 << 8}, {"testdata/video-001.cmyk.png", "testdata/video-001.cmyk.jpeg", 8 << 8}, {"testdata/video-001.rgb.png", "testdata/video-001.rgb.jpeg", 8 << 8}, + {"testdata/video-001.progressive.truncated.png", "testdata/video-001.progressive.truncated.jpeg", 8 << 8}, // Grayscale images. {"testdata/video-005.gray.png", "testdata/video-005.gray.jpeg", 8 << 8}, {"testdata/video-005.gray.png", "testdata/video-005.gray.png", 0}, diff --git a/src/image/jpeg/reader.go b/src/image/jpeg/reader.go index adf97abbd1..c5834219a3 100644 --- a/src/image/jpeg/reader.go +++ b/src/image/jpeg/reader.go @@ -641,6 +641,12 @@ func (d *decoder) decode(r io.Reader, configOnly bool) (image.Image, error) { return nil, err } } + + if d.progressive { + if err := d.reconstructProgressiveImage(); err != nil { + return nil, err + } + } if d.img1 != nil { return d.img1, nil } diff --git a/src/image/jpeg/scan.go b/src/image/jpeg/scan.go index 99734c01af..e1104d27c2 100644 --- a/src/image/jpeg/scan.go +++ b/src/image/jpeg/scan.go @@ -173,7 +173,6 @@ func (d *decoder) processSOS(n int) error { compIndex := scan[i].compIndex hi := d.comp[compIndex].h vi := d.comp[compIndex].v - qt := &d.quant[d.comp[compIndex].tq] for j := 0; j < hi*vi; j++ { // The blocks are traversed one MCU at a time. For 4:2:0 chroma // subsampling, there are four Y 8x8 blocks in every 16x16 MCU. @@ -286,55 +285,19 @@ func (d *decoder) processSOS(n int) error { } if d.progressive { - if zigEnd != blockSize-1 || al != 0 { - // We haven't completely decoded this 8x8 block. Save the coefficients. - d.progCoeffs[compIndex][by*mxx*hi+bx] = b - // At this point, we could execute the rest of the loop body to dequantize and - // perform the inverse DCT, to save early stages of a progressive image to the - // *image.YCbCr buffers (the whole point of progressive encoding), but in Go, - // the jpeg.Decode function does not return until the entire image is decoded, - // so we "continue" here to avoid wasted computation. - continue - } - } - - // Dequantize, perform the inverse DCT and store the block to the image. - for zig := 0; zig < blockSize; zig++ { - b[unzig[zig]] *= qt[zig] + // Save the coefficients. + d.progCoeffs[compIndex][by*mxx*hi+bx] = b + // At this point, we could call reconstructBlock to dequantize and perform the + // inverse DCT, to save early stages of a progressive image to the *image.YCbCr + // buffers (the whole point of progressive encoding), but in Go, the jpeg.Decode + // function does not return until the entire image is decoded, so we "continue" + // here to avoid wasted computation. Instead, reconstructBlock is called on each + // accumulated block by the reconstructProgressiveImage method after all of the + // SOS markers are processed. + continue } - idct(&b) - dst, stride := []byte(nil), 0 - if d.nComp == 1 { - dst, stride = d.img1.Pix[8*(by*d.img1.Stride+bx):], d.img1.Stride - } else { - switch compIndex { - case 0: - dst, stride = d.img3.Y[8*(by*d.img3.YStride+bx):], d.img3.YStride - case 1: - dst, stride = d.img3.Cb[8*(by*d.img3.CStride+bx):], d.img3.CStride - case 2: - dst, stride = d.img3.Cr[8*(by*d.img3.CStride+bx):], d.img3.CStride - case 3: - dst, stride = d.blackPix[8*(by*d.blackStride+bx):], d.blackStride - default: - return UnsupportedError("too many components") - } - } - // Level shift by +128, clip to [0, 255], and write to dst. - for y := 0; y < 8; y++ { - y8 := y * 8 - yStride := y * stride - for x := 0; x < 8; x++ { - c := b[y8+x] - if c < -128 { - c = 0 - } else if c > 127 { - c = 255 - } else { - c += 128 - } - dst[yStride+x] = uint8(c) - } + if err := d.reconstructBlock(&b, bx, by, int(compIndex)); err != nil { + return err } } // for j } // for i @@ -470,3 +433,70 @@ func (d *decoder) refineNonZeroes(b *block, zig, zigEnd, nz, delta int32) (int32 } return zig, nil } + +func (d *decoder) reconstructProgressiveImage() error { + // The h0, mxx, by and bx variables have the same meaning as in the + // processSOS method. + h0 := d.comp[0].h + mxx := (d.width + 8*h0 - 1) / (8 * h0) + for i := 0; i < d.nComp; i++ { + if d.progCoeffs[i] == nil { + continue + } + v := 8 * d.comp[0].v / d.comp[i].v + h := 8 * d.comp[0].h / d.comp[i].h + stride := mxx * d.comp[i].h + for by := 0; by*v < d.height; by++ { + for bx := 0; bx*h < d.width; bx++ { + if err := d.reconstructBlock(&d.progCoeffs[i][by*stride+bx], bx, by, i); err != nil { + return err + } + } + } + } + return nil +} + +// reconstructBlock dequantizes, performs the inverse DCT and stores the block +// to the image. +func (d *decoder) reconstructBlock(b *block, bx, by, compIndex int) error { + qt := &d.quant[d.comp[compIndex].tq] + for zig := 0; zig < blockSize; zig++ { + b[unzig[zig]] *= qt[zig] + } + idct(b) + dst, stride := []byte(nil), 0 + if d.nComp == 1 { + dst, stride = d.img1.Pix[8*(by*d.img1.Stride+bx):], d.img1.Stride + } else { + switch compIndex { + case 0: + dst, stride = d.img3.Y[8*(by*d.img3.YStride+bx):], d.img3.YStride + case 1: + dst, stride = d.img3.Cb[8*(by*d.img3.CStride+bx):], d.img3.CStride + case 2: + dst, stride = d.img3.Cr[8*(by*d.img3.CStride+bx):], d.img3.CStride + case 3: + dst, stride = d.blackPix[8*(by*d.blackStride+bx):], d.blackStride + default: + return UnsupportedError("too many components") + } + } + // Level shift by +128, clip to [0, 255], and write to dst. + for y := 0; y < 8; y++ { + y8 := y * 8 + yStride := y * stride + for x := 0; x < 8; x++ { + c := b[y8+x] + if c < -128 { + c = 0 + } else if c > 127 { + c = 255 + } else { + c += 128 + } + dst[yStride+x] = uint8(c) + } + } + return nil +} diff --git a/src/image/testdata/video-001.progressive.truncated.jpeg b/src/image/testdata/video-001.progressive.truncated.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b5be8bc7639da5872754ebc29655aa0536ca4eda GIT binary patch literal 7456 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 Jxr^te{{vWMoAdwx literal 0 HcmV?d00001 diff --git a/src/image/testdata/video-001.progressive.truncated.png b/src/image/testdata/video-001.progressive.truncated.png new file mode 100644 index 0000000000000000000000000000000000000000..baf19812265408e82f2a65d7e658d581ecc7d341 GIT binary patch literal 23616 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 XF*-0XVt~uc00000NkvXXu0mjf+`&i7 literal 0 HcmV?d00001 -- 2.50.0