Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |