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

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

Issue 1866243003: Revert of Eliminate copies of encoded image data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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/ImageFrameGeneratorTest.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
index 4b9d1b738a11b8854d9b389e9e0127a53c7899a6..aef5863c0a437377a4ace835bc339dcda54f06ad 100644
--- a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
@@ -29,7 +29,6 @@
#include "platform/ThreadSafeFunctional.h"
#include "platform/graphics/ImageDecodingStore.h"
#include "platform/graphics/test/MockImageDecoder.h"
-#include "platform/image-decoders/SegmentReader.h"
#include "public/platform/Platform.h"
#include "public/platform/WebTaskRunner.h"
#include "public/platform/WebThread.h"
@@ -55,9 +54,8 @@
void SetUp() override
{
ImageDecodingStore::instance().setCacheLimitInBytes(1024 * 1024);
- m_generator = ImageFrameGenerator::create(fullSize(), false);
m_data = SharedBuffer::create();
- m_segmentReader = SegmentReader::createFromSharedBuffer(m_data);
+ m_generator = ImageFrameGenerator::create(fullSize(), m_data, false);
useMockImageDecoderFactory();
m_decodersDestroyed = 0;
m_decodeRequestCount = 0;
@@ -103,9 +101,10 @@
m_generator->setImageDecoderFactory(MockImageDecoderFactory::create(this, fullSize()));
}
- void addNewData()
+ void addNewData(bool allDataReceived = false)
{
m_data->append("g", 1u);
+ m_generator->setData(m_data, allDataReceived);
}
void setFrameStatus(ImageFrame::Status status) { m_status = m_nextFrameStatus = status; }
@@ -115,13 +114,12 @@
m_frameCount = count;
if (count > 1) {
m_generator.clear();
- m_generator = ImageFrameGenerator::create(fullSize(), true);
+ m_generator = ImageFrameGenerator::create(fullSize(), m_data, true, true);
useMockImageDecoderFactory();
}
}
RefPtr<SharedBuffer> m_data;
- RefPtr<SegmentReader> m_segmentReader;
RefPtr<ImageFrameGenerator> m_generator;
int m_decodersDestroyed;
int m_decodeRequestCount;
@@ -136,11 +134,11 @@
setFrameStatus(ImageFrame::FramePartial);
char buffer[100 * 100 * 4];
- m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(1, m_decodeRequestCount);
addNewData();
- m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(2, m_decodeRequestCount);
EXPECT_EQ(0, m_decodersDestroyed);
}
@@ -150,26 +148,35 @@
setFrameStatus(ImageFrame::FramePartial);
char buffer[100 * 100 * 4];
- m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(1, m_decodeRequestCount);
EXPECT_EQ(0, m_decodersDestroyed);
setFrameStatus(ImageFrame::FrameComplete);
addNewData();
- m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(2, m_decodeRequestCount);
EXPECT_EQ(1, m_decodersDestroyed);
// Decoder created again.
- m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
- EXPECT_EQ(3, m_decodeRequestCount);
-}
-
-static void decodeThreadMain(ImageFrameGenerator* generator, SegmentReader* segmentReader)
-{
- char buffer[100 * 100 * 4];
- generator->decodeAndScale(segmentReader, false, 0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ EXPECT_EQ(3, m_decodeRequestCount);
+}
+
+static void decodeThreadMain(ImageFrameGenerator* generator)
+{
+ char buffer[100 * 100 * 4];
+ generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+}
+
+static void decodeThreadWithRefEncodedMain(ImageFrameGenerator* generator)
+{
+ // Image must be complete - refEncodedData otherwise returns null.
+ char buffer[100 * 100 * 4];
+ SkData* data = generator->refEncodedData();
+ generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ data->unref();
}
TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded)
@@ -177,27 +184,52 @@
setFrameStatus(ImageFrame::FramePartial);
char buffer[100 * 100 * 4];
- m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
- EXPECT_EQ(1, m_decodeRequestCount);
- EXPECT_EQ(0, m_decodersDestroyed);
+ m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ EXPECT_EQ(1, m_decodeRequestCount);
+ EXPECT_EQ(0, m_decodersDestroyed);
+ SkData* data = m_generator->refEncodedData();
+ EXPECT_EQ(nullptr, data);
// LocalFrame can now be decoded completely.
setFrameStatus(ImageFrame::FrameComplete);
addNewData();
+ // addNewData is calling m_generator->setData with allDataReceived == false, which means that
+ // refEncodedData should return null.
+ data = m_generator->refEncodedData();
+ EXPECT_EQ(nullptr, data);
OwnPtr<WebThread> thread = adoptPtr(Platform::current()->createThread("DecodeThread"));
- thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get()), AllowCrossThreadAccess(m_segmentReader.get())));
+ thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get())));
thread.clear();
EXPECT_EQ(2, m_decodeRequestCount);
EXPECT_EQ(1, m_decodersDestroyed);
// Decoder created again.
- m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
- EXPECT_EQ(3, m_decodeRequestCount);
-
- addNewData();
-
- // Delete generator.
+ m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ EXPECT_EQ(3, m_decodeRequestCount);
+
+ addNewData(true);
+ data = m_generator->refEncodedData();
+ ASSERT_TRUE(data);
+ // To prevent data writting, SkData::unique() should be false.
+ ASSERT_TRUE(!data->unique());
+
+ // Thread will also ref and unref the data.
+ thread = adoptPtr(Platform::current()->createThread("RefEncodedDataThread"));
+ thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(&decodeThreadWithRefEncodedMain, AllowCrossThreadAccess(m_generator.get())));
+ thread.clear();
+ EXPECT_EQ(4, m_decodeRequestCount);
+
+ data->unref();
+ // m_generator is holding the only reference to SkData now.
+ ASSERT_TRUE(data->unique());
+
+ data = m_generator->refEncodedData();
+ ASSERT_TRUE(data && !data->unique());
+
+ // Delete generator, and SkData should have the only reference.
m_generator = nullptr;
+ ASSERT_TRUE(data->unique());
+ data->unref();
}
TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
@@ -205,7 +237,7 @@
setFrameStatus(ImageFrame::FramePartial);
char buffer[100 * 100 * 4];
- m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
EXPECT_TRUE(m_generator->hasAlpha(0));
EXPECT_EQ(1, m_decodeRequestCount);
@@ -217,7 +249,7 @@
EXPECT_EQ(2, m_decodeRequestCount);
setFrameStatus(ImageFrame::FrameComplete);
- m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(3, m_decodeRequestCount);
EXPECT_FALSE(m_generator->hasAlpha(0));
}
@@ -228,14 +260,14 @@
setFrameStatus(ImageFrame::FrameComplete);
char buffer[100 * 100 * 4];
- m_generator->decodeAndScale(m_segmentReader.get(), true, 0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(1, m_decodeRequestCount);
EXPECT_EQ(0, m_decodersDestroyed);
EXPECT_EQ(0U, m_requestedClearExceptFrame);
setFrameStatus(ImageFrame::FrameComplete);
- m_generator->decodeAndScale(m_segmentReader.get(), true, 1, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(1, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(2, m_decodeRequestCount);
EXPECT_EQ(0, m_decodersDestroyed);
EXPECT_EQ(1U, m_requestedClearExceptFrame);
@@ -245,7 +277,7 @@
// Decoding the last frame of a multi-frame images should trigger clearing
// all the frame data, but not destroying the decoder. See comments in
// ImageFrameGenerator::tryToResumeDecode().
- m_generator->decodeAndScale(m_segmentReader.get(), true, 2, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(2, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(3, m_decodeRequestCount);
EXPECT_EQ(0, m_decodersDestroyed);
EXPECT_EQ(kNotFound, m_requestedClearExceptFrame);

Powered by Google App Engine
This is Rietveld 408576698