| 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" |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 int memory_size = size.width() * size.height() * kBytesPerPixel; | 240 int memory_size = size.width() * size.height() * kBytesPerPixel; |
| 241 for (int i = 0; i < memory_size; ++i) { | 241 for (int i = 0; i < memory_size; ++i) { |
| 242 frame->data()[i] = rand() % 256; | 242 frame->data()[i] = rand() % 256; |
| 243 } | 243 } |
| 244 | 244 |
| 245 return frame.Pass(); | 245 return frame.Pass(); |
| 246 } | 246 } |
| 247 | 247 |
| 248 static void TestEncodingRects(VideoEncoder* encoder, | 248 static void TestEncodingRects(VideoEncoder* encoder, |
| 249 VideoEncoderTester* tester, | 249 VideoEncoderTester* tester, |
| 250 webrtc::DesktopFrame* frame, | 250 DesktopFrame* frame, |
| 251 const DesktopRect* rects, | 251 const DesktopRect* rects, |
| 252 int count) { | 252 int count) { |
| 253 frame->mutable_updated_region()->Clear(); | 253 frame->mutable_updated_region()->Clear(); |
| 254 for (int i = 0; i < count; ++i) { | 254 for (int i = 0; i < count; ++i) { |
| 255 frame->mutable_updated_region()->AddRect(rects[i]); | 255 frame->mutable_updated_region()->AddRect(rects[i]); |
| 256 } | 256 } |
| 257 | 257 |
| 258 scoped_ptr<VideoPacket> packet = encoder->Encode(*frame); | 258 scoped_ptr<VideoPacket> packet = encoder->Encode(*frame); |
| 259 tester->DataAvailable(packet.Pass()); | 259 tester->DataAvailable(packet.Pass()); |
| 260 } | 260 } |
| 261 | 261 |
| 262 void TestVideoEncoder(VideoEncoder* encoder, bool strict) { | 262 void TestVideoEncoder(VideoEncoder* encoder, bool strict) { |
| 263 const int kSizes[] = {320, 319, 317, 150}; | 263 const int kSizes[] = {320, 319, 317, 150}; |
| 264 | 264 |
| 265 VideoEncoderTester tester; | 265 VideoEncoderTester tester; |
| 266 | 266 |
| 267 for (size_t xi = 0; xi < arraysize(kSizes); ++xi) { | 267 for (size_t xi = 0; xi < arraysize(kSizes); ++xi) { |
| 268 for (size_t yi = 0; yi < arraysize(kSizes); ++yi) { | 268 for (size_t yi = 0; yi < arraysize(kSizes); ++yi) { |
| 269 DesktopSize size = DesktopSize(kSizes[xi], kSizes[yi]); | 269 DesktopSize size = DesktopSize(kSizes[xi], kSizes[yi]); |
| 270 scoped_ptr<webrtc::DesktopFrame> frame = PrepareFrame(size); | 270 scoped_ptr<DesktopFrame> frame = PrepareFrame(size); |
| 271 std::vector<std::vector<DesktopRect> > test_rect_lists = | 271 std::vector<std::vector<DesktopRect> > test_rect_lists = |
| 272 MakeTestRectLists(size); | 272 MakeTestRectLists(size); |
| 273 for (size_t i = 0; i < test_rect_lists.size(); ++i) { | 273 for (size_t i = 0; i < test_rect_lists.size(); ++i) { |
| 274 const std::vector<DesktopRect>& test_rects = test_rect_lists[i]; | 274 const std::vector<DesktopRect>& test_rects = test_rect_lists[i]; |
| 275 TestEncodingRects(encoder, &tester, frame.get(), | 275 TestEncodingRects(encoder, &tester, frame.get(), |
| 276 &test_rects[0], test_rects.size()); | 276 &test_rects[0], test_rects.size()); |
| 277 } | 277 } |
| 278 |
| 279 // Pass some empty frames through the encoder. |
| 280 for (int i = 0; i < 10; ++i) { |
| 281 TestEncodingRects(encoder, &tester, frame.get(), nullptr, 0); |
| 282 } |
| 278 } | 283 } |
| 279 } | 284 } |
| 280 } | 285 } |
| 281 | 286 |
| 287 void TestVideoEncoderEmptyFrames(VideoEncoder* encoder, int topoff_frames) { |
| 288 const DesktopSize kSize(640, 480); |
| 289 scoped_ptr<DesktopFrame> frame(PrepareFrame(kSize)); |
| 290 |
| 291 frame->mutable_updated_region()->SetRect( |
| 292 webrtc::DesktopRect::MakeSize(kSize)); |
| 293 EXPECT_TRUE(encoder->Encode(*frame)); |
| 294 |
| 295 frame->mutable_updated_region()->Clear(); |
| 296 for (int i=0; i < topoff_frames; ++i) { |
| 297 EXPECT_TRUE(encoder->Encode(*frame)); |
| 298 } |
| 299 |
| 300 EXPECT_FALSE(encoder->Encode(*frame)); |
| 301 } |
| 302 |
| 282 static void TestEncodeDecodeRects(VideoEncoder* encoder, | 303 static void TestEncodeDecodeRects(VideoEncoder* encoder, |
| 283 VideoEncoderTester* encoder_tester, | 304 VideoEncoderTester* encoder_tester, |
| 284 VideoDecoderTester* decoder_tester, | 305 VideoDecoderTester* decoder_tester, |
| 285 DesktopFrame* frame, | 306 DesktopFrame* frame, |
| 286 const DesktopRect* rects, int count) { | 307 const DesktopRect* rects, int count) { |
| 287 frame->mutable_updated_region()->Clear(); | 308 frame->mutable_updated_region()->Clear(); |
| 288 for (int i = 0; i < count; ++i) { | 309 for (int i = 0; i < count; ++i) { |
| 289 frame->mutable_updated_region()->AddRect(rects[i]); | 310 frame->mutable_updated_region()->AddRect(rects[i]); |
| 290 } | 311 } |
| 291 decoder_tester->AddRects(rects, count); | 312 decoder_tester->AddRects(rects, count); |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 | 442 |
| 422 if (frame_count >= kWarmUpFrameCount) { | 443 if (frame_count >= kWarmUpFrameCount) { |
| 423 elapsed = base::TimeTicks::Now() - start_time; | 444 elapsed = base::TimeTicks::Now() - start_time; |
| 424 } | 445 } |
| 425 } | 446 } |
| 426 | 447 |
| 427 return (frame_count * base::TimeDelta::FromSeconds(1)) / elapsed; | 448 return (frame_count * base::TimeDelta::FromSeconds(1)) / elapsed; |
| 428 } | 449 } |
| 429 | 450 |
| 430 } // namespace remoting | 451 } // namespace remoting |
| OLD | NEW |