| 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 21 matching lines...) Expand all Loading... |
| 32 #include "third_party/skia/include/core/SkYUVSizeInfo.h" | 32 #include "third_party/skia/include/core/SkYUVSizeInfo.h" |
| 33 #include "wtf/PtrUtil.h" | 33 #include "wtf/PtrUtil.h" |
| 34 #include <memory> | 34 #include <memory> |
| 35 | 35 |
| 36 namespace blink { | 36 namespace blink { |
| 37 | 37 |
| 38 static bool compatibleInfo(const SkImageInfo& src, const SkImageInfo& dst) { | 38 static bool compatibleInfo(const SkImageInfo& src, const SkImageInfo& dst) { |
| 39 if (src == dst) | 39 if (src == dst) |
| 40 return true; | 40 return true; |
| 41 | 41 |
| 42 // It is legal to write kOpaque_SkAlphaType pixels into a kPremul_SkAlphaType
buffer. | 42 // It is legal to write kOpaque_SkAlphaType pixels into a kPremul_SkAlphaType |
| 43 // This can happen when DeferredImageDecoder allocates an kOpaque_SkAlphaType
image | 43 // buffer. This can happen when DeferredImageDecoder allocates an |
| 44 // generator based on cached frame info, while the ImageFrame-allocated dest b
itmap | 44 // kOpaque_SkAlphaType image generator based on cached frame info, while the |
| 45 // stays kPremul_SkAlphaType. | 45 // ImageFrame-allocated dest bitmap stays kPremul_SkAlphaType. |
| 46 if (src.alphaType() == kOpaque_SkAlphaType && | 46 if (src.alphaType() == kOpaque_SkAlphaType && |
| 47 dst.alphaType() == kPremul_SkAlphaType) { | 47 dst.alphaType() == kPremul_SkAlphaType) { |
| 48 const SkImageInfo& tmp = src.makeAlphaType(kPremul_SkAlphaType); | 48 const SkImageInfo& tmp = src.makeAlphaType(kPremul_SkAlphaType); |
| 49 return tmp == dst; | 49 return tmp == dst; |
| 50 } | 50 } |
| 51 | 51 |
| 52 return false; | 52 return false; |
| 53 } | 53 } |
| 54 | 54 |
| 55 // Creates a SkPixelRef such that the memory for pixels is given by an external
body. | 55 // Creates a SkPixelRef such that the memory for pixels is given by an external |
| 56 // This is used to write directly to the memory given by Skia during decoding. | 56 // body. This is used to write directly to the memory given by Skia during |
| 57 // decoding. |
| 57 class ExternalMemoryAllocator final : public SkBitmap::Allocator { | 58 class ExternalMemoryAllocator final : public SkBitmap::Allocator { |
| 58 USING_FAST_MALLOC(ExternalMemoryAllocator); | 59 USING_FAST_MALLOC(ExternalMemoryAllocator); |
| 59 WTF_MAKE_NONCOPYABLE(ExternalMemoryAllocator); | 60 WTF_MAKE_NONCOPYABLE(ExternalMemoryAllocator); |
| 60 | 61 |
| 61 public: | 62 public: |
| 62 ExternalMemoryAllocator(const SkImageInfo& info, | 63 ExternalMemoryAllocator(const SkImageInfo& info, |
| 63 void* pixels, | 64 void* pixels, |
| 64 size_t rowBytes) | 65 size_t rowBytes) |
| 65 : m_info(info), m_pixels(pixels), m_rowBytes(rowBytes) {} | 66 : m_info(info), m_pixels(pixels), m_rowBytes(rowBytes) {} |
| 66 | 67 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 if (bitmap.getPixels() != pixels) | 151 if (bitmap.getPixels() != pixels) |
| 151 return bitmap.copyPixelsTo(pixels, rowBytes * info.height(), rowBytes); | 152 return bitmap.copyPixelsTo(pixels, rowBytes * info.height(), rowBytes); |
| 152 return true; | 153 return true; |
| 153 } | 154 } |
| 154 | 155 |
| 155 bool ImageFrameGenerator::decodeToYUV(SegmentReader* data, | 156 bool ImageFrameGenerator::decodeToYUV(SegmentReader* data, |
| 156 size_t index, | 157 size_t index, |
| 157 const SkISize componentSizes[3], | 158 const SkISize componentSizes[3], |
| 158 void* planes[3], | 159 void* planes[3], |
| 159 const size_t rowBytes[3]) { | 160 const size_t rowBytes[3]) { |
| 160 // TODO (scroggo): The only interesting thing this uses from the ImageFrameGen
erator is m_decodeFailed. | 161 // TODO (scroggo): The only interesting thing this uses from the |
| 161 // Move this into DecodingImageGenerator, which is the only class that calls i
t. | 162 // ImageFrameGenerator is m_decodeFailed. Move this into |
| 163 // DecodingImageGenerator, which is the only class that calls it. |
| 162 if (m_decodeFailed) | 164 if (m_decodeFailed) |
| 163 return false; | 165 return false; |
| 164 | 166 |
| 165 TRACE_EVENT1("blink", "ImageFrameGenerator::decodeToYUV", "frame index", | 167 TRACE_EVENT1("blink", "ImageFrameGenerator::decodeToYUV", "frame index", |
| 166 static_cast<int>(index)); | 168 static_cast<int>(index)); |
| 167 | 169 |
| 168 if (!planes || !planes[0] || !planes[1] || !planes[2] || !rowBytes || | 170 if (!planes || !planes[0] || !planes[1] || !planes[2] || !rowBytes || |
| 169 !rowBytes[0] || !rowBytes[1] || !rowBytes[2]) { | 171 !rowBytes[0] || !rowBytes[1] || !rowBytes[2]) { |
| 170 return false; | 172 return false; |
| 171 } | 173 } |
| 172 | 174 |
| 173 std::unique_ptr<ImageDecoder> decoder = | 175 std::unique_ptr<ImageDecoder> decoder = |
| 174 ImageDecoder::create(data, true, ImageDecoder::AlphaPremultiplied, | 176 ImageDecoder::create(data, true, ImageDecoder::AlphaPremultiplied, |
| 175 ImageDecoder::GammaAndColorProfileApplied); | 177 ImageDecoder::GammaAndColorProfileApplied); |
| 176 // getYUVComponentSizes was already called and was successful, so ImageDecoder
::create must succeed. | 178 // getYUVComponentSizes was already called and was successful, so |
| 179 // ImageDecoder::create must succeed. |
| 177 ASSERT(decoder); | 180 ASSERT(decoder); |
| 178 | 181 |
| 179 std::unique_ptr<ImagePlanes> imagePlanes = | 182 std::unique_ptr<ImagePlanes> imagePlanes = |
| 180 wrapUnique(new ImagePlanes(planes, rowBytes)); | 183 wrapUnique(new ImagePlanes(planes, rowBytes)); |
| 181 decoder->setImagePlanes(std::move(imagePlanes)); | 184 decoder->setImagePlanes(std::move(imagePlanes)); |
| 182 | 185 |
| 183 ASSERT(decoder->canDecodeToYUV()); | 186 ASSERT(decoder->canDecodeToYUV()); |
| 184 | 187 |
| 185 if (decoder->decodeToYUV()) { | 188 if (decoder->decodeToYUV()) { |
| 186 setHasAlpha(0, false); // YUV is always opaque | 189 setHasAlpha(0, false); // YUV is always opaque |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 | 363 |
| 361 if (m_yuvDecodingFailed) | 364 if (m_yuvDecodingFailed) |
| 362 return false; | 365 return false; |
| 363 | 366 |
| 364 std::unique_ptr<ImageDecoder> decoder = | 367 std::unique_ptr<ImageDecoder> decoder = |
| 365 ImageDecoder::create(data, true, ImageDecoder::AlphaPremultiplied, | 368 ImageDecoder::create(data, true, ImageDecoder::AlphaPremultiplied, |
| 366 ImageDecoder::GammaAndColorProfileApplied); | 369 ImageDecoder::GammaAndColorProfileApplied); |
| 367 if (!decoder) | 370 if (!decoder) |
| 368 return false; | 371 return false; |
| 369 | 372 |
| 370 // Setting a dummy ImagePlanes object signals to the decoder that we want to d
o YUV decoding. | 373 // Setting a dummy ImagePlanes object signals to the decoder that we want to |
| 374 // do YUV decoding. |
| 371 std::unique_ptr<ImagePlanes> dummyImagePlanes = wrapUnique(new ImagePlanes); | 375 std::unique_ptr<ImagePlanes> dummyImagePlanes = wrapUnique(new ImagePlanes); |
| 372 decoder->setImagePlanes(std::move(dummyImagePlanes)); | 376 decoder->setImagePlanes(std::move(dummyImagePlanes)); |
| 373 | 377 |
| 374 return updateYUVComponentSizes(decoder.get(), sizeInfo->fSizes, | 378 return updateYUVComponentSizes(decoder.get(), sizeInfo->fSizes, |
| 375 sizeInfo->fWidthBytes); | 379 sizeInfo->fWidthBytes); |
| 376 } | 380 } |
| 377 | 381 |
| 378 } // namespace blink | 382 } // namespace blink |
| OLD | NEW |