| OLD | NEW |
| 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 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 verifyFramesMatch(webpFile, decoderA->frameBufferAtIndex(i), | 136 verifyFramesMatch(webpFile, decoderA->frameBufferAtIndex(i), |
| 137 decoderB->frameBufferAtIndex(i)); | 137 decoderB->frameBufferAtIndex(i)); |
| 138 } | 138 } |
| 139 | 139 |
| 140 } // anonymous namespace | 140 } // anonymous namespace |
| 141 | 141 |
| 142 TEST(AnimatedWebPTests, uniqueGenerationIDs) { | 142 TEST(AnimatedWebPTests, uniqueGenerationIDs) { |
| 143 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 143 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 144 | 144 |
| 145 RefPtr<SharedBuffer> data = | 145 RefPtr<SharedBuffer> data = |
| 146 readFile("/LayoutTests/fast/images/resources/webp-animated.webp"); | 146 readFile("/LayoutTests/images/resources/webp-animated.webp"); |
| 147 ASSERT_TRUE(data.get()); | 147 ASSERT_TRUE(data.get()); |
| 148 decoder->setData(data.get(), true); | 148 decoder->setData(data.get(), true); |
| 149 | 149 |
| 150 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 150 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 151 uint32_t generationID0 = frame->bitmap().getGenerationID(); | 151 uint32_t generationID0 = frame->bitmap().getGenerationID(); |
| 152 frame = decoder->frameBufferAtIndex(1); | 152 frame = decoder->frameBufferAtIndex(1); |
| 153 uint32_t generationID1 = frame->bitmap().getGenerationID(); | 153 uint32_t generationID1 = frame->bitmap().getGenerationID(); |
| 154 | 154 |
| 155 EXPECT_TRUE(generationID0 != generationID1); | 155 EXPECT_TRUE(generationID0 != generationID1); |
| 156 } | 156 } |
| 157 | 157 |
| 158 TEST(AnimatedWebPTests, verifyAnimationParametersTransparentImage) { | 158 TEST(AnimatedWebPTests, verifyAnimationParametersTransparentImage) { |
| 159 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 159 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 160 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 160 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 161 | 161 |
| 162 RefPtr<SharedBuffer> data = | 162 RefPtr<SharedBuffer> data = |
| 163 readFile("/LayoutTests/fast/images/resources/webp-animated.webp"); | 163 readFile("/LayoutTests/images/resources/webp-animated.webp"); |
| 164 ASSERT_TRUE(data.get()); | 164 ASSERT_TRUE(data.get()); |
| 165 decoder->setData(data.get(), true); | 165 decoder->setData(data.get(), true); |
| 166 | 166 |
| 167 const int canvasWidth = 11; | 167 const int canvasWidth = 11; |
| 168 const int canvasHeight = 29; | 168 const int canvasHeight = 29; |
| 169 const struct AnimParam { | 169 const struct AnimParam { |
| 170 int xOffset, yOffset, width, height; | 170 int xOffset, yOffset, width, height; |
| 171 ImageFrame::DisposalMethod disposalMethod; | 171 ImageFrame::DisposalMethod disposalMethod; |
| 172 ImageFrame::AlphaBlendSource alphaBlendSource; | 172 ImageFrame::AlphaBlendSource alphaBlendSource; |
| 173 unsigned duration; | 173 unsigned duration; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 200 EXPECT_EQ(WTF_ARRAY_LENGTH(frameParameters), decoder->frameCount()); | 200 EXPECT_EQ(WTF_ARRAY_LENGTH(frameParameters), decoder->frameCount()); |
| 201 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 201 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
| 202 } | 202 } |
| 203 | 203 |
| 204 TEST(AnimatedWebPTests, | 204 TEST(AnimatedWebPTests, |
| 205 verifyAnimationParametersOpaqueFramesTransparentBackground) { | 205 verifyAnimationParametersOpaqueFramesTransparentBackground) { |
| 206 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 206 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 207 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 207 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 208 | 208 |
| 209 RefPtr<SharedBuffer> data = | 209 RefPtr<SharedBuffer> data = |
| 210 readFile("/LayoutTests/fast/images/resources/webp-animated-opaque.webp"); | 210 readFile("/LayoutTests/images/resources/webp-animated-opaque.webp"); |
| 211 ASSERT_TRUE(data.get()); | 211 ASSERT_TRUE(data.get()); |
| 212 decoder->setData(data.get(), true); | 212 decoder->setData(data.get(), true); |
| 213 | 213 |
| 214 const int canvasWidth = 94; | 214 const int canvasWidth = 94; |
| 215 const int canvasHeight = 87; | 215 const int canvasHeight = 87; |
| 216 const struct AnimParam { | 216 const struct AnimParam { |
| 217 int xOffset, yOffset, width, height; | 217 int xOffset, yOffset, width, height; |
| 218 ImageFrame::DisposalMethod disposalMethod; | 218 ImageFrame::DisposalMethod disposalMethod; |
| 219 ImageFrame::AlphaBlendSource alphaBlendSource; | 219 ImageFrame::AlphaBlendSource alphaBlendSource; |
| 220 unsigned duration; | 220 unsigned duration; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 247 } | 247 } |
| 248 | 248 |
| 249 EXPECT_EQ(WTF_ARRAY_LENGTH(frameParameters), decoder->frameCount()); | 249 EXPECT_EQ(WTF_ARRAY_LENGTH(frameParameters), decoder->frameCount()); |
| 250 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 250 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
| 251 } | 251 } |
| 252 | 252 |
| 253 TEST(AnimatedWebPTests, verifyAnimationParametersBlendOverwrite) { | 253 TEST(AnimatedWebPTests, verifyAnimationParametersBlendOverwrite) { |
| 254 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 254 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 255 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 255 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 256 | 256 |
| 257 RefPtr<SharedBuffer> data = readFile( | 257 RefPtr<SharedBuffer> data = |
| 258 "/LayoutTests/fast/images/resources/webp-animated-no-blend.webp"); | 258 readFile("/LayoutTests/images/resources/webp-animated-no-blend.webp"); |
| 259 ASSERT_TRUE(data.get()); | 259 ASSERT_TRUE(data.get()); |
| 260 decoder->setData(data.get(), true); | 260 decoder->setData(data.get(), true); |
| 261 | 261 |
| 262 const int canvasWidth = 94; | 262 const int canvasWidth = 94; |
| 263 const int canvasHeight = 87; | 263 const int canvasHeight = 87; |
| 264 const struct AnimParam { | 264 const struct AnimParam { |
| 265 int xOffset, yOffset, width, height; | 265 int xOffset, yOffset, width, height; |
| 266 ImageFrame::DisposalMethod disposalMethod; | 266 ImageFrame::DisposalMethod disposalMethod; |
| 267 ImageFrame::AlphaBlendSource alphaBlendSource; | 267 ImageFrame::AlphaBlendSource alphaBlendSource; |
| 268 unsigned duration; | 268 unsigned duration; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 293 EXPECT_EQ(frameParameters[i].duration, frame->duration()); | 293 EXPECT_EQ(frameParameters[i].duration, frame->duration()); |
| 294 EXPECT_EQ(frameParameters[i].hasAlpha, frame->hasAlpha()); | 294 EXPECT_EQ(frameParameters[i].hasAlpha, frame->hasAlpha()); |
| 295 } | 295 } |
| 296 | 296 |
| 297 EXPECT_EQ(WTF_ARRAY_LENGTH(frameParameters), decoder->frameCount()); | 297 EXPECT_EQ(WTF_ARRAY_LENGTH(frameParameters), decoder->frameCount()); |
| 298 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); | 298 EXPECT_EQ(cAnimationLoopInfinite, decoder->repetitionCount()); |
| 299 } | 299 } |
| 300 | 300 |
| 301 TEST(AnimatedWebPTests, parseAndDecodeByteByByte) { | 301 TEST(AnimatedWebPTests, parseAndDecodeByteByByte) { |
| 302 testByteByByteDecode(&createDecoder, | 302 testByteByByteDecode(&createDecoder, |
| 303 "/LayoutTests/fast/images/resources/webp-animated.webp", | 303 "/LayoutTests/images/resources/webp-animated.webp", 3u, |
| 304 3u, cAnimationLoopInfinite); | 304 cAnimationLoopInfinite); |
| 305 testByteByByteDecode( | 305 testByteByByteDecode( |
| 306 &createDecoder, | 306 &createDecoder, |
| 307 "/LayoutTests/fast/images/resources/webp-animated-icc-xmp.webp", 13u, | 307 "/LayoutTests/images/resources/webp-animated-icc-xmp.webp", 13u, 32000); |
| 308 32000); | |
| 309 } | 308 } |
| 310 | 309 |
| 311 TEST(AnimatedWebPTests, invalidImages) { | 310 TEST(AnimatedWebPTests, invalidImages) { |
| 312 // ANMF chunk size is smaller than ANMF header size. | 311 // ANMF chunk size is smaller than ANMF header size. |
| 313 testInvalidImage( | 312 testInvalidImage("/LayoutTests/images/resources/invalid-animated-webp.webp", |
| 314 "/LayoutTests/fast/images/resources/invalid-animated-webp.webp", true); | 313 true); |
| 315 // One of the frame rectangles extends outside the image boundary. | 314 // One of the frame rectangles extends outside the image boundary. |
| 316 testInvalidImage( | 315 testInvalidImage("/LayoutTests/images/resources/invalid-animated-webp3.webp", |
| 317 "/LayoutTests/fast/images/resources/invalid-animated-webp3.webp", true); | 316 true); |
| 318 } | 317 } |
| 319 | 318 |
| 320 TEST(AnimatedWebPTests, truncatedLastFrame) { | 319 TEST(AnimatedWebPTests, truncatedLastFrame) { |
| 321 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 320 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 322 | 321 |
| 323 RefPtr<SharedBuffer> data = readFile( | 322 RefPtr<SharedBuffer> data = |
| 324 "/LayoutTests/fast/images/resources/invalid-animated-webp2.webp"); | 323 readFile("/LayoutTests/images/resources/invalid-animated-webp2.webp"); |
| 325 ASSERT_TRUE(data.get()); | 324 ASSERT_TRUE(data.get()); |
| 326 decoder->setData(data.get(), true); | 325 decoder->setData(data.get(), true); |
| 327 | 326 |
| 328 size_t frameCount = 8; | 327 size_t frameCount = 8; |
| 329 EXPECT_EQ(frameCount, decoder->frameCount()); | 328 EXPECT_EQ(frameCount, decoder->frameCount()); |
| 330 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 329 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 331 ASSERT_TRUE(frame); | 330 ASSERT_TRUE(frame); |
| 332 EXPECT_EQ(ImageFrame::FrameComplete, frame->getStatus()); | 331 EXPECT_EQ(ImageFrame::FrameComplete, frame->getStatus()); |
| 333 EXPECT_FALSE(decoder->failed()); | 332 EXPECT_FALSE(decoder->failed()); |
| 334 frame = decoder->frameBufferAtIndex(frameCount - 1); | 333 frame = decoder->frameBufferAtIndex(frameCount - 1); |
| 335 ASSERT_TRUE(frame); | 334 ASSERT_TRUE(frame); |
| 336 EXPECT_EQ(ImageFrame::FramePartial, frame->getStatus()); | 335 EXPECT_EQ(ImageFrame::FramePartial, frame->getStatus()); |
| 337 EXPECT_TRUE(decoder->failed()); | 336 EXPECT_TRUE(decoder->failed()); |
| 338 frame = decoder->frameBufferAtIndex(0); | 337 frame = decoder->frameBufferAtIndex(0); |
| 339 ASSERT_TRUE(frame); | 338 ASSERT_TRUE(frame); |
| 340 EXPECT_EQ(ImageFrame::FrameComplete, frame->getStatus()); | 339 EXPECT_EQ(ImageFrame::FrameComplete, frame->getStatus()); |
| 341 } | 340 } |
| 342 | 341 |
| 343 TEST(AnimatedWebPTests, truncatedInBetweenFrame) { | 342 TEST(AnimatedWebPTests, truncatedInBetweenFrame) { |
| 344 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 343 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 345 | 344 |
| 346 RefPtr<SharedBuffer> fullData = readFile( | 345 RefPtr<SharedBuffer> fullData = |
| 347 "/LayoutTests/fast/images/resources/invalid-animated-webp4.webp"); | 346 readFile("/LayoutTests/images/resources/invalid-animated-webp4.webp"); |
| 348 ASSERT_TRUE(fullData.get()); | 347 ASSERT_TRUE(fullData.get()); |
| 349 RefPtr<SharedBuffer> data = | 348 RefPtr<SharedBuffer> data = |
| 350 SharedBuffer::create(fullData->data(), fullData->size() - 1); | 349 SharedBuffer::create(fullData->data(), fullData->size() - 1); |
| 351 decoder->setData(data.get(), false); | 350 decoder->setData(data.get(), false); |
| 352 | 351 |
| 353 ImageFrame* frame = decoder->frameBufferAtIndex(1); | 352 ImageFrame* frame = decoder->frameBufferAtIndex(1); |
| 354 ASSERT_TRUE(frame); | 353 ASSERT_TRUE(frame); |
| 355 EXPECT_EQ(ImageFrame::FrameComplete, frame->getStatus()); | 354 EXPECT_EQ(ImageFrame::FrameComplete, frame->getStatus()); |
| 356 frame = decoder->frameBufferAtIndex(2); | 355 frame = decoder->frameBufferAtIndex(2); |
| 357 ASSERT_TRUE(frame); | 356 ASSERT_TRUE(frame); |
| 358 EXPECT_EQ(ImageFrame::FramePartial, frame->getStatus()); | 357 EXPECT_EQ(ImageFrame::FramePartial, frame->getStatus()); |
| 359 EXPECT_TRUE(decoder->failed()); | 358 EXPECT_TRUE(decoder->failed()); |
| 360 } | 359 } |
| 361 | 360 |
| 362 // Tests for a crash that used to happen for a specific file with specific | 361 // Tests for a crash that used to happen for a specific file with specific |
| 363 // sequence of method calls. | 362 // sequence of method calls. |
| 364 TEST(AnimatedWebPTests, reproCrash) { | 363 TEST(AnimatedWebPTests, reproCrash) { |
| 365 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 364 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 366 | 365 |
| 367 RefPtr<SharedBuffer> fullData = | 366 RefPtr<SharedBuffer> fullData = |
| 368 readFile("/LayoutTests/fast/images/resources/invalid_vp8_vp8x.webp"); | 367 readFile("/LayoutTests/images/resources/invalid_vp8_vp8x.webp"); |
| 369 ASSERT_TRUE(fullData.get()); | 368 ASSERT_TRUE(fullData.get()); |
| 370 | 369 |
| 371 // Parse partial data up to which error in bitstream is not detected. | 370 // Parse partial data up to which error in bitstream is not detected. |
| 372 const size_t partialSize = 32768; | 371 const size_t partialSize = 32768; |
| 373 ASSERT_GT(fullData->size(), partialSize); | 372 ASSERT_GT(fullData->size(), partialSize); |
| 374 RefPtr<SharedBuffer> data = | 373 RefPtr<SharedBuffer> data = |
| 375 SharedBuffer::create(fullData->data(), partialSize); | 374 SharedBuffer::create(fullData->data(), partialSize); |
| 376 decoder->setData(data.get(), false); | 375 decoder->setData(data.get(), false); |
| 377 EXPECT_EQ(1u, decoder->frameCount()); | 376 EXPECT_EQ(1u, decoder->frameCount()); |
| 378 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 377 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 379 ASSERT_TRUE(frame); | 378 ASSERT_TRUE(frame); |
| 380 EXPECT_EQ(ImageFrame::FramePartial, frame->getStatus()); | 379 EXPECT_EQ(ImageFrame::FramePartial, frame->getStatus()); |
| 381 EXPECT_FALSE(decoder->failed()); | 380 EXPECT_FALSE(decoder->failed()); |
| 382 | 381 |
| 383 // Parse full data now. The error in bitstream should now be detected. | 382 // Parse full data now. The error in bitstream should now be detected. |
| 384 decoder->setData(fullData.get(), true); | 383 decoder->setData(fullData.get(), true); |
| 385 EXPECT_EQ(1u, decoder->frameCount()); | 384 EXPECT_EQ(1u, decoder->frameCount()); |
| 386 frame = decoder->frameBufferAtIndex(0); | 385 frame = decoder->frameBufferAtIndex(0); |
| 387 ASSERT_TRUE(frame); | 386 ASSERT_TRUE(frame); |
| 388 EXPECT_EQ(ImageFrame::FramePartial, frame->getStatus()); | 387 EXPECT_EQ(ImageFrame::FramePartial, frame->getStatus()); |
| 389 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); | 388 EXPECT_EQ(cAnimationLoopOnce, decoder->repetitionCount()); |
| 390 EXPECT_TRUE(decoder->failed()); | 389 EXPECT_TRUE(decoder->failed()); |
| 391 } | 390 } |
| 392 | 391 |
| 393 TEST(AnimatedWebPTests, progressiveDecode) { | 392 TEST(AnimatedWebPTests, progressiveDecode) { |
| 394 testProgressiveDecoding( | 393 testProgressiveDecoding(&createDecoder, |
| 395 &createDecoder, "/LayoutTests/fast/images/resources/webp-animated.webp"); | 394 "/LayoutTests/images/resources/webp-animated.webp"); |
| 396 } | 395 } |
| 397 | 396 |
| 398 TEST(AnimatedWebPTests, frameIsCompleteAndDuration) { | 397 TEST(AnimatedWebPTests, frameIsCompleteAndDuration) { |
| 399 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 398 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 400 | 399 |
| 401 RefPtr<SharedBuffer> data = | 400 RefPtr<SharedBuffer> data = |
| 402 readFile("/LayoutTests/fast/images/resources/webp-animated.webp"); | 401 readFile("/LayoutTests/images/resources/webp-animated.webp"); |
| 403 ASSERT_TRUE(data.get()); | 402 ASSERT_TRUE(data.get()); |
| 404 | 403 |
| 405 ASSERT_GE(data->size(), 10u); | 404 ASSERT_GE(data->size(), 10u); |
| 406 RefPtr<SharedBuffer> tempData = | 405 RefPtr<SharedBuffer> tempData = |
| 407 SharedBuffer::create(data->data(), data->size() - 10); | 406 SharedBuffer::create(data->data(), data->size() - 10); |
| 408 decoder->setData(tempData.get(), false); | 407 decoder->setData(tempData.get(), false); |
| 409 | 408 |
| 410 EXPECT_EQ(2u, decoder->frameCount()); | 409 EXPECT_EQ(2u, decoder->frameCount()); |
| 411 EXPECT_FALSE(decoder->failed()); | 410 EXPECT_FALSE(decoder->failed()); |
| 412 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); | 411 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); |
| 413 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0)); | 412 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0)); |
| 414 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); | 413 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); |
| 415 EXPECT_EQ(500, decoder->frameDurationAtIndex(1)); | 414 EXPECT_EQ(500, decoder->frameDurationAtIndex(1)); |
| 416 | 415 |
| 417 decoder->setData(data.get(), true); | 416 decoder->setData(data.get(), true); |
| 418 EXPECT_EQ(3u, decoder->frameCount()); | 417 EXPECT_EQ(3u, decoder->frameCount()); |
| 419 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); | 418 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(0)); |
| 420 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0)); | 419 EXPECT_EQ(1000, decoder->frameDurationAtIndex(0)); |
| 421 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); | 420 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(1)); |
| 422 EXPECT_EQ(500, decoder->frameDurationAtIndex(1)); | 421 EXPECT_EQ(500, decoder->frameDurationAtIndex(1)); |
| 423 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(2)); | 422 EXPECT_TRUE(decoder->frameIsCompleteAtIndex(2)); |
| 424 EXPECT_EQ(1000.0, decoder->frameDurationAtIndex(2)); | 423 EXPECT_EQ(1000.0, decoder->frameDurationAtIndex(2)); |
| 425 } | 424 } |
| 426 | 425 |
| 427 TEST(AnimatedWebPTests, updateRequiredPreviousFrameAfterFirstDecode) { | 426 TEST(AnimatedWebPTests, updateRequiredPreviousFrameAfterFirstDecode) { |
| 428 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 427 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 429 | 428 |
| 430 RefPtr<SharedBuffer> fullData = | 429 RefPtr<SharedBuffer> fullData = |
| 431 readFile("/LayoutTests/fast/images/resources/webp-animated.webp"); | 430 readFile("/LayoutTests/images/resources/webp-animated.webp"); |
| 432 ASSERT_TRUE(fullData.get()); | 431 ASSERT_TRUE(fullData.get()); |
| 433 | 432 |
| 434 // Check the status of requiredPreviousFrameIndex before decoding, by | 433 // Check the status of requiredPreviousFrameIndex before decoding, by |
| 435 // supplying data sufficient to parse but not decode. | 434 // supplying data sufficient to parse but not decode. |
| 436 size_t partialSize = 1; | 435 size_t partialSize = 1; |
| 437 do { | 436 do { |
| 438 RefPtr<SharedBuffer> data = | 437 RefPtr<SharedBuffer> data = |
| 439 SharedBuffer::create(fullData->data(), partialSize); | 438 SharedBuffer::create(fullData->data(), partialSize); |
| 440 decoder->setData(data.get(), false); | 439 decoder->setData(data.get(), false); |
| 441 ++partialSize; | 440 ++partialSize; |
| 442 } while (!decoder->frameCount() || | 441 } while (!decoder->frameCount() || |
| 443 decoder->frameBufferAtIndex(0)->getStatus() == | 442 decoder->frameBufferAtIndex(0)->getStatus() == |
| 444 ImageFrame::FrameEmpty); | 443 ImageFrame::FrameEmpty); |
| 445 | 444 |
| 446 EXPECT_EQ(kNotFound, | 445 EXPECT_EQ(kNotFound, |
| 447 decoder->frameBufferAtIndex(0)->requiredPreviousFrameIndex()); | 446 decoder->frameBufferAtIndex(0)->requiredPreviousFrameIndex()); |
| 448 size_t frameCount = decoder->frameCount(); | 447 size_t frameCount = decoder->frameCount(); |
| 449 for (size_t i = 1; i < frameCount; ++i) | 448 for (size_t i = 1; i < frameCount; ++i) |
| 450 EXPECT_EQ(i - 1, | 449 EXPECT_EQ(i - 1, |
| 451 decoder->frameBufferAtIndex(i)->requiredPreviousFrameIndex()); | 450 decoder->frameBufferAtIndex(i)->requiredPreviousFrameIndex()); |
| 452 | 451 |
| 453 decoder->setData(fullData.get(), true); | 452 decoder->setData(fullData.get(), true); |
| 454 for (size_t i = 0; i < frameCount; ++i) | 453 for (size_t i = 0; i < frameCount; ++i) |
| 455 EXPECT_EQ(kNotFound, | 454 EXPECT_EQ(kNotFound, |
| 456 decoder->frameBufferAtIndex(i)->requiredPreviousFrameIndex()); | 455 decoder->frameBufferAtIndex(i)->requiredPreviousFrameIndex()); |
| 457 } | 456 } |
| 458 | 457 |
| 459 TEST(AnimatedWebPTests, randomFrameDecode) { | 458 TEST(AnimatedWebPTests, randomFrameDecode) { |
| 460 testRandomFrameDecode( | 459 testRandomFrameDecode(&createDecoder, |
| 461 &createDecoder, "/LayoutTests/fast/images/resources/webp-animated.webp"); | 460 "/LayoutTests/images/resources/webp-animated.webp"); |
| 462 testRandomFrameDecode( | 461 testRandomFrameDecode( |
| 463 &createDecoder, | 462 &createDecoder, |
| 464 "/LayoutTests/fast/images/resources/webp-animated-opaque.webp"); | 463 "/LayoutTests/images/resources/webp-animated-opaque.webp"); |
| 464 testRandomFrameDecode( |
| 465 &createDecoder, "/LayoutTests/images/resources/webp-animated-large.webp"); |
| 465 testRandomFrameDecode( | 466 testRandomFrameDecode( |
| 466 &createDecoder, | 467 &createDecoder, |
| 467 "/LayoutTests/fast/images/resources/webp-animated-large.webp"); | 468 "/LayoutTests/images/resources/webp-animated-icc-xmp.webp"); |
| 468 testRandomFrameDecode( | |
| 469 &createDecoder, | |
| 470 "/LayoutTests/fast/images/resources/webp-animated-icc-xmp.webp"); | |
| 471 } | 469 } |
| 472 | 470 |
| 473 TEST(AnimatedWebPTests, randomDecodeAfterClearFrameBufferCache) { | 471 TEST(AnimatedWebPTests, randomDecodeAfterClearFrameBufferCache) { |
| 474 testRandomDecodeAfterClearFrameBufferCache( | 472 testRandomDecodeAfterClearFrameBufferCache( |
| 475 &createDecoder, "/LayoutTests/fast/images/resources/webp-animated.webp"); | 473 &createDecoder, "/LayoutTests/images/resources/webp-animated.webp"); |
| 476 testRandomDecodeAfterClearFrameBufferCache( | 474 testRandomDecodeAfterClearFrameBufferCache( |
| 477 &createDecoder, | 475 &createDecoder, |
| 478 "/LayoutTests/fast/images/resources/webp-animated-opaque.webp"); | 476 "/LayoutTests/images/resources/webp-animated-opaque.webp"); |
| 477 testRandomDecodeAfterClearFrameBufferCache( |
| 478 &createDecoder, "/LayoutTests/images/resources/webp-animated-large.webp"); |
| 479 testRandomDecodeAfterClearFrameBufferCache( | 479 testRandomDecodeAfterClearFrameBufferCache( |
| 480 &createDecoder, | 480 &createDecoder, |
| 481 "/LayoutTests/fast/images/resources/webp-animated-large.webp"); | 481 "/LayoutTests/images/resources/webp-animated-icc-xmp.webp"); |
| 482 testRandomDecodeAfterClearFrameBufferCache( | |
| 483 &createDecoder, | |
| 484 "/LayoutTests/fast/images/resources/webp-animated-icc-xmp.webp"); | |
| 485 } | 482 } |
| 486 | 483 |
| 487 TEST(AnimatedWebPTests, | 484 TEST(AnimatedWebPTests, |
| 488 DISABLED_resumePartialDecodeAfterClearFrameBufferCache) { | 485 DISABLED_resumePartialDecodeAfterClearFrameBufferCache) { |
| 489 RefPtr<SharedBuffer> fullData = | 486 RefPtr<SharedBuffer> fullData = |
| 490 readFile("/LayoutTests/fast/images/resources/webp-animated-large.webp"); | 487 readFile("/LayoutTests/images/resources/webp-animated-large.webp"); |
| 491 ASSERT_TRUE(fullData.get()); | 488 ASSERT_TRUE(fullData.get()); |
| 492 Vector<unsigned> baselineHashes; | 489 Vector<unsigned> baselineHashes; |
| 493 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); | 490 createDecodingBaseline(&createDecoder, fullData.get(), &baselineHashes); |
| 494 size_t frameCount = baselineHashes.size(); | 491 size_t frameCount = baselineHashes.size(); |
| 495 | 492 |
| 496 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 493 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 497 | 494 |
| 498 // Let frame 0 be partially decoded. | 495 // Let frame 0 be partially decoded. |
| 499 size_t partialSize = 1; | 496 size_t partialSize = 1; |
| 500 do { | 497 do { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 514 decoder->clearCacheExceptFrame(kNotFound); | 511 decoder->clearCacheExceptFrame(kNotFound); |
| 515 | 512 |
| 516 // Resume decoding of the first frame. | 513 // Resume decoding of the first frame. |
| 517 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); | 514 ImageFrame* firstFrame = decoder->frameBufferAtIndex(0); |
| 518 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->getStatus()); | 515 EXPECT_EQ(ImageFrame::FrameComplete, firstFrame->getStatus()); |
| 519 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->bitmap())); | 516 EXPECT_EQ(baselineHashes[0], hashBitmap(firstFrame->bitmap())); |
| 520 } | 517 } |
| 521 | 518 |
| 522 TEST(AnimatedWebPTests, decodeAfterReallocatingData) { | 519 TEST(AnimatedWebPTests, decodeAfterReallocatingData) { |
| 523 testDecodeAfterReallocatingData( | 520 testDecodeAfterReallocatingData( |
| 524 &createDecoder, "/LayoutTests/fast/images/resources/webp-animated.webp"); | 521 &createDecoder, "/LayoutTests/images/resources/webp-animated.webp"); |
| 525 testDecodeAfterReallocatingData( | 522 testDecodeAfterReallocatingData( |
| 526 &createDecoder, | 523 &createDecoder, |
| 527 "/LayoutTests/fast/images/resources/webp-animated-icc-xmp.webp"); | 524 "/LayoutTests/images/resources/webp-animated-icc-xmp.webp"); |
| 528 } | 525 } |
| 529 | 526 |
| 530 TEST(AnimatedWebPTests, alphaBlending) { | 527 TEST(AnimatedWebPTests, alphaBlending) { |
| 531 testAlphaBlending("/LayoutTests/fast/images/resources/webp-animated.webp"); | 528 testAlphaBlending("/LayoutTests/images/resources/webp-animated.webp"); |
| 532 testAlphaBlending( | 529 testAlphaBlending( |
| 533 "/LayoutTests/fast/images/resources/webp-animated-semitransparent1.webp"); | 530 "/LayoutTests/images/resources/webp-animated-semitransparent1.webp"); |
| 534 testAlphaBlending( | 531 testAlphaBlending( |
| 535 "/LayoutTests/fast/images/resources/webp-animated-semitransparent2.webp"); | 532 "/LayoutTests/images/resources/webp-animated-semitransparent2.webp"); |
| 536 testAlphaBlending( | 533 testAlphaBlending( |
| 537 "/LayoutTests/fast/images/resources/webp-animated-semitransparent3.webp"); | 534 "/LayoutTests/images/resources/webp-animated-semitransparent3.webp"); |
| 538 testAlphaBlending( | 535 testAlphaBlending( |
| 539 "/LayoutTests/fast/images/resources/webp-animated-semitransparent4.webp"); | 536 "/LayoutTests/images/resources/webp-animated-semitransparent4.webp"); |
| 540 } | 537 } |
| 541 | 538 |
| 542 TEST(AnimatedWebPTests, isSizeAvailable) { | 539 TEST(AnimatedWebPTests, isSizeAvailable) { |
| 543 testByteByByteSizeAvailable( | 540 testByteByByteSizeAvailable( |
| 544 &createDecoder, "/LayoutTests/fast/images/resources/webp-animated.webp", | 541 &createDecoder, "/LayoutTests/images/resources/webp-animated.webp", 142u, |
| 545 142u, false, cAnimationLoopInfinite); | 542 false, cAnimationLoopInfinite); |
| 546 // FIXME: Add color profile support for animated webp images. | 543 // FIXME: Add color profile support for animated webp images. |
| 547 testByteByByteSizeAvailable( | 544 testByteByByteSizeAvailable( |
| 548 &createDecoder, | 545 &createDecoder, |
| 549 "/LayoutTests/fast/images/resources/webp-animated-icc-xmp.webp", 1404u, | 546 "/LayoutTests/images/resources/webp-animated-icc-xmp.webp", 1404u, false, |
| 550 false, 32000); | 547 32000); |
| 551 } | 548 } |
| 552 | 549 |
| 553 TEST(StaticWebPTests, truncatedImage) { | 550 TEST(StaticWebPTests, truncatedImage) { |
| 554 // VP8 data is truncated. | 551 // VP8 data is truncated. |
| 555 testInvalidImage("/LayoutTests/fast/images/resources/truncated.webp", false); | 552 testInvalidImage("/LayoutTests/images/resources/truncated.webp", false); |
| 556 // Chunk size in RIFF header doesn't match the file size. | 553 // Chunk size in RIFF header doesn't match the file size. |
| 557 testInvalidImage("/LayoutTests/fast/images/resources/truncated2.webp", true); | 554 testInvalidImage("/LayoutTests/images/resources/truncated2.webp", true); |
| 558 } | 555 } |
| 559 | 556 |
| 560 // Regression test for a bug where some valid images were failing to decode | 557 // Regression test for a bug where some valid images were failing to decode |
| 561 // incrementally. | 558 // incrementally. |
| 562 TEST(StaticWebPTests, incrementalDecode) { | 559 TEST(StaticWebPTests, incrementalDecode) { |
| 563 testByteByByteDecode(&createDecoder, | 560 testByteByByteDecode(&createDecoder, |
| 564 "/LayoutTests/fast/images/resources/crbug.364830.webp", | 561 "/LayoutTests/images/resources/crbug.364830.webp", 1u, |
| 565 1u, cAnimationNone); | 562 cAnimationNone); |
| 566 } | 563 } |
| 567 | 564 |
| 568 TEST(StaticWebPTests, isSizeAvailable) { | 565 TEST(StaticWebPTests, isSizeAvailable) { |
| 569 testByteByByteSizeAvailable( | 566 testByteByByteSizeAvailable( |
| 570 &createDecoder, | 567 &createDecoder, |
| 571 "/LayoutTests/fast/images/resources/webp-color-profile-lossy.webp", 520u, | 568 "/LayoutTests/images/resources/webp-color-profile-lossy.webp", 520u, true, |
| 572 true, cAnimationNone); | 569 cAnimationNone); |
| 573 testByteByByteSizeAvailable(&createDecoder, | 570 testByteByByteSizeAvailable(&createDecoder, |
| 574 "/LayoutTests/fast/images/resources/test.webp", | 571 "/LayoutTests/images/resources/test.webp", 30u, |
| 575 30u, false, cAnimationNone); | 572 false, cAnimationNone); |
| 576 } | 573 } |
| 577 | 574 |
| 578 TEST(StaticWebPTests, notAnimated) { | 575 TEST(StaticWebPTests, notAnimated) { |
| 579 std::unique_ptr<ImageDecoder> decoder = createDecoder(); | 576 std::unique_ptr<ImageDecoder> decoder = createDecoder(); |
| 580 RefPtr<SharedBuffer> data = readFile( | 577 RefPtr<SharedBuffer> data = |
| 581 "/LayoutTests/fast/images/resources/webp-color-profile-lossy.webp"); | 578 readFile("/LayoutTests/images/resources/webp-color-profile-lossy.webp"); |
| 582 ASSERT_TRUE(data.get()); | 579 ASSERT_TRUE(data.get()); |
| 583 decoder->setData(data.get(), true); | 580 decoder->setData(data.get(), true); |
| 584 EXPECT_EQ(1u, decoder->frameCount()); | 581 EXPECT_EQ(1u, decoder->frameCount()); |
| 585 EXPECT_EQ(cAnimationNone, decoder->repetitionCount()); | 582 EXPECT_EQ(cAnimationNone, decoder->repetitionCount()); |
| 586 } | 583 } |
| 587 | 584 |
| 588 } // namespace blink | 585 } // namespace blink |
| OLD | NEW |