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

Side by Side Diff: third_party/WebKit/Source/platform/image-decoders/ImageDecoderTestHelpers.cpp

Issue 1812273003: Eliminate copies of encoded image data (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "platform/image-decoders/ImageDecoderTestHelpers.h" 5 #include "platform/image-decoders/ImageDecoderTestHelpers.h"
6 6
7 #include "platform/SharedBuffer.h" 7 #include "platform/SharedBuffer.h"
8 #include "platform/image-decoders/ImageDecoder.h" 8 #include "platform/image-decoders/ImageDecoder.h"
9 #include "platform/image-decoders/ImageFrame.h" 9 #include "platform/image-decoders/ImageFrame.h"
10 #include "platform/image-decoders/SharedBufferSegmentReader.h"
10 #include "platform/testing/UnitTestHelpers.h" 11 #include "platform/testing/UnitTestHelpers.h"
11 #include "public/platform/Platform.h" 12 #include "public/platform/Platform.h"
12 #include "public/platform/WebUnitTestSupport.h" 13 #include "public/platform/WebUnitTestSupport.h"
13 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
14 #include "wtf/OwnPtr.h" 15 #include "wtf/OwnPtr.h"
15 #include "wtf/StringHasher.h" 16 #include "wtf/StringHasher.h"
16 17
17 namespace blink { 18 namespace blink {
18 19
19 PassRefPtr<SharedBuffer> readFile(const char* fileName) 20 PassRefPtr<SharedBuffer> readFile(const char* fileName)
(...skipping 15 matching lines...) Expand all
35 } 36 }
36 37
37 unsigned hashBitmap(const SkBitmap& bitmap) 38 unsigned hashBitmap(const SkBitmap& bitmap)
38 { 39 {
39 return StringHasher::hashMemory(bitmap.getPixels(), bitmap.getSize()); 40 return StringHasher::hashMemory(bitmap.getPixels(), bitmap.getSize());
40 } 41 }
41 42
42 static unsigned createDecodingBaseline(DecoderCreator createDecoder, SharedBuffe r* data) 43 static unsigned createDecodingBaseline(DecoderCreator createDecoder, SharedBuffe r* data)
43 { 44 {
44 OwnPtr<ImageDecoder> decoder = createDecoder(); 45 OwnPtr<ImageDecoder> decoder = createDecoder();
45 decoder->setData(data, true); 46 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
47 decoder->setData(segmentReader.get(), true);
f(malita) 2016/03/23 16:41:58 If we update setData to take a PassRefPtr, this sh
46 ImageFrame* frame = decoder->frameBufferAtIndex(0); 48 ImageFrame* frame = decoder->frameBufferAtIndex(0);
47 return hashBitmap(frame->bitmap()); 49 return hashBitmap(frame->bitmap());
48 } 50 }
49 51
50 void createDecodingBaseline(DecoderCreator createDecoder, SharedBuffer* data, Ve ctor<unsigned>* baselineHashes) 52 void createDecodingBaseline(DecoderCreator createDecoder, SharedBuffer* data, Ve ctor<unsigned>* baselineHashes)
51 { 53 {
52 OwnPtr<ImageDecoder> decoder = createDecoder(); 54 OwnPtr<ImageDecoder> decoder = createDecoder();
53 decoder->setData(data, true); 55 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
56 decoder->setData(segmentReader.get(), true);
f(malita) 2016/03/23 16:41:58 ditto
54 size_t frameCount = decoder->frameCount(); 57 size_t frameCount = decoder->frameCount();
55 for (size_t i = 0; i < frameCount; ++i) { 58 for (size_t i = 0; i < frameCount; ++i) {
56 ImageFrame* frame = decoder->frameBufferAtIndex(i); 59 ImageFrame* frame = decoder->frameBufferAtIndex(i);
57 baselineHashes->append(hashBitmap(frame->getSkBitmap())); 60 baselineHashes->append(hashBitmap(frame->getSkBitmap()));
58 } 61 }
59 } 62 }
60 63
61 void testByteByByteDecode(DecoderCreator createDecoder, const char* file, size_t expectedFrameCount, int expectedRepetitionCount) 64 void testByteByByteDecode(DecoderCreator createDecoder, const char* file, size_t expectedFrameCount, int expectedRepetitionCount)
62 { 65 {
63 RefPtr<SharedBuffer> data = readFile(file); 66 RefPtr<SharedBuffer> data = readFile(file);
64 ASSERT_TRUE(data.get()); 67 ASSERT_TRUE(data.get());
65 ASSERT_TRUE(data->data()); 68 ASSERT_TRUE(data->data());
66 69
67 Vector<unsigned> baselineHashes; 70 Vector<unsigned> baselineHashes;
68 createDecodingBaseline(createDecoder, data.get(), &baselineHashes); 71 createDecodingBaseline(createDecoder, data.get(), &baselineHashes);
69 72
70 OwnPtr<ImageDecoder> decoder = createDecoder(); 73 OwnPtr<ImageDecoder> decoder = createDecoder();
71 74
72 size_t frameCount = 0; 75 size_t frameCount = 0;
73 size_t framesDecoded = 0; 76 size_t framesDecoded = 0;
74 77
75 // Pass data to decoder byte by byte. 78 // Pass data to decoder byte by byte.
76 RefPtr<SharedBuffer> sourceData[2] = { SharedBuffer::create(), SharedBuffer: :create() }; 79 RefPtr<SharedBuffer> sourceData[2] = { SharedBuffer::create(), SharedBuffer: :create() };
80 RefPtr<SharedBufferSegmentReader> segmentReader[2] = { adoptRef(new SharedBu fferSegmentReader(sourceData[0])), adoptRef(new SharedBufferSegmentReader(source Data[1])) };
77 const char* source = data->data(); 81 const char* source = data->data();
78 82
79 for (size_t length = 1; length <= data->size() && !decoder->failed(); ++leng th) { 83 for (size_t length = 1; length <= data->size() && !decoder->failed(); ++leng th) {
80 sourceData[0]->append(source, 1); 84 sourceData[0]->append(source, 1);
81 sourceData[1]->append(source++, 1); 85 sourceData[1]->append(source++, 1);
82 // Alternate the buffers to cover the JPEGImageDecoder::onSetData restar t code. 86 // Alternate the buffers to cover the JPEGImageDecoder::onSetData restar t code.
83 decoder->setData(sourceData[length & 1].get(), length == data->size()); 87 decoder->setData(segmentReader[length & 1].get(), length == data->size() );
84 88
85 EXPECT_LE(frameCount, decoder->frameCount()); 89 EXPECT_LE(frameCount, decoder->frameCount());
86 frameCount = decoder->frameCount(); 90 frameCount = decoder->frameCount();
87 91
88 if (!decoder->isSizeAvailable()) 92 if (!decoder->isSizeAvailable())
89 continue; 93 continue;
90 94
91 ImageFrame* frame = decoder->frameBufferAtIndex(frameCount - 1); 95 ImageFrame* frame = decoder->frameBufferAtIndex(frameCount - 1);
92 if (frame && frame->status() == ImageFrame::FrameComplete && framesDecod ed < frameCount) 96 if (frame && frame->status() == ImageFrame::FrameComplete && framesDecod ed < frameCount)
93 ++framesDecoded; 97 ++framesDecoded;
(...skipping 24 matching lines...) Expand all
118 122
119 // In order to do any verification, this test needs to move the data owned 123 // In order to do any verification, this test needs to move the data owned
120 // by the SharedBuffer. A way to guarantee that is to create a new one, and 124 // by the SharedBuffer. A way to guarantee that is to create a new one, and
121 // then append a string of characters greater than kSegmentSize. This 125 // then append a string of characters greater than kSegmentSize. This
122 // results in writing the data into a segment, skipping the internal 126 // results in writing the data into a segment, skipping the internal
123 // contiguous buffer. 127 // contiguous buffer.
124 RefPtr<SharedBuffer> segmentedData = SharedBuffer::create(); 128 RefPtr<SharedBuffer> segmentedData = SharedBuffer::create();
125 segmentedData->append(data->data(), data->size()); 129 segmentedData->append(data->data(), data->size());
126 130
127 OwnPtr<ImageDecoder> decoder = createDecoder(); 131 OwnPtr<ImageDecoder> decoder = createDecoder();
128 decoder->setData(segmentedData.get(), true); 132 RefPtr<SharedBufferSegmentReader> segmentReader = adoptRef(new SharedBufferS egmentReader(data));
133 decoder->setData(segmentReader.get(), true);
129 134
130 ASSERT_TRUE(decoder->isSizeAvailable()); 135 ASSERT_TRUE(decoder->isSizeAvailable());
131 136
132 // This will call SharedBuffer::mergeSegmentsIntoBuffer, copying all 137 // This will call SharedBuffer::mergeSegmentsIntoBuffer, copying all
133 // segments into the contiguous buffer. If the ImageDecoder was pointing to 138 // segments into the contiguous buffer. If the ImageDecoder was pointing to
134 // data in a segment, its pointer would no longer be valid. 139 // data in a segment, its pointer would no longer be valid.
135 segmentedData->data(); 140 segmentedData->data();
136 141
137 ImageFrame* frame = decoder->frameBufferAtIndex(0); 142 ImageFrame* frame = decoder->frameBufferAtIndex(0);
138 ASSERT_FALSE(decoder->failed()); 143 ASSERT_FALSE(decoder->failed());
139 EXPECT_EQ(frame->status(), ImageFrame::FrameComplete); 144 EXPECT_EQ(frame->status(), ImageFrame::FrameComplete);
140 EXPECT_EQ(hashBitmap(frame->bitmap()), hash); 145 EXPECT_EQ(hashBitmap(frame->bitmap()), hash);
141 } 146 }
142 147
143 } // namespace blink 148 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698