Reland "Make WebP decoding independent of stream length."
authorscroggo@google.com <scroggo@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Fri, 9 Aug 2013 19:22:00 +0000 (19:22 +0000)
committerscroggo@google.com <scroggo@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Fri, 9 Aug 2013 19:22:00 +0000 (19:22 +0000)
This reverts commit 1de924955b103c4f5dc9c46a06527d6a37e6cb70.

When reading the stream, only read as much as will fit in the
allocated buffer.

BUG=skia:1495

Review URL: https://codereview.chromium.org/22629010

git-svn-id: http://skia.googlecode.com/svn/trunk@10665 2bbb7eff-a529-9590-31e7-b0007b416f81

src/images/SkImageDecoder_libwebp.cpp

index b0fa7f7..4691d0d 100644 (file)
@@ -203,31 +203,26 @@ static bool webp_idecode(SkStream* stream, WebPDecoderConfig* config) {
         return false;
     }
 
-    uint32_t bytesRemaining = contentSize;
-    while (bytesRemaining > 0) {
-        const uint32_t bytesToRead = (bytesRemaining < WEBP_IDECODE_BUFFER_SZ) ?
-                                      bytesRemaining : WEBP_IDECODE_BUFFER_SZ;
-        const size_t bytesRead = stream->read(input, bytesToRead);
+    bool success = true;
+    VP8StatusCode status = VP8_STATUS_SUSPENDED;
+    do {
+        const size_t bytesRead = stream->read(input, readBufferSize);
         if (0 == bytesRead) {
+            success = false;
             break;
         }
 
-        VP8StatusCode status = WebPIAppend(idec, input, bytesRead);
-        if (VP8_STATUS_OK == status || VP8_STATUS_SUSPENDED == status) {
-            bytesRemaining -= bytesRead;
-        } else {
+        status = WebPIAppend(idec, input, bytesRead);
+        if (VP8_STATUS_OK != status && VP8_STATUS_SUSPENDED != status) {
+            success = false;
             break;
         }
-    }
+    } while (VP8_STATUS_OK != status);
     srcStorage.free();
     WebPIDelete(idec);
     WebPFreeDecBuffer(&config->output);
 
-    if (bytesRemaining > 0) {
-        return false;
-    } else {
-        return true;
-    }
+    return success;
 }
 
 static bool webp_get_config_resize(WebPDecoderConfig* config,