Index: src/codec/SkWebpCodec.cpp |
diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp |
index 3c61b937622097d5e1c5be483770a6fb2336543a..2137877f1e7f2986144f2694ed02537993b3f297 100644 |
--- a/src/codec/SkWebpCodec.cpp |
+++ b/src/codec/SkWebpCodec.cpp |
@@ -20,26 +20,26 @@ |
#include "webp/decode.h" |
#include "webp/encode.h" |
-bool SkWebpCodec::IsWebp(SkStream* stream) { |
+bool SkWebpCodec::IsWebp(const void* buf, size_t bytesRead) { |
// WEBP starts with the following: |
// RIFFXXXXWEBPVP |
// Where XXXX is unspecified. |
- const char LENGTH = 14; |
- char bytes[LENGTH]; |
- if (stream->read(&bytes, LENGTH) != LENGTH) { |
- return false; |
- } |
- return !memcmp(bytes, "RIFF", 4) && !memcmp(&bytes[8], "WEBPVP", 6); |
+ const char* bytes = static_cast<const char*>(buf); |
+ return bytesRead >= 14 && !memcmp(bytes, "RIFF", 4) && !memcmp(&bytes[8], "WEBPVP", 6); |
} |
-static const size_t WEBP_VP8_HEADER_SIZE = 30; |
- |
// Parse headers of RIFF container, and check for valid Webp (VP8) content. |
// NOTE: This calls peek instead of read, since onGetPixels will need these |
// bytes again. |
static bool webp_parse_header(SkStream* stream, SkImageInfo* info) { |
unsigned char buffer[WEBP_VP8_HEADER_SIZE]; |
- if (!stream->peek(buffer, WEBP_VP8_HEADER_SIZE)) { |
+ SkASSERT(WEBP_VP8_HEADER_SIZE <= SkCodec::MinBufferedBytesNeeded()); |
+ |
+ const size_t bytesPeeked = stream->peek(buffer, WEBP_VP8_HEADER_SIZE); |
+ if (bytesPeeked != WEBP_VP8_HEADER_SIZE) { |
+ // Use read + rewind as a backup |
+ if (stream->read(buffer, WEBP_VP8_HEADER_SIZE) != WEBP_VP8_HEADER_SIZE |
+ || !stream->rewind()) |
return false; |
} |