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

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

Issue 7622002: Revert 96327 - Switch over to using SkRegions to calculate dirty areas. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 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/capture_data.cc ('k') | remoting/base/decoder.h » ('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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/memory/scoped_ptr.h"
9 #include "media/base/video_frame.h" 8 #include "media/base/video_frame.h"
10 #include "remoting/base/base_mock_objects.h" 9 #include "remoting/base/base_mock_objects.h"
11 #include "remoting/base/codec_test.h" 10 #include "remoting/base/codec_test.h"
12 #include "remoting/base/decoder.h" 11 #include "remoting/base/decoder.h"
13 #include "remoting/base/encoder.h" 12 #include "remoting/base/encoder.h"
14 #include "remoting/base/util.h" 13 #include "remoting/base/util.h"
15 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "ui/gfx/rect.h"
16 16
17 static const int kWidth = 320; 17 static const int kWidth = 320;
18 static const int kHeight = 240; 18 static const int kHeight = 240;
19 static const int kBytesPerPixel = 4; 19 static const int kBytesPerPixel = 4;
20 20
21 // Some sample rects for testing. 21 // Some sample rects for testing.
22 static const SkIRect kTestRects[] = { 22 static const gfx::Rect kTestRects[] = {
23 SkIRect::MakeXYWH(0, 0, kWidth, kHeight), 23 gfx::Rect(0, 0, kWidth, kHeight),
24 SkIRect::MakeXYWH(0, 0, kWidth / 2, kHeight / 2), 24 gfx::Rect(0, 0, kWidth / 2, kHeight / 2),
25 SkIRect::MakeXYWH(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), 25 gfx::Rect(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2),
26 SkIRect::MakeXYWH(16, 16, 16, 16), 26 gfx::Rect(16, 16, 16, 16),
27 SkIRect::MakeXYWH(128, 64, 32, 32), 27 gfx::Rect(128, 64, 32, 32),
28 }; 28 };
29 29
30 namespace remoting { 30 namespace remoting {
31 31
32 // A class to test the message output of the encoder. 32 // A class to test the message output of the encoder.
33 class EncoderMessageTester { 33 class EncoderMessageTester {
34 public: 34 public:
35 EncoderMessageTester() 35 EncoderMessageTester()
36 : begin_rect_(0), 36 : begin_rect_(0),
37 rect_data_(0), 37 rect_data_(0),
(...skipping 13 matching lines...) Expand all
51 } 51 }
52 52
53 // Test that we received the correct packet. 53 // Test that we received the correct packet.
54 void ReceivedPacket(VideoPacket* packet) { 54 void ReceivedPacket(VideoPacket* packet) {
55 if (state_ == kWaitingForBeginRect) { 55 if (state_ == kWaitingForBeginRect) {
56 EXPECT_TRUE((packet->flags() & VideoPacket::FIRST_PACKET) != 0); 56 EXPECT_TRUE((packet->flags() & VideoPacket::FIRST_PACKET) != 0);
57 state_ = kWaitingForRectData; 57 state_ = kWaitingForRectData;
58 ++begin_rect_; 58 ++begin_rect_;
59 59
60 if (strict_) { 60 if (strict_) {
61 SkIRect rect = rects_.front(); 61 gfx::Rect rect = rects_.front();
62 rects_.pop_front(); 62 rects_.pop_front();
63 EXPECT_EQ(rect.fLeft, packet->format().x()); 63 EXPECT_EQ(rect.x(), packet->format().x());
64 EXPECT_EQ(rect.fTop, packet->format().y()); 64 EXPECT_EQ(rect.y(), packet->format().y());
65 EXPECT_EQ(rect.width(), packet->format().width()); 65 EXPECT_EQ(rect.width(), packet->format().width());
66 EXPECT_EQ(rect.height(), packet->format().height()); 66 EXPECT_EQ(rect.height(), packet->format().height());
67 } 67 }
68 } else { 68 } else {
69 EXPECT_FALSE((packet->flags() & VideoPacket::FIRST_PACKET) != 0); 69 EXPECT_FALSE((packet->flags() & VideoPacket::FIRST_PACKET) != 0);
70 } 70 }
71 71
72 if (state_ == kWaitingForRectData) { 72 if (state_ == kWaitingForRectData) {
73 if (packet->has_data()) { 73 if (packet->has_data()) {
74 ++rect_data_; 74 ++rect_data_;
(...skipping 11 matching lines...) Expand all
86 // LAST_PARTITION must always be marked with LAST_PACKET. 86 // LAST_PARTITION must always be marked with LAST_PACKET.
87 EXPECT_TRUE((packet->flags() & VideoPacket::LAST_PACKET) != 0); 87 EXPECT_TRUE((packet->flags() & VideoPacket::LAST_PACKET) != 0);
88 } 88 }
89 } 89 }
90 } 90 }
91 91
92 void set_strict(bool strict) { 92 void set_strict(bool strict) {
93 strict_ = strict; 93 strict_ = strict;
94 } 94 }
95 95
96 void AddRects(const SkIRect* rects, int count) { 96 void AddRects(const gfx::Rect* rects, int count) {
97 rects_.insert(rects_.begin() + rects_.size(), rects, rects + count); 97 rects_.insert(rects_.begin() + rects_.size(), rects, rects + count);
98 added_rects_ += count; 98 added_rects_ += count;
99 } 99 }
100 100
101 private: 101 private:
102 enum State { 102 enum State {
103 kWaitingForBeginRect, 103 kWaitingForBeginRect,
104 kWaitingForRectData, 104 kWaitingForRectData,
105 }; 105 };
106 106
107 int begin_rect_; 107 int begin_rect_;
108 int rect_data_; 108 int rect_data_;
109 int end_rect_; 109 int end_rect_;
110 int added_rects_; 110 int added_rects_;
111 State state_; 111 State state_;
112 bool strict_; 112 bool strict_;
113 113
114 std::deque<SkIRect> rects_; 114 std::deque<gfx::Rect> rects_;
115 115
116 DISALLOW_COPY_AND_ASSIGN(EncoderMessageTester); 116 DISALLOW_COPY_AND_ASSIGN(EncoderMessageTester);
117 }; 117 };
118 118
119 class DecoderTester { 119 class DecoderTester {
120 public: 120 public:
121 DecoderTester(Decoder* decoder) 121 DecoderTester(Decoder* decoder)
122 : strict_(false), 122 : strict_(false),
123 decoder_(decoder) { 123 decoder_(decoder) {
124 frame_ = media::VideoFrame::CreateFrame(media::VideoFrame::RGB32, 124 frame_ = media::VideoFrame::CreateFrame(media::VideoFrame::RGB32,
(...skipping 20 matching lines...) Expand all
145 } 145 }
146 146
147 void set_strict(bool strict) { 147 void set_strict(bool strict) {
148 strict_ = strict; 148 strict_ = strict;
149 } 149 }
150 150
151 void set_capture_data(scoped_refptr<CaptureData> data) { 151 void set_capture_data(scoped_refptr<CaptureData> data) {
152 capture_data_ = data; 152 capture_data_ = data;
153 } 153 }
154 154
155 void AddRects(const SkIRect* rects, int count) { 155 void AddRects(const gfx::Rect* rects, int count) {
156 rects_.insert(rects_.begin() + rects_.size(), rects, rects + count); 156 rects_.insert(rects_.begin() + rects_.size(), rects, rects + count);
157 } 157 }
158 158
159 void VerifyResults() { 159 void VerifyResults() {
160 if (!strict_) 160 if (!strict_)
161 return; 161 return;
162 162
163 ASSERT_TRUE(capture_data_.get()); 163 ASSERT_TRUE(capture_data_.get());
164 164
165 // Test the content of the update rect. 165 // Test the content of the update rect.
166 ASSERT_EQ(rects_.size(), update_rects_.size()); 166 ASSERT_EQ(rects_.size(), update_rects_.size());
167 for (size_t i = 0; i < update_rects_.size(); ++i) { 167 for (size_t i = 0; i < update_rects_.size(); ++i) {
168 SkIRect &r = rects_[i]; 168 gfx::Rect rect = rects_[i];
169 gfx::Rect rect(r.fLeft, r.fTop, r.width(), r.height());
170 EXPECT_EQ(rect, update_rects_[i]); 169 EXPECT_EQ(rect, update_rects_[i]);
171 170
172 EXPECT_EQ(frame_->stride(0), capture_data_->data_planes().strides[0]); 171 EXPECT_EQ(frame_->stride(0), capture_data_->data_planes().strides[0]);
173 const int stride = frame_->stride(0); 172 const int stride = frame_->stride(0);
174 const int offset = stride * update_rects_[i].y() + 173 const int offset = stride * update_rects_[i].y() +
175 kBytesPerPixel * update_rects_[i].x(); 174 kBytesPerPixel * update_rects_[i].x();
176 const uint8* original = capture_data_->data_planes().data[0] + offset; 175 const uint8* original = capture_data_->data_planes().data[0] + offset;
177 const uint8* decoded = frame_->data(0) + offset; 176 const uint8* decoded = frame_->data(0) + offset;
178 const int row_size = kBytesPerPixel * update_rects_[i].width(); 177 const int row_size = kBytesPerPixel * update_rects_[i].width();
179 for (int y = 0; y < update_rects_[i].height(); ++y) { 178 for (int y = 0; y < update_rects_[i].height(); ++y) {
180 EXPECT_EQ(0, memcmp(original, decoded, row_size)) 179 EXPECT_EQ(0, memcmp(original, decoded, row_size))
181 << "Row " << y << " is different"; 180 << "Row " << y << " is different";
182 original += stride; 181 original += stride;
183 decoded += stride; 182 decoded += stride;
184 } 183 }
185 } 184 }
186 } 185 }
187 186
188 private: 187 private:
189 bool strict_; 188 bool strict_;
190 std::deque<SkIRect> rects_; 189 std::deque<gfx::Rect> rects_;
191 UpdatedRects update_rects_; 190 UpdatedRects update_rects_;
192 Decoder* decoder_; 191 Decoder* decoder_;
193 scoped_refptr<media::VideoFrame> frame_; 192 scoped_refptr<media::VideoFrame> frame_;
194 scoped_refptr<CaptureData> capture_data_; 193 scoped_refptr<CaptureData> capture_data_;
195 194
196 DISALLOW_COPY_AND_ASSIGN(DecoderTester); 195 DISALLOW_COPY_AND_ASSIGN(DecoderTester);
197 }; 196 };
198 197
199 // The EncoderTester provides a hook for retrieving the data, and passing the 198 // The EncoderTester provides a hook for retrieving the data, and passing the
200 // message to other subprograms for validaton. 199 // message to other subprograms for validaton.
(...skipping 14 matching lines...) Expand all
215 message_tester_->ReceivedPacket(packet); 214 message_tester_->ReceivedPacket(packet);
216 215
217 // Send the message to the DecoderTester. 216 // Send the message to the DecoderTester.
218 if (decoder_tester_) { 217 if (decoder_tester_) {
219 decoder_tester_->ReceivedPacket(packet); 218 decoder_tester_->ReceivedPacket(packet);
220 } 219 }
221 220
222 delete packet; 221 delete packet;
223 } 222 }
224 223
225 void AddRects(const SkIRect* rects, int count) { 224 void AddRects(const gfx::Rect* rects, int count) {
226 message_tester_->AddRects(rects, count); 225 message_tester_->AddRects(rects, count);
227 } 226 }
228 227
229 void set_decoder_tester(DecoderTester* decoder_tester) { 228 void set_decoder_tester(DecoderTester* decoder_tester) {
230 decoder_tester_ = decoder_tester; 229 decoder_tester_ = decoder_tester;
231 } 230 }
232 231
233 private: 232 private:
234 EncoderMessageTester* message_tester_; 233 EncoderMessageTester* message_tester_;
235 DecoderTester* decoder_tester_; 234 DecoderTester* decoder_tester_;
(...skipping 21 matching lines...) Expand all
257 planes.strides[0] = kWidth * kBytesPerPixel; 256 planes.strides[0] = kWidth * kBytesPerPixel;
258 257
259 scoped_refptr<CaptureData> data = 258 scoped_refptr<CaptureData> data =
260 new CaptureData(planes, gfx::Size(kWidth, kHeight), format); 259 new CaptureData(planes, gfx::Size(kWidth, kHeight), format);
261 return data; 260 return data;
262 } 261 }
263 262
264 static void TestEncodingRects(Encoder* encoder, 263 static void TestEncodingRects(Encoder* encoder,
265 EncoderTester* tester, 264 EncoderTester* tester,
266 scoped_refptr<CaptureData> data, 265 scoped_refptr<CaptureData> data,
267 const SkIRect* rects, int count) { 266 const gfx::Rect* rects, int count) {
268 data->mutable_dirty_region().setEmpty(); 267 data->mutable_dirty_rects().clear();
269 for (int i = 0; i < count; ++i) { 268 for (int i = 0; i < count; ++i) {
270 data->mutable_dirty_region().op(rects[i], SkRegion::kUnion_Op); 269 data->mutable_dirty_rects().insert(rects[i]);
271 } 270 }
272 tester->AddRects(rects, count); 271 tester->AddRects(rects, count);
273 272
274 encoder->Encode(data, true, 273 encoder->Encode(data, true,
275 NewCallback(tester, &EncoderTester::DataAvailable)); 274 NewCallback(tester, &EncoderTester::DataAvailable));
276 } 275 }
277 276
278 void TestEncoder(Encoder* encoder, bool strict) { 277 void TestEncoder(Encoder* encoder, bool strict) {
279 EncoderMessageTester message_tester; 278 EncoderMessageTester message_tester;
280 message_tester.set_strict(strict); 279 message_tester.set_strict(strict);
281 280
282 EncoderTester tester(&message_tester); 281 EncoderTester tester(&message_tester);
283 282
284 uint8* memory; 283 uint8* memory;
285 scoped_refptr<CaptureData> data = 284 scoped_refptr<CaptureData> data =
286 PrepareEncodeData(media::VideoFrame::RGB32, &memory); 285 PrepareEncodeData(media::VideoFrame::RGB32, &memory);
287 scoped_array<uint8> memory_wrapper(memory);
288 286
289 TestEncodingRects(encoder, &tester, data, kTestRects, 1); 287 TestEncodingRects(encoder, &tester, data, kTestRects, 1);
290 TestEncodingRects(encoder, &tester, data, kTestRects + 1, 1); 288 TestEncodingRects(encoder, &tester, data, kTestRects + 1, 1);
291 TestEncodingRects(encoder, &tester, data, kTestRects + 2, 1); 289 TestEncodingRects(encoder, &tester, data, kTestRects + 2, 1);
292 TestEncodingRects(encoder, &tester, data, kTestRects + 3, 2); 290 TestEncodingRects(encoder, &tester, data, kTestRects + 3, 2);
291 delete [] memory;
293 } 292 }
294 293
295 static void TestEncodingRects(Encoder* encoder, 294 static void TestEncodingRects(Encoder* encoder,
296 EncoderTester* encoder_tester, 295 EncoderTester* encoder_tester,
297 DecoderTester* decoder_tester, 296 DecoderTester* decoder_tester,
298 scoped_refptr<CaptureData> data, 297 scoped_refptr<CaptureData> data,
299 const SkIRect* rects, int count) { 298 const gfx::Rect* rects, int count) {
300 data->mutable_dirty_region().setEmpty(); 299 data->mutable_dirty_rects().clear();
301 for (int i = 0; i < count; ++i) { 300 for (int i = 0; i < count; ++i) {
302 data->mutable_dirty_region().op(rects[i], SkRegion::kUnion_Op); 301 data->mutable_dirty_rects().insert(rects[i]);
303 } 302 }
304 encoder_tester->AddRects(rects, count); 303 encoder_tester->AddRects(rects, count);
305 decoder_tester->AddRects(rects, count); 304 decoder_tester->AddRects(rects, count);
306 305
307 // Generate random data for the updated rects. 306 // Generate random data for the updated rects.
308 srand(0); 307 srand(0);
309 for (int i = 0; i < count; ++i) { 308 for (int i = 0; i < count; ++i) {
310 const SkIRect& rect = rects[i]; 309 const gfx::Rect rect = rects[i];
311 const int bytes_per_pixel = GetBytesPerPixel(data->pixel_format()); 310 const int bytes_per_pixel = GetBytesPerPixel(data->pixel_format());
312 const int row_size = bytes_per_pixel * rect.width(); 311 const int row_size = bytes_per_pixel * rect.width();
313 uint8* memory = data->data_planes().data[0] + 312 uint8* memory = data->data_planes().data[0] +
314 data->data_planes().strides[0] * rect.fTop + 313 data->data_planes().strides[0] * rect.y() +
315 bytes_per_pixel * rect.fLeft; 314 bytes_per_pixel * rect.x();
316 for (int y = 0; y < rect.height(); ++y) { 315 for (int y = 0; y < rect.height(); ++y) {
317 for (int x = 0; x < row_size; ++x) 316 for (int x = 0; x < row_size; ++x)
318 memory[x] = rand() % 256; 317 memory[x] = rand() % 256;
319 memory += data->data_planes().strides[0]; 318 memory += data->data_planes().strides[0];
320 } 319 }
321 } 320 }
322 321
323 encoder->Encode(data, true, 322 encoder->Encode(data, true,
324 NewCallback(encoder_tester, &EncoderTester::DataAvailable)); 323 NewCallback(encoder_tester, &EncoderTester::DataAvailable));
325 decoder_tester->VerifyResults(); 324 decoder_tester->VerifyResults();
326 decoder_tester->Reset(); 325 decoder_tester->Reset();
327 } 326 }
328 327
329 void TestEncoderDecoder(Encoder* encoder, Decoder* decoder, bool strict) { 328 void TestEncoderDecoder(Encoder* encoder, Decoder* decoder, bool strict) {
330 EncoderMessageTester message_tester; 329 EncoderMessageTester message_tester;
331 message_tester.set_strict(strict); 330 message_tester.set_strict(strict);
332 331
333 EncoderTester encoder_tester(&message_tester); 332 EncoderTester encoder_tester(&message_tester);
334 333
335 uint8* memory; 334 uint8* memory;
336 scoped_refptr<CaptureData> data = 335 scoped_refptr<CaptureData> data =
337 PrepareEncodeData(media::VideoFrame::RGB32, &memory); 336 PrepareEncodeData(media::VideoFrame::RGB32, &memory);
338 scoped_array<uint8> memory_wrapper(memory);
339
340 DecoderTester decoder_tester(decoder); 337 DecoderTester decoder_tester(decoder);
341 decoder_tester.set_strict(strict); 338 decoder_tester.set_strict(strict);
342 decoder_tester.set_capture_data(data); 339 decoder_tester.set_capture_data(data);
343 encoder_tester.set_decoder_tester(&decoder_tester); 340 encoder_tester.set_decoder_tester(&decoder_tester);
344 341
345 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, 342 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data,
346 kTestRects, 1); 343 kTestRects, 1);
347 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, 344 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data,
348 kTestRects + 1, 1); 345 kTestRects + 1, 1);
349 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, 346 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data,
350 kTestRects + 2, 1); 347 kTestRects + 2, 1);
351 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, 348 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data,
352 kTestRects + 3, 2); 349 kTestRects + 3, 2);
350 delete [] memory;
353 } 351 }
354 352
355 } // namespace remoting 353 } // namespace remoting
356 354
357 DISABLE_RUNNABLE_METHOD_REFCOUNT(remoting::DecoderTester); 355 DISABLE_RUNNABLE_METHOD_REFCOUNT(remoting::DecoderTester);
OLDNEW
« no previous file with comments | « remoting/base/capture_data.cc ('k') | remoting/base/decoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698