Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(594)

Side by Side Diff: third_party/WebKit/Source/platform/image-decoders/webp/WEBPImageDecoderTest.cpp

Issue 1812273003: Eliminate copies of encoded image data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 15 matching lines...) Expand all
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "platform/image-decoders/webp/WEBPImageDecoder.h" 31 #include "platform/image-decoders/webp/WEBPImageDecoder.h"
32 32
33 #include "platform/RuntimeEnabledFeatures.h" 33 #include "platform/RuntimeEnabledFeatures.h"
34 #include "platform/SharedBuffer.h" 34 #include "platform/SharedBuffer.h"
35 #include "platform/image-decoders/ImageDecoderTestHelpers.h" 35 #include "platform/image-decoders/ImageDecoderTestHelpers.h"
36 #include "platform/image-decoders/SharedBufferSegmentReader.h"
36 #include "public/platform/WebData.h" 37 #include "public/platform/WebData.h"
37 #include "public/platform/WebSize.h" 38 #include "public/platform/WebSize.h"
38 #include "testing/gtest/include/gtest/gtest.h" 39 #include "testing/gtest/include/gtest/gtest.h"
39 #include "wtf/OwnPtr.h" 40 #include "wtf/OwnPtr.h"
40 #include "wtf/PassOwnPtr.h" 41 #include "wtf/PassOwnPtr.h"
41 #include "wtf/Vector.h" 42 #include "wtf/Vector.h"
42 #include "wtf/dtoa/utils.h" 43 #include "wtf/dtoa/utils.h"
43 44
44 namespace blink { 45 namespace blink {
45 46
(...skipping 14 matching lines...) Expand all
60 SCOPED_TRACE(webpFile); 61 SCOPED_TRACE(webpFile);
61 62
62 RefPtr<SharedBuffer> fullData = readFile(webpFile); 63 RefPtr<SharedBuffer> fullData = readFile(webpFile);
63 ASSERT_TRUE(fullData.get()); 64 ASSERT_TRUE(fullData.get());
64 Vector<unsigned> baselineHashes; 65 Vector<unsigned> baselineHashes;
65 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); 66 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes);
66 size_t frameCount = baselineHashes.size(); 67 size_t frameCount = baselineHashes.size();
67 68
68 // Random decoding should get the same results as sequential decoding. 69 // Random decoding should get the same results as sequential decoding.
69 OwnPtr<ImageDecoder> decoder = createDecoder(); 70 OwnPtr<ImageDecoder> decoder = createDecoder();
70 decoder->setData(fullData.get(), true); 71 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(fullData));
72 decoder->setData(segmentReader.get(), true);
71 const size_t skippingStep = 5; 73 const size_t skippingStep = 5;
72 for (size_t i = 0; i < skippingStep; ++i) { 74 for (size_t i = 0; i < skippingStep; ++i) {
73 for (size_t j = i; j < frameCount; j += skippingStep) { 75 for (size_t j = i; j < frameCount; j += skippingStep) {
74 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); 76 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j);
75 ImageFrame* frame = decoder->frameBufferAtIndex(j); 77 ImageFrame* frame = decoder->frameBufferAtIndex(j);
76 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); 78 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap()));
77 } 79 }
78 } 80 }
79 81
80 // Decoding in reverse order. 82 // Decoding in reverse order.
81 decoder = createDecoder(); 83 decoder = createDecoder();
82 decoder->setData(fullData.get(), true); 84 decoder->setData(segmentReader.get(), true);
83 for (size_t i = frameCount; i; --i) { 85 for (size_t i = frameCount; i; --i) {
84 SCOPED_TRACE(testing::Message() << "Reverse i:" << i); 86 SCOPED_TRACE(testing::Message() << "Reverse i:" << i);
85 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1); 87 ImageFrame* frame = decoder->frameBufferAtIndex(i - 1);
86 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap())); 88 EXPECT_EQ(baselineHashes[i - 1], hashBitmap(frame->getSkBitmap()));
87 } 89 }
88 } 90 }
89 91
90 void testRandomDecodeAfterClearFrameBufferCache(const char* webpFile) 92 void testRandomDecodeAfterClearFrameBufferCache(const char* webpFile)
91 { 93 {
92 SCOPED_TRACE(webpFile); 94 SCOPED_TRACE(webpFile);
93 95
94 RefPtr<SharedBuffer> data = readFile(webpFile); 96 RefPtr<SharedBuffer> data = readFile(webpFile);
95 ASSERT_TRUE(data.get()); 97 ASSERT_TRUE(data.get());
96 Vector<unsigned> baselineHashes; 98 Vector<unsigned> baselineHashes;
97 createDecodingBaseline(&createDecoder, data.get(), &baselineHashes); 99 createDecodingBaseline(&createDecoder, data.get(), &baselineHashes);
98 size_t frameCount = baselineHashes.size(); 100 size_t frameCount = baselineHashes.size();
99 101
100 OwnPtr<ImageDecoder> decoder = createDecoder(); 102 OwnPtr<ImageDecoder> decoder = createDecoder();
101 decoder->setData(data.get(), true); 103 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
104 decoder->setData(segmentReader.get(), true);
102 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce ptFrame) { 105 for (size_t clearExceptFrame = 0; clearExceptFrame < frameCount; ++clearExce ptFrame) {
103 decoder->clearCacheExceptFrame(clearExceptFrame); 106 decoder->clearCacheExceptFrame(clearExceptFrame);
104 const size_t skippingStep = 5; 107 const size_t skippingStep = 5;
105 for (size_t i = 0; i < skippingStep; ++i) { 108 for (size_t i = 0; i < skippingStep; ++i) {
106 for (size_t j = 0; j < frameCount; j += skippingStep) { 109 for (size_t j = 0; j < frameCount; j += skippingStep) {
107 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j); 110 SCOPED_TRACE(testing::Message() << "Random i:" << i << " j:" << j);
108 ImageFrame* frame = decoder->frameBufferAtIndex(j); 111 ImageFrame* frame = decoder->frameBufferAtIndex(j);
109 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap())); 112 EXPECT_EQ(baselineHashes[j], hashBitmap(frame->getSkBitmap()));
110 } 113 }
111 } 114 }
112 } 115 }
113 } 116 }
114 117
115 void testDecodeAfterReallocatingData(const char* webpFile) 118 void testDecodeAfterReallocatingData(const char* webpFile)
116 { 119 {
117 OwnPtr<ImageDecoder> decoder = createDecoder(); 120 OwnPtr<ImageDecoder> decoder = createDecoder();
118 RefPtr<SharedBuffer> data = readFile(webpFile); 121 RefPtr<SharedBuffer> data = readFile(webpFile);
119 ASSERT_TRUE(data.get()); 122 ASSERT_TRUE(data.get());
120 123
121 // Parse from 'data'. 124 // Parse from 'data'.
122 decoder->setData(data.get(), true); 125 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
126 decoder->setData(segmentReader.get(), true);
123 size_t frameCount = decoder->frameCount(); 127 size_t frameCount = decoder->frameCount();
124 128
125 // ... and then decode frames from 'reallocatedData'. 129 // ... and then decode frames from 'reallocatedData'.
126 RefPtr<SharedBuffer> reallocatedData = data.get()->copy(); 130 RefPtr<SharedBuffer> reallocatedData = data.get()->copy();
127 ASSERT_TRUE(reallocatedData.get()); 131 ASSERT_TRUE(reallocatedData.get());
128 data.clear(); 132 data.clear();
129 decoder->setData(reallocatedData.get(), true); 133 segmentReader = adoptRef(new SharedBufferSegmentReader(reallocatedData));
134 decoder->setData(segmentReader.get(), true);
130 135
131 for (size_t i = 0; i < frameCount; ++i) { 136 for (size_t i = 0; i < frameCount; ++i) {
132 const ImageFrame* const frame = decoder->frameBufferAtIndex(i); 137 const ImageFrame* const frame = decoder->frameBufferAtIndex(i);
133 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 138 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
134 } 139 }
135 } 140 }
136 141
137 void testByteByByteSizeAvailable(const char* webpFile, size_t frameOffset, bool hasColorProfile, int expectedRepetitionCount) 142 void testByteByByteSizeAvailable(const char* webpFile, size_t frameOffset, bool hasColorProfile, int expectedRepetitionCount)
138 { 143 {
139 OwnPtr<ImageDecoder> decoder = createDecoder(); 144 OwnPtr<ImageDecoder> decoder = createDecoder();
140 RefPtr<SharedBuffer> data = readFile(webpFile); 145 RefPtr<SharedBuffer> data = readFile(webpFile);
141 ASSERT_TRUE(data.get()); 146 ASSERT_TRUE(data.get());
142 EXPECT_LT(frameOffset, data->size()); 147 EXPECT_LT(frameOffset, data->size());
143 148
144 // Send data to the decoder byte-by-byte and use the provided frame offset i n the data to check 149 // Send data to the decoder byte-by-byte and use the provided frame offset i n the data to check
145 // isSizeAvailable() changes state only when that offset is reached, and the associated decoder 150 // isSizeAvailable() changes state only when that offset is reached, and the associated decoder
146 // state also: size, colorProfile, frameCount, repetitionCount ... 151 // state also: size, colorProfile, frameCount, repetitionCount ...
147 152
148 for (size_t length = 1; length <= frameOffset; ++length) { 153 for (size_t length = 1; length <= frameOffset; ++length) {
149 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h); 154 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), lengt h);
150 decoder->setData(tempData.get(), false); 155 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(tempData));
156 decoder->setData(segmentReader.get(), false);
151 157
152 if (length < frameOffset) { 158 if (length < frameOffset) {
153 EXPECT_FALSE(decoder->isSizeAvailable()); 159 EXPECT_FALSE(decoder->isSizeAvailable());
154 EXPECT_TRUE(decoder->size().isEmpty()); 160 EXPECT_TRUE(decoder->size().isEmpty());
155 EXPECT_FALSE(decoder->hasColorProfile()); 161 EXPECT_FALSE(decoder->hasColorProfile());
156 EXPECT_EQ(0u, decoder->frameCount()); 162 EXPECT_EQ(0u, decoder->frameCount());
157 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); 163 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount());
158 EXPECT_FALSE(decoder->frameBufferAtIndex(0)); 164 EXPECT_FALSE(decoder->frameBufferAtIndex(0));
159 } else { 165 } else {
160 EXPECT_TRUE(decoder->isSizeAvailable()); 166 EXPECT_TRUE(decoder->isSizeAvailable());
(...skipping 17 matching lines...) Expand all
178 } 184 }
179 185
180 // If 'parseErrorExpected' is true, error is expected during parse (frameCount() 186 // If 'parseErrorExpected' is true, error is expected during parse (frameCount()
181 // call); else error is expected during decode (frameBufferAtIndex() call). 187 // call); else error is expected during decode (frameBufferAtIndex() call).
182 void testInvalidImage(const char* webpFile, bool parseErrorExpected) 188 void testInvalidImage(const char* webpFile, bool parseErrorExpected)
183 { 189 {
184 OwnPtr<ImageDecoder> decoder = createDecoder(); 190 OwnPtr<ImageDecoder> decoder = createDecoder();
185 191
186 RefPtr<SharedBuffer> data = readFile(webpFile); 192 RefPtr<SharedBuffer> data = readFile(webpFile);
187 ASSERT_TRUE(data.get()); 193 ASSERT_TRUE(data.get());
188 decoder->setData(data.get(), true); 194 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
195 decoder->setData(segmentReader.get(), true);
189 196
190 if (parseErrorExpected) { 197 if (parseErrorExpected) {
191 EXPECT_EQ(0u, decoder->frameCount()); 198 EXPECT_EQ(0u, decoder->frameCount());
192 EXPECT_FALSE(decoder->frameBufferAtIndex(0)); 199 EXPECT_FALSE(decoder->frameBufferAtIndex(0));
193 } else { 200 } else {
194 EXPECT_GT(decoder->frameCount(), 0u); 201 EXPECT_GT(decoder->frameCount(), 0u);
195 ImageFrame* frame = decoder->frameBufferAtIndex(0); 202 ImageFrame* frame = decoder->frameBufferAtIndex(0);
196 ASSERT_TRUE(frame); 203 ASSERT_TRUE(frame);
197 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); 204 EXPECT_EQ(ImageFrame::FramePartial, frame->status());
198 } 205 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 // Pre-multiplication could round the RGBA channel values. So, we declare 241 // Pre-multiplication could round the RGBA channel values. So, we declare
235 // that the frames match if the RGBA channel values differ by at most 2. 242 // that the frames match if the RGBA channel values differ by at most 2.
236 EXPECT_GE(2, maxDifference) << webpFile; 243 EXPECT_GE(2, maxDifference) << webpFile;
237 } 244 }
238 245
239 // Verify that result of alpha blending is similar for AlphaPremultiplied and Al phaNotPremultiplied cases. 246 // Verify that result of alpha blending is similar for AlphaPremultiplied and Al phaNotPremultiplied cases.
240 void testAlphaBlending(const char* webpFile) 247 void testAlphaBlending(const char* webpFile)
241 { 248 {
242 RefPtr<SharedBuffer> data = readFile(webpFile); 249 RefPtr<SharedBuffer> data = readFile(webpFile);
243 ASSERT_TRUE(data.get()); 250 ASSERT_TRUE(data.get());
251 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
244 252
245 OwnPtr<ImageDecoder> decoderA = createDecoder(ImageDecoder::AlphaPremultipli ed); 253 OwnPtr<ImageDecoder> decoderA = createDecoder(ImageDecoder::AlphaPremultipli ed);
246 decoderA->setData(data.get(), true); 254 decoderA->setData(segmentReader.get(), true);
247 255
248 OwnPtr<ImageDecoder> decoderB = createDecoder(ImageDecoder::AlphaNotPremulti plied); 256 OwnPtr<ImageDecoder> decoderB = createDecoder(ImageDecoder::AlphaNotPremulti plied);
249 decoderB->setData(data.get(), true); 257 decoderB->setData(segmentReader.get(), true);
250 258
251 size_t frameCount = decoderA->frameCount(); 259 size_t frameCount = decoderA->frameCount();
252 ASSERT_EQ(frameCount, decoderB->frameCount()); 260 ASSERT_EQ(frameCount, decoderB->frameCount());
253 261
254 for (size_t i = 0; i < frameCount; ++i) 262 for (size_t i = 0; i < frameCount; ++i)
255 verifyFramesMatch(webpFile, decoderA->frameBufferAtIndex(i), decoderB->f rameBufferAtIndex(i)); 263 verifyFramesMatch(webpFile, decoderA->frameBufferAtIndex(i), decoderB->f rameBufferAtIndex(i));
256 } 264 }
257 265
258 } // anonymous namespace 266 } // anonymous namespace
259 267
260 TEST(AnimatedWebPTests, uniqueGenerationIDs) 268 TEST(AnimatedWebPTests, uniqueGenerationIDs)
261 { 269 {
262 OwnPtr<ImageDecoder> decoder = createDecoder(); 270 OwnPtr<ImageDecoder> decoder = createDecoder();
263 271
264 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-animated.webp"); 272 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-animated.webp");
265 ASSERT_TRUE(data.get()); 273 ASSERT_TRUE(data.get());
266 decoder->setData(data.get(), true); 274 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
275 decoder->setData(segmentReader.get(), true);
267 276
268 ImageFrame* frame = decoder->frameBufferAtIndex(0); 277 ImageFrame* frame = decoder->frameBufferAtIndex(0);
269 uint32_t generationID0 = frame->getSkBitmap().getGenerationID(); 278 uint32_t generationID0 = frame->getSkBitmap().getGenerationID();
270 frame = decoder->frameBufferAtIndex(1); 279 frame = decoder->frameBufferAtIndex(1);
271 uint32_t generationID1 = frame->getSkBitmap().getGenerationID(); 280 uint32_t generationID1 = frame->getSkBitmap().getGenerationID();
272 281
273 EXPECT_TRUE(generationID0 != generationID1); 282 EXPECT_TRUE(generationID0 != generationID1);
274 } 283 }
275 284
276 TEST(AnimatedWebPTests, verifyAnimationParametersTransparentImage) 285 TEST(AnimatedWebPTests, verifyAnimationParametersTransparentImage)
277 { 286 {
278 OwnPtr<ImageDecoder> decoder = createDecoder(); 287 OwnPtr<ImageDecoder> decoder = createDecoder();
279 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); 288 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount());
280 289
281 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-animated.webp"); 290 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-animated.webp");
282 ASSERT_TRUE(data.get()); 291 ASSERT_TRUE(data.get());
283 decoder->setData(data.get(), true); 292 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
293 decoder->setData(segmentReader.get(), true);
284 294
285 const int canvasWidth = 11; 295 const int canvasWidth = 11;
286 const int canvasHeight = 29; 296 const int canvasHeight = 29;
287 const struct AnimParam { 297 const struct AnimParam {
288 int xOffset, yOffset, width, height; 298 int xOffset, yOffset, width, height;
289 ImageFrame::DisposalMethod disposalMethod; 299 ImageFrame::DisposalMethod disposalMethod;
290 ImageFrame::AlphaBlendSource alphaBlendSource; 300 ImageFrame::AlphaBlendSource alphaBlendSource;
291 unsigned duration; 301 unsigned duration;
292 bool hasAlpha; 302 bool hasAlpha;
293 } frameParameters[] = { 303 } frameParameters[] = {
(...skipping 21 matching lines...) Expand all
315 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 325 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
316 } 326 }
317 327
318 TEST(AnimatedWebPTests, verifyAnimationParametersOpaqueFramesTransparentBackgrou nd) 328 TEST(AnimatedWebPTests, verifyAnimationParametersOpaqueFramesTransparentBackgrou nd)
319 { 329 {
320 OwnPtr<ImageDecoder> decoder = createDecoder(); 330 OwnPtr<ImageDecoder> decoder = createDecoder();
321 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); 331 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount());
322 332
323 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-animated-opaque.webp"); 333 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-animated-opaque.webp");
324 ASSERT_TRUE(data.get()); 334 ASSERT_TRUE(data.get());
325 decoder->setData(data.get(), true); 335 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
336 decoder->setData(segmentReader.get(), true);
326 337
327 const int canvasWidth = 94; 338 const int canvasWidth = 94;
328 const int canvasHeight = 87; 339 const int canvasHeight = 87;
329 const struct AnimParam { 340 const struct AnimParam {
330 int xOffset, yOffset, width, height; 341 int xOffset, yOffset, width, height;
331 ImageFrame::DisposalMethod disposalMethod; 342 ImageFrame::DisposalMethod disposalMethod;
332 ImageFrame::AlphaBlendSource alphaBlendSource; 343 ImageFrame::AlphaBlendSource alphaBlendSource;
333 unsigned duration; 344 unsigned duration;
334 bool hasAlpha; 345 bool hasAlpha;
335 } frameParameters[] = { 346 } frameParameters[] = {
(...skipping 22 matching lines...) Expand all
358 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); 369 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount());
359 } 370 }
360 371
361 TEST(AnimatedWebPTests, verifyAnimationParametersBlendOverwrite) 372 TEST(AnimatedWebPTests, verifyAnimationParametersBlendOverwrite)
362 { 373 {
363 OwnPtr<ImageDecoder> decoder = createDecoder(); 374 OwnPtr<ImageDecoder> decoder = createDecoder();
364 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); 375 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount());
365 376
366 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-animated-no-blend.webp"); 377 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-animated-no-blend.webp");
367 ASSERT_TRUE(data.get()); 378 ASSERT_TRUE(data.get());
368 decoder->setData(data.get(), true); 379 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
380 decoder->setData(segmentReader.get(), true);
369 381
370 const int canvasWidth = 94; 382 const int canvasWidth = 94;
371 const int canvasHeight = 87; 383 const int canvasHeight = 87;
372 const struct AnimParam { 384 const struct AnimParam {
373 int xOffset, yOffset, width, height; 385 int xOffset, yOffset, width, height;
374 ImageFrame::DisposalMethod disposalMethod; 386 ImageFrame::DisposalMethod disposalMethod;
375 ImageFrame::AlphaBlendSource alphaBlendSource; 387 ImageFrame::AlphaBlendSource alphaBlendSource;
376 unsigned duration; 388 unsigned duration;
377 bool hasAlpha; 389 bool hasAlpha;
378 } frameParameters[] = { 390 } frameParameters[] = {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 // One of the frame rectangles extends outside the image boundary. 426 // One of the frame rectangles extends outside the image boundary.
415 testInvalidImage("/LayoutTests/fast/images/resources/invalid-animated-webp3. webp", true); 427 testInvalidImage("/LayoutTests/fast/images/resources/invalid-animated-webp3. webp", true);
416 } 428 }
417 429
418 TEST(AnimatedWebPTests, truncatedLastFrame) 430 TEST(AnimatedWebPTests, truncatedLastFrame)
419 { 431 {
420 OwnPtr<ImageDecoder> decoder = createDecoder(); 432 OwnPtr<ImageDecoder> decoder = createDecoder();
421 433
422 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/inv alid-animated-webp2.webp"); 434 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/inv alid-animated-webp2.webp");
423 ASSERT_TRUE(data.get()); 435 ASSERT_TRUE(data.get());
424 decoder->setData(data.get(), true); 436 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
437 decoder->setData(segmentReader.get(), true);
425 438
426 size_t frameCount = 8; 439 size_t frameCount = 8;
427 EXPECT_EQ(frameCount, decoder->frameCount()); 440 EXPECT_EQ(frameCount, decoder->frameCount());
428 ImageFrame* frame = decoder->frameBufferAtIndex(0); 441 ImageFrame* frame = decoder->frameBufferAtIndex(0);
429 ASSERT_TRUE(frame); 442 ASSERT_TRUE(frame);
430 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 443 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
431 EXPECT_FALSE(decoder->failed()); 444 EXPECT_FALSE(decoder->failed());
432 frame = decoder->frameBufferAtIndex(frameCount - 1); 445 frame = decoder->frameBufferAtIndex(frameCount - 1);
433 ASSERT_TRUE(frame); 446 ASSERT_TRUE(frame);
434 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); 447 EXPECT_EQ(ImageFrame::FramePartial, frame->status());
435 EXPECT_TRUE(decoder->failed()); 448 EXPECT_TRUE(decoder->failed());
436 frame = decoder->frameBufferAtIndex(0); 449 frame = decoder->frameBufferAtIndex(0);
437 ASSERT_TRUE(frame); 450 ASSERT_TRUE(frame);
438 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 451 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
439 } 452 }
440 453
441 TEST(AnimatedWebPTests, truncatedInBetweenFrame) 454 TEST(AnimatedWebPTests, truncatedInBetweenFrame)
442 { 455 {
443 OwnPtr<ImageDecoder> decoder = createDecoder(); 456 OwnPtr<ImageDecoder> decoder = createDecoder();
444 457
445 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources /invalid-animated-webp4.webp"); 458 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources /invalid-animated-webp4.webp");
446 ASSERT_TRUE(fullData.get()); 459 ASSERT_TRUE(fullData.get());
447 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), fullData- >size() - 1); 460 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), fullData- >size() - 1);
448 decoder->setData(data.get(), false); 461 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
462 decoder->setData(segmentReader.get(), false);
449 463
450 ImageFrame* frame = decoder->frameBufferAtIndex(1); 464 ImageFrame* frame = decoder->frameBufferAtIndex(1);
451 ASSERT_TRUE(frame); 465 ASSERT_TRUE(frame);
452 EXPECT_EQ(ImageFrame::FrameComplete, frame->status()); 466 EXPECT_EQ(ImageFrame::FrameComplete, frame->status());
453 frame = decoder->frameBufferAtIndex(2); 467 frame = decoder->frameBufferAtIndex(2);
454 ASSERT_TRUE(frame); 468 ASSERT_TRUE(frame);
455 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); 469 EXPECT_EQ(ImageFrame::FramePartial, frame->status());
456 EXPECT_TRUE(decoder->failed()); 470 EXPECT_TRUE(decoder->failed());
457 } 471 }
458 472
459 // Reproduce a crash that used to happen for a specific file with specific seque nce of method calls. 473 // Reproduce a crash that used to happen for a specific file with specific seque nce of method calls.
460 TEST(AnimatedWebPTests, reproCrash) 474 TEST(AnimatedWebPTests, reproCrash)
461 { 475 {
462 OwnPtr<ImageDecoder> decoder = createDecoder(); 476 OwnPtr<ImageDecoder> decoder = createDecoder();
463 477
464 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources /invalid_vp8_vp8x.webp"); 478 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources /invalid_vp8_vp8x.webp");
465 ASSERT_TRUE(fullData.get()); 479 ASSERT_TRUE(fullData.get());
466 480
467 // Parse partial data up to which error in bitstream is not detected. 481 // Parse partial data up to which error in bitstream is not detected.
468 const size_t partialSize = 32768; 482 const size_t partialSize = 32768;
469 ASSERT_GT(fullData->size(), partialSize); 483 ASSERT_GT(fullData->size(), partialSize);
470 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), partialSi ze); 484 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), partialSi ze);
471 decoder->setData(data.get(), false); 485 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
486 decoder->setData(segmentReader.get(), false);
472 EXPECT_EQ(1u, decoder->frameCount()); 487 EXPECT_EQ(1u, decoder->frameCount());
473 ImageFrame* frame = decoder->frameBufferAtIndex(0); 488 ImageFrame* frame = decoder->frameBufferAtIndex(0);
474 ASSERT_TRUE(frame); 489 ASSERT_TRUE(frame);
475 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); 490 EXPECT_EQ(ImageFrame::FramePartial, frame->status());
476 EXPECT_FALSE(decoder->failed()); 491 EXPECT_FALSE(decoder->failed());
477 492
478 // Parse full data now. The error in bitstream should now be detected. 493 // Parse full data now. The error in bitstream should now be detected.
479 decoder->setData(fullData.get(), true); 494 segmentReader = adoptRef(new SharedBufferSegmentReader(fullData));
495 decoder->setData(segmentReader.get(), true);
480 EXPECT_EQ(1u, decoder->frameCount()); 496 EXPECT_EQ(1u, decoder->frameCount());
481 frame = decoder->frameBufferAtIndex(0); 497 frame = decoder->frameBufferAtIndex(0);
482 ASSERT_TRUE(frame); 498 ASSERT_TRUE(frame);
483 EXPECT_EQ(ImageFrame::FramePartial, frame->status()); 499 EXPECT_EQ(ImageFrame::FramePartial, frame->status());
484 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); 500 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount());
485 EXPECT_TRUE(decoder->failed()); 501 EXPECT_TRUE(decoder->failed());
486 } 502 }
487 503
488 TEST(AnimatedWebPTests, progressiveDecode) 504 TEST(AnimatedWebPTests, progressiveDecode)
489 { 505 {
490 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources /webp-animated.webp"); 506 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources /webp-animated.webp");
491 ASSERT_TRUE(fullData.get()); 507 ASSERT_TRUE(fullData.get());
492 const size_t fullLength = fullData->size(); 508 const size_t fullLength = fullData->size();
493 509
494 OwnPtr<ImageDecoder> decoder; 510 OwnPtr<ImageDecoder> decoder;
495 ImageFrame* frame; 511 ImageFrame* frame;
496 512
497 Vector<unsigned> truncatedHashes; 513 Vector<unsigned> truncatedHashes;
498 Vector<unsigned> progressiveHashes; 514 Vector<unsigned> progressiveHashes;
499 515
500 // Compute hashes when the file is truncated. 516 // Compute hashes when the file is truncated.
501 const size_t increment = 1; 517 const size_t increment = 1;
502 for (size_t i = 1; i <= fullLength; i += increment) { 518 for (size_t i = 1; i <= fullLength; i += increment) {
503 decoder = createDecoder(); 519 decoder = createDecoder();
504 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); 520 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i);
505 decoder->setData(data.get(), i == fullLength); 521 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(data));
522 decoder->setData(segmentReader.get(), i == fullLength);
506 frame = decoder->frameBufferAtIndex(0); 523 frame = decoder->frameBufferAtIndex(0);
507 if (!frame) { 524 if (!frame) {
508 truncatedHashes.append(0); 525 truncatedHashes.append(0);
509 continue; 526 continue;
510 } 527 }
511 truncatedHashes.append(hashBitmap(frame->getSkBitmap())); 528 truncatedHashes.append(hashBitmap(frame->getSkBitmap()));
512 } 529 }
513 530
514 // Compute hashes when the file is progressively decoded. 531 // Compute hashes when the file is progressively decoded.
515 decoder = createDecoder(); 532 decoder = createDecoder();
516 for (size_t i = 1; i <= fullLength; i += increment) { 533 for (size_t i = 1; i <= fullLength; i += increment) {
517 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i); 534 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), i);
518 decoder->setData(data.get(), i == fullLength); 535 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(data));
536 decoder->setData(segmentReader.get(), i == fullLength);
519 frame = decoder->frameBufferAtIndex(0); 537 frame = decoder->frameBufferAtIndex(0);
520 if (!frame) { 538 if (!frame) {
521 progressiveHashes.append(0); 539 progressiveHashes.append(0);
522 continue; 540 continue;
523 } 541 }
524 progressiveHashes.append(hashBitmap(frame->getSkBitmap())); 542 progressiveHashes.append(hashBitmap(frame->getSkBitmap()));
525 } 543 }
526 544
527 bool match = true; 545 bool match = true;
528 for (size_t i = 0; i < truncatedHashes.size(); ++i) { 546 for (size_t i = 0; i < truncatedHashes.size(); ++i) {
529 if (truncatedHashes[i] != progressiveHashes[i]) { 547 if (truncatedHashes[i] != progressiveHashes[i]) {
530 match = false; 548 match = false;
531 break; 549 break;
532 } 550 }
533 } 551 }
534 EXPECT_TRUE(match); 552 EXPECT_TRUE(match);
535 } 553 }
536 554
537 TEST(AnimatedWebPTests, frameIsCompleteAndDuration) 555 TEST(AnimatedWebPTests, frameIsCompleteAndDuration)
538 { 556 {
539 OwnPtr<ImageDecoder> decoder = createDecoder(); 557 OwnPtr<ImageDecoder> decoder = createDecoder();
540 558
541 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-animated.webp"); 559 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-animated.webp");
542 ASSERT_TRUE(data.get()); 560 ASSERT_TRUE(data.get());
543 561
544 ASSERT_GE(data->size(), 10u); 562 ASSERT_GE(data->size(), 10u);
545 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10); 563 RefPtr<SharedBuffer> tempData = SharedBuffer::create(data->data(), data->siz e() - 10);
546 decoder->setData(tempData.get(), false); 564 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(tempData));
565 decoder->setData(segmentReader.get(), false);
547 566
548 EXPECT_EQ(2u, decoder->frameCount()); 567 EXPECT_EQ(2u, decoder->frameCount());
549 EXPECT_FALSE(decoder->failed()); 568 EXPECT_FALSE(decoder->failed());
550 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); 569 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0));
551 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0)); 570 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0));
552 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); 571 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1));
553 EXPECT_EQ(500, decoder->frameDurationAtIndex(1)); 572 EXPECT_EQ(500, decoder->frameDurationAtIndex(1));
554 573
555 decoder->setData(data.get(), true); 574 segmentReader = adoptRef(new SharedBufferSegmentReader(data));
575 decoder->setData(segmentReader.get(), true);
556 EXPECT_EQ(3u, decoder->frameCount()); 576 EXPECT_EQ(3u, decoder->frameCount());
557 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); 577 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0));
558 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0)); 578 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0));
559 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); 579 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1));
560 EXPECT_EQ(500, decoder->frameDurationAtIndex(1)); 580 EXPECT_EQ(500, decoder->frameDurationAtIndex(1));
561 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(2)); 581 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(2));
562 EXPECT_EQ(1000.0, decoder->frameDurationAtIndex(2)); 582 EXPECT_EQ(1000.0, decoder->frameDurationAtIndex(2));
563 } 583 }
564 584
565 TEST(AnimatedWebPTests, updateRequiredPreviousFrameAfterFirstDecode) 585 TEST(AnimatedWebPTests, updateRequiredPreviousFrameAfterFirstDecode)
566 { 586 {
567 OwnPtr<ImageDecoder> decoder = createDecoder(); 587 OwnPtr<ImageDecoder> decoder = createDecoder();
568 588
569 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources /webp-animated.webp"); 589 RefPtr<SharedBuffer> fullData = readFile("/LayoutTests/fast/images/resources /webp-animated.webp");
570 ASSERT_TRUE(fullData.get()); 590 ASSERT_TRUE(fullData.get());
571 591
572 // Give it data that is enough to parse but not decode in order to check the status 592 // Give it data that is enough to parse but not decode in order to check the status
573 // of requiredPreviousFrameIndex before decoding. 593 // of requiredPreviousFrameIndex before decoding.
574 size_t partialSize = 1; 594 size_t partialSize = 1;
575 do { 595 do {
576 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize); 596 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize);
577 decoder->setData(data.get(), false); 597 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(data));
598 decoder->setData(segmentReader.get(), false);
578 ++partialSize; 599 ++partialSize;
579 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty); 600 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty);
580 601
581 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameIn dex()); 602 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(0)->requiredPreviousFrameIn dex());
582 size_t frameCount = decoder->frameCount(); 603 size_t frameCount = decoder->frameCount();
583 for (size_t i = 1; i < frameCount; ++i) 604 for (size_t i = 1; i < frameCount; ++i)
584 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn dex()); 605 EXPECT_EQ(i - 1, decoder->frameBufferAtIndex(i)->requiredPreviousFrameIn dex());
585 606
586 decoder->setData(fullData.get(), true); 607 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(fullData));
608 decoder->setData(segmentReader.get(), true);
587 for (size_t i = 0; i < frameCount; ++i) 609 for (size_t i = 0; i < frameCount; ++i)
588 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(i)->requiredPreviousFra meIndex()); 610 EXPECT_EQ(kNotFound, decoder->frameBufferAtIndex(i)->requiredPreviousFra meIndex());
589 } 611 }
590 612
591 TEST(AnimatedWebPTests, randomFrameDecode) 613 TEST(AnimatedWebPTests, randomFrameDecode)
592 { 614 {
593 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated.webp "); 615 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated.webp ");
594 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-opaq ue.webp"); 616 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-opaq ue.webp");
595 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-larg e.webp"); 617 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-larg e.webp");
596 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-icc- xmp.webp"); 618 testRandomFrameDecode("/LayoutTests/fast/images/resources/webp-animated-icc- xmp.webp");
(...skipping 14 matching lines...) Expand all
611 Vector<unsigned> baselineHashes; 633 Vector<unsigned> baselineHashes;
612 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); 634 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes);
613 size_t frameCount = baselineHashes.size(); 635 size_t frameCount = baselineHashes.size();
614 636
615 OwnPtr<ImageDecoder> decoder = createDecoder(); 637 OwnPtr<ImageDecoder> decoder = createDecoder();
616 638
617 // Let frame 0 be partially decoded. 639 // Let frame 0 be partially decoded.
618 size_t partialSize = 1; 640 size_t partialSize = 1;
619 do { 641 do {
620 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize); 642 RefPtr<SharedBuffer> data = SharedBuffer::create(fullData->data(), parti alSize);
621 decoder->setData(data.get(), false); 643 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBuf ferSegmentReader(data));
644 decoder->setData(segmentReader.get(), false);
622 ++partialSize; 645 ++partialSize;
623 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty); 646 } while (!decoder->frameCount() || decoder->frameBufferAtIndex(0)->status() == ImageFrame::FrameEmpty);
624 647
625 // Skip to the last frame and clear. 648 // Skip to the last frame and clear.
626 decoder->setData(fullData.get(), true); 649 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(fullData));
650 decoder->setData(segmentReader.get(), true);
627 EXPECT_EQ(frameCount, decoder->frameCount()); 651 EXPECT_EQ(frameCount, decoder->frameCount());
628 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1); 652 ImageFrame* lastFrame = decoder->frameBufferAtIndex(frameCount - 1);
629 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->getSkBitmap( ))); 653 EXPECT_EQ(baselineHashes[frameCount - 1], hashBitmap(lastFrame->getSkBitmap( )));
630 decoder->clearCacheExceptFrame(kNotFound); 654 decoder->clearCacheExceptFrame(kNotFound);
631 655
632 // Resume decoding of the first frame. 656 // Resume decoding of the first frame.
633 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); 657 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0);
634 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status()); 658 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->status());
635 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->getSkBitmap())); 659 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->getSkBitmap()));
636 } 660 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 { 699 {
676 testByteByByteSizeAvailable("/LayoutTests/fast/images/resources/webp-color-p rofile-lossy.webp", 520u, true, cAnimationNone); 700 testByteByByteSizeAvailable("/LayoutTests/fast/images/resources/webp-color-p rofile-lossy.webp", 520u, true, cAnimationNone);
677 testByteByByteSizeAvailable("/LayoutTests/fast/images/resources/test.webp", 30u, false, cAnimationNone); 701 testByteByByteSizeAvailable("/LayoutTests/fast/images/resources/test.webp", 30u, false, cAnimationNone);
678 } 702 }
679 703
680 TEST(StaticWebPTests, notAnimated) 704 TEST(StaticWebPTests, notAnimated)
681 { 705 {
682 OwnPtr<ImageDecoder> decoder = createDecoder(); 706 OwnPtr<ImageDecoder> decoder = createDecoder();
683 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-color-profile-lossy.webp"); 707 RefPtr<SharedBuffer> data = readFile("/LayoutTests/fast/images/resources/web p-color-profile-lossy.webp");
684 ASSERT_TRUE(data.get()); 708 ASSERT_TRUE(data.get());
685 decoder->setData(data.get(), true); 709 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
710 decoder->setData(segmentReader.get(), true);
686 EXPECT_EQ(1u, decoder->frameCount()); 711 EXPECT_EQ(1u, decoder->frameCount());
687 EXPECT_EQ(cAnimationNone, decoder->repetitionCount()); 712 EXPECT_EQ(cAnimationNone, decoder->repetitionCount());
688 } 713 }
689 714
690 } // namespace blink 715 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698