| 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<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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |