bool ImageFrameGenerator::getYUVComponentSizes(SkISize componentSizes[3]) { ASSERT(componentSizes); TRACE_EVENT2("webkit", "ImageFrameGenerator::getYUVComponentSizes", "width", m_fullSize.width(), "height", m_fullSize.height()); SharedBuffer* data = 0; bool allDataReceived = false; m_data.data(&data, &allDataReceived); // FIXME: YUV decoding does not currently support progressive decoding. if (!allDataReceived) return false; OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*data, ImageSource::AlphaPremultiplied, ImageSource::GammaAndColorProfileApplied); if (!decoder) return false; // JPEG images support YUV decoding: other decoders do not. So don't pump data into decoders // that always return false to updateYUVComponentSizes() requests. if (decoder->filenameExtension() != "jpg") return false; // Setting a dummy ImagePlanes object signals to the decoder that we want to do YUV decoding. decoder->setData(data, allDataReceived); OwnPtr<ImagePlanes> dummyImagePlanes = adoptPtr(new ImagePlanes); decoder->setImagePlanes(dummyImagePlanes.release()); return updateYUVComponentSizes(decoder.get(), componentSizes, ImageDecoder::SizeForMemoryAllocation); }
bool ImageFrameGenerator::getYUVComponentSizes(SkISize componentSizes[3]) { TRACE_EVENT2("blink", "ImageFrameGenerator::getYUVComponentSizes", "width", m_fullSize.width(), "height", m_fullSize.height()); if (m_yuvDecodingFailed) return false; SharedBuffer* data = 0; bool allDataReceived = false; m_data->data(&data, &allDataReceived); // FIXME: YUV decoding does not currently support progressive decoding. if (!allDataReceived) return false; OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*data, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied); if (!decoder) return false; // Setting a dummy ImagePlanes object signals to the decoder that we want to do YUV decoding. decoder->setData(data, allDataReceived); OwnPtr<ImagePlanes> dummyImagePlanes = adoptPtr(new ImagePlanes); decoder->setImagePlanes(dummyImagePlanes.release()); ASSERT(componentSizes); return updateYUVComponentSizes(decoder.get(), componentSizes, ImageDecoder::SizeForMemoryAllocation); }
bool ImageFrameGenerator::decodeToYUV(size_t index, SkISize componentSizes[3], void* planes[3], size_t rowBytes[3]) { // Prevent concurrent decode or scale operations on the same image data. MutexLocker lock(m_decodeMutex); if (m_decodeFailed) return false; TRACE_EVENT1("blink", "ImageFrameGenerator::decodeToYUV", "frame index", static_cast<int>(index)); if (!planes || !planes[0] || !planes[1] || !planes[2] || !rowBytes || !rowBytes[0] || !rowBytes[1] || !rowBytes[2]) { return false; } SharedBuffer* data = 0; bool allDataReceived = false; m_data->data(&data, &allDataReceived); // FIXME: YUV decoding does not currently support progressive decoding. ASSERT(allDataReceived); OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*data, ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied); if (!decoder) return false; decoder->setData(data, allDataReceived); OwnPtr<ImagePlanes> imagePlanes = adoptPtr(new ImagePlanes(planes, rowBytes)); decoder->setImagePlanes(imagePlanes.release()); bool sizeUpdated = updateYUVComponentSizes(decoder.get(), componentSizes, ImageDecoder::ActualSize); RELEASE_ASSERT(sizeUpdated); if (decoder->decodeToYUV()) { setHasAlpha(0, false); // YUV is always opaque return true; } ASSERT(decoder->failed()); m_yuvDecodingFailed = true; return false; }
bool ImageFrameGenerator::decodeToYUV(SkISize componentSizes[3], void* planes[3], size_t rowBytes[3]) { // This method is called to populate a discardable memory owned by Skia. // Prevents concurrent decode or scale operations on the same image data. MutexLocker lock(m_decodeMutex); if (m_decodeFailedAndEmpty) return false; TRACE_EVENT2("blink", "ImageFrameGenerator::decodeToYUV", "generator", this, "decodeCount", static_cast<int>(m_decodeCount)); if (!planes || !planes[0] || !planes[1] || !planes[2] || !rowBytes || !rowBytes[0] || !rowBytes[1] || !rowBytes[2]) { return false; } SharedBuffer* data = 0; bool allDataReceived = false; m_data.data(&data, &allDataReceived); // FIXME: YUV decoding does not currently support progressive decoding. ASSERT(allDataReceived); OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*data, ImageSource::AlphaPremultiplied, ImageSource::GammaAndColorProfileApplied); if (!decoder) return false; decoder->setData(data, allDataReceived); OwnPtr<ImagePlanes> imagePlanes = adoptPtr(new ImagePlanes(planes, rowBytes)); decoder->setImagePlanes(imagePlanes.release()); bool sizeUpdated = updateYUVComponentSizes(decoder.get(), componentSizes, ImageDecoder::ActualSize); RELEASE_ASSERT(sizeUpdated); bool yuvDecoded = decoder->decodeToYUV(); if (yuvDecoded) setHasAlpha(0, false); // YUV is always opaque return yuvDecoded; }