-
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