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