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

Unified Diff: third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp

Issue 1812273003: Eliminate copies of encoded image data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix a leak; remove unnecessary comments 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
index 64d6223d6af84d4c2aaed13b95cd5ae9f5164a10..963362f54c8fdb8261331a6c7cd3101d49818256 100644
--- a/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
+++ b/third_party/WebKit/Source/platform/graphics/DecodingImageGenerator.cpp
@@ -29,14 +29,18 @@
#include "platform/SharedBuffer.h"
#include "platform/TraceEvent.h"
#include "platform/graphics/ImageFrameGenerator.h"
+#include "platform/image-decoders/DataSegmentReader.h"
#include "platform/image-decoders/ImageDecoder.h"
#include "third_party/skia/include/core/SkData.h"
+#include "third_party/skia/src/core/SkRWBuffer.h"
namespace blink {
-DecodingImageGenerator::DecodingImageGenerator(PassRefPtr<ImageFrameGenerator> frameGenerator, const SkImageInfo& info, size_t index)
+DecodingImageGenerator::DecodingImageGenerator(PassRefPtr<ImageFrameGenerator> frameGenerator, const SkImageInfo& info, PassRefPtr<SegmentReader> data, bool allDataReceived, size_t index)
: SkImageGenerator(info)
, m_frameGenerator(frameGenerator)
+ , m_data(data)
+ , m_allDataReceived(allDataReceived)
, m_frameIndex(index)
, m_generationId(0)
, m_canYUVDecode(false)
@@ -51,7 +55,10 @@ SkData* DecodingImageGenerator::onRefEncodedData()
{
TRACE_EVENT0("blink", "DecodingImageGenerator::refEncodedData");
- return m_frameGenerator->refEncodedData();
+ if (!m_allDataReceived)
+ return nullptr;
+
+ return m_data->getAsSkData().leakRef();
}
bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor table[], int* tableCount)
@@ -69,7 +76,7 @@ bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels,
}
PlatformInstrumentation::willDecodeLazyPixelRef(m_generationId);
- bool decoded = m_frameGenerator->decodeAndScale(m_frameIndex, getInfo(), pixels, rowBytes);
+ bool decoded = m_frameGenerator->decodeAndScale(m_data.get(), m_allDataReceived, m_frameIndex, getInfo(), pixels, rowBytes);
PlatformInstrumentation::didDecodeLazyPixelRef();
return decoded;
@@ -77,7 +84,7 @@ bool DecodingImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels,
bool DecodingImageGenerator::onGetYUV8Planes(SkISize sizes[3], void* planes[3], size_t rowBytes[3], SkYUVColorSpace* colorSpace)
{
- if (!m_canYUVDecode)
+ if (!m_canYUVDecode || !m_allDataReceived)
return false;
bool requestingYUVSizes = !planes || !planes[0];
@@ -85,13 +92,13 @@ bool DecodingImageGenerator::onGetYUV8Planes(SkISize sizes[3], void* planes[3],
TRACE_EVENT1("blink", "DecodingImageGenerator::getYUV8Planes", requestingYUVSizes ? "sizes" : "frame index", static_cast<int>(m_frameIndex));
if (requestingYUVSizes)
- return m_frameGenerator->getYUVComponentSizes(sizes);
+ return m_frameGenerator->getYUVComponentSizes(m_data.get(), sizes);
if (colorSpace)
*colorSpace = kJPEG_SkYUVColorSpace;
PlatformInstrumentation::willDecodeLazyPixelRef(m_generationId);
- bool decoded = m_frameGenerator->decodeToYUV(m_frameIndex, sizes, planes, rowBytes);
+ bool decoded = m_frameGenerator->decodeToYUV(m_data.get(), m_frameIndex, sizes, planes, rowBytes);
PlatformInstrumentation::didDecodeLazyPixelRef();
return decoded;
@@ -99,26 +106,26 @@ bool DecodingImageGenerator::onGetYUV8Planes(SkISize sizes[3], void* planes[3],
SkImageGenerator* DecodingImageGenerator::create(SkData* data)
{
- RefPtr<SharedBuffer> buffer = SharedBuffer::create(data->bytes(), data->size());
-
// We just need the size of the image, so we have to temporarily create an ImageDecoder. Since
// we only need the size, it doesn't really matter about premul or not, or gamma settings.
- OwnPtr<ImageDecoder> decoder = ImageDecoder::create(*buffer.get(), ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
+ OwnPtr<ImageDecoder> decoder = ImageDecoder::create(static_cast<const char*>(data->data()), data->size(),
+ ImageDecoder::AlphaPremultiplied, ImageDecoder::GammaAndColorProfileApplied);
if (!decoder)
return 0;
- decoder->setData(buffer.get(), true);
+ RefPtr<SegmentReader> segmentReader = adoptRef(new DataSegmentReader(data));
+ decoder->setData(segmentReader.get(), true);
if (!decoder->isSizeAvailable())
return 0;
const IntSize size = decoder->size();
const SkImageInfo info = SkImageInfo::MakeN32Premul(size.width(), size.height());
- RefPtr<ImageFrameGenerator> frame = ImageFrameGenerator::create(SkISize::Make(size.width(), size.height()), buffer, true, false);
+ RefPtr<ImageFrameGenerator> frame = ImageFrameGenerator::create(SkISize::Make(size.width(), size.height()), false);
if (!frame)
return 0;
- return new DecodingImageGenerator(frame, info, 0);
+ return new DecodingImageGenerator(frame, info, segmentReader.release(), true, 0);
}
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698