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

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: 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
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<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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698