• Nigel Tao's avatar
    image/jpeg: decode progressive JPEGs. · 8b624f60
    Nigel Tao authored
    To be clear, this supports decoding the bytes on the wire into an
    in-memory image. There is no API change: jpeg.Decode will still not
    return until the entire image is decoded.
    
    The code is obviously more complicated, and costs around 10% in
    performance on baseline JPEGs. The processSOS code could be cleaned up a
    bit, and maybe some of that loss can be reclaimed, but I'll leave that
    for follow-up CLs, to keep the diff for this one as small as possible.
    
    Before:
    BenchmarkDecode	    1000	   2855637 ns/op	  21.64 MB/s
    After:
    BenchmarkDecodeBaseline	     500	   3178960 ns/op	  19.44 MB/s
    BenchmarkDecodeProgressive	     500	   4082640 ns/op	  15.14 MB/s
    
    Fixes #3976.
    
    The test data was generated by:
    # Create intermediate files; cjpeg on Ubuntu 10.04 can't read PNG.
    convert video-001.png video-001.bmp
    convert video-005.gray.png video-005.gray.pgm
    # Create new test files.
    cjpeg -quality 100 -sample 1x1,1x1,1x1 -progressive video-001.bmp > video-001.progressive.jpeg
    cjpeg -quality 50 -sample 2x2,1x1,1x1 video-001.bmp > video-001.q50.420.jpeg
    cjpeg -quality 50 -sample 2x1,1x1,1x1 video-001.bmp > video-001.q50.422.jpeg
    cjpeg -quality 50 -sample 1x1,1x1,1x1 video-001.bmp > video-001.q50.444.jpeg
    cjpeg -quality 50 -sample 2x2,1x1,1x1 -progressive video-001.bmp > video-001.q50.420.progressive.jpeg
    cjpeg -quality 50 -sample 2x1,1x1,1x1 -progressive video-001.bmp > video-001.q50.422.progressive.jpeg
    cjpeg -quality 50 -sample 1x1,1x1,1x1 -progressive video-001.bmp > video-001.q50.444.progressive.jpeg
    cjpeg -quality 50 video-005.gray.pgm > video-005.gray.q50.jpeg
    cjpeg -quality 50 -progressive video-005.gray.pgm > video-005.gray.q50.progressive.jpeg
    # Delete intermediate files.
    rm video-001.bmp video-005.gray.pgm
    
    R=r
    CC=golang-dev
    https://golang.org/cl/6684046
    8b624f60