| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 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 | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 m_decoderColorBehavior) | 300 m_decoderColorBehavior) |
| 301 .release(); | 301 .release(); |
| 302 // The newly created decoder just grabbed the data. No need to reset it. | 302 // The newly created decoder just grabbed the data. No need to reset it. |
| 303 shouldCallSetData = false; | 303 shouldCallSetData = false; |
| 304 } | 304 } |
| 305 | 305 |
| 306 if (!*decoder) | 306 if (!*decoder) |
| 307 return false; | 307 return false; |
| 308 } | 308 } |
| 309 | 309 |
| 310 if (!m_isMultiFrame && newDecoder && allDataReceived) { | |
| 311 // If we're using an external memory allocator that means we're decoding | |
| 312 // directly into the output memory and we can save one memcpy. | |
| 313 ASSERT(allocator); | |
| 314 (*decoder)->setMemoryAllocator(allocator); | |
| 315 } | |
| 316 | 310 |
| 317 if (shouldCallSetData) | 311 if (shouldCallSetData) |
| 318 (*decoder)->setData(data, allDataReceived); | 312 (*decoder)->setData(data, allDataReceived); |
| 319 ImageFrame* frame = (*decoder)->frameBufferAtIndex(index); | 313 |
| 314 bool usingExternalAllocator = false; |
| 320 | 315 |
| 321 // For multi-frame image decoders, we need to know how many frames are | 316 // For multi-frame image decoders, we need to know how many frames are |
| 322 // in that image in order to release the decoder when all frames are | 317 // in that image in order to release the decoder when all frames are |
| 323 // decoded. frameCount() is reliable only if all data is received and set in | 318 // decoded. frameCount() is reliable only if all data is received and set in |
| 324 // decoder, particularly with GIF. | 319 // decoder, particularly with GIF. |
| 325 if (allDataReceived) | 320 if (allDataReceived) { |
| 326 m_frameCount = (*decoder)->frameCount(); | 321 m_frameCount = (*decoder)->frameCount(); |
| 322 // TODO (scroggo): If !m_isMultiFrame && newDecoder && allDataReceived, it |
| 323 // should always be the case that 1u == m_frameCount. But it looks like it |
| 324 // is currently possible for m_frameCount to be another value. |
| 325 if (!m_isMultiFrame && newDecoder && 1u == m_frameCount) { |
| 326 // If we're using an external memory allocator that means we're decoding |
| 327 // directly into the output memory and we can save one memcpy. |
| 328 DCHECK(allocator); |
| 329 (*decoder)->setMemoryAllocator(allocator); |
| 330 usingExternalAllocator = true; |
| 331 } |
| 332 } |
| 333 |
| 334 ImageFrame* frame = (*decoder)->frameBufferAtIndex(index); |
| 327 | 335 |
| 328 (*decoder)->setData(PassRefPtr<SegmentReader>(nullptr), | 336 (*decoder)->setData(PassRefPtr<SegmentReader>(nullptr), |
| 329 false); // Unref SegmentReader from ImageDecoder. | 337 false); // Unref SegmentReader from ImageDecoder. |
| 330 (*decoder)->clearCacheExceptFrame(index); | 338 (*decoder)->clearCacheExceptFrame(index); |
| 331 (*decoder)->setMemoryAllocator(0); | 339 if (usingExternalAllocator) |
| 340 (*decoder)->setMemoryAllocator(0); |
| 332 | 341 |
| 333 if (!frame || frame->getStatus() == ImageFrame::FrameEmpty) | 342 if (!frame || frame->getStatus() == ImageFrame::FrameEmpty) |
| 334 return false; | 343 return false; |
| 335 | 344 |
| 336 // A cache object is considered complete if we can decode a complete frame. | 345 // A cache object is considered complete if we can decode a complete frame. |
| 337 // Or we have received all data. The image might not be fully decoded in | 346 // Or we have received all data. The image might not be fully decoded in |
| 338 // the latter case. | 347 // the latter case. |
| 339 const bool isDecodeComplete = | 348 const bool isDecodeComplete = |
| 340 frame->getStatus() == ImageFrame::FrameComplete || allDataReceived; | 349 frame->getStatus() == ImageFrame::FrameComplete || allDataReceived; |
| 341 | 350 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 // do YUV decoding. | 383 // do YUV decoding. |
| 375 std::unique_ptr<ImagePlanes> dummyImagePlanes = | 384 std::unique_ptr<ImagePlanes> dummyImagePlanes = |
| 376 WTF::wrapUnique(new ImagePlanes); | 385 WTF::wrapUnique(new ImagePlanes); |
| 377 decoder->setImagePlanes(std::move(dummyImagePlanes)); | 386 decoder->setImagePlanes(std::move(dummyImagePlanes)); |
| 378 | 387 |
| 379 return updateYUVComponentSizes(decoder.get(), sizeInfo->fSizes, | 388 return updateYUVComponentSizes(decoder.get(), sizeInfo->fSizes, |
| 380 sizeInfo->fWidthBytes); | 389 sizeInfo->fWidthBytes); |
| 381 } | 390 } |
| 382 | 391 |
| 383 } // namespace blink | 392 } // namespace blink |
| OLD | NEW |