OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <deque> | 5 #include <deque> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
11 #include "media/base/video_frame.h" | 11 #include "media/base/video_frame.h" |
12 #include "remoting/base/base_mock_objects.h" | 12 #include "remoting/base/base_mock_objects.h" |
13 #include "remoting/base/codec_test.h" | 13 #include "remoting/base/codec_test.h" |
14 #include "remoting/base/decoder.h" | 14 #include "remoting/base/decoder.h" |
15 #include "remoting/base/encoder.h" | 15 #include "remoting/base/encoder.h" |
16 #include "remoting/base/util.h" | 16 #include "remoting/base/util.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
18 | 18 |
19 static const int kWidth = 320; | 19 namespace { |
20 static const int kHeight = 240; | 20 |
21 static const int kBytesPerPixel = 4; | 21 const int kBytesPerPixel = 4; |
22 | 22 |
23 // Some sample rects for testing. | 23 // Some sample rects for testing. |
24 static const SkIRect kTestRects[] = { | 24 std::vector<SkIRect> makeTestRects(const SkISize& size) { |
Sergey Ulanov
2012/07/27 22:29:37
MakeTestRects()
simonmorris
2012/07/27 23:14:12
Done.
| |
25 SkIRect::MakeXYWH(0, 0, kWidth, kHeight), | 25 std::vector<SkIRect> rects; |
26 SkIRect::MakeXYWH(0, 0, kWidth / 2, kHeight / 2), | 26 rects.push_back(SkIRect::MakeXYWH(0, 0, size.width(), size.height())); |
27 SkIRect::MakeXYWH(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), | 27 rects.push_back(SkIRect::MakeXYWH(0, 0, size.width() / 2, size.height() / 2)); |
28 SkIRect::MakeXYWH(16, 16, 16, 16), | 28 rects.push_back(SkIRect::MakeXYWH(size.width() / 2, size.height() / 2, |
29 SkIRect::MakeXYWH(128, 64, 32, 32), | 29 size.width() / 2, size.height() / 2)); |
30 rects.push_back(SkIRect::MakeXYWH(16, 16, 16, 16)); | |
31 rects.push_back(SkIRect::MakeXYWH(128, 64, 32, 32)); | |
32 return rects; | |
30 }; | 33 }; |
Sergey Ulanov
2012/07/27 22:29:37
nit: don't need semicolon here.
simonmorris
2012/07/27 23:14:12
Done.
| |
31 | 34 |
35 } // namespace | |
36 | |
32 namespace remoting { | 37 namespace remoting { |
33 | 38 |
34 // A class to test the message output of the encoder. | 39 // A class to test the message output of the encoder. |
35 class EncoderMessageTester { | 40 class EncoderMessageTester { |
36 public: | 41 public: |
37 EncoderMessageTester() | 42 EncoderMessageTester() |
38 : begin_rect_(0), | 43 : begin_rect_(0), |
39 rect_data_(0), | 44 rect_data_(0), |
40 end_rect_(0), | 45 end_rect_(0), |
41 added_rects_(0), | 46 added_rects_(0), |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
113 State state_; | 118 State state_; |
114 bool strict_; | 119 bool strict_; |
115 | 120 |
116 std::deque<SkIRect> rects_; | 121 std::deque<SkIRect> rects_; |
117 | 122 |
118 DISALLOW_COPY_AND_ASSIGN(EncoderMessageTester); | 123 DISALLOW_COPY_AND_ASSIGN(EncoderMessageTester); |
119 }; | 124 }; |
120 | 125 |
121 class DecoderTester { | 126 class DecoderTester { |
122 public: | 127 public: |
123 DecoderTester(Decoder* decoder) | 128 DecoderTester(Decoder* decoder, const SkISize& screen_size, |
124 : strict_(false), | 129 const SkISize& view_size) |
130 : screen_size_(screen_size), | |
131 view_size_(view_size), | |
132 strict_(false), | |
125 decoder_(decoder) { | 133 decoder_(decoder) { |
126 image_data_.reset(new uint8[kWidth * kHeight * kBytesPerPixel]); | 134 image_data_.reset(new uint8[ |
135 view_size_.width() * view_size_.height() * kBytesPerPixel]); | |
127 EXPECT_TRUE(image_data_.get()); | 136 EXPECT_TRUE(image_data_.get()); |
128 decoder_->Initialize(SkISize::Make(kWidth, kHeight)); | 137 decoder_->Initialize(screen_size_); |
129 } | 138 } |
130 | 139 |
131 void Reset() { | 140 void Reset() { |
132 expected_region_.setEmpty(); | 141 expected_region_.setEmpty(); |
133 update_region_.setEmpty(); | 142 update_region_.setEmpty(); |
134 } | 143 } |
135 | 144 |
145 void ResetRenderedData() { | |
146 memset(image_data_.get(), 0, | |
147 view_size_.width() * view_size_.height() * kBytesPerPixel); | |
148 } | |
149 | |
136 void ReceivedPacket(VideoPacket* packet) { | 150 void ReceivedPacket(VideoPacket* packet) { |
137 Decoder::DecodeResult result = decoder_->DecodePacket(packet); | 151 Decoder::DecodeResult result = decoder_->DecodePacket(packet); |
138 | 152 |
139 ASSERT_NE(Decoder::DECODE_ERROR, result); | 153 ASSERT_NE(Decoder::DECODE_ERROR, result); |
140 | 154 |
141 if (result == Decoder::DECODE_DONE) { | 155 if (result == Decoder::DECODE_DONE) { |
142 decoder_->RenderFrame(SkISize::Make(kWidth, kHeight), | 156 RenderFrame(); |
143 SkIRect::MakeXYWH(0, 0, kWidth, kHeight), | |
144 image_data_.get(), | |
145 kWidth * kBytesPerPixel, | |
146 &update_region_); | |
147 } | 157 } |
148 } | 158 } |
149 | 159 |
160 void RenderFrame() { | |
161 decoder_->RenderFrame(view_size_, | |
162 SkIRect::MakeSize(view_size_), | |
163 image_data_.get(), | |
164 view_size_.width() * kBytesPerPixel, | |
165 &update_region_); | |
166 } | |
167 | |
150 void ReceivedScopedPacket(scoped_ptr<VideoPacket> packet) { | 168 void ReceivedScopedPacket(scoped_ptr<VideoPacket> packet) { |
151 ReceivedPacket(packet.get()); | 169 ReceivedPacket(packet.get()); |
152 } | 170 } |
153 | 171 |
154 void set_strict(bool strict) { | 172 void set_strict(bool strict) { |
155 strict_ = strict; | 173 strict_ = strict; |
156 } | 174 } |
157 | 175 |
158 void set_capture_data(scoped_refptr<CaptureData> data) { | 176 void set_capture_data(scoped_refptr<CaptureData> data) { |
159 capture_data_ = data; | 177 capture_data_ = data; |
(...skipping 11 matching lines...) Expand all Loading... | |
171 | 189 |
172 void VerifyResults() { | 190 void VerifyResults() { |
173 if (!strict_) | 191 if (!strict_) |
174 return; | 192 return; |
175 | 193 |
176 ASSERT_TRUE(capture_data_.get()); | 194 ASSERT_TRUE(capture_data_.get()); |
177 | 195 |
178 // Test the content of the update region. | 196 // Test the content of the update region. |
179 EXPECT_EQ(expected_region_, update_region_); | 197 EXPECT_EQ(expected_region_, update_region_); |
180 for (SkRegion::Iterator i(update_region_); !i.done(); i.next()) { | 198 for (SkRegion::Iterator i(update_region_); !i.done(); i.next()) { |
181 const int stride = kWidth * kBytesPerPixel; | 199 const int stride = view_size_.width() * kBytesPerPixel; |
182 EXPECT_EQ(stride, capture_data_->data_planes().strides[0]); | 200 EXPECT_EQ(stride, capture_data_->data_planes().strides[0]); |
183 const int offset = stride * i.rect().top() + | 201 const int offset = stride * i.rect().top() + |
184 kBytesPerPixel * i.rect().left(); | 202 kBytesPerPixel * i.rect().left(); |
185 const uint8* original = capture_data_->data_planes().data[0] + offset; | 203 const uint8* original = capture_data_->data_planes().data[0] + offset; |
186 const uint8* decoded = image_data_.get() + offset; | 204 const uint8* decoded = image_data_.get() + offset; |
187 const int row_size = kBytesPerPixel * i.rect().width(); | 205 const int row_size = kBytesPerPixel * i.rect().width(); |
188 for (int y = 0; y < i.rect().height(); ++y) { | 206 for (int y = 0; y < i.rect().height(); ++y) { |
189 EXPECT_EQ(0, memcmp(original, decoded, row_size)) | 207 EXPECT_EQ(0, memcmp(original, decoded, row_size)) |
190 << "Row " << y << " is different"; | 208 << "Row " << y << " is different"; |
191 original += stride; | 209 original += stride; |
192 decoded += stride; | 210 decoded += stride; |
193 } | 211 } |
194 } | 212 } |
195 } | 213 } |
196 | 214 |
197 // The error at each pixel is the root mean square of the errors in | 215 // The error at each pixel is the root mean square of the errors in |
198 // the R, G, and B components, each normalized to [0, 1]. This routine | 216 // the R, G, and B components, each normalized to [0, 1]. This routine |
199 // checks that the maximum and mean pixel errors do not exceed given limits. | 217 // checks that the maximum and mean pixel errors do not exceed given limits. |
200 void VerifyResultsApprox(double max_error_limit, double mean_error_limit) { | 218 void VerifyResultsApprox(const uint8* expected_view_data, |
201 ASSERT_TRUE(capture_data_.get()); | 219 double max_error_limit, double mean_error_limit) { |
202 | |
203 // Test the content of the update region. | |
204 EXPECT_EQ(expected_region_, update_region_); | |
205 double max_error = 0.0; | 220 double max_error = 0.0; |
206 double sum_error = 0.0; | 221 double sum_error = 0.0; |
207 int error_num = 0; | 222 int error_num = 0; |
208 for (SkRegion::Iterator i(update_region_); !i.done(); i.next()) { | 223 for (SkRegion::Iterator i(update_region_); !i.done(); i.next()) { |
209 const int stride = kWidth * kBytesPerPixel; | 224 const int stride = view_size_.width() * kBytesPerPixel; |
210 EXPECT_EQ(stride, capture_data_->data_planes().strides[0]); | |
211 const int offset = stride * i.rect().top() + | 225 const int offset = stride * i.rect().top() + |
212 kBytesPerPixel * i.rect().left(); | 226 kBytesPerPixel * i.rect().left(); |
213 const uint8* original = capture_data_->data_planes().data[0] + offset; | 227 const uint8* expected = expected_view_data + offset; |
214 const uint8* decoded = image_data_.get() + offset; | 228 const uint8* actual = image_data_.get() + offset; |
215 for (int y = 0; y < i.rect().height(); ++y) { | 229 for (int y = 0; y < i.rect().height(); ++y) { |
216 for (int x = 0; x < i.rect().width(); ++x) { | 230 for (int x = 0; x < i.rect().width(); ++x) { |
217 double error = CalculateError(original, decoded); | 231 double error = CalculateError(expected, actual); |
218 max_error = std::max(max_error, error); | 232 max_error = std::max(max_error, error); |
219 sum_error += error; | 233 sum_error += error; |
220 ++error_num; | 234 ++error_num; |
221 original += 4; | 235 expected += 4; |
222 decoded += 4; | 236 actual += 4; |
223 } | 237 } |
224 } | 238 } |
225 } | 239 } |
226 EXPECT_LE(max_error, max_error_limit); | 240 EXPECT_LE(max_error, max_error_limit); |
227 double mean_error = sum_error / error_num; | 241 double mean_error = sum_error / error_num; |
228 EXPECT_LE(mean_error, mean_error_limit); | 242 EXPECT_LE(mean_error, mean_error_limit); |
229 LOG(INFO) << "Max error: " << max_error; | 243 LOG(INFO) << "Max error: " << max_error; |
230 LOG(INFO) << "Mean error: " << mean_error; | 244 LOG(INFO) << "Mean error: " << mean_error; |
231 } | 245 } |
232 | 246 |
233 double CalculateError(const uint8* original, const uint8* decoded) { | 247 double CalculateError(const uint8* original, const uint8* decoded) { |
234 double error_sum_squares = 0.0; | 248 double error_sum_squares = 0.0; |
235 for (int i = 0; i < 3; i++) { | 249 for (int i = 0; i < 3; i++) { |
236 double error = static_cast<double>(*original++) - | 250 double error = static_cast<double>(*original++) - |
237 static_cast<double>(*decoded++); | 251 static_cast<double>(*decoded++); |
238 error /= 255.0; | 252 error /= 255.0; |
239 error_sum_squares += error * error; | 253 error_sum_squares += error * error; |
240 } | 254 } |
241 original++; | 255 original++; |
242 decoded++; | 256 decoded++; |
243 return sqrt(error_sum_squares / 3.0); | 257 return sqrt(error_sum_squares / 3.0); |
244 } | 258 } |
245 | 259 |
246 private: | 260 private: |
261 SkISize screen_size_; | |
262 SkISize view_size_; | |
247 bool strict_; | 263 bool strict_; |
248 SkRegion expected_region_; | 264 SkRegion expected_region_; |
249 SkRegion update_region_; | 265 SkRegion update_region_; |
250 Decoder* decoder_; | 266 Decoder* decoder_; |
251 scoped_array<uint8> image_data_; | 267 scoped_array<uint8> image_data_; |
252 scoped_refptr<CaptureData> capture_data_; | 268 scoped_refptr<CaptureData> capture_data_; |
253 | 269 |
254 DISALLOW_COPY_AND_ASSIGN(DecoderTester); | 270 DISALLOW_COPY_AND_ASSIGN(DecoderTester); |
255 }; | 271 }; |
256 | 272 |
(...skipping 30 matching lines...) Expand all Loading... | |
287 } | 303 } |
288 | 304 |
289 private: | 305 private: |
290 EncoderMessageTester* message_tester_; | 306 EncoderMessageTester* message_tester_; |
291 DecoderTester* decoder_tester_; | 307 DecoderTester* decoder_tester_; |
292 int data_available_; | 308 int data_available_; |
293 | 309 |
294 DISALLOW_COPY_AND_ASSIGN(EncoderTester); | 310 DISALLOW_COPY_AND_ASSIGN(EncoderTester); |
295 }; | 311 }; |
296 | 312 |
297 scoped_refptr<CaptureData> PrepareEncodeData(media::VideoFrame::Format format, | 313 scoped_refptr<CaptureData> PrepareEncodeData(const SkISize& size, |
314 media::VideoFrame::Format format, | |
298 uint8** memory) { | 315 uint8** memory) { |
299 // TODO(hclam): Support also YUV format. | 316 // TODO(hclam): Support also YUV format. |
300 CHECK_EQ(format, media::VideoFrame::RGB32); | 317 CHECK_EQ(format, media::VideoFrame::RGB32); |
301 int size = kWidth * kHeight * kBytesPerPixel; | 318 int memory_size = size.width() * size.height() * kBytesPerPixel; |
302 | 319 |
303 *memory = new uint8[size]; | 320 *memory = new uint8[memory_size]; |
304 srand(0); | 321 srand(0); |
305 for (int i = 0; i < size; ++i) { | 322 for (int i = 0; i < memory_size; ++i) { |
306 (*memory)[i] = rand() % 256; | 323 (*memory)[i] = rand() % 256; |
307 } | 324 } |
308 | 325 |
309 DataPlanes planes; | 326 DataPlanes planes; |
310 memset(planes.data, 0, sizeof(planes.data)); | 327 memset(planes.data, 0, sizeof(planes.data)); |
311 memset(planes.strides, 0, sizeof(planes.strides)); | 328 memset(planes.strides, 0, sizeof(planes.strides)); |
312 planes.data[0] = *memory; | 329 planes.data[0] = *memory; |
313 planes.strides[0] = kWidth * kBytesPerPixel; | 330 planes.strides[0] = size.width() * kBytesPerPixel; |
314 | 331 |
315 scoped_refptr<CaptureData> data = | 332 scoped_refptr<CaptureData> data = |
316 new CaptureData(planes, SkISize::Make(kWidth, kHeight), format); | 333 new CaptureData(planes, size, format); |
317 return data; | 334 return data; |
318 } | 335 } |
319 | 336 |
320 static void TestEncodingRects(Encoder* encoder, | 337 static void TestEncodingRects(Encoder* encoder, |
321 EncoderTester* tester, | 338 EncoderTester* tester, |
322 scoped_refptr<CaptureData> data, | 339 scoped_refptr<CaptureData> data, |
323 const SkIRect* rects, int count) { | 340 const SkIRect* rects, int count) { |
324 data->mutable_dirty_region().setEmpty(); | 341 data->mutable_dirty_region().setEmpty(); |
325 for (int i = 0; i < count; ++i) { | 342 for (int i = 0; i < count; ++i) { |
326 data->mutable_dirty_region().op(rects[i], SkRegion::kUnion_Op); | 343 data->mutable_dirty_region().op(rects[i], SkRegion::kUnion_Op); |
327 } | 344 } |
328 tester->AddRects(rects, count); | 345 tester->AddRects(rects, count); |
329 | 346 |
330 encoder->Encode(data, true, base::Bind( | 347 encoder->Encode(data, true, base::Bind( |
331 &EncoderTester::DataAvailable, base::Unretained(tester))); | 348 &EncoderTester::DataAvailable, base::Unretained(tester))); |
332 } | 349 } |
333 | 350 |
334 void TestEncoder(Encoder* encoder, bool strict) { | 351 void TestEncoder(Encoder* encoder, bool strict) { |
352 SkISize kSize = SkISize::Make(320, 240); | |
353 | |
335 EncoderMessageTester message_tester; | 354 EncoderMessageTester message_tester; |
336 message_tester.set_strict(strict); | 355 message_tester.set_strict(strict); |
337 | 356 |
338 EncoderTester tester(&message_tester); | 357 EncoderTester tester(&message_tester); |
339 | 358 |
340 uint8* memory; | 359 uint8* memory; |
341 scoped_refptr<CaptureData> data = | 360 scoped_refptr<CaptureData> data = |
342 PrepareEncodeData(media::VideoFrame::RGB32, &memory); | 361 PrepareEncodeData(kSize, media::VideoFrame::RGB32, &memory); |
343 scoped_array<uint8> memory_wrapper(memory); | 362 scoped_array<uint8> memory_wrapper(memory); |
344 | 363 |
345 TestEncodingRects(encoder, &tester, data, kTestRects, 1); | 364 std::vector<SkIRect> test_rects = makeTestRects(kSize); |
346 TestEncodingRects(encoder, &tester, data, kTestRects + 1, 1); | 365 TestEncodingRects(encoder, &tester, data, &test_rects[0], 1); |
Sergey Ulanov
2012/07/27 22:29:37
Would it be better to have for loop to iterate ove
simonmorris
2012/07/27 23:14:12
Done.
| |
347 TestEncodingRects(encoder, &tester, data, kTestRects + 2, 1); | 366 TestEncodingRects(encoder, &tester, data, &test_rects[1], 1); |
348 TestEncodingRects(encoder, &tester, data, kTestRects + 3, 2); | 367 TestEncodingRects(encoder, &tester, data, &test_rects[2], 1); |
368 TestEncodingRects(encoder, &tester, data, &test_rects[3], 2); | |
349 } | 369 } |
350 | 370 |
351 static void TestEncodeDecodeRects(Encoder* encoder, | 371 static void TestEncodeDecodeRects(Encoder* encoder, |
352 EncoderTester* encoder_tester, | 372 EncoderTester* encoder_tester, |
353 DecoderTester* decoder_tester, | 373 DecoderTester* decoder_tester, |
354 scoped_refptr<CaptureData> data, | 374 scoped_refptr<CaptureData> data, |
355 const SkIRect* rects, int count) { | 375 const SkIRect* rects, int count) { |
356 data->mutable_dirty_region().setRects(rects, count); | 376 data->mutable_dirty_region().setRects(rects, count); |
357 encoder_tester->AddRects(rects, count); | 377 encoder_tester->AddRects(rects, count); |
358 decoder_tester->AddRects(rects, count); | 378 decoder_tester->AddRects(rects, count); |
(...skipping 14 matching lines...) Expand all Loading... | |
373 } | 393 } |
374 } | 394 } |
375 | 395 |
376 encoder->Encode(data, true, base::Bind(&EncoderTester::DataAvailable, | 396 encoder->Encode(data, true, base::Bind(&EncoderTester::DataAvailable, |
377 base::Unretained(encoder_tester))); | 397 base::Unretained(encoder_tester))); |
378 decoder_tester->VerifyResults(); | 398 decoder_tester->VerifyResults(); |
379 decoder_tester->Reset(); | 399 decoder_tester->Reset(); |
380 } | 400 } |
381 | 401 |
382 void TestEncoderDecoder(Encoder* encoder, Decoder* decoder, bool strict) { | 402 void TestEncoderDecoder(Encoder* encoder, Decoder* decoder, bool strict) { |
403 SkISize kSize = SkISize::Make(320, 240); | |
404 | |
383 EncoderMessageTester message_tester; | 405 EncoderMessageTester message_tester; |
384 message_tester.set_strict(strict); | 406 message_tester.set_strict(strict); |
385 | 407 |
386 EncoderTester encoder_tester(&message_tester); | 408 EncoderTester encoder_tester(&message_tester); |
387 | 409 |
388 uint8* memory; | 410 uint8* memory; |
389 scoped_refptr<CaptureData> data = | 411 scoped_refptr<CaptureData> data = |
390 PrepareEncodeData(media::VideoFrame::RGB32, &memory); | 412 PrepareEncodeData(kSize, media::VideoFrame::RGB32, &memory); |
391 scoped_array<uint8> memory_wrapper(memory); | 413 scoped_array<uint8> memory_wrapper(memory); |
392 | 414 |
393 DecoderTester decoder_tester(decoder); | 415 DecoderTester decoder_tester(decoder, kSize, kSize); |
394 decoder_tester.set_strict(strict); | 416 decoder_tester.set_strict(strict); |
395 decoder_tester.set_capture_data(data); | 417 decoder_tester.set_capture_data(data); |
396 encoder_tester.set_decoder_tester(&decoder_tester); | 418 encoder_tester.set_decoder_tester(&decoder_tester); |
397 | 419 |
420 std::vector<SkIRect> test_rects = makeTestRects(kSize); | |
398 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, | 421 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, |
Sergey Ulanov
2012/07/27 22:29:37
for loop here in case we add some other rects in m
simonmorris
2012/07/27 23:14:12
Done.
| |
399 kTestRects, 1); | 422 &test_rects[0], 1); |
400 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, | 423 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, |
401 kTestRects + 1, 1); | 424 &test_rects[1], 1); |
402 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, | 425 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, |
403 kTestRects + 2, 1); | 426 &test_rects[2], 1); |
404 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, | 427 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, |
405 kTestRects + 3, 2); | 428 &test_rects[3], 2); |
406 } | 429 } |
407 | 430 |
408 static void FillWithGradient(uint8* memory, const SkISize& frame_size, | 431 static void FillWithGradient(uint8* memory, const SkISize& frame_size, |
409 const SkIRect& rect) { | 432 const SkIRect& rect) { |
410 for (int j = rect.top(); j < rect.bottom(); ++j) { | 433 for (int j = rect.top(); j < rect.bottom(); ++j) { |
411 uint8* p = memory + ((j * frame_size.width()) + rect.left()) * 4; | 434 uint8* p = memory + ((j * frame_size.width()) + rect.left()) * 4; |
412 for (int i = rect.left(); i < rect.right(); ++i) { | 435 for (int i = rect.left(); i < rect.right(); ++i) { |
413 *p++ = static_cast<uint8>((255.0 * i) / frame_size.width()); | 436 *p++ = static_cast<uint8>((255.0 * i) / frame_size.width()); |
414 *p++ = static_cast<uint8>((164.0 * j) / frame_size.height()); | 437 *p++ = static_cast<uint8>((164.0 * j) / frame_size.height()); |
415 *p++ = static_cast<uint8>((82.0 * (i + j)) / | 438 *p++ = static_cast<uint8>((82.0 * (i + j)) / |
416 (frame_size.width() + frame_size.height())); | 439 (frame_size.width() + frame_size.height())); |
417 *p++ = 0; | 440 *p++ = 0; |
418 } | 441 } |
419 } | 442 } |
420 } | 443 } |
421 | 444 |
422 void TestEncoderDecoderGradient(Encoder* encoder, | 445 void TestEncoderDecoderGradient(Encoder* encoder, |
423 Decoder* decoder, | 446 Decoder* decoder, |
447 const SkISize& screen_size, | |
448 const SkISize& view_size, | |
424 double max_error_limit, | 449 double max_error_limit, |
425 double mean_error_limit) { | 450 double mean_error_limit) { |
426 SkIRect full_frame = SkIRect::MakeWH(kWidth, kHeight); | 451 SkIRect screen_rect = SkIRect::MakeSize(screen_size); |
427 scoped_array<uint8> frame_data(new uint8[kWidth * kHeight * kBytesPerPixel]); | 452 scoped_array<uint8> screen_data(new uint8[ |
428 FillWithGradient(frame_data.get(), SkISize::Make(kWidth, kHeight), | 453 screen_size.width() * screen_size.height() * kBytesPerPixel]); |
429 full_frame); | 454 FillWithGradient(screen_data.get(), screen_size, screen_rect); |
455 | |
456 SkIRect view_rect = SkIRect::MakeSize(view_size); | |
457 scoped_array<uint8> expected_view_data(new uint8[ | |
458 view_size.width() * view_size.height() * kBytesPerPixel]); | |
459 FillWithGradient(expected_view_data.get(), view_size, view_rect); | |
430 | 460 |
431 DataPlanes planes; | 461 DataPlanes planes; |
432 memset(planes.data, 0, sizeof(planes.data)); | 462 memset(planes.data, 0, sizeof(planes.data)); |
433 memset(planes.strides, 0, sizeof(planes.strides)); | 463 memset(planes.strides, 0, sizeof(planes.strides)); |
434 planes.data[0] = frame_data.get(); | 464 planes.data[0] = screen_data.get(); |
435 planes.strides[0] = kWidth * kBytesPerPixel; | 465 planes.strides[0] = screen_size.width() * kBytesPerPixel; |
436 | 466 |
437 scoped_refptr<CaptureData> capture_data = | 467 scoped_refptr<CaptureData> capture_data = |
438 new CaptureData(planes, SkISize::Make(kWidth, kHeight), | 468 new CaptureData(planes, screen_size, media::VideoFrame::RGB32); |
439 media::VideoFrame::RGB32); | 469 capture_data->mutable_dirty_region().op(screen_rect, SkRegion::kUnion_Op); |
440 capture_data->mutable_dirty_region().op(full_frame, SkRegion::kUnion_Op); | |
441 | 470 |
442 DecoderTester decoder_tester(decoder); | 471 DecoderTester decoder_tester(decoder, screen_size, view_size); |
443 decoder_tester.set_capture_data(capture_data); | 472 decoder_tester.set_capture_data(capture_data); |
444 decoder_tester.AddRegion(capture_data->dirty_region()); | 473 decoder_tester.AddRegion(capture_data->dirty_region()); |
445 | 474 |
446 encoder->Encode(capture_data, true, | 475 encoder->Encode(capture_data, true, |
447 base::Bind(&DecoderTester::ReceivedScopedPacket, | 476 base::Bind(&DecoderTester::ReceivedScopedPacket, |
448 base::Unretained(&decoder_tester))); | 477 base::Unretained(&decoder_tester))); |
449 | 478 |
450 decoder_tester.VerifyResultsApprox(max_error_limit, mean_error_limit); | 479 decoder_tester.VerifyResultsApprox(expected_view_data.get(), |
480 max_error_limit, mean_error_limit); | |
481 | |
482 decoder_tester.ResetRenderedData(); | |
483 decoder->Invalidate(view_size, SkRegion(view_rect)); | |
484 decoder_tester.RenderFrame(); | |
485 decoder_tester.VerifyResultsApprox(expected_view_data.get(), | |
Sergey Ulanov
2012/07/27 22:29:37
Not sure why we need this. Is it to make sure that
simonmorris
2012/07/27 23:14:12
Done.
| |
486 max_error_limit, mean_error_limit); | |
451 } | 487 } |
452 | 488 |
453 } // namespace remoting | 489 } // namespace remoting |
OLD | NEW |