Title: [223509] releases/WebKitGTK/webkit-2.18/Source/WebCore
Revision
223509
Author
[email protected]
Date
2017-10-17 02:53:11 -0700 (Tue, 17 Oct 2017)

Log Message

Merge r222836 - [GTK][WPE] Fix playback of GIFs
https://bugs.webkit.org/show_bug.cgi?id=176089

Reviewed by Carlos Garcia Campos.

Allow GIFImageReader to decode again already decoded frames. Thanks to this, we don't
need to delete the GIFImageReader when GIFImageDecoder::clearFrameBufferCache() is
called, and the we don't need the lock to avoid crashes in that situation.

Covered by existent tests.

* platform/image-decoders/gif/GIFImageDecoder.cpp:
(WebCore::GIFImageDecoder::clearFrameBufferCache):
(WebCore::GIFImageDecoder::decode):
* platform/image-decoders/gif/GIFImageDecoder.h:
* platform/image-decoders/gif/GIFImageReader.cpp:
(GIFImageReader::decode):

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/ChangeLog (223508 => 223509)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/ChangeLog	2017-10-17 09:49:43 UTC (rev 223508)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/ChangeLog	2017-10-17 09:53:11 UTC (rev 223509)
@@ -1,3 +1,23 @@
+2017-10-04  Miguel Gomez  <[email protected]>
+
+        [GTK][WPE] Fix playback of GIFs
+        https://bugs.webkit.org/show_bug.cgi?id=176089
+
+        Reviewed by Carlos Garcia Campos.
+
+        Allow GIFImageReader to decode again already decoded frames. Thanks to this, we don't
+        need to delete the GIFImageReader when GIFImageDecoder::clearFrameBufferCache() is
+        called, and the we don't need the lock to avoid crashes in that situation.
+
+        Covered by existent tests.
+
+        * platform/image-decoders/gif/GIFImageDecoder.cpp:
+        (WebCore::GIFImageDecoder::clearFrameBufferCache):
+        (WebCore::GIFImageDecoder::decode):
+        * platform/image-decoders/gif/GIFImageDecoder.h:
+        * platform/image-decoders/gif/GIFImageReader.cpp:
+        (GIFImageReader::decode):
+
 2017-10-04  Joanmarie Diggs  <[email protected]>
 
         AX: [ATK] aria-pressed="mixed" should be exposed via ATK_STATE_INDETERMINATE

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp (223508 => 223509)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp	2017-10-17 09:49:43 UTC (rev 223508)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.cpp	2017-10-17 09:53:11 UTC (rev 223509)
@@ -125,10 +125,6 @@
     if (m_frameBufferCache.isEmpty())
         return; // Nothing to do.
 
-    // Lock the decodelock here, as we are going to destroy the GIFImageReader and doing so while
-    // there's an ongoing decode will cause a crash.
-    LockHolder locker(m_decodeLock);
-
     // The "-1" here is tricky.  It does not mean that |clearBeforeFrame| is the
     // last frame we wish to preserve, but rather that we never want to clear
     // the very last frame in the cache: it's empty (so clearing it is
@@ -170,10 +166,6 @@
         if (j->isInvalid())
             j->clear();
     }
-
-    // When some frames are cleared, the reader is out of sync, since the caller might ask for any frame not
-    // necessarily in the order expected by the reader. See https://bugs.webkit.org/show_bug.cgi?id=159089.
-    m_reader = nullptr;
 }
 
 bool GIFImageDecoder::haveDecodedRow(unsigned frameIndex, const Vector<unsigned char>& rowBuffer, size_t width, size_t rowNumber, unsigned repeatCount, bool writeTransparentPixels)
@@ -302,7 +294,6 @@
     if (failed())
         return;
 
-    LockHolder locker(m_decodeLock);
     if (!m_reader) {
         m_reader = std::make_unique<GIFImageReader>(this);
         m_reader->setData(m_data.get());

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.h (223508 => 223509)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.h	2017-10-17 09:49:43 UTC (rev 223508)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/platform/image-decoders/gif/GIFImageDecoder.h	2017-10-17 09:53:11 UTC (rev 223509)
@@ -80,7 +80,6 @@
         bool m_currentBufferSawAlpha;
         mutable RepetitionCount m_repetitionCount { RepetitionCountOnce };
         std::unique_ptr<GIFImageReader> m_reader;
-        Lock m_decodeLock;
     };
 
 } // namespace WebCore

Modified: releases/WebKitGTK/webkit-2.18/Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp (223508 => 223509)


--- releases/WebKitGTK/webkit-2.18/Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp	2017-10-17 09:49:43 UTC (rev 223508)
+++ releases/WebKitGTK/webkit-2.18/Source/WebCore/platform/image-decoders/gif/GIFImageReader.cpp	2017-10-17 09:53:11 UTC (rev 223509)
@@ -363,6 +363,12 @@
     if (query != GIFImageDecoder::GIFFullQuery)
         return true;
 
+    // Already decoded frames can be deleted from the cache and then they require to be decoded again, so
+    // the haltAtFrame value we receive here may be lower than m_currentDecodingFrame. In this case
+    // we position m_currentDecodingFrame to haltAtFrame and decode from there.
+    // See bug https://bugs.webkit.org/show_bug.cgi?id=176089.
+    m_currentDecodingFrame = std::min(m_currentDecodingFrame, static_cast<size_t>(haltAtFrame));
+
     while (m_currentDecodingFrame < std::min(m_frames.size(), static_cast<size_t>(haltAtFrame))) {
         bool frameDecoded = false;
         GIFFrameContext* currentFrame = m_frames[m_currentDecodingFrame].get();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to