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 14 matching lines...) Expand all Loading... |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #include "platform/image-decoders/ImageDecoder.h" | 31 #include "platform/image-decoders/ImageDecoder.h" |
32 | 32 |
33 #include "platform/image-decoders/ImageFrame.h" | 33 #include "platform/image-decoders/ImageFrame.h" |
34 #include "testing/gtest/include/gtest/gtest.h" | 34 #include "testing/gtest/include/gtest/gtest.h" |
35 #include "wtf/OwnPtr.h" | 35 #include "wtf/PtrUtil.h" |
36 #include "wtf/PassOwnPtr.h" | |
37 #include "wtf/Vector.h" | 36 #include "wtf/Vector.h" |
| 37 #include <memory> |
38 | 38 |
39 namespace blink { | 39 namespace blink { |
40 | 40 |
41 class TestImageDecoder : public ImageDecoder { | 41 class TestImageDecoder : public ImageDecoder { |
42 public: | 42 public: |
43 TestImageDecoder() | 43 TestImageDecoder() |
44 : ImageDecoder(AlphaNotPremultiplied, GammaAndColorProfileApplied, noDec
odedImageByteLimit) | 44 : ImageDecoder(AlphaNotPremultiplied, GammaAndColorProfileApplied, noDec
odedImageByteLimit) |
45 { | 45 { |
46 } | 46 } |
47 | 47 |
(...skipping 18 matching lines...) Expand all Loading... |
66 m_frameBufferCache[i].setOriginalFrameRect(IntRect(0, 0, width, heig
ht)); | 66 m_frameBufferCache[i].setOriginalFrameRect(IntRect(0, 0, width, heig
ht)); |
67 } | 67 } |
68 | 68 |
69 private: | 69 private: |
70 void decodeSize() override { } | 70 void decodeSize() override { } |
71 void decode(size_t index) override { } | 71 void decode(size_t index) override { } |
72 }; | 72 }; |
73 | 73 |
74 TEST(ImageDecoderTest, sizeCalculationMayOverflow) | 74 TEST(ImageDecoderTest, sizeCalculationMayOverflow) |
75 { | 75 { |
76 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 76 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
77 EXPECT_FALSE(decoder->setSize(1 << 29, 1)); | 77 EXPECT_FALSE(decoder->setSize(1 << 29, 1)); |
78 EXPECT_FALSE(decoder->setSize(1, 1 << 29)); | 78 EXPECT_FALSE(decoder->setSize(1, 1 << 29)); |
79 EXPECT_FALSE(decoder->setSize(1 << 15, 1 << 15)); | 79 EXPECT_FALSE(decoder->setSize(1 << 15, 1 << 15)); |
80 EXPECT_TRUE(decoder->setSize(1 << 28, 1)); | 80 EXPECT_TRUE(decoder->setSize(1 << 28, 1)); |
81 EXPECT_TRUE(decoder->setSize(1, 1 << 28)); | 81 EXPECT_TRUE(decoder->setSize(1, 1 << 28)); |
82 EXPECT_TRUE(decoder->setSize(1 << 14, 1 << 14)); | 82 EXPECT_TRUE(decoder->setSize(1 << 14, 1 << 14)); |
83 } | 83 } |
84 | 84 |
85 TEST(ImageDecoderTest, requiredPreviousFrameIndex) | 85 TEST(ImageDecoderTest, requiredPreviousFrameIndex) |
86 { | 86 { |
87 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 87 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
88 decoder->initFrames(6); | 88 decoder->initFrames(6); |
89 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 89 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
90 | 90 |
91 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeKeep); | 91 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeKeep); |
92 frameBuffers[2].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 92 frameBuffers[2].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
93 frameBuffers[3].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 93 frameBuffers[3].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
94 frameBuffers[4].setDisposalMethod(ImageFrame::DisposeKeep); | 94 frameBuffers[4].setDisposalMethod(ImageFrame::DisposeKeep); |
95 | 95 |
96 decoder->resetRequiredPreviousFrames(); | 96 decoder->resetRequiredPreviousFrames(); |
97 | 97 |
98 // The first frame doesn't require any previous frame. | 98 // The first frame doesn't require any previous frame. |
99 EXPECT_EQ(kNotFound, frameBuffers[0].requiredPreviousFrameIndex()); | 99 EXPECT_EQ(kNotFound, frameBuffers[0].requiredPreviousFrameIndex()); |
100 // The previous DisposeNotSpecified frame is required. | 100 // The previous DisposeNotSpecified frame is required. |
101 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); | 101 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); |
102 // DisposeKeep is treated as DisposeNotSpecified. | 102 // DisposeKeep is treated as DisposeNotSpecified. |
103 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); | 103 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); |
104 // Previous DisposeOverwritePrevious frames are skipped. | 104 // Previous DisposeOverwritePrevious frames are skipped. |
105 EXPECT_EQ(1u, frameBuffers[3].requiredPreviousFrameIndex()); | 105 EXPECT_EQ(1u, frameBuffers[3].requiredPreviousFrameIndex()); |
106 EXPECT_EQ(1u, frameBuffers[4].requiredPreviousFrameIndex()); | 106 EXPECT_EQ(1u, frameBuffers[4].requiredPreviousFrameIndex()); |
107 EXPECT_EQ(4u, frameBuffers[5].requiredPreviousFrameIndex()); | 107 EXPECT_EQ(4u, frameBuffers[5].requiredPreviousFrameIndex()); |
108 } | 108 } |
109 | 109 |
110 TEST(ImageDecoderTest, requiredPreviousFrameIndexDisposeOverwriteBgcolor) | 110 TEST(ImageDecoderTest, requiredPreviousFrameIndexDisposeOverwriteBgcolor) |
111 { | 111 { |
112 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 112 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
113 decoder->initFrames(3); | 113 decoder->initFrames(3); |
114 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 114 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
115 | 115 |
116 // Fully covering DisposeOverwriteBgcolor previous frame resets the starting
state. | 116 // Fully covering DisposeOverwriteBgcolor previous frame resets the starting
state. |
117 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); | 117 frameBuffers[1].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); |
118 decoder->resetRequiredPreviousFrames(); | 118 decoder->resetRequiredPreviousFrames(); |
119 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 119 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
120 | 120 |
121 // Partially covering DisposeOverwriteBgcolor previous frame is required by
this frame. | 121 // Partially covering DisposeOverwriteBgcolor previous frame is required by
this frame. |
122 frameBuffers[1].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 122 frameBuffers[1].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
123 decoder->resetRequiredPreviousFrames(); | 123 decoder->resetRequiredPreviousFrames(); |
124 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); | 124 EXPECT_EQ(1u, frameBuffers[2].requiredPreviousFrameIndex()); |
125 } | 125 } |
126 | 126 |
127 TEST(ImageDecoderTest, requiredPreviousFrameIndexForFrame1) | 127 TEST(ImageDecoderTest, requiredPreviousFrameIndexForFrame1) |
128 { | 128 { |
129 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 129 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
130 decoder->initFrames(2); | 130 decoder->initFrames(2); |
131 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 131 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
132 | 132 |
133 decoder->resetRequiredPreviousFrames(); | 133 decoder->resetRequiredPreviousFrames(); |
134 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); | 134 EXPECT_EQ(0u, frameBuffers[1].requiredPreviousFrameIndex()); |
135 | 135 |
136 // The first frame with DisposeOverwritePrevious or DisposeOverwriteBgcolor | 136 // The first frame with DisposeOverwritePrevious or DisposeOverwriteBgcolor |
137 // resets the starting state. | 137 // resets the starting state. |
138 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 138 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
139 decoder->resetRequiredPreviousFrames(); | 139 decoder->resetRequiredPreviousFrames(); |
140 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 140 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
141 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); | 141 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); |
142 decoder->resetRequiredPreviousFrames(); | 142 decoder->resetRequiredPreviousFrames(); |
143 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 143 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
144 | 144 |
145 // ... even if it partially covers. | 145 // ... even if it partially covers. |
146 frameBuffers[0].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 146 frameBuffers[0].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
147 | 147 |
148 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); | 148 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwritePrevious); |
149 decoder->resetRequiredPreviousFrames(); | 149 decoder->resetRequiredPreviousFrames(); |
150 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 150 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
151 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); | 151 frameBuffers[0].setDisposalMethod(ImageFrame::DisposeOverwriteBgcolor); |
152 decoder->resetRequiredPreviousFrames(); | 152 decoder->resetRequiredPreviousFrames(); |
153 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); | 153 EXPECT_EQ(kNotFound, frameBuffers[1].requiredPreviousFrameIndex()); |
154 } | 154 } |
155 | 155 |
156 TEST(ImageDecoderTest, requiredPreviousFrameIndexBlendAtopBgcolor) | 156 TEST(ImageDecoderTest, requiredPreviousFrameIndexBlendAtopBgcolor) |
157 { | 157 { |
158 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 158 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
159 decoder->initFrames(3); | 159 decoder->initFrames(3); |
160 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 160 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
161 | 161 |
162 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); | 162 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); |
163 frameBuffers[2].setAlphaBlendSource(ImageFrame::BlendAtopBgcolor); | 163 frameBuffers[2].setAlphaBlendSource(ImageFrame::BlendAtopBgcolor); |
164 | 164 |
165 // A full frame with 'blending method == BlendAtopBgcolor' doesn't depend on
any prior frames. | 165 // A full frame with 'blending method == BlendAtopBgcolor' doesn't depend on
any prior frames. |
166 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 166 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
167 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); | 167 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); |
168 decoder->resetRequiredPreviousFrames(); | 168 decoder->resetRequiredPreviousFrames(); |
169 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 169 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
170 } | 170 } |
171 | 171 |
172 // A non-full frame with 'blending method == BlendAtopBgcolor' does depend o
n a prior frame. | 172 // A non-full frame with 'blending method == BlendAtopBgcolor' does depend o
n a prior frame. |
173 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 173 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
174 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 174 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
175 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); | 175 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); |
176 decoder->resetRequiredPreviousFrames(); | 176 decoder->resetRequiredPreviousFrames(); |
177 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 177 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
178 } | 178 } |
179 } | 179 } |
180 | 180 |
181 TEST(ImageDecoderTest, requiredPreviousFrameIndexKnownOpaque) | 181 TEST(ImageDecoderTest, requiredPreviousFrameIndexKnownOpaque) |
182 { | 182 { |
183 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 183 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
184 decoder->initFrames(3); | 184 decoder->initFrames(3); |
185 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 185 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
186 | 186 |
187 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); | 187 frameBuffers[1].setOriginalFrameRect(IntRect(25, 25, 50, 50)); |
188 | 188 |
189 // A full frame that is known to be opaque doesn't depend on any prior frame
s. | 189 // A full frame that is known to be opaque doesn't depend on any prior frame
s. |
190 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 190 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
191 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); | 191 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); |
192 decoder->resetRequiredPreviousFrames(true); | 192 decoder->resetRequiredPreviousFrames(true); |
193 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 193 EXPECT_EQ(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
194 } | 194 } |
195 | 195 |
196 // A non-full frame that is known to be opaque does depend on a prior frame. | 196 // A non-full frame that is known to be opaque does depend on a prior frame. |
197 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); | 197 frameBuffers[2].setOriginalFrameRect(IntRect(50, 50, 50, 50)); |
198 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { | 198 for (int disposeMethod = ImageFrame::DisposeNotSpecified; disposeMethod <= I
mageFrame::DisposeOverwritePrevious; ++disposeMethod) { |
199 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); | 199 frameBuffers[1].setDisposalMethod(static_cast<ImageFrame::DisposalMethod
>(disposeMethod)); |
200 decoder->resetRequiredPreviousFrames(true); | 200 decoder->resetRequiredPreviousFrames(true); |
201 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); | 201 EXPECT_NE(kNotFound, frameBuffers[2].requiredPreviousFrameIndex()); |
202 } | 202 } |
203 } | 203 } |
204 | 204 |
205 TEST(ImageDecoderTest, clearCacheExceptFrameDoNothing) | 205 TEST(ImageDecoderTest, clearCacheExceptFrameDoNothing) |
206 { | 206 { |
207 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 207 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
208 decoder->clearCacheExceptFrame(0); | 208 decoder->clearCacheExceptFrame(0); |
209 | 209 |
210 // This should not crash. | 210 // This should not crash. |
211 decoder->initFrames(20); | 211 decoder->initFrames(20); |
212 decoder->clearCacheExceptFrame(kNotFound); | 212 decoder->clearCacheExceptFrame(kNotFound); |
213 } | 213 } |
214 | 214 |
215 TEST(ImageDecoderTest, clearCacheExceptFrameAll) | 215 TEST(ImageDecoderTest, clearCacheExceptFrameAll) |
216 { | 216 { |
217 const size_t numFrames = 10; | 217 const size_t numFrames = 10; |
218 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 218 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
219 decoder->initFrames(numFrames); | 219 decoder->initFrames(numFrames); |
220 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 220 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
221 for (size_t i = 0; i < numFrames; ++i) | 221 for (size_t i = 0; i < numFrames; ++i) |
222 frameBuffers[i].setStatus(i % 2 ? ImageFrame::FramePartial : ImageFrame:
:FrameComplete); | 222 frameBuffers[i].setStatus(i % 2 ? ImageFrame::FramePartial : ImageFrame:
:FrameComplete); |
223 | 223 |
224 decoder->clearCacheExceptFrame(kNotFound); | 224 decoder->clearCacheExceptFrame(kNotFound); |
225 | 225 |
226 for (size_t i = 0; i < numFrames; ++i) { | 226 for (size_t i = 0; i < numFrames; ++i) { |
227 SCOPED_TRACE(testing::Message() << i); | 227 SCOPED_TRACE(testing::Message() << i); |
228 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); | 228 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); |
229 } | 229 } |
230 } | 230 } |
231 | 231 |
232 TEST(ImageDecoderTest, clearCacheExceptFramePreverveClearExceptFrame) | 232 TEST(ImageDecoderTest, clearCacheExceptFramePreverveClearExceptFrame) |
233 { | 233 { |
234 const size_t numFrames = 10; | 234 const size_t numFrames = 10; |
235 OwnPtr<TestImageDecoder> decoder(adoptPtr(new TestImageDecoder())); | 235 std::unique_ptr<TestImageDecoder> decoder(wrapUnique(new TestImageDecoder())
); |
236 decoder->initFrames(numFrames); | 236 decoder->initFrames(numFrames); |
237 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); | 237 Vector<ImageFrame, 1>& frameBuffers = decoder->frameBufferCache(); |
238 for (size_t i = 0; i < numFrames; ++i) | 238 for (size_t i = 0; i < numFrames; ++i) |
239 frameBuffers[i].setStatus(ImageFrame::FrameComplete); | 239 frameBuffers[i].setStatus(ImageFrame::FrameComplete); |
240 | 240 |
241 decoder->resetRequiredPreviousFrames(); | 241 decoder->resetRequiredPreviousFrames(); |
242 decoder->clearCacheExceptFrame(5); | 242 decoder->clearCacheExceptFrame(5); |
243 for (size_t i = 0; i < numFrames; ++i) { | 243 for (size_t i = 0; i < numFrames; ++i) { |
244 SCOPED_TRACE(testing::Message() << i); | 244 SCOPED_TRACE(testing::Message() << i); |
245 if (i == 5) | 245 if (i == 5) |
246 EXPECT_EQ(ImageFrame::FrameComplete, frameBuffers[i].getStatus()); | 246 EXPECT_EQ(ImageFrame::FrameComplete, frameBuffers[i].getStatus()); |
247 else | 247 else |
248 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); | 248 EXPECT_EQ(ImageFrame::FrameEmpty, frameBuffers[i].getStatus()); |
249 } | 249 } |
250 } | 250 } |
251 | 251 |
252 } // namespace blink | 252 } // namespace blink |
OLD | NEW |