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" |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 int end_rect_; | 123 int end_rect_; |
124 int added_rects_; | 124 int added_rects_; |
125 State state_; | 125 State state_; |
126 bool strict_; | 126 bool strict_; |
127 | 127 |
128 std::deque<SkIRect> rects_; | 128 std::deque<SkIRect> rects_; |
129 | 129 |
130 DISALLOW_COPY_AND_ASSIGN(EncoderMessageTester); | 130 DISALLOW_COPY_AND_ASSIGN(EncoderMessageTester); |
131 }; | 131 }; |
132 | 132 |
133 class DecoderTester { | 133 class VideoDecoderTester { |
134 public: | 134 public: |
135 DecoderTester(Decoder* decoder, const SkISize& screen_size, | 135 VideoDecoderTester(VideoDecoder* decoder, const SkISize& screen_size, |
136 const SkISize& view_size) | 136 const SkISize& view_size) |
137 : screen_size_(screen_size), | 137 : screen_size_(screen_size), |
138 view_size_(view_size), | 138 view_size_(view_size), |
139 strict_(false), | 139 strict_(false), |
140 decoder_(decoder) { | 140 decoder_(decoder) { |
141 image_data_.reset(new uint8[ | 141 image_data_.reset(new uint8[ |
142 view_size_.width() * view_size_.height() * kBytesPerPixel]); | 142 view_size_.width() * view_size_.height() * kBytesPerPixel]); |
143 EXPECT_TRUE(image_data_.get()); | 143 EXPECT_TRUE(image_data_.get()); |
144 decoder_->Initialize(screen_size_); | 144 decoder_->Initialize(screen_size_); |
145 } | 145 } |
146 | 146 |
147 void Reset() { | 147 void Reset() { |
148 expected_region_.setEmpty(); | 148 expected_region_.setEmpty(); |
149 update_region_.setEmpty(); | 149 update_region_.setEmpty(); |
150 } | 150 } |
151 | 151 |
152 void ResetRenderedData() { | 152 void ResetRenderedData() { |
153 memset(image_data_.get(), 0, | 153 memset(image_data_.get(), 0, |
154 view_size_.width() * view_size_.height() * kBytesPerPixel); | 154 view_size_.width() * view_size_.height() * kBytesPerPixel); |
155 } | 155 } |
156 | 156 |
157 void ReceivedPacket(VideoPacket* packet) { | 157 void ReceivedPacket(VideoPacket* packet) { |
158 Decoder::DecodeResult result = decoder_->DecodePacket(packet); | 158 VideoDecoder::DecodeResult result = decoder_->DecodePacket(packet); |
159 | 159 |
160 ASSERT_NE(Decoder::DECODE_ERROR, result); | 160 ASSERT_NE(VideoDecoder::DECODE_ERROR, result); |
161 | 161 |
162 if (result == Decoder::DECODE_DONE) { | 162 if (result == VideoDecoder::DECODE_DONE) { |
163 RenderFrame(); | 163 RenderFrame(); |
164 } | 164 } |
165 } | 165 } |
166 | 166 |
167 void RenderFrame() { | 167 void RenderFrame() { |
168 decoder_->RenderFrame(view_size_, | 168 decoder_->RenderFrame(view_size_, |
169 SkIRect::MakeSize(view_size_), | 169 SkIRect::MakeSize(view_size_), |
170 image_data_.get(), | 170 image_data_.get(), |
171 view_size_.width() * kBytesPerPixel, | 171 view_size_.width() * kBytesPerPixel, |
172 &update_region_); | 172 &update_region_); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 decoded++; | 263 decoded++; |
264 return sqrt(error_sum_squares / 3.0); | 264 return sqrt(error_sum_squares / 3.0); |
265 } | 265 } |
266 | 266 |
267 private: | 267 private: |
268 SkISize screen_size_; | 268 SkISize screen_size_; |
269 SkISize view_size_; | 269 SkISize view_size_; |
270 bool strict_; | 270 bool strict_; |
271 SkRegion expected_region_; | 271 SkRegion expected_region_; |
272 SkRegion update_region_; | 272 SkRegion update_region_; |
273 Decoder* decoder_; | 273 VideoDecoder* decoder_; |
274 scoped_array<uint8> image_data_; | 274 scoped_array<uint8> image_data_; |
275 scoped_refptr<CaptureData> capture_data_; | 275 scoped_refptr<CaptureData> capture_data_; |
276 | 276 |
277 DISALLOW_COPY_AND_ASSIGN(DecoderTester); | 277 DISALLOW_COPY_AND_ASSIGN(VideoDecoderTester); |
278 }; | 278 }; |
279 | 279 |
280 // The EncoderTester provides a hook for retrieving the data, and passing the | 280 // The EncoderTester provides a hook for retrieving the data, and passing the |
281 // message to other subprograms for validaton. | 281 // message to other subprograms for validaton. |
282 class EncoderTester { | 282 class EncoderTester { |
283 public: | 283 public: |
284 EncoderTester(EncoderMessageTester* message_tester) | 284 EncoderTester(EncoderMessageTester* message_tester) |
285 : message_tester_(message_tester), | 285 : message_tester_(message_tester), |
286 decoder_tester_(NULL), | 286 decoder_tester_(NULL), |
287 data_available_(0) { | 287 data_available_(0) { |
288 } | 288 } |
289 | 289 |
290 ~EncoderTester() { | 290 ~EncoderTester() { |
291 EXPECT_GT(data_available_, 0); | 291 EXPECT_GT(data_available_, 0); |
292 } | 292 } |
293 | 293 |
294 void DataAvailable(scoped_ptr<VideoPacket> packet) { | 294 void DataAvailable(scoped_ptr<VideoPacket> packet) { |
295 ++data_available_; | 295 ++data_available_; |
296 message_tester_->ReceivedPacket(packet.get()); | 296 message_tester_->ReceivedPacket(packet.get()); |
297 | 297 |
298 // Send the message to the DecoderTester. | 298 // Send the message to the VideoDecoderTester. |
299 if (decoder_tester_) { | 299 if (decoder_tester_) { |
300 decoder_tester_->ReceivedPacket(packet.get()); | 300 decoder_tester_->ReceivedPacket(packet.get()); |
301 } | 301 } |
302 } | 302 } |
303 | 303 |
304 void AddRects(const SkIRect* rects, int count) { | 304 void AddRects(const SkIRect* rects, int count) { |
305 message_tester_->AddRects(rects, count); | 305 message_tester_->AddRects(rects, count); |
306 } | 306 } |
307 | 307 |
308 void set_decoder_tester(DecoderTester* decoder_tester) { | 308 void set_decoder_tester(VideoDecoderTester* decoder_tester) { |
309 decoder_tester_ = decoder_tester; | 309 decoder_tester_ = decoder_tester; |
310 } | 310 } |
311 | 311 |
312 private: | 312 private: |
313 EncoderMessageTester* message_tester_; | 313 EncoderMessageTester* message_tester_; |
314 DecoderTester* decoder_tester_; | 314 VideoDecoderTester* decoder_tester_; |
315 int data_available_; | 315 int data_available_; |
316 | 316 |
317 DISALLOW_COPY_AND_ASSIGN(EncoderTester); | 317 DISALLOW_COPY_AND_ASSIGN(EncoderTester); |
318 }; | 318 }; |
319 | 319 |
320 scoped_refptr<CaptureData> PrepareEncodeData(const SkISize& size, | 320 scoped_refptr<CaptureData> PrepareEncodeData(const SkISize& size, |
321 media::VideoFrame::Format format, | 321 media::VideoFrame::Format format, |
322 uint8** memory) { | 322 uint8** memory) { |
323 // TODO(hclam): Support also YUV format. | 323 // TODO(hclam): Support also YUV format. |
324 CHECK_EQ(format, media::VideoFrame::RGB32); | 324 CHECK_EQ(format, media::VideoFrame::RGB32); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 std::vector<std::vector<SkIRect> > test_rect_lists = MakeTestRectLists(kSize); | 371 std::vector<std::vector<SkIRect> > test_rect_lists = MakeTestRectLists(kSize); |
372 for (size_t i = 0; i < test_rect_lists.size(); ++i) { | 372 for (size_t i = 0; i < test_rect_lists.size(); ++i) { |
373 const std::vector<SkIRect>& test_rects = test_rect_lists[i]; | 373 const std::vector<SkIRect>& test_rects = test_rect_lists[i]; |
374 TestEncodingRects(encoder, &tester, data, | 374 TestEncodingRects(encoder, &tester, data, |
375 &test_rects[0], test_rects.size()); | 375 &test_rects[0], test_rects.size()); |
376 } | 376 } |
377 } | 377 } |
378 | 378 |
379 static void TestEncodeDecodeRects(Encoder* encoder, | 379 static void TestEncodeDecodeRects(Encoder* encoder, |
380 EncoderTester* encoder_tester, | 380 EncoderTester* encoder_tester, |
381 DecoderTester* decoder_tester, | 381 VideoDecoderTester* decoder_tester, |
382 scoped_refptr<CaptureData> data, | 382 scoped_refptr<CaptureData> data, |
383 const SkIRect* rects, int count) { | 383 const SkIRect* rects, int count) { |
384 data->mutable_dirty_region().setRects(rects, count); | 384 data->mutable_dirty_region().setRects(rects, count); |
385 encoder_tester->AddRects(rects, count); | 385 encoder_tester->AddRects(rects, count); |
386 decoder_tester->AddRects(rects, count); | 386 decoder_tester->AddRects(rects, count); |
387 | 387 |
388 // Generate random data for the updated region. | 388 // Generate random data for the updated region. |
389 srand(0); | 389 srand(0); |
390 for (int i = 0; i < count; ++i) { | 390 for (int i = 0; i < count; ++i) { |
391 CHECK_EQ(data->pixel_format(), media::VideoFrame::RGB32); | 391 CHECK_EQ(data->pixel_format(), media::VideoFrame::RGB32); |
392 const int bytes_per_pixel = 4; // Because of RGB32 on previous line. | 392 const int bytes_per_pixel = 4; // Because of RGB32 on previous line. |
393 const int row_size = bytes_per_pixel * rects[i].width(); | 393 const int row_size = bytes_per_pixel * rects[i].width(); |
394 uint8* memory = data->data_planes().data[0] + | 394 uint8* memory = data->data_planes().data[0] + |
395 data->data_planes().strides[0] * rects[i].top() + | 395 data->data_planes().strides[0] * rects[i].top() + |
396 bytes_per_pixel * rects[i].left(); | 396 bytes_per_pixel * rects[i].left(); |
397 for (int y = 0; y < rects[i].height(); ++y) { | 397 for (int y = 0; y < rects[i].height(); ++y) { |
398 for (int x = 0; x < row_size; ++x) | 398 for (int x = 0; x < row_size; ++x) |
399 memory[x] = rand() % 256; | 399 memory[x] = rand() % 256; |
400 memory += data->data_planes().strides[0]; | 400 memory += data->data_planes().strides[0]; |
401 } | 401 } |
402 } | 402 } |
403 | 403 |
404 encoder->Encode(data, true, base::Bind(&EncoderTester::DataAvailable, | 404 encoder->Encode(data, true, base::Bind(&EncoderTester::DataAvailable, |
405 base::Unretained(encoder_tester))); | 405 base::Unretained(encoder_tester))); |
406 decoder_tester->VerifyResults(); | 406 decoder_tester->VerifyResults(); |
407 decoder_tester->Reset(); | 407 decoder_tester->Reset(); |
408 } | 408 } |
409 | 409 |
410 void TestEncoderDecoder(Encoder* encoder, Decoder* decoder, bool strict) { | 410 void TestEncoderDecoder(Encoder* encoder, VideoDecoder* decoder, bool strict) { |
411 SkISize kSize = SkISize::Make(320, 240); | 411 SkISize kSize = SkISize::Make(320, 240); |
412 | 412 |
413 EncoderMessageTester message_tester; | 413 EncoderMessageTester message_tester; |
414 message_tester.set_strict(strict); | 414 message_tester.set_strict(strict); |
415 | 415 |
416 EncoderTester encoder_tester(&message_tester); | 416 EncoderTester encoder_tester(&message_tester); |
417 | 417 |
418 uint8* memory; | 418 uint8* memory; |
419 scoped_refptr<CaptureData> data = | 419 scoped_refptr<CaptureData> data = |
420 PrepareEncodeData(kSize, media::VideoFrame::RGB32, &memory); | 420 PrepareEncodeData(kSize, media::VideoFrame::RGB32, &memory); |
421 scoped_array<uint8> memory_wrapper(memory); | 421 scoped_array<uint8> memory_wrapper(memory); |
422 | 422 |
423 DecoderTester decoder_tester(decoder, kSize, kSize); | 423 VideoDecoderTester decoder_tester(decoder, kSize, kSize); |
424 decoder_tester.set_strict(strict); | 424 decoder_tester.set_strict(strict); |
425 decoder_tester.set_capture_data(data); | 425 decoder_tester.set_capture_data(data); |
426 encoder_tester.set_decoder_tester(&decoder_tester); | 426 encoder_tester.set_decoder_tester(&decoder_tester); |
427 | 427 |
428 std::vector<std::vector<SkIRect> > test_rect_lists = MakeTestRectLists(kSize); | 428 std::vector<std::vector<SkIRect> > test_rect_lists = MakeTestRectLists(kSize); |
429 for (size_t i = 0; i < test_rect_lists.size(); ++i) { | 429 for (size_t i = 0; i < test_rect_lists.size(); ++i) { |
430 const std::vector<SkIRect> test_rects = test_rect_lists[i]; | 430 const std::vector<SkIRect> test_rects = test_rect_lists[i]; |
431 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, | 431 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, |
432 &test_rects[0], test_rects.size()); | 432 &test_rects[0], test_rects.size()); |
433 } | 433 } |
434 } | 434 } |
435 | 435 |
436 static void FillWithGradient(uint8* memory, const SkISize& frame_size, | 436 static void FillWithGradient(uint8* memory, const SkISize& frame_size, |
437 const SkIRect& rect) { | 437 const SkIRect& rect) { |
438 for (int j = rect.top(); j < rect.bottom(); ++j) { | 438 for (int j = rect.top(); j < rect.bottom(); ++j) { |
439 uint8* p = memory + ((j * frame_size.width()) + rect.left()) * 4; | 439 uint8* p = memory + ((j * frame_size.width()) + rect.left()) * 4; |
440 for (int i = rect.left(); i < rect.right(); ++i) { | 440 for (int i = rect.left(); i < rect.right(); ++i) { |
441 *p++ = static_cast<uint8>((255.0 * i) / frame_size.width()); | 441 *p++ = static_cast<uint8>((255.0 * i) / frame_size.width()); |
442 *p++ = static_cast<uint8>((164.0 * j) / frame_size.height()); | 442 *p++ = static_cast<uint8>((164.0 * j) / frame_size.height()); |
443 *p++ = static_cast<uint8>((82.0 * (i + j)) / | 443 *p++ = static_cast<uint8>((82.0 * (i + j)) / |
444 (frame_size.width() + frame_size.height())); | 444 (frame_size.width() + frame_size.height())); |
445 *p++ = 0; | 445 *p++ = 0; |
446 } | 446 } |
447 } | 447 } |
448 } | 448 } |
449 | 449 |
450 void TestEncoderDecoderGradient(Encoder* encoder, | 450 void TestEncoderDecoderGradient(Encoder* encoder, |
451 Decoder* decoder, | 451 VideoDecoder* decoder, |
452 const SkISize& screen_size, | 452 const SkISize& screen_size, |
453 const SkISize& view_size, | 453 const SkISize& view_size, |
454 double max_error_limit, | 454 double max_error_limit, |
455 double mean_error_limit) { | 455 double mean_error_limit) { |
456 SkIRect screen_rect = SkIRect::MakeSize(screen_size); | 456 SkIRect screen_rect = SkIRect::MakeSize(screen_size); |
457 scoped_array<uint8> screen_data(new uint8[ | 457 scoped_array<uint8> screen_data(new uint8[ |
458 screen_size.width() * screen_size.height() * kBytesPerPixel]); | 458 screen_size.width() * screen_size.height() * kBytesPerPixel]); |
459 FillWithGradient(screen_data.get(), screen_size, screen_rect); | 459 FillWithGradient(screen_data.get(), screen_size, screen_rect); |
460 | 460 |
461 SkIRect view_rect = SkIRect::MakeSize(view_size); | 461 SkIRect view_rect = SkIRect::MakeSize(view_size); |
462 scoped_array<uint8> expected_view_data(new uint8[ | 462 scoped_array<uint8> expected_view_data(new uint8[ |
463 view_size.width() * view_size.height() * kBytesPerPixel]); | 463 view_size.width() * view_size.height() * kBytesPerPixel]); |
464 FillWithGradient(expected_view_data.get(), view_size, view_rect); | 464 FillWithGradient(expected_view_data.get(), view_size, view_rect); |
465 | 465 |
466 DataPlanes planes; | 466 DataPlanes planes; |
467 memset(planes.data, 0, sizeof(planes.data)); | 467 memset(planes.data, 0, sizeof(planes.data)); |
468 memset(planes.strides, 0, sizeof(planes.strides)); | 468 memset(planes.strides, 0, sizeof(planes.strides)); |
469 planes.data[0] = screen_data.get(); | 469 planes.data[0] = screen_data.get(); |
470 planes.strides[0] = screen_size.width() * kBytesPerPixel; | 470 planes.strides[0] = screen_size.width() * kBytesPerPixel; |
471 | 471 |
472 scoped_refptr<CaptureData> capture_data = | 472 scoped_refptr<CaptureData> capture_data = |
473 new CaptureData(planes, screen_size, media::VideoFrame::RGB32); | 473 new CaptureData(planes, screen_size, media::VideoFrame::RGB32); |
474 capture_data->mutable_dirty_region().op(screen_rect, SkRegion::kUnion_Op); | 474 capture_data->mutable_dirty_region().op(screen_rect, SkRegion::kUnion_Op); |
475 | 475 |
476 DecoderTester decoder_tester(decoder, screen_size, view_size); | 476 VideoDecoderTester decoder_tester(decoder, screen_size, view_size); |
477 decoder_tester.set_capture_data(capture_data); | 477 decoder_tester.set_capture_data(capture_data); |
478 decoder_tester.AddRegion(capture_data->dirty_region()); | 478 decoder_tester.AddRegion(capture_data->dirty_region()); |
479 | 479 |
480 encoder->Encode(capture_data, true, | 480 encoder->Encode(capture_data, true, |
481 base::Bind(&DecoderTester::ReceivedScopedPacket, | 481 base::Bind(&VideoDecoderTester::ReceivedScopedPacket, |
482 base::Unretained(&decoder_tester))); | 482 base::Unretained(&decoder_tester))); |
483 | 483 |
484 decoder_tester.VerifyResultsApprox(expected_view_data.get(), | 484 decoder_tester.VerifyResultsApprox(expected_view_data.get(), |
485 max_error_limit, mean_error_limit); | 485 max_error_limit, mean_error_limit); |
486 | 486 |
487 // Check that the decoder correctly re-renders the frame if its client | 487 // Check that the decoder correctly re-renders the frame if its client |
488 // invalidates the frame. | 488 // invalidates the frame. |
489 decoder_tester.ResetRenderedData(); | 489 decoder_tester.ResetRenderedData(); |
490 decoder->Invalidate(view_size, SkRegion(view_rect)); | 490 decoder->Invalidate(view_size, SkRegion(view_rect)); |
491 decoder_tester.RenderFrame(); | 491 decoder_tester.RenderFrame(); |
492 decoder_tester.VerifyResultsApprox(expected_view_data.get(), | 492 decoder_tester.VerifyResultsApprox(expected_view_data.get(), |
493 max_error_limit, mean_error_limit); | 493 max_error_limit, mean_error_limit); |
494 } | 494 } |
495 | 495 |
496 } // namespace remoting | 496 } // namespace remoting |
OLD | NEW |