New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
image/jpeg: bad RST marker due to pre-reset marker byte alignment #28717
Comments
CC @nigeltao |
JPEG standard allows for stuffed bytes just before the reset markers in order to align bytes (refer to B 1, D 1.6, and F 1.2.3 of JPEG spec). Some JPEG encoders seem to use these even when byte alignment is not strictly necessary. This fix checks for and skips over the escaped stuffed byte. Fixes golang#28717
I've setup a branch with the proposed fix on my fork of golang/go. I may be completely wrong about this bug (there's a chance the webcam has a bad jpeg encoder) or there may be a better way to fix the issue |
Any chance this will be fixed in 1.12? |
The patch in the OP looks plausible (although I'd like the comment to mention F1.2.3 in the spec), but we are deep in the release cycle (https://github.com/golang/go/wiki/Go-Release-Cycle) for Go 1.13. As it is not a regression, it will probably land in 1.14 at the earliest. Sorry for the late reply. I can't remember why I didn't see the "CC @nigeltao" note earlier. |
Is this anticipated in 1.15? |
Change https://golang.org/cl/230122 mentions this issue: |
Fixes golang#28717 Change-Id: I0a1e4ef1583fff89b6f46ef647fb6e4499bdf999 Reviewed-on: https://go-review.googlesource.com/c/go/+/230122 Run-TryBot: Nigel Tao <nigeltao@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rob Pike <r@golang.org>
What did you do?
While writing a small app to decode and process the JPEG frames from webcams running in Motion-JPEG mode, I found that images from a Logitech C270 webcam failed to decode when using the
jpeg.Decode
function. Images from other/dev/video
devices worked just fine. I confirmed that the same images decoded fine using other programs likevlc
.I isolated a frame that caused the decoder to fail and stepped through the decoding with a debugger and compared it to the part of the jpeg spec in F1.2.3 from https://www.w3.org/Graphics/JPEG/itu-t81.pdf#page=36&zoom=auto,-200,43.
Turns out the jpeg decoder doesn't handle
0xFF 0x00
bytes that precede the expected0xFF 0xD*
bytes that form the reset markers. The stuffed bytes are used for byte alignment.Here's an example frame from the stream:
And here's a play.golang.org link with a reproducer: https://play.golang.org/p/QTTKiHRfrLe
I've experimented with a fix in the handling of the rst marker in the
image/jpeg/scan.go
file and I'm fairly confident that this should fix the issue (it certainly seemed to fix it in my usecase):What did you expect to see?
Expected the frame to decode successfully as it is in other software like VLC and web browsers.
What did you see instead?
Does this issue reproduce with the latest release (go1.11.2)?
Yes.
System details
The text was updated successfully, but these errors were encountered: