OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 18 matching lines...) Expand all Loading... |
29 */ | 29 */ |
30 | 30 |
31 #include "platform/image-decoders/jpeg/JPEGImageDecoder.h" | 31 #include "platform/image-decoders/jpeg/JPEGImageDecoder.h" |
32 | 32 |
33 #include "platform/SharedBuffer.h" | 33 #include "platform/SharedBuffer.h" |
34 #include "platform/image-decoders/ImageAnimation.h" | 34 #include "platform/image-decoders/ImageAnimation.h" |
35 #include "platform/image-decoders/ImageDecoderTestHelpers.h" | 35 #include "platform/image-decoders/ImageDecoderTestHelpers.h" |
36 #include "public/platform/WebData.h" | 36 #include "public/platform/WebData.h" |
37 #include "public/platform/WebSize.h" | 37 #include "public/platform/WebSize.h" |
38 #include "testing/gtest/include/gtest/gtest.h" | 38 #include "testing/gtest/include/gtest/gtest.h" |
39 #include "wtf/PtrUtil.h" | 39 #include "wtf/OwnPtr.h" |
| 40 #include "wtf/PassOwnPtr.h" |
40 #include "wtf/typed_arrays/ArrayBuffer.h" | 41 #include "wtf/typed_arrays/ArrayBuffer.h" |
41 #include <memory> | |
42 | 42 |
43 namespace blink { | 43 namespace blink { |
44 | 44 |
45 static const size_t LargeEnoughSize = 1000 * 1000; | 45 static const size_t LargeEnoughSize = 1000 * 1000; |
46 | 46 |
47 namespace { | 47 namespace { |
48 | 48 |
49 std::unique_ptr<ImageDecoder> createDecoder(size_t maxDecodedBytes) | 49 PassOwnPtr<ImageDecoder> createDecoder(size_t maxDecodedBytes) |
50 { | 50 { |
51 return wrapUnique(new JPEGImageDecoder(ImageDecoder::AlphaNotPremultiplied,
ImageDecoder::GammaAndColorProfileApplied, maxDecodedBytes)); | 51 return adoptPtr(new JPEGImageDecoder(ImageDecoder::AlphaNotPremultiplied, Im
ageDecoder::GammaAndColorProfileApplied, maxDecodedBytes)); |
52 } | 52 } |
53 | 53 |
54 std::unique_ptr<ImageDecoder> createDecoder() | 54 PassOwnPtr<ImageDecoder> createDecoder() |
55 { | 55 { |
56 return createDecoder(ImageDecoder::noDecodedImageByteLimit); | 56 return createDecoder(ImageDecoder::noDecodedImageByteLimit); |
57 } | 57 } |
58 | 58 |
59 } // anonymous namespace | 59 } // anonymous namespace |
60 | 60 |
61 void downsample(size_t maxDecodedBytes, unsigned* outputWidth, unsigned* outputH
eight, const char* imageFilePath) | 61 void downsample(size_t maxDecodedBytes, unsigned* outputWidth, unsigned* outputH
eight, const char* imageFilePath) |
62 { | 62 { |
63 RefPtr<SharedBuffer> data = readFile(imageFilePath); | 63 RefPtr<SharedBuffer> data = readFile(imageFilePath); |
64 ASSERT_TRUE(data); | 64 ASSERT_TRUE(data); |
65 | 65 |
66 std::unique_ptr<ImageDecoder> decoder = createDecoder(maxDecodedBytes); | 66 OwnPtr<ImageDecoder> decoder = createDecoder(maxDecodedBytes); |
67 decoder->setData(data.get(), true); | 67 decoder->setData(data.get(), true); |
68 | 68 |
69 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 69 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
70 ASSERT_TRUE(frame); | 70 ASSERT_TRUE(frame); |
71 *outputWidth = frame->bitmap().width(); | 71 *outputWidth = frame->bitmap().width(); |
72 *outputHeight = frame->bitmap().height(); | 72 *outputHeight = frame->bitmap().height(); |
73 EXPECT_EQ(IntSize(*outputWidth, *outputHeight), decoder->decodedSize()); | 73 EXPECT_EQ(IntSize(*outputWidth, *outputHeight), decoder->decodedSize()); |
74 } | 74 } |
75 | 75 |
76 void readYUV(size_t maxDecodedBytes, unsigned* outputYWidth, unsigned* outputYHe
ight, unsigned* outputUVWidth, unsigned* outputUVHeight, const char* imageFilePa
th) | 76 void readYUV(size_t maxDecodedBytes, unsigned* outputYWidth, unsigned* outputYHe
ight, unsigned* outputUVWidth, unsigned* outputUVHeight, const char* imageFilePa
th) |
77 { | 77 { |
78 RefPtr<SharedBuffer> data = readFile(imageFilePath); | 78 RefPtr<SharedBuffer> data = readFile(imageFilePath); |
79 ASSERT_TRUE(data); | 79 ASSERT_TRUE(data); |
80 | 80 |
81 std::unique_ptr<ImageDecoder> decoder = createDecoder(maxDecodedBytes); | 81 OwnPtr<ImageDecoder> decoder = createDecoder(maxDecodedBytes); |
82 decoder->setData(data.get(), true); | 82 decoder->setData(data.get(), true); |
83 | 83 |
84 // Setting a dummy ImagePlanes object signals to the decoder that we want to
do YUV decoding. | 84 // Setting a dummy ImagePlanes object signals to the decoder that we want to
do YUV decoding. |
85 std::unique_ptr<ImagePlanes> dummyImagePlanes = wrapUnique(new ImagePlanes()
); | 85 OwnPtr<ImagePlanes> dummyImagePlanes = adoptPtr(new ImagePlanes()); |
86 decoder->setImagePlanes(std::move(dummyImagePlanes)); | 86 decoder->setImagePlanes(std::move(dummyImagePlanes)); |
87 | 87 |
88 bool sizeIsAvailable = decoder->isSizeAvailable(); | 88 bool sizeIsAvailable = decoder->isSizeAvailable(); |
89 ASSERT_TRUE(sizeIsAvailable); | 89 ASSERT_TRUE(sizeIsAvailable); |
90 | 90 |
91 IntSize size = decoder->decodedSize(); | 91 IntSize size = decoder->decodedSize(); |
92 IntSize ySize = decoder->decodedYUVSize(0); | 92 IntSize ySize = decoder->decodedYUVSize(0); |
93 IntSize uSize = decoder->decodedYUVSize(1); | 93 IntSize uSize = decoder->decodedYUVSize(1); |
94 IntSize vSize = decoder->decodedYUVSize(2); | 94 IntSize vSize = decoder->decodedYUVSize(2); |
95 | 95 |
(...skipping 11 matching lines...) Expand all Loading... |
107 rowBytes[0] = decoder->decodedYUVWidthBytes(0); | 107 rowBytes[0] = decoder->decodedYUVWidthBytes(0); |
108 rowBytes[1] = decoder->decodedYUVWidthBytes(1); | 108 rowBytes[1] = decoder->decodedYUVWidthBytes(1); |
109 rowBytes[2] = decoder->decodedYUVWidthBytes(2); | 109 rowBytes[2] = decoder->decodedYUVWidthBytes(2); |
110 | 110 |
111 RefPtr<ArrayBuffer> buffer(ArrayBuffer::create(rowBytes[0] * ySize.height()
+ rowBytes[1] * uSize.height() + rowBytes[2] * vSize.height(), 1)); | 111 RefPtr<ArrayBuffer> buffer(ArrayBuffer::create(rowBytes[0] * ySize.height()
+ rowBytes[1] * uSize.height() + rowBytes[2] * vSize.height(), 1)); |
112 void* planes[3]; | 112 void* planes[3]; |
113 planes[0] = buffer->data(); | 113 planes[0] = buffer->data(); |
114 planes[1] = ((char*) planes[0]) + rowBytes[0] * ySize.height(); | 114 planes[1] = ((char*) planes[0]) + rowBytes[0] * ySize.height(); |
115 planes[2] = ((char*) planes[1]) + rowBytes[1] * uSize.height(); | 115 planes[2] = ((char*) planes[1]) + rowBytes[1] * uSize.height(); |
116 | 116 |
117 std::unique_ptr<ImagePlanes> imagePlanes = wrapUnique(new ImagePlanes(planes
, rowBytes)); | 117 OwnPtr<ImagePlanes> imagePlanes = adoptPtr(new ImagePlanes(planes, rowBytes)
); |
118 decoder->setImagePlanes(std::move(imagePlanes)); | 118 decoder->setImagePlanes(std::move(imagePlanes)); |
119 | 119 |
120 ASSERT_TRUE(decoder->decodeToYUV()); | 120 ASSERT_TRUE(decoder->decodeToYUV()); |
121 } | 121 } |
122 | 122 |
123 // Tests failure on a too big image. | 123 // Tests failure on a too big image. |
124 TEST(JPEGImageDecoderTest, tooBig) | 124 TEST(JPEGImageDecoderTest, tooBig) |
125 { | 125 { |
126 std::unique_ptr<ImageDecoder> decoder = createDecoder(100); | 126 OwnPtr<ImageDecoder> decoder = createDecoder(100); |
127 EXPECT_FALSE(decoder->setSize(10000, 10000)); | 127 EXPECT_FALSE(decoder->setSize(10000, 10000)); |
128 EXPECT_TRUE(decoder->failed()); | 128 EXPECT_TRUE(decoder->failed()); |
129 } | 129 } |
130 | 130 |
131 // Tests that JPEG decoder can downsample image whose width and height are multi
ple of 8, | 131 // Tests that JPEG decoder can downsample image whose width and height are multi
ple of 8, |
132 // to ensure we compute the correct decodedSize and pass correct parameters to l
ibjpeg to | 132 // to ensure we compute the correct decodedSize and pass correct parameters to l
ibjpeg to |
133 // output image with the expected size. | 133 // output image with the expected size. |
134 TEST(JPEGImageDecoderTest, downsampleImageSizeMultipleOf8) | 134 TEST(JPEGImageDecoderTest, downsampleImageSizeMultipleOf8) |
135 { | 135 { |
136 const char* jpegFile = "/LayoutTests/fast/images/resources/lenna.jpg"; // 25
6x256 | 136 const char* jpegFile = "/LayoutTests/fast/images/resources/lenna.jpg"; // 25
6x256 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 EXPECT_EQ(439u, outputYWidth); | 240 EXPECT_EQ(439u, outputYWidth); |
241 EXPECT_EQ(154u, outputYHeight); | 241 EXPECT_EQ(154u, outputYHeight); |
242 EXPECT_EQ(220u, outputUVWidth); | 242 EXPECT_EQ(220u, outputUVWidth); |
243 EXPECT_EQ(77u, outputUVHeight); | 243 EXPECT_EQ(77u, outputUVHeight); |
244 | 244 |
245 // Make sure we revert to RGBA decoding when we're about to downscale, | 245 // Make sure we revert to RGBA decoding when we're about to downscale, |
246 // which can occur on memory-constrained android devices. | 246 // which can occur on memory-constrained android devices. |
247 RefPtr<SharedBuffer> data = readFile(jpegFile); | 247 RefPtr<SharedBuffer> data = readFile(jpegFile); |
248 ASSERT_TRUE(data); | 248 ASSERT_TRUE(data); |
249 | 249 |
250 std::unique_ptr<ImageDecoder> decoder = createDecoder(230 * 230 * 4); | 250 OwnPtr<ImageDecoder> decoder = createDecoder(230 * 230 * 4); |
251 decoder->setData(data.get(), true); | 251 decoder->setData(data.get(), true); |
252 | 252 |
253 std::unique_ptr<ImagePlanes> imagePlanes = wrapUnique(new ImagePlanes()); | 253 OwnPtr<ImagePlanes> imagePlanes = adoptPtr(new ImagePlanes()); |
254 decoder->setImagePlanes(std::move(imagePlanes)); | 254 decoder->setImagePlanes(std::move(imagePlanes)); |
255 ASSERT_TRUE(decoder->isSizeAvailable()); | 255 ASSERT_TRUE(decoder->isSizeAvailable()); |
256 ASSERT_FALSE(decoder->canDecodeToYUV()); | 256 ASSERT_FALSE(decoder->canDecodeToYUV()); |
257 } | 257 } |
258 | 258 |
259 TEST(JPEGImageDecoderTest, byteByByteBaselineJPEGWithColorProfileAndRestartMarke
rs) | 259 TEST(JPEGImageDecoderTest, byteByByteBaselineJPEGWithColorProfileAndRestartMarke
rs) |
260 { | 260 { |
261 testByteByByteDecode(&createDecoder, "/LayoutTests/fast/images/resources/sma
ll-square-with-colorspin-profile.jpg", 1u, cAnimationNone); | 261 testByteByByteDecode(&createDecoder, "/LayoutTests/fast/images/resources/sma
ll-square-with-colorspin-profile.jpg", 1u, cAnimationNone); |
262 } | 262 } |
263 | 263 |
(...skipping 11 matching lines...) Expand all Loading... |
275 // not break JPEG decoding at a critical point: in between a call to decode the | 275 // not break JPEG decoding at a critical point: in between a call to decode the |
276 // size (when JPEGImageDecoder stops while it may still have input data to | 276 // size (when JPEGImageDecoder stops while it may still have input data to |
277 // read) and a call to do a full decode. | 277 // read) and a call to do a full decode. |
278 TEST(JPEGImageDecoderTest, mergeBuffer) | 278 TEST(JPEGImageDecoderTest, mergeBuffer) |
279 { | 279 { |
280 const char* jpegFile = "/LayoutTests/fast/images/resources/lenna.jpg"; | 280 const char* jpegFile = "/LayoutTests/fast/images/resources/lenna.jpg"; |
281 testMergeBuffer(&createDecoder, jpegFile); | 281 testMergeBuffer(&createDecoder, jpegFile); |
282 } | 282 } |
283 | 283 |
284 } // namespace blink | 284 } // namespace blink |
OLD | NEW |