Closed
Bug 1279859
Opened 9 years ago
Closed 9 years ago
no longer animate with certain gif
Categories
(Core :: Graphics: ImageLib, defect)
Tracking
()
VERIFIED
FIXED
mozilla50
Tracking | Status | |
---|---|---|
firefox49 | --- | unaffected |
firefox50 | + | fixed |
People
(Reporter: alice0775, Assigned: seth)
References
Details
(Keywords: regression, Whiteboard: [parity-Chrome][parity-Edge])
Attachments
(1 file, 1 obsolete file)
[Tracking Requested - why for this release]: no longer animate with certain gif
Steps To Reproduce:
1. Open attachment 641410 [details] of Bug 773203
Actual Results:
No animated
Expected Results:
Flashing in order
Regression window:
https://hg.mozilla.org/integration/mozilla-inbound/pushloghtml?fromchange=8dc18bf5abac83c7adb2791eb582f1722a244666&tochange=026cf6432f4473549aa6193272764a06be33a1c3
Regressed by: Bug 1204392
Flags: needinfo?(seth)
Let's stop this from getting into Aurora.
Assignee: nobody → seth
Assignee | ||
Comment 2•9 years ago
|
||
Hmm. I'm not seeing the failure to animate. Plays back fine here. However, I know Alice0775 White generally tests on Windows, and with content acceleration, invalidation behaves different. So I'd strongly suspect this is an invalidation-related bug.
Assignee | ||
Comment 3•9 years ago
|
||
I take it back; I do see it. Nightly failed to update to the latest version for me and I had to update it manually. Will get this fixed ASAP.
Assignee | ||
Comment 4•9 years ago
|
||
So check out this *great* code from the previous version of the GIF decoder:
> case gif_sub_block:
> mGIFStruct.count = *q;
> if (mGIFStruct.count) {
> // Still working on the same image: Process next LZW data block
> // Make sure there are still pixels left. If the GIF data
> // is corrupt, we may not get an explicit terminator.
> if (mGIFStruct.pixels_remaining <= 0) {
> #ifdef DONT_TOLERATE_BROKEN_GIFS
> mGIFStruct.state = gif_error;
> break;
> #else
> // This is an illegal GIF, but we remain tolerant.
> GETN(1, gif_sub_block);
Hmm, looks like in this situation we should read one byte and return to the
gif_sub_block state, right?
> #endif
> if (mGIFStruct.count == GIF_TRAILER) {
> // Found a terminator anyway, so consider the image done
> GETN(1, gif_done);
> break;
> }
> }
Well, if we didn't hit a GIF_TAILER, control flow reaches here:
> GETN(mGIFStruct.count, gif_lzw);
Looks like we're actually going to read |count| bytes in the gif_lzw state! The
previous GETN() actually did nothing! Nice.
> } else {
> // See if there are any more images in this sequence.
> EndImageFrame();
> GETN(1, gif_image_start);
> }
> break;
There's the bug. The new code behaves as though GETN(1, gif_sub_block) was the
right thing to do, but actually we want to do the equivalent of
GETN(mGIFStruct.count, gif_lzw).
Patch incoming.
Flags: needinfo?(seth)
Assignee | ||
Comment 5•9 years ago
|
||
Here's the patch, with accompanying test. (Alas the test is a bit verbose since
we actually need an Image object to check this one.)
Attachment #8763296 -
Flags: review?(n.nethercote)
Comment 7•9 years ago
|
||
Hello,
I'm not an ImageLib expert. Is bug 1280781 a DUPLICATE of this bug?
Is this bug a Windows only bug? Just asking...
Thank you for your assistance here.
Gérard
Comment 8•9 years ago
|
||
I am a Linux user [Linux 3.13.0-85-generic x86_64, Qt: 4.8.6, KDE 4.13.3; Kubuntu (trusty) 14.04.4 LTS] and I get actual results when loading attachment 641410 [details] in Firefox 50.0a1 buildID=20160618024606.
From what I can see, this bug fits the description and what I see in bug 1280781.
Resolving accordingly.
OS: Windows 10 → All
Hardware: x86 → All
![]() |
||
Comment 10•9 years ago
|
||
Comment on attachment 8763296 [details] [diff] [review]
Correctly skip over extra image sub blocks in the GIF decoder.
Review of attachment 8763296 [details] [diff] [review]:
-----------------------------------------------------------------
::: image/test/gtest/TestDecoders.cpp
@@ +363,5 @@
> + ImageFactory::CreateAnonymousImage(nsDependentCString(testCase.mMimeType));
> + ASSERT_TRUE(!image->HasError());
> +
> + nsCOMPtr<nsIInputStream> inputStream = LoadFile(testCase.mPath);
> + ASSERT_TRUE(inputStream != nullptr);
Just do ASSERT_TRUE(inputStream); ?
@@ +409,5 @@
> + RasterSurfaceKey(imageSize,
> + DefaultSurfaceFlags(),
> + /* aFrameNum = */ 0));
> + EXPECT_EQ(MatchType::EXACT, firstFrameLookupResult.Type());
> +
Trailing whitespace.
Attachment #8763296 -
Flags: review?(n.nethercote) → review+
Assignee | ||
Comment 11•9 years ago
|
||
Thanks for the review! Here's an updated version of the patch.
Assignee | ||
Updated•9 years ago
|
Attachment #8763296 -
Attachment is obsolete: true
Comment 12•9 years ago
|
||
Pushed by mfowler@mozilla.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/629faa5d9254
Correctly skip over extra image sub blocks in the GIF decoder. r=njn
Comment 14•9 years ago
|
||
bugherder |
Status: NEW → RESOLVED
Closed: 9 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla50
Comment 15•9 years ago
|
||
When I load attachment 641410 [details] into Firefox 50.0a1 buildID=20160622030210, I get expected results (Flashing in order); I also get expected results when I load the animated GIF from bug 1280781.
Thank you for the bug fix, Seth Fowler
Marking this bug as VERIFIED
Status: RESOLVED → VERIFIED
You need to log in
before you can comment on or make changes to this bug.
Description
•