OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 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 | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 size_t frameCount() override { return m_frameCount; } | 89 size_t frameCount() override { return m_frameCount; } |
90 int repetitionCount() const override { return m_frameCount == 1 ? cAnimation
None:cAnimationLoopOnce; } | 90 int repetitionCount() const override { return m_frameCount == 1 ? cAnimation
None:cAnimationLoopOnce; } |
91 float frameDuration() const override { return 0; } | 91 float frameDuration() const override { return 0; } |
92 | 92 |
93 protected: | 93 protected: |
94 void useMockImageDecoderFactory() | 94 void useMockImageDecoderFactory() |
95 { | 95 { |
96 m_generator->setImageDecoderFactory(MockImageDecoderFactory::create(this
, fullSize())); | 96 m_generator->setImageDecoderFactory(MockImageDecoderFactory::create(this
, fullSize())); |
97 } | 97 } |
98 | 98 |
99 void addNewData() | 99 void addNewData(bool allDataReceived = false) |
100 { | 100 { |
101 m_data->append("g", 1); | 101 m_data->append("g", 1); |
102 m_generator->setData(m_data, false); | 102 m_generator->setData(m_data, allDataReceived); |
103 } | 103 } |
104 | 104 |
105 void setFrameStatus(ImageFrame::Status status) { m_status = m_nextFrameStat
us = status; } | 105 void setFrameStatus(ImageFrame::Status status) { m_status = m_nextFrameStat
us = status; } |
106 void setNextFrameStatus(ImageFrame::Status status) { m_nextFrameStatus = st
atus; } | 106 void setNextFrameStatus(ImageFrame::Status status) { m_nextFrameStatus = st
atus; } |
107 void setFrameCount(size_t count) | 107 void setFrameCount(size_t count) |
108 { | 108 { |
109 m_frameCount = count; | 109 m_frameCount = count; |
110 if (count > 1) { | 110 if (count > 1) { |
111 m_generator.clear(); | 111 m_generator.clear(); |
112 m_generator = ImageFrameGenerator::create(fullSize(), m_data, true,
true); | 112 m_generator = ImageFrameGenerator::create(fullSize(), m_data, true,
true); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); | 157 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
158 EXPECT_EQ(3, m_decodeRequestCount); | 158 EXPECT_EQ(3, m_decodeRequestCount); |
159 } | 159 } |
160 | 160 |
161 static void decodeThreadMain(ImageFrameGenerator* generator) | 161 static void decodeThreadMain(ImageFrameGenerator* generator) |
162 { | 162 { |
163 char buffer[100 * 100 * 4]; | 163 char buffer[100 * 100 * 4]; |
164 generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); | 164 generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
165 } | 165 } |
166 | 166 |
| 167 static void decodeThreadWithRefEncodedMain(ImageFrameGenerator* generator) |
| 168 { |
| 169 // Image must be complete - refEncodedData otherwise returns null. |
| 170 char buffer[100 * 100 * 4]; |
| 171 SkData* data = generator->refEncodedData(); |
| 172 generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
| 173 data->unref(); |
| 174 } |
| 175 |
167 TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded) | 176 TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded) |
168 { | 177 { |
169 setFrameStatus(ImageFrame::FramePartial); | 178 setFrameStatus(ImageFrame::FramePartial); |
170 | 179 |
171 char buffer[100 * 100 * 4]; | 180 char buffer[100 * 100 * 4]; |
172 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); | 181 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
173 EXPECT_EQ(1, m_decodeRequestCount); | 182 EXPECT_EQ(1, m_decodeRequestCount); |
174 EXPECT_EQ(0, m_decodersDestroyed); | 183 EXPECT_EQ(0, m_decodersDestroyed); |
| 184 SkData* data = m_generator->refEncodedData(); |
| 185 EXPECT_EQ(nullptr, data); |
175 | 186 |
176 // LocalFrame can now be decoded completely. | 187 // LocalFrame can now be decoded completely. |
177 setFrameStatus(ImageFrame::FrameComplete); | 188 setFrameStatus(ImageFrame::FrameComplete); |
178 addNewData(); | 189 addNewData(); |
| 190 // addNewData is calling m_generator->setData with allDataReceived == false,
which means that |
| 191 // refEncodedData should return null. |
| 192 data = m_generator->refEncodedData(); |
| 193 EXPECT_EQ(nullptr, data); |
179 OwnPtr<WebThread> thread = adoptPtr(Platform::current()->createThread("Decod
eThread")); | 194 OwnPtr<WebThread> thread = adoptPtr(Platform::current()->createThread("Decod
eThread")); |
180 thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&dec
odeThreadMain, AllowCrossThreadAccess(m_generator.get())))); | 195 thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&dec
odeThreadMain, AllowCrossThreadAccess(m_generator.get())))); |
181 thread.clear(); | 196 thread.clear(); |
182 EXPECT_EQ(2, m_decodeRequestCount); | 197 EXPECT_EQ(2, m_decodeRequestCount); |
183 EXPECT_EQ(1, m_decodersDestroyed); | 198 EXPECT_EQ(1, m_decodersDestroyed); |
184 | 199 |
185 // Decoder created again. | 200 // Decoder created again. |
186 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); | 201 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
187 EXPECT_EQ(3, m_decodeRequestCount); | 202 EXPECT_EQ(3, m_decodeRequestCount); |
| 203 |
| 204 addNewData(true); |
| 205 data = m_generator->refEncodedData(); |
| 206 ASSERT_TRUE(data); |
| 207 // To prevent data writting, SkData::unique() should be false. |
| 208 ASSERT_TRUE(!data->unique()); |
| 209 |
| 210 // Thread will also ref and unref the data. |
| 211 thread = adoptPtr(Platform::current()->createThread("RefEncodedDataThread"))
; |
| 212 thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&dec
odeThreadWithRefEncodedMain, AllowCrossThreadAccess(m_generator.get())))); |
| 213 thread.clear(); |
| 214 EXPECT_EQ(4, m_decodeRequestCount); |
| 215 |
| 216 data->unref(); |
| 217 // m_generator is holding the only reference to SkData now. |
| 218 ASSERT_TRUE(data->unique()); |
| 219 |
| 220 data = m_generator->refEncodedData(); |
| 221 ASSERT_TRUE(data && !data->unique()); |
| 222 |
| 223 // Delete generator, and SkData should have the only reference. |
| 224 m_generator = nullptr; |
| 225 ASSERT_TRUE(data->unique()); |
| 226 data->unref(); |
188 } | 227 } |
189 | 228 |
190 TEST_F(ImageFrameGeneratorTest, frameHasAlpha) | 229 TEST_F(ImageFrameGeneratorTest, frameHasAlpha) |
191 { | 230 { |
192 setFrameStatus(ImageFrame::FramePartial); | 231 setFrameStatus(ImageFrame::FramePartial); |
193 | 232 |
194 char buffer[100 * 100 * 4]; | 233 char buffer[100 * 100 * 4]; |
195 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); | 234 m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); |
196 EXPECT_TRUE(m_generator->hasAlpha(0)); | 235 EXPECT_TRUE(m_generator->hasAlpha(0)); |
197 EXPECT_EQ(1, m_decodeRequestCount); | 236 EXPECT_EQ(1, m_decodeRequestCount); |
(...skipping 29 matching lines...) Expand all Loading... |
227 | 266 |
228 setFrameStatus(ImageFrame::FrameComplete); | 267 setFrameStatus(ImageFrame::FrameComplete); |
229 | 268 |
230 // Multi frame decoder should be removed. | 269 // Multi frame decoder should be removed. |
231 m_generator->decodeAndScale(imageInfo(), 2, buffer, 100 * 4); | 270 m_generator->decodeAndScale(imageInfo(), 2, buffer, 100 * 4); |
232 EXPECT_EQ(3, m_decodeRequestCount); | 271 EXPECT_EQ(3, m_decodeRequestCount); |
233 EXPECT_EQ(1, m_decodersDestroyed); | 272 EXPECT_EQ(1, m_decodersDestroyed); |
234 } | 273 } |
235 | 274 |
236 } // namespace blink | 275 } // namespace blink |
OLD | NEW |