| OLD | NEW |
| 1 // Copyright (c) 2010 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 "gfx/rect.h" | 8 #include "gfx/rect.h" |
| 9 #include "media/base/video_frame.h" | 9 #include "media/base/video_frame.h" |
| 10 #include "remoting/base/codec_test.h" | 10 #include "remoting/base/codec_test.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 static const gfx::Rect kTestRects[] = { | 22 static const gfx::Rect kTestRects[] = { |
| 23 gfx::Rect(0, 0, kWidth, kHeight), | 23 gfx::Rect(0, 0, kWidth, kHeight), |
| 24 gfx::Rect(0, 0, kWidth / 2, kHeight / 2), | 24 gfx::Rect(0, 0, kWidth / 2, kHeight / 2), |
| 25 gfx::Rect(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), | 25 gfx::Rect(kWidth / 2, kHeight / 2, kWidth / 2, kHeight / 2), |
| 26 gfx::Rect(16, 16, 16, 16), | 26 gfx::Rect(16, 16, 16, 16), |
| 27 gfx::Rect(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 that the state transition of the Encoder is correct. |
| 33 class EncoderStateTester { |
| 34 public: |
| 35 EncoderStateTester() |
| 36 : next_state_(Encoder::EncodingStarting) { |
| 37 } |
| 38 |
| 39 ~EncoderStateTester() { |
| 40 EXPECT_EQ(Encoder::EncodingStarting, next_state_); |
| 41 } |
| 42 |
| 43 // Set the state output of the Encoder. |
| 44 void ReceivedState(Encoder::EncodingState state) { |
| 45 if (state & Encoder::EncodingStarting) { |
| 46 EXPECT_EQ(Encoder::EncodingStarting, next_state_); |
| 47 next_state_ = Encoder::EncodingInProgress | Encoder::EncodingEnded; |
| 48 } else { |
| 49 EXPECT_FALSE(next_state_ & Encoder::EncodingStarting); |
| 50 } |
| 51 |
| 52 if (state & Encoder::EncodingInProgress) { |
| 53 EXPECT_TRUE(next_state_ & Encoder::EncodingInProgress); |
| 54 } |
| 55 |
| 56 if (state & Encoder::EncodingEnded) { |
| 57 EXPECT_TRUE(next_state_ & Encoder::EncodingEnded); |
| 58 next_state_ = Encoder::EncodingStarting; |
| 59 } |
| 60 } |
| 61 |
| 62 private: |
| 63 Encoder::EncodingState next_state_; |
| 64 |
| 65 DISALLOW_COPY_AND_ASSIGN(EncoderStateTester); |
| 66 }; |
| 67 |
| 32 // A class to test the message output of the encoder. | 68 // A class to test the message output of the encoder. |
| 33 class EncoderMessageTester { | 69 class EncoderMessageTester { |
| 34 public: | 70 public: |
| 35 EncoderMessageTester() | 71 EncoderMessageTester() |
| 36 : begin_rect_(0), | 72 : begin_rect_(0), |
| 37 rect_data_(0), | 73 rect_data_(0), |
| 38 end_rect_(0), | 74 end_rect_(0), |
| 39 added_rects_(0), | 75 added_rects_(0), |
| 40 state_(kWaitingForBeginRect), | 76 state_(kWaitingForBeginRect), |
| 41 strict_(false) { | 77 strict_(false) { |
| 42 } | 78 } |
| 43 | 79 |
| 44 ~EncoderMessageTester() { | 80 ~EncoderMessageTester() { |
| 45 EXPECT_EQ(begin_rect_, end_rect_); | 81 EXPECT_EQ(begin_rect_, end_rect_); |
| 46 EXPECT_GT(begin_rect_, 0); | 82 EXPECT_GT(begin_rect_, 0); |
| 47 EXPECT_EQ(kWaitingForBeginRect, state_); | 83 EXPECT_EQ(kWaitingForBeginRect, state_); |
| 48 if (strict_) { | 84 if (strict_) { |
| 49 EXPECT_EQ(added_rects_, begin_rect_); | 85 EXPECT_EQ(added_rects_, begin_rect_); |
| 50 } | 86 } |
| 51 } | 87 } |
| 52 | 88 |
| 53 // Test that we received the correct packet. | 89 // Test that we received the correct message. |
| 54 void ReceivedPacket(VideoPacket* packet) { | 90 void ReceivedMessage(ChromotingHostMessage* message) { |
| 91 EXPECT_TRUE(message->has_update_stream_packet()); |
| 92 |
| 55 if (state_ == kWaitingForBeginRect) { | 93 if (state_ == kWaitingForBeginRect) { |
| 56 EXPECT_TRUE((packet->flags() & VideoPacket::FIRST_PACKET) != 0); | 94 EXPECT_TRUE(message->update_stream_packet().has_begin_rect()); |
| 57 state_ = kWaitingForRectData; | 95 state_ = kWaitingForRectData; |
| 58 ++begin_rect_; | 96 ++begin_rect_; |
| 59 | 97 |
| 60 if (strict_) { | 98 if (strict_) { |
| 61 gfx::Rect rect = rects_.front(); | 99 gfx::Rect rect = rects_.front(); |
| 62 rects_.pop_front(); | 100 rects_.pop_front(); |
| 63 EXPECT_EQ(rect.x(), packet->format().x()); | 101 EXPECT_EQ(rect.x(), message->update_stream_packet().begin_rect().x()); |
| 64 EXPECT_EQ(rect.y(), packet->format().y()); | 102 EXPECT_EQ(rect.y(), message->update_stream_packet().begin_rect().y()); |
| 65 EXPECT_EQ(rect.width(), packet->format().width()); | 103 EXPECT_EQ(rect.width(), |
| 66 EXPECT_EQ(rect.height(), packet->format().height()); | 104 message->update_stream_packet().begin_rect().width()); |
| 105 EXPECT_EQ(rect.height(), |
| 106 message->update_stream_packet().begin_rect().height()); |
| 67 } | 107 } |
| 68 } else { | 108 } else { |
| 69 EXPECT_FALSE((packet->flags() & VideoPacket::FIRST_PACKET) != 0); | 109 EXPECT_FALSE(message->update_stream_packet().has_begin_rect()); |
| 70 } | 110 } |
| 71 | 111 |
| 72 if (state_ == kWaitingForRectData) { | 112 if (state_ == kWaitingForRectData) { |
| 73 if (packet->has_data()) { | 113 if (message->update_stream_packet().has_rect_data()) { |
| 74 ++rect_data_; | 114 ++rect_data_; |
| 75 } | 115 } |
| 76 | 116 |
| 77 if ((packet->flags() & VideoPacket::LAST_PACKET) != 0) { | 117 if (message->update_stream_packet().has_end_rect()) { |
| 78 // Expect that we have received some data. | 118 // Expect that we have received some data. |
| 79 EXPECT_GT(rect_data_, 0); | 119 EXPECT_GT(rect_data_, 0); |
| 80 rect_data_ = 0; | 120 rect_data_ = 0; |
| 81 state_ = kWaitingForBeginRect; | 121 state_ = kWaitingForBeginRect; |
| 82 ++end_rect_; | 122 ++end_rect_; |
| 83 } | 123 } |
| 84 } | 124 } |
| 85 } | 125 } |
| 86 | 126 |
| 87 void set_strict(bool strict) { | 127 void set_strict(bool strict) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 108 | 148 |
| 109 std::deque<gfx::Rect> rects_; | 149 std::deque<gfx::Rect> rects_; |
| 110 | 150 |
| 111 DISALLOW_COPY_AND_ASSIGN(EncoderMessageTester); | 151 DISALLOW_COPY_AND_ASSIGN(EncoderMessageTester); |
| 112 }; | 152 }; |
| 113 | 153 |
| 114 class DecoderTester { | 154 class DecoderTester { |
| 115 public: | 155 public: |
| 116 DecoderTester(Decoder* decoder) | 156 DecoderTester(Decoder* decoder) |
| 117 : strict_(false), | 157 : strict_(false), |
| 118 decoder_(decoder) { | 158 decoder_(decoder), |
| 159 decode_done_(false) { |
| 119 media::VideoFrame::CreateFrame(media::VideoFrame::RGB32, | 160 media::VideoFrame::CreateFrame(media::VideoFrame::RGB32, |
| 120 kWidth, kHeight, | 161 kWidth, kHeight, |
| 121 base::TimeDelta(), | 162 base::TimeDelta(), |
| 122 base::TimeDelta(), &frame_); | 163 base::TimeDelta(), &frame_); |
| 123 EXPECT_TRUE(frame_.get()); | 164 EXPECT_TRUE(frame_.get()); |
| 124 decoder_->Initialize(frame_); | |
| 125 } | 165 } |
| 126 | 166 |
| 127 void Reset() { | 167 void ReceivedMessage(ChromotingHostMessage* message) { |
| 128 rects_.clear(); | 168 if (message->has_update_stream_packet()) { |
| 129 update_rects_.clear(); | 169 EXPECT_TRUE(decoder_->PartialDecode(message)); |
| 130 } | 170 return; |
| 171 } |
| 131 | 172 |
| 132 void ReceivedPacket(VideoPacket* packet) { | 173 if (message->has_begin_update_stream()) { |
| 133 Decoder::DecodeResult result = decoder_->DecodePacket(packet); | 174 EXPECT_TRUE(decoder_->BeginDecode( |
| 175 frame_, &update_rects_, |
| 176 NewRunnableMethod(this, &DecoderTester::OnPartialDecodeDone), |
| 177 NewRunnableMethod(this, &DecoderTester::OnDecodeDone))); |
| 178 } |
| 134 | 179 |
| 135 ASSERT_NE(Decoder::DECODE_ERROR, result); | 180 if (message->has_end_update_stream()) { |
| 136 | 181 decoder_->EndDecode(); |
| 137 if (result == Decoder::DECODE_DONE) { | |
| 138 decoder_->GetUpdatedRects(&update_rects_); | |
| 139 } | 182 } |
| 183 delete message; |
| 140 } | 184 } |
| 141 | 185 |
| 142 void set_strict(bool strict) { | 186 void set_strict(bool strict) { |
| 143 strict_ = strict; | 187 strict_ = strict; |
| 144 } | 188 } |
| 145 | 189 |
| 146 void set_capture_data(scoped_refptr<CaptureData> data) { | 190 void set_capture_data(scoped_refptr<CaptureData> data) { |
| 147 capture_data_ = data; | 191 capture_data_ = data; |
| 148 } | 192 } |
| 149 | 193 |
| 150 void AddRects(const gfx::Rect* rects, int count) { | 194 void AddRects(const gfx::Rect* rects, int count) { |
| 151 rects_.insert(rects_.begin() + rects_.size(), rects, rects + count); | 195 rects_.insert(rects_.begin() + rects_.size(), rects, rects + count); |
| 152 } | 196 } |
| 153 | 197 |
| 154 void VerifyResults() { | 198 bool decode_done() const { return decode_done_; } |
| 199 void reset_decode_done() { decode_done_ = false; } |
| 200 |
| 201 private: |
| 202 void OnPartialDecodeDone() { |
| 155 if (!strict_) | 203 if (!strict_) |
| 156 return; | 204 return; |
| 157 | 205 |
| 158 ASSERT_TRUE(capture_data_.get()); | |
| 159 | |
| 160 // Test the content of the update rect. | 206 // Test the content of the update rect. |
| 161 ASSERT_EQ(rects_.size(), update_rects_.size()); | |
| 162 for (size_t i = 0; i < update_rects_.size(); ++i) { | 207 for (size_t i = 0; i < update_rects_.size(); ++i) { |
| 163 gfx::Rect rect = rects_[i]; | 208 EXPECT_FALSE(rects_.empty()); |
| 209 gfx::Rect rect = rects_.front(); |
| 210 rects_.pop_front(); |
| 164 EXPECT_EQ(rect, update_rects_[i]); | 211 EXPECT_EQ(rect, update_rects_[i]); |
| 165 | 212 |
| 166 EXPECT_EQ(frame_->stride(0), capture_data_->data_planes().strides[0]); | 213 EXPECT_EQ(frame_->stride(0), capture_data_->data_planes().strides[0]); |
| 167 const int stride = frame_->stride(0); | 214 const int stride = frame_->stride(0); |
| 168 const int offset = stride * update_rects_[i].y() + | 215 const int offset = stride * update_rects_[i].y() + |
| 169 kBytesPerPixel * update_rects_[i].x(); | 216 kBytesPerPixel * update_rects_[i].x(); |
| 170 const uint8* original = capture_data_->data_planes().data[0] + offset; | 217 const uint8* original = capture_data_->data_planes().data[0] + offset; |
| 171 const uint8* decoded = frame_->data(0) + offset; | 218 const uint8* decoded = frame_->data(0) + offset; |
| 172 const int row_size = kBytesPerPixel * update_rects_[i].width(); | 219 const int row_size = kBytesPerPixel * update_rects_[i].width(); |
| 173 for (int y = 0; y < update_rects_[i].height(); ++y) { | 220 for (int y = 0; y < update_rects_[i].height(); ++y) { |
| 174 EXPECT_EQ(0, memcmp(original, decoded, row_size)) | 221 EXPECT_EQ(0, memcmp(original, decoded, row_size)) |
| 175 << "Row " << y << " is different"; | 222 << "Row " << y << " is different"; |
| 176 original += stride; | 223 original += stride; |
| 177 decoded += stride; | 224 decoded += stride; |
| 178 } | 225 } |
| 179 } | 226 } |
| 180 } | 227 } |
| 181 | 228 |
| 182 private: | 229 void OnDecodeDone() { |
| 230 decode_done_ = true; |
| 231 if (!strict_) |
| 232 return; |
| 233 |
| 234 EXPECT_TRUE(capture_data_.get()); |
| 235 for (int i = 0; i < DataPlanes::kPlaneCount; ++i) { |
| 236 if (!frame_->data(i) || !capture_data_->data_planes().data[i]) |
| 237 continue; |
| 238 // TODO(hclam): HAndle YUV. |
| 239 int size = capture_data_->data_planes().strides[i] * kHeight; |
| 240 EXPECT_EQ(0, memcmp(capture_data_->data_planes().data[i], |
| 241 frame_->data(i), size)); |
| 242 } |
| 243 } |
| 244 |
| 183 bool strict_; | 245 bool strict_; |
| 184 std::deque<gfx::Rect> rects_; | 246 std::deque<gfx::Rect> rects_; |
| 185 UpdatedRects update_rects_; | 247 UpdatedRects update_rects_; |
| 186 Decoder* decoder_; | 248 Decoder* decoder_; |
| 187 scoped_refptr<media::VideoFrame> frame_; | 249 scoped_refptr<media::VideoFrame> frame_; |
| 188 scoped_refptr<CaptureData> capture_data_; | 250 scoped_refptr<CaptureData> capture_data_; |
| 251 bool decode_done_; |
| 189 | 252 |
| 190 DISALLOW_COPY_AND_ASSIGN(DecoderTester); | 253 DISALLOW_COPY_AND_ASSIGN(DecoderTester); |
| 191 }; | 254 }; |
| 192 | 255 |
| 193 // The EncoderTester provides a hook for retrieving the data, and passing the | 256 // The EncoderTester provides a hook for retrieving the data, and passing the |
| 194 // message to other subprograms for validaton. | 257 // message to other subprograms for validaton. |
| 195 class EncoderTester { | 258 class EncoderTester { |
| 196 public: | 259 public: |
| 197 EncoderTester(EncoderMessageTester* message_tester) | 260 EncoderTester(EncoderMessageTester* message_tester, |
| 261 EncoderStateTester* state_tester) |
| 198 : message_tester_(message_tester), | 262 : message_tester_(message_tester), |
| 263 state_tester_(state_tester), |
| 199 decoder_tester_(NULL), | 264 decoder_tester_(NULL), |
| 200 data_available_(0) { | 265 data_available_(0) { |
| 201 } | 266 } |
| 202 | 267 |
| 203 ~EncoderTester() { | 268 ~EncoderTester() { |
| 204 EXPECT_GT(data_available_, 0); | 269 EXPECT_GT(data_available_, 0); |
| 205 } | 270 } |
| 206 | 271 |
| 207 void DataAvailable(VideoPacket *packet) { | 272 void DataAvailable(ChromotingHostMessage* message, |
| 273 Encoder::EncodingState state) { |
| 208 ++data_available_; | 274 ++data_available_; |
| 209 message_tester_->ReceivedPacket(packet); | 275 message_tester_->ReceivedMessage(message); |
| 276 state_tester_->ReceivedState(state); |
| 210 | 277 |
| 211 // Send the message to the DecoderTester. | 278 // Send the message to the DecoderTester. |
| 212 if (decoder_tester_) { | 279 if (decoder_tester_) { |
| 213 decoder_tester_->ReceivedPacket(packet); | 280 if (state & Encoder::EncodingStarting) { |
| 281 ChromotingHostMessage* begin_update = new ChromotingHostMessage(); |
| 282 begin_update->mutable_begin_update_stream(); |
| 283 decoder_tester_->ReceivedMessage(begin_update); |
| 284 } |
| 285 |
| 286 if (state & Encoder::EncodingInProgress) { |
| 287 decoder_tester_->ReceivedMessage(message); |
| 288 } |
| 289 |
| 290 if (state & Encoder::EncodingEnded) { |
| 291 ChromotingHostMessage* end_update = new ChromotingHostMessage(); |
| 292 end_update->mutable_end_update_stream(); |
| 293 decoder_tester_->ReceivedMessage(end_update); |
| 294 } |
| 295 } else { |
| 296 delete message; |
| 214 } | 297 } |
| 215 | |
| 216 delete packet; | |
| 217 } | 298 } |
| 218 | 299 |
| 219 void AddRects(const gfx::Rect* rects, int count) { | 300 void AddRects(const gfx::Rect* rects, int count) { |
| 220 message_tester_->AddRects(rects, count); | 301 message_tester_->AddRects(rects, count); |
| 221 } | 302 } |
| 222 | 303 |
| 223 void set_decoder_tester(DecoderTester* decoder_tester) { | 304 void set_decoder_tester(DecoderTester* decoder_tester) { |
| 224 decoder_tester_ = decoder_tester; | 305 decoder_tester_ = decoder_tester; |
| 225 } | 306 } |
| 226 | 307 |
| 227 private: | 308 private: |
| 228 EncoderMessageTester* message_tester_; | 309 EncoderMessageTester* message_tester_; |
| 310 EncoderStateTester* state_tester_; |
| 229 DecoderTester* decoder_tester_; | 311 DecoderTester* decoder_tester_; |
| 230 int data_available_; | 312 int data_available_; |
| 231 | 313 |
| 232 DISALLOW_COPY_AND_ASSIGN(EncoderTester); | 314 DISALLOW_COPY_AND_ASSIGN(EncoderTester); |
| 233 }; | 315 }; |
| 234 | 316 |
| 235 scoped_refptr<CaptureData> PrepareEncodeData(media::VideoFrame::Format format, | 317 scoped_refptr<CaptureData> PrepareEncodeData(PixelFormat format, |
| 236 uint8** memory) { | 318 uint8** memory) { |
| 237 // TODO(hclam): Support also YUV format. | 319 // TODO(hclam): Support also YUV format. |
| 238 CHECK_EQ(format, media::VideoFrame::RGB32); | 320 CHECK(format == PIXEL_FORMAT_RGB32); |
| 239 int size = kWidth * kHeight * kBytesPerPixel; | 321 int size = kWidth * kHeight * kBytesPerPixel; |
| 240 | 322 |
| 241 *memory = new uint8[size]; | 323 *memory = new uint8[size]; |
| 242 srand(0); | 324 srand(0); |
| 243 for (int i = 0; i < size; ++i) { | 325 for (int i = 0; i < size; ++i) { |
| 244 (*memory)[i] = rand() % 256; | 326 (*memory)[i] = rand() % 256; |
| 245 } | 327 } |
| 246 | 328 |
| 247 DataPlanes planes; | 329 DataPlanes planes; |
| 248 memset(planes.data, 0, sizeof(planes.data)); | 330 memset(planes.data, 0, sizeof(planes.data)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 266 tester->AddRects(rects, count); | 348 tester->AddRects(rects, count); |
| 267 | 349 |
| 268 encoder->Encode(data, true, | 350 encoder->Encode(data, true, |
| 269 NewCallback(tester, &EncoderTester::DataAvailable)); | 351 NewCallback(tester, &EncoderTester::DataAvailable)); |
| 270 } | 352 } |
| 271 | 353 |
| 272 void TestEncoder(Encoder* encoder, bool strict) { | 354 void TestEncoder(Encoder* encoder, bool strict) { |
| 273 EncoderMessageTester message_tester; | 355 EncoderMessageTester message_tester; |
| 274 message_tester.set_strict(strict); | 356 message_tester.set_strict(strict); |
| 275 | 357 |
| 276 EncoderTester tester(&message_tester); | 358 EncoderStateTester state_tester; |
| 359 EncoderTester tester(&message_tester, &state_tester); |
| 277 | 360 |
| 278 uint8* memory; | 361 uint8* memory; |
| 279 scoped_refptr<CaptureData> data = | 362 scoped_refptr<CaptureData> data = |
| 280 PrepareEncodeData(media::VideoFrame::RGB32, &memory); | 363 PrepareEncodeData(PIXEL_FORMAT_RGB32, &memory); |
| 281 | 364 |
| 282 TestEncodingRects(encoder, &tester, data, kTestRects, 1); | 365 TestEncodingRects(encoder, &tester, data, kTestRects, 1); |
| 283 TestEncodingRects(encoder, &tester, data, kTestRects + 1, 1); | 366 TestEncodingRects(encoder, &tester, data, kTestRects + 1, 1); |
| 284 TestEncodingRects(encoder, &tester, data, kTestRects + 2, 1); | 367 TestEncodingRects(encoder, &tester, data, kTestRects + 2, 1); |
| 285 TestEncodingRects(encoder, &tester, data, kTestRects + 3, 2); | 368 TestEncodingRects(encoder, &tester, data, kTestRects + 3, 2); |
| 286 delete [] memory; | 369 delete [] memory; |
| 287 } | 370 } |
| 288 | 371 |
| 289 static void TestEncodingRects(Encoder* encoder, | 372 static void TestEncodingRects(Encoder* encoder, |
| 290 EncoderTester* encoder_tester, | 373 EncoderTester* encoder_tester, |
| 291 DecoderTester* decoder_tester, | 374 DecoderTester* decoder_tester, |
| 292 scoped_refptr<CaptureData> data, | 375 scoped_refptr<CaptureData> data, |
| 293 const gfx::Rect* rects, int count) { | 376 const gfx::Rect* rects, int count) { |
| 294 data->mutable_dirty_rects().clear(); | 377 data->mutable_dirty_rects().clear(); |
| 295 for (int i = 0; i < count; ++i) { | 378 for (int i = 0; i < count; ++i) { |
| 296 data->mutable_dirty_rects().insert(rects[i]); | 379 data->mutable_dirty_rects().insert(rects[i]); |
| 297 } | 380 } |
| 298 encoder_tester->AddRects(rects, count); | 381 encoder_tester->AddRects(rects, count); |
| 299 decoder_tester->AddRects(rects, count); | 382 decoder_tester->AddRects(rects, count); |
| 383 decoder_tester->reset_decode_done(); |
| 300 | 384 |
| 301 // Generate random data for the updated rects. | 385 // Generate random data for the updated rects. |
| 302 srand(0); | 386 srand(0); |
| 303 for (int i = 0; i < count; ++i) { | 387 for (int i = 0; i < count; ++i) { |
| 304 const gfx::Rect rect = rects[i]; | 388 const gfx::Rect rect = rects[i]; |
| 305 const int bytes_per_pixel = GetBytesPerPixel(data->pixel_format()); | 389 const int bytes_per_pixel = GetBytesPerPixel(data->pixel_format()); |
| 306 const int row_size = bytes_per_pixel * rect.width(); | 390 const int row_size = bytes_per_pixel * rect.width(); |
| 307 uint8* memory = data->data_planes().data[0] + | 391 uint8* memory = data->data_planes().data[0] + |
| 308 data->data_planes().strides[0] * rect.y() + | 392 data->data_planes().strides[0] * rect.y() + |
| 309 bytes_per_pixel * rect.x(); | 393 bytes_per_pixel * rect.x(); |
| 310 for (int y = 0; y < rect.height(); ++y) { | 394 for (int y = 0; y < rect.height(); ++y) { |
| 311 for (int x = 0; x < row_size; ++x) | 395 for (int x = 0; x < row_size; ++x) |
| 312 memory[x] = rand() % 256; | 396 memory[x] = rand() % 256; |
| 313 memory += data->data_planes().strides[0]; | 397 memory += data->data_planes().strides[0]; |
| 314 } | 398 } |
| 315 } | 399 } |
| 316 | 400 |
| 317 encoder->Encode(data, true, | 401 encoder->Encode(data, true, |
| 318 NewCallback(encoder_tester, &EncoderTester::DataAvailable)); | 402 NewCallback(encoder_tester, &EncoderTester::DataAvailable)); |
| 319 decoder_tester->VerifyResults(); | 403 EXPECT_TRUE(decoder_tester->decode_done()); |
| 320 decoder_tester->Reset(); | |
| 321 } | 404 } |
| 322 | 405 |
| 323 void TestEncoderDecoder(Encoder* encoder, Decoder* decoder, bool strict) { | 406 void TestEncoderDecoder(Encoder* encoder, Decoder* decoder, bool strict) { |
| 324 EncoderMessageTester message_tester; | 407 EncoderMessageTester message_tester; |
| 325 message_tester.set_strict(strict); | 408 message_tester.set_strict(strict); |
| 326 | 409 |
| 327 EncoderTester encoder_tester(&message_tester); | 410 EncoderStateTester state_tester; |
| 411 EncoderTester encoder_tester(&message_tester, &state_tester); |
| 328 | 412 |
| 329 uint8* memory; | 413 uint8* memory; |
| 330 scoped_refptr<CaptureData> data = | 414 scoped_refptr<CaptureData> data = |
| 331 PrepareEncodeData(media::VideoFrame::RGB32, &memory); | 415 PrepareEncodeData(PIXEL_FORMAT_RGB32, &memory); |
| 332 DecoderTester decoder_tester(decoder); | 416 DecoderTester decoder_tester(decoder); |
| 333 decoder_tester.set_strict(strict); | 417 decoder_tester.set_strict(strict); |
| 334 decoder_tester.set_capture_data(data); | 418 decoder_tester.set_capture_data(data); |
| 335 encoder_tester.set_decoder_tester(&decoder_tester); | 419 encoder_tester.set_decoder_tester(&decoder_tester); |
| 336 | 420 |
| 337 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, | 421 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, |
| 338 kTestRects, 1); | 422 kTestRects, 1); |
| 339 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, | 423 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, |
| 340 kTestRects + 1, 1); | 424 kTestRects + 1, 1); |
| 341 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, | 425 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, |
| 342 kTestRects + 2, 1); | 426 kTestRects + 2, 1); |
| 343 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, | 427 TestEncodingRects(encoder, &encoder_tester, &decoder_tester, data, |
| 344 kTestRects + 3, 2); | 428 kTestRects + 3, 2); |
| 345 delete [] memory; | 429 delete [] memory; |
| 346 } | 430 } |
| 347 | 431 |
| 348 } // namespace remoting | 432 } // namespace remoting |
| 349 | 433 |
| 350 DISABLE_RUNNABLE_METHOD_REFCOUNT(remoting::DecoderTester); | 434 DISABLE_RUNNABLE_METHOD_REFCOUNT(remoting::DecoderTester); |
| OLD | NEW |