Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: remoting/base/codec_test.cc

Issue 10828058: [Chromoting] Add unit tests for up- and down-scaling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Make more allowance for the misbehaving test. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « remoting/base/codec_test.h ('k') | remoting/base/decoder_vp8_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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<std::vector<SkIRect> > MakeTestRectLists(const SkISize& size) {
25 SkIRect::MakeXYWH(0, 0, kWidth, kHeight), 25 std::vector<std::vector<SkIRect> > rect_lists;
26 SkIRect::MakeXYWH(0, 0, kWidth / 2, kHeight / 2), 26 std::vector<SkIRect> rects;
27 SkIRect::MakeXYWH(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), 27 rects.push_back(SkIRect::MakeXYWH(0, 0, size.width(), size.height()));
28 SkIRect::MakeXYWH(16, 16, 16, 16), 28 rect_lists.push_back(rects);
29 SkIRect::MakeXYWH(128, 64, 32, 32), 29 rects.clear();
30 }; 30 rects.push_back(SkIRect::MakeXYWH(0, 0, size.width() / 2, size.height() / 2));
31 rect_lists.push_back(rects);
32 rects.clear();
33 rects.push_back(SkIRect::MakeXYWH(size.width() / 2, size.height() / 2,
34 size.width() / 2, size.height() / 2));
35 rect_lists.push_back(rects);
36 rects.clear();
37 rects.push_back(SkIRect::MakeXYWH(16, 16, 16, 16));
38 rects.push_back(SkIRect::MakeXYWH(128, 64, 32, 32));
39 rect_lists.push_back(rects);
40 return rect_lists;
41 }
42
43 } // namespace
31 44
32 namespace remoting { 45 namespace remoting {
33 46
34 // A class to test the message output of the encoder. 47 // A class to test the message output of the encoder.
35 class EncoderMessageTester { 48 class EncoderMessageTester {
36 public: 49 public:
37 EncoderMessageTester() 50 EncoderMessageTester()
38 : begin_rect_(0), 51 : begin_rect_(0),
39 rect_data_(0), 52 rect_data_(0),
40 end_rect_(0), 53 end_rect_(0),
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 State state_; 126 State state_;
114 bool strict_; 127 bool strict_;
115 128
116 std::deque<SkIRect> rects_; 129 std::deque<SkIRect> rects_;
117 130
118 DISALLOW_COPY_AND_ASSIGN(EncoderMessageTester); 131 DISALLOW_COPY_AND_ASSIGN(EncoderMessageTester);
119 }; 132 };
120 133
121 class DecoderTester { 134 class DecoderTester {
122 public: 135 public:
123 DecoderTester(Decoder* decoder) 136 DecoderTester(Decoder* decoder, const SkISize& screen_size,
124 : strict_(false), 137 const SkISize& view_size)
138 : screen_size_(screen_size),
139 view_size_(view_size),
140 strict_(false),
125 decoder_(decoder) { 141 decoder_(decoder) {
126 image_data_.reset(new uint8[kWidth * kHeight * kBytesPerPixel]); 142 image_data_.reset(new uint8[
143 view_size_.width() * view_size_.height() * kBytesPerPixel]);
127 EXPECT_TRUE(image_data_.get()); 144 EXPECT_TRUE(image_data_.get());
128 decoder_->Initialize(SkISize::Make(kWidth, kHeight)); 145 decoder_->Initialize(screen_size_);
129 } 146 }
130 147
131 void Reset() { 148 void Reset() {
132 expected_region_.setEmpty(); 149 expected_region_.setEmpty();
133 update_region_.setEmpty(); 150 update_region_.setEmpty();
134 } 151 }
135 152
153 void ResetRenderedData() {
154 memset(image_data_.get(), 0,
155 view_size_.width() * view_size_.height() * kBytesPerPixel);
156 }
157
136 void ReceivedPacket(VideoPacket* packet) { 158 void ReceivedPacket(VideoPacket* packet) {
137 Decoder::DecodeResult result = decoder_->DecodePacket(packet); 159 Decoder::DecodeResult result = decoder_->DecodePacket(packet);
138 160
139 ASSERT_NE(Decoder::DECODE_ERROR, result); 161 ASSERT_NE(Decoder::DECODE_ERROR, result);
140 162
141 if (result == Decoder::DECODE_DONE) { 163 if (result == Decoder::DECODE_DONE) {
142 decoder_->RenderFrame(SkISize::Make(kWidth, kHeight), 164 RenderFrame();
143 SkIRect::MakeXYWH(0, 0, kWidth, kHeight),
144 image_data_.get(),
145 kWidth * kBytesPerPixel,
146 &update_region_);
147 } 165 }
148 } 166 }
149 167
168 void RenderFrame() {
169 decoder_->RenderFrame(view_size_,
170 SkIRect::MakeSize(view_size_),
171 image_data_.get(),
172 view_size_.width() * kBytesPerPixel,
173 &update_region_);
174 }
175
150 void ReceivedScopedPacket(scoped_ptr<VideoPacket> packet) { 176 void ReceivedScopedPacket(scoped_ptr<VideoPacket> packet) {
151 ReceivedPacket(packet.get()); 177 ReceivedPacket(packet.get());
152 } 178 }
153 179
154 void set_strict(bool strict) { 180 void set_strict(bool strict) {
155 strict_ = strict; 181 strict_ = strict;
156 } 182 }
157 183
158 void set_capture_data(scoped_refptr<CaptureData> data) { 184 void set_capture_data(scoped_refptr<CaptureData> data) {
159 capture_data_ = data; 185 capture_data_ = data;
(...skipping 11 matching lines...) Expand all
171 197
172 void VerifyResults() { 198 void VerifyResults() {
173 if (!strict_) 199 if (!strict_)
174 return; 200 return;
175 201
176 ASSERT_TRUE(capture_data_.get()); 202 ASSERT_TRUE(capture_data_.get());
177 203
178 // Test the content of the update region. 204 // Test the content of the update region.
179 EXPECT_EQ(expected_region_, update_region_); 205 EXPECT_EQ(expected_region_, update_region_);
180 for (SkRegion::Iterator i(update_region_); !i.done(); i.next()) { 206 for (SkRegion::Iterator i(update_region_); !i.done(); i.next()) {
181 const int stride = kWidth * kBytesPerPixel; 207 const int stride = view_size_.width() * kBytesPerPixel;
182 EXPECT_EQ(stride, capture_data_->data_planes().strides[0]); 208 EXPECT_EQ(stride, capture_data_->data_planes().strides[0]);
183 const int offset = stride * i.rect().top() + 209 const int offset = stride * i.rect().top() +
184 kBytesPerPixel * i.rect().left(); 210 kBytesPerPixel * i.rect().left();
185 const uint8* original = capture_data_->data_planes().data[0] + offset; 211 const uint8* original = capture_data_->data_planes().data[0] + offset;
186 const uint8* decoded = image_data_.get() + offset; 212 const uint8* decoded = image_data_.get() + offset;
187 const int row_size = kBytesPerPixel * i.rect().width(); 213 const int row_size = kBytesPerPixel * i.rect().width();
188 for (int y = 0; y < i.rect().height(); ++y) { 214 for (int y = 0; y < i.rect().height(); ++y) {
189 EXPECT_EQ(0, memcmp(original, decoded, row_size)) 215 EXPECT_EQ(0, memcmp(original, decoded, row_size))
190 << "Row " << y << " is different"; 216 << "Row " << y << " is different";
191 original += stride; 217 original += stride;
192 decoded += stride; 218 decoded += stride;
193 } 219 }
194 } 220 }
195 } 221 }
196 222
197 // The error at each pixel is the root mean square of the errors in 223 // 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 224 // 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. 225 // checks that the maximum and mean pixel errors do not exceed given limits.
200 void VerifyResultsApprox(double max_error_limit, double mean_error_limit) { 226 void VerifyResultsApprox(const uint8* expected_view_data,
201 ASSERT_TRUE(capture_data_.get()); 227 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; 228 double max_error = 0.0;
206 double sum_error = 0.0; 229 double sum_error = 0.0;
207 int error_num = 0; 230 int error_num = 0;
208 for (SkRegion::Iterator i(update_region_); !i.done(); i.next()) { 231 for (SkRegion::Iterator i(update_region_); !i.done(); i.next()) {
209 const int stride = kWidth * kBytesPerPixel; 232 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() + 233 const int offset = stride * i.rect().top() +
212 kBytesPerPixel * i.rect().left(); 234 kBytesPerPixel * i.rect().left();
213 const uint8* original = capture_data_->data_planes().data[0] + offset; 235 const uint8* expected = expected_view_data + offset;
214 const uint8* decoded = image_data_.get() + offset; 236 const uint8* actual = image_data_.get() + offset;
215 for (int y = 0; y < i.rect().height(); ++y) { 237 for (int y = 0; y < i.rect().height(); ++y) {
216 for (int x = 0; x < i.rect().width(); ++x) { 238 for (int x = 0; x < i.rect().width(); ++x) {
217 double error = CalculateError(original, decoded); 239 double error = CalculateError(expected, actual);
218 max_error = std::max(max_error, error); 240 max_error = std::max(max_error, error);
219 sum_error += error; 241 sum_error += error;
220 ++error_num; 242 ++error_num;
221 original += 4; 243 expected += 4;
222 decoded += 4; 244 actual += 4;
223 } 245 }
224 } 246 }
225 } 247 }
226 EXPECT_LE(max_error, max_error_limit); 248 EXPECT_LE(max_error, max_error_limit);
227 double mean_error = sum_error / error_num; 249 double mean_error = sum_error / error_num;
228 EXPECT_LE(mean_error, mean_error_limit); 250 EXPECT_LE(mean_error, mean_error_limit);
229 LOG(INFO) << "Max error: " << max_error; 251 LOG(INFO) << "Max error: " << max_error;
230 LOG(INFO) << "Mean error: " << mean_error; 252 LOG(INFO) << "Mean error: " << mean_error;
231 } 253 }
232 254
233 double CalculateError(const uint8* original, const uint8* decoded) { 255 double CalculateError(const uint8* original, const uint8* decoded) {
234 double error_sum_squares = 0.0; 256 double error_sum_squares = 0.0;
235 for (int i = 0; i < 3; i++) { 257 for (int i = 0; i < 3; i++) {
236 double error = static_cast<double>(*original++) - 258 double error = static_cast<double>(*original++) -
237 static_cast<double>(*decoded++); 259 static_cast<double>(*decoded++);
238 error /= 255.0; 260 error /= 255.0;
239 error_sum_squares += error * error; 261 error_sum_squares += error * error;
240 } 262 }
241 original++; 263 original++;
242 decoded++; 264 decoded++;
243 return sqrt(error_sum_squares / 3.0); 265 return sqrt(error_sum_squares / 3.0);
244 } 266 }
245 267
246 private: 268 private:
269 SkISize screen_size_;
270 SkISize view_size_;
247 bool strict_; 271 bool strict_;
248 SkRegion expected_region_; 272 SkRegion expected_region_;
249 SkRegion update_region_; 273 SkRegion update_region_;
250 Decoder* decoder_; 274 Decoder* decoder_;
251 scoped_array<uint8> image_data_; 275 scoped_array<uint8> image_data_;
252 scoped_refptr<CaptureData> capture_data_; 276 scoped_refptr<CaptureData> capture_data_;
253 277
254 DISALLOW_COPY_AND_ASSIGN(DecoderTester); 278 DISALLOW_COPY_AND_ASSIGN(DecoderTester);
255 }; 279 };
256 280
(...skipping 30 matching lines...) Expand all
287 } 311 }
288 312
289 private: 313 private:
290 EncoderMessageTester* message_tester_; 314 EncoderMessageTester* message_tester_;
291 DecoderTester* decoder_tester_; 315 DecoderTester* decoder_tester_;
292 int data_available_; 316 int data_available_;
293 317
294 DISALLOW_COPY_AND_ASSIGN(EncoderTester); 318 DISALLOW_COPY_AND_ASSIGN(EncoderTester);
295 }; 319 };
296 320
297 scoped_refptr<CaptureData> PrepareEncodeData(media::VideoFrame::Format format, 321 scoped_refptr<CaptureData> PrepareEncodeData(const SkISize& size,
322 media::VideoFrame::Format format,
298 uint8** memory) { 323 uint8** memory) {
299 // TODO(hclam): Support also YUV format. 324 // TODO(hclam): Support also YUV format.
300 CHECK_EQ(format, media::VideoFrame::RGB32); 325 CHECK_EQ(format, media::VideoFrame::RGB32);
301 int size = kWidth * kHeight * kBytesPerPixel; 326 int memory_size = size.width() * size.height() * kBytesPerPixel;
302 327
303 *memory = new uint8[size]; 328 *memory = new uint8[memory_size];
304 srand(0); 329 srand(0);
305 for (int i = 0; i < size; ++i) { 330 for (int i = 0; i < memory_size; ++i) {
306 (*memory)[i] = rand() % 256; 331 (*memory)[i] = rand() % 256;
307 } 332 }
308 333
309 DataPlanes planes; 334 DataPlanes planes;
310 memset(planes.data, 0, sizeof(planes.data)); 335 memset(planes.data, 0, sizeof(planes.data));
311 memset(planes.strides, 0, sizeof(planes.strides)); 336 memset(planes.strides, 0, sizeof(planes.strides));
312 planes.data[0] = *memory; 337 planes.data[0] = *memory;
313 planes.strides[0] = kWidth * kBytesPerPixel; 338 planes.strides[0] = size.width() * kBytesPerPixel;
314 339
315 scoped_refptr<CaptureData> data = 340 scoped_refptr<CaptureData> data =
316 new CaptureData(planes, SkISize::Make(kWidth, kHeight), format); 341 new CaptureData(planes, size, format);
317 return data; 342 return data;
318 } 343 }
319 344
320 static void TestEncodingRects(Encoder* encoder, 345 static void TestEncodingRects(Encoder* encoder,
321 EncoderTester* tester, 346 EncoderTester* tester,
322 scoped_refptr<CaptureData> data, 347 scoped_refptr<CaptureData> data,
323 const SkIRect* rects, int count) { 348 const SkIRect* rects, int count) {
324 data->mutable_dirty_region().setEmpty(); 349 data->mutable_dirty_region().setEmpty();
325 for (int i = 0; i < count; ++i) { 350 for (int i = 0; i < count; ++i) {
326 data->mutable_dirty_region().op(rects[i], SkRegion::kUnion_Op); 351 data->mutable_dirty_region().op(rects[i], SkRegion::kUnion_Op);
327 } 352 }
328 tester->AddRects(rects, count); 353 tester->AddRects(rects, count);
329 354
330 encoder->Encode(data, true, base::Bind( 355 encoder->Encode(data, true, base::Bind(
331 &EncoderTester::DataAvailable, base::Unretained(tester))); 356 &EncoderTester::DataAvailable, base::Unretained(tester)));
332 } 357 }
333 358
334 void TestEncoder(Encoder* encoder, bool strict) { 359 void TestEncoder(Encoder* encoder, bool strict) {
360 SkISize kSize = SkISize::Make(320, 240);
361
335 EncoderMessageTester message_tester; 362 EncoderMessageTester message_tester;
336 message_tester.set_strict(strict); 363 message_tester.set_strict(strict);
337 364
338 EncoderTester tester(&message_tester); 365 EncoderTester tester(&message_tester);
339 366
340 uint8* memory; 367 uint8* memory;
341 scoped_refptr<CaptureData> data = 368 scoped_refptr<CaptureData> data =
342 PrepareEncodeData(media::VideoFrame::RGB32, &memory); 369 PrepareEncodeData(kSize, media::VideoFrame::RGB32, &memory);
343 scoped_array<uint8> memory_wrapper(memory); 370 scoped_array<uint8> memory_wrapper(memory);
344 371
345 TestEncodingRects(encoder, &tester, data, kTestRects, 1); 372 std::vector<std::vector<SkIRect> > test_rect_lists = MakeTestRectLists(kSize);
346 TestEncodingRects(encoder, &tester, data, kTestRects + 1, 1); 373 for (size_t i = 0; i < test_rect_lists.size(); ++i) {
347 TestEncodingRects(encoder, &tester, data, kTestRects + 2, 1); 374 const std::vector<SkIRect>& test_rects = test_rect_lists[i];
348 TestEncodingRects(encoder, &tester, data, kTestRects + 3, 2); 375 TestEncodingRects(encoder, &tester, data,
376 &test_rects[0], test_rects.size());
377 }
349 } 378 }
350 379
351 static void TestEncodeDecodeRects(Encoder* encoder, 380 static void TestEncodeDecodeRects(Encoder* encoder,
352 EncoderTester* encoder_tester, 381 EncoderTester* encoder_tester,
353 DecoderTester* decoder_tester, 382 DecoderTester* decoder_tester,
354 scoped_refptr<CaptureData> data, 383 scoped_refptr<CaptureData> data,
355 const SkIRect* rects, int count) { 384 const SkIRect* rects, int count) {
356 data->mutable_dirty_region().setRects(rects, count); 385 data->mutable_dirty_region().setRects(rects, count);
357 encoder_tester->AddRects(rects, count); 386 encoder_tester->AddRects(rects, count);
358 decoder_tester->AddRects(rects, count); 387 decoder_tester->AddRects(rects, count);
(...skipping 14 matching lines...) Expand all
373 } 402 }
374 } 403 }
375 404
376 encoder->Encode(data, true, base::Bind(&EncoderTester::DataAvailable, 405 encoder->Encode(data, true, base::Bind(&EncoderTester::DataAvailable,
377 base::Unretained(encoder_tester))); 406 base::Unretained(encoder_tester)));
378 decoder_tester->VerifyResults(); 407 decoder_tester->VerifyResults();
379 decoder_tester->Reset(); 408 decoder_tester->Reset();
380 } 409 }
381 410
382 void TestEncoderDecoder(Encoder* encoder, Decoder* decoder, bool strict) { 411 void TestEncoderDecoder(Encoder* encoder, Decoder* decoder, bool strict) {
412 SkISize kSize = SkISize::Make(320, 240);
413
383 EncoderMessageTester message_tester; 414 EncoderMessageTester message_tester;
384 message_tester.set_strict(strict); 415 message_tester.set_strict(strict);
385 416
386 EncoderTester encoder_tester(&message_tester); 417 EncoderTester encoder_tester(&message_tester);
387 418
388 uint8* memory; 419 uint8* memory;
389 scoped_refptr<CaptureData> data = 420 scoped_refptr<CaptureData> data =
390 PrepareEncodeData(media::VideoFrame::RGB32, &memory); 421 PrepareEncodeData(kSize, media::VideoFrame::RGB32, &memory);
391 scoped_array<uint8> memory_wrapper(memory); 422 scoped_array<uint8> memory_wrapper(memory);
392 423
393 DecoderTester decoder_tester(decoder); 424 DecoderTester decoder_tester(decoder, kSize, kSize);
394 decoder_tester.set_strict(strict); 425 decoder_tester.set_strict(strict);
395 decoder_tester.set_capture_data(data); 426 decoder_tester.set_capture_data(data);
396 encoder_tester.set_decoder_tester(&decoder_tester); 427 encoder_tester.set_decoder_tester(&decoder_tester);
397 428
398 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, 429 std::vector<std::vector<SkIRect> > test_rect_lists = MakeTestRectLists(kSize);
399 kTestRects, 1); 430 for (size_t i = 0; i < test_rect_lists.size(); ++i) {
400 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, 431 const std::vector<SkIRect> test_rects = test_rect_lists[i];
401 kTestRects + 1, 1); 432 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data,
402 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data, 433 &test_rects[0], test_rects.size());
403 kTestRects + 2, 1); 434 }
404 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, data,
405 kTestRects + 3, 2);
406 } 435 }
407 436
408 static void FillWithGradient(uint8* memory, const SkISize& frame_size, 437 static void FillWithGradient(uint8* memory, const SkISize& frame_size,
409 const SkIRect& rect) { 438 const SkIRect& rect) {
410 for (int j = rect.top(); j < rect.bottom(); ++j) { 439 for (int j = rect.top(); j < rect.bottom(); ++j) {
411 uint8* p = memory + ((j * frame_size.width()) + rect.left()) * 4; 440 uint8* p = memory + ((j * frame_size.width()) + rect.left()) * 4;
412 for (int i = rect.left(); i < rect.right(); ++i) { 441 for (int i = rect.left(); i < rect.right(); ++i) {
413 *p++ = static_cast<uint8>((255.0 * i) / frame_size.width()); 442 *p++ = static_cast<uint8>((255.0 * i) / frame_size.width());
414 *p++ = static_cast<uint8>((164.0 * j) / frame_size.height()); 443 *p++ = static_cast<uint8>((164.0 * j) / frame_size.height());
415 *p++ = static_cast<uint8>((82.0 * (i + j)) / 444 *p++ = static_cast<uint8>((82.0 * (i + j)) /
416 (frame_size.width() + frame_size.height())); 445 (frame_size.width() + frame_size.height()));
417 *p++ = 0; 446 *p++ = 0;
418 } 447 }
419 } 448 }
420 } 449 }
421 450
422 void TestEncoderDecoderGradient(Encoder* encoder, 451 void TestEncoderDecoderGradient(Encoder* encoder,
423 Decoder* decoder, 452 Decoder* decoder,
453 const SkISize& screen_size,
454 const SkISize& view_size,
424 double max_error_limit, 455 double max_error_limit,
425 double mean_error_limit) { 456 double mean_error_limit) {
426 SkIRect full_frame = SkIRect::MakeWH(kWidth, kHeight); 457 SkIRect screen_rect = SkIRect::MakeSize(screen_size);
427 scoped_array<uint8> frame_data(new uint8[kWidth * kHeight * kBytesPerPixel]); 458 scoped_array<uint8> screen_data(new uint8[
428 FillWithGradient(frame_data.get(), SkISize::Make(kWidth, kHeight), 459 screen_size.width() * screen_size.height() * kBytesPerPixel]);
429 full_frame); 460 FillWithGradient(screen_data.get(), screen_size, screen_rect);
461
462 SkIRect view_rect = SkIRect::MakeSize(view_size);
463 scoped_array<uint8> expected_view_data(new uint8[
464 view_size.width() * view_size.height() * kBytesPerPixel]);
465 FillWithGradient(expected_view_data.get(), view_size, view_rect);
430 466
431 DataPlanes planes; 467 DataPlanes planes;
432 memset(planes.data, 0, sizeof(planes.data)); 468 memset(planes.data, 0, sizeof(planes.data));
433 memset(planes.strides, 0, sizeof(planes.strides)); 469 memset(planes.strides, 0, sizeof(planes.strides));
434 planes.data[0] = frame_data.get(); 470 planes.data[0] = screen_data.get();
435 planes.strides[0] = kWidth * kBytesPerPixel; 471 planes.strides[0] = screen_size.width() * kBytesPerPixel;
436 472
437 scoped_refptr<CaptureData> capture_data = 473 scoped_refptr<CaptureData> capture_data =
438 new CaptureData(planes, SkISize::Make(kWidth, kHeight), 474 new CaptureData(planes, screen_size, media::VideoFrame::RGB32);
439 media::VideoFrame::RGB32); 475 capture_data->mutable_dirty_region().op(screen_rect, SkRegion::kUnion_Op);
440 capture_data->mutable_dirty_region().op(full_frame, SkRegion::kUnion_Op);
441 476
442 DecoderTester decoder_tester(decoder); 477 DecoderTester decoder_tester(decoder, screen_size, view_size);
443 decoder_tester.set_capture_data(capture_data); 478 decoder_tester.set_capture_data(capture_data);
444 decoder_tester.AddRegion(capture_data->dirty_region()); 479 decoder_tester.AddRegion(capture_data->dirty_region());
445 480
446 encoder->Encode(capture_data, true, 481 encoder->Encode(capture_data, true,
447 base::Bind(&DecoderTester::ReceivedScopedPacket, 482 base::Bind(&DecoderTester::ReceivedScopedPacket,
448 base::Unretained(&decoder_tester))); 483 base::Unretained(&decoder_tester)));
449 484
450 decoder_tester.VerifyResultsApprox(max_error_limit, mean_error_limit); 485 decoder_tester.VerifyResultsApprox(expected_view_data.get(),
486 max_error_limit, mean_error_limit);
487
488 // Check that the decoder correctly re-renders the frame if its client
489 // invalidates the frame.
490 decoder_tester.ResetRenderedData();
491 decoder->Invalidate(view_size, SkRegion(view_rect));
492 decoder_tester.RenderFrame();
493 decoder_tester.VerifyResultsApprox(expected_view_data.get(),
494 max_error_limit, mean_error_limit);
451 } 495 }
452 496
453 } // namespace remoting 497 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/base/codec_test.h ('k') | remoting/base/decoder_vp8_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698