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

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

Issue 1812273003: Eliminate copies of encoded image data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Small cleanups; remove unneeded changes 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/ImageFrameGeneratorTest.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
index 9edaf3875ec4dc49a7947909763d15d5cf0d0bfb..d36ffdaaf88f166e6d2522d258493c0f2f9cf183 100644
--- a/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/ImageFrameGeneratorTest.cpp
@@ -30,6 +30,7 @@
#include "platform/ThreadSafeFunctional.h"
#include "platform/graphics/ImageDecodingStore.h"
#include "platform/graphics/test/MockImageDecoder.h"
+#include "platform/image-decoders/SharedBufferSegmentReader.h"
#include "public/platform/Platform.h"
#include "public/platform/WebThread.h"
#include "public/platform/WebTraceLocation.h"
@@ -54,8 +55,9 @@ public:
void SetUp() override
{
ImageDecodingStore::instance().setCacheLimitInBytes(1024 * 1024);
+ m_generator = ImageFrameGenerator::create(fullSize(), false);
m_data = SharedBuffer::create();
- m_generator = ImageFrameGenerator::create(fullSize(), m_data, false);
+ m_segmentReader = adoptRef(new SharedBufferSegmentReader(m_data));
useMockImageDecoderFactory();
m_decodersDestroyed = 0;
m_decodeRequestCount = 0;
@@ -95,10 +97,9 @@ protected:
m_generator->setImageDecoderFactory(MockImageDecoderFactory::create(this, fullSize()));
}
- void addNewData(bool allDataReceived = false)
+ void addNewData()
{
m_data->append("g", 1);
- m_generator->setData(m_data, allDataReceived);
}
void setFrameStatus(ImageFrame::Status status) { m_status = m_nextFrameStatus = status; }
@@ -108,12 +109,13 @@ protected:
m_frameCount = count;
if (count > 1) {
m_generator.clear();
- m_generator = ImageFrameGenerator::create(fullSize(), m_data, true, true);
+ m_generator = ImageFrameGenerator::create(fullSize(), true);
useMockImageDecoderFactory();
}
}
RefPtr<SharedBuffer> m_data;
+ RefPtr<SegmentReader> m_segmentReader;
RefPtr<ImageFrameGenerator> m_generator;
int m_decodersDestroyed;
int m_decodeRequestCount;
@@ -127,11 +129,11 @@ TEST_F(ImageFrameGeneratorTest, incompleteDecode)
setFrameStatus(ImageFrame::FramePartial);
char buffer[100 * 100 * 4];
- m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(1, m_decodeRequestCount);
addNewData();
- m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(2, m_decodeRequestCount);
EXPECT_EQ(0, m_decodersDestroyed);
}
@@ -141,35 +143,26 @@ TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesComplete)
setFrameStatus(ImageFrame::FramePartial);
char buffer[100 * 100 * 4];
- m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(1, m_decodeRequestCount);
EXPECT_EQ(0, m_decodersDestroyed);
setFrameStatus(ImageFrame::FrameComplete);
addNewData();
- m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(2, m_decodeRequestCount);
EXPECT_EQ(1, m_decodersDestroyed);
// Decoder created again.
- m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(3, m_decodeRequestCount);
}
-static void decodeThreadMain(ImageFrameGenerator* generator)
+static void decodeThreadMain(ImageFrameGenerator* generator, SegmentReader* segmentReader)
{
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();
+ generator->decodeAndScale(segmentReader, false, 0, imageInfo(), buffer, 100 * 4);
}
TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded)
@@ -177,52 +170,27 @@ TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded)
setFrameStatus(ImageFrame::FramePartial);
char buffer[100 * 100 * 4];
- m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), false, 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->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get()))));
+ thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get()), AllowCrossThreadAccess(m_segmentReader.get()))));
thread.clear();
EXPECT_EQ(2, m_decodeRequestCount);
EXPECT_EQ(1, m_decodersDestroyed);
// Decoder created again.
- m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), false, 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->taskRunner()->postTask(BLINK_FROM_HERE, new Task(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());
+ addNewData();
- // Delete generator, and SkData should have the only reference.
+ // Delete generator.
m_generator = nullptr;
- ASSERT_TRUE(data->unique());
- data->unref();
}
TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
@@ -230,7 +198,7 @@ TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
setFrameStatus(ImageFrame::FramePartial);
char buffer[100 * 100 * 4];
- m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
EXPECT_TRUE(m_generator->hasAlpha(0));
EXPECT_EQ(1, m_decodeRequestCount);
@@ -242,7 +210,7 @@ TEST_F(ImageFrameGeneratorTest, frameHasAlpha)
EXPECT_EQ(2, m_decodeRequestCount);
setFrameStatus(ImageFrame::FrameComplete);
- m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), false, 0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(3, m_decodeRequestCount);
EXPECT_FALSE(m_generator->hasAlpha(0));
}
@@ -253,20 +221,20 @@ TEST_F(ImageFrameGeneratorTest, removeMultiFrameDecoder)
setFrameStatus(ImageFrame::FrameComplete);
char buffer[100 * 100 * 4];
- m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), true, 0, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(1, m_decodeRequestCount);
EXPECT_EQ(0, m_decodersDestroyed);
setFrameStatus(ImageFrame::FrameComplete);
- m_generator->decodeAndScale(1, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), true, 1, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(2, m_decodeRequestCount);
EXPECT_EQ(0, m_decodersDestroyed);
setFrameStatus(ImageFrame::FrameComplete);
// Multi frame decoder should be removed.
- m_generator->decodeAndScale(2, imageInfo(), buffer, 100 * 4);
+ m_generator->decodeAndScale(m_segmentReader.get(), true, 2, imageInfo(), buffer, 100 * 4);
EXPECT_EQ(3, m_decodeRequestCount);
EXPECT_EQ(1, m_decodersDestroyed);
}

Powered by Google App Engine
This is Rietveld 408576698