| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include <stdio.h> | 11 #include <stdio.h> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #include "webrtc/base/gunit.h" | 14 #include "webrtc/base/gunit.h" |
| 15 #include "webrtc/base/logging.h" | 15 #include "webrtc/base/logging.h" |
| 16 #include "webrtc/base/thread.h" | 16 #include "webrtc/base/thread.h" |
| 17 #include "webrtc/media/base/fakevideocapturer.h" | 17 #include "webrtc/media/base/fakevideocapturer.h" |
| 18 #include "webrtc/media/base/fakevideorenderer.h" | 18 #include "webrtc/media/base/fakevideorenderer.h" |
| 19 #include "webrtc/media/base/testutils.h" | 19 #include "webrtc/media/base/testutils.h" |
| 20 #include "webrtc/media/base/videocapturer.h" | 20 #include "webrtc/media/base/videocapturer.h" |
| 21 | 21 |
| 22 using cricket::FakeVideoCapturer; | 22 using cricket::FakeVideoCapturer; |
| 23 | 23 |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 const int kMsCallbackWait = 500; | 26 const int kMsCallbackWait = 500; |
| 27 // For HD only the height matters. | 27 // For HD only the height matters. |
| 28 const int kMinHdHeight = 720; | 28 const int kMinHdHeight = 720; |
| 29 const uint32_t kTimeout = 5000U; |
| 29 | 30 |
| 30 } // namespace | 31 } // namespace |
| 31 | 32 |
| 32 class VideoCapturerTest | 33 class VideoCapturerTest |
| 33 : public sigslot::has_slots<>, | 34 : public sigslot::has_slots<>, |
| 34 public testing::Test { | 35 public testing::Test { |
| 35 public: | 36 public: |
| 36 VideoCapturerTest() | 37 VideoCapturerTest() |
| 37 : capture_state_(cricket::CS_STOPPED), num_state_changes_(0) { | 38 : capture_state_(cricket::CS_STOPPED), num_state_changes_(0) { |
| 38 capturer_.SignalStateChange.connect(this, | 39 capturer_.SignalStateChange.connect(this, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 67 EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); | 68 EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); |
| 68 EXPECT_EQ(1, num_state_changes()); | 69 EXPECT_EQ(1, num_state_changes()); |
| 69 capturer_.Stop(); | 70 capturer_.Stop(); |
| 70 EXPECT_EQ_WAIT(cricket::CS_STOPPED, capture_state(), kMsCallbackWait); | 71 EXPECT_EQ_WAIT(cricket::CS_STOPPED, capture_state(), kMsCallbackWait); |
| 71 EXPECT_EQ(2, num_state_changes()); | 72 EXPECT_EQ(2, num_state_changes()); |
| 72 capturer_.Stop(); | 73 capturer_.Stop(); |
| 73 rtc::Thread::Current()->ProcessMessages(100); | 74 rtc::Thread::Current()->ProcessMessages(100); |
| 74 EXPECT_EQ(2, num_state_changes()); | 75 EXPECT_EQ(2, num_state_changes()); |
| 75 } | 76 } |
| 76 | 77 |
| 78 TEST_F(VideoCapturerTest, TestRestart) { |
| 79 EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat( |
| 80 640, |
| 81 480, |
| 82 cricket::VideoFormat::FpsToInterval(30), |
| 83 cricket::FOURCC_I420))); |
| 84 EXPECT_TRUE(capturer_.IsRunning()); |
| 85 EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); |
| 86 EXPECT_EQ(1, num_state_changes()); |
| 87 EXPECT_TRUE(capturer_.Restart(cricket::VideoFormat( |
| 88 320, |
| 89 240, |
| 90 cricket::VideoFormat::FpsToInterval(30), |
| 91 cricket::FOURCC_I420))); |
| 92 EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); |
| 93 EXPECT_TRUE(capturer_.IsRunning()); |
| 94 EXPECT_GE(1, num_state_changes()); |
| 95 capturer_.Stop(); |
| 96 rtc::Thread::Current()->ProcessMessages(100); |
| 97 EXPECT_FALSE(capturer_.IsRunning()); |
| 98 } |
| 99 |
| 100 TEST_F(VideoCapturerTest, TestStartingWithRestart) { |
| 101 EXPECT_FALSE(capturer_.IsRunning()); |
| 102 EXPECT_TRUE(capturer_.Restart(cricket::VideoFormat( |
| 103 640, |
| 104 480, |
| 105 cricket::VideoFormat::FpsToInterval(30), |
| 106 cricket::FOURCC_I420))); |
| 107 EXPECT_TRUE(capturer_.IsRunning()); |
| 108 EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); |
| 109 } |
| 110 |
| 111 TEST_F(VideoCapturerTest, TestRestartWithSameFormat) { |
| 112 cricket::VideoFormat format(640, 480, |
| 113 cricket::VideoFormat::FpsToInterval(30), |
| 114 cricket::FOURCC_I420); |
| 115 EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(format)); |
| 116 EXPECT_TRUE(capturer_.IsRunning()); |
| 117 EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); |
| 118 EXPECT_EQ(1, num_state_changes()); |
| 119 EXPECT_TRUE(capturer_.Restart(format)); |
| 120 EXPECT_EQ(cricket::CS_RUNNING, capture_state()); |
| 121 EXPECT_TRUE(capturer_.IsRunning()); |
| 122 EXPECT_EQ(1, num_state_changes()); |
| 123 } |
| 124 |
| 125 TEST_F(VideoCapturerTest, CameraOffOnMute) { |
| 126 EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat( |
| 127 640, |
| 128 480, |
| 129 cricket::VideoFormat::FpsToInterval(30), |
| 130 cricket::FOURCC_I420))); |
| 131 EXPECT_TRUE(capturer_.IsRunning()); |
| 132 EXPECT_EQ(0, renderer_.num_rendered_frames()); |
| 133 EXPECT_TRUE(capturer_.CaptureFrame()); |
| 134 EXPECT_EQ(1, renderer_.num_rendered_frames()); |
| 135 EXPECT_FALSE(capturer_.IsMuted()); |
| 136 |
| 137 // Mute the camera and expect black output frame. |
| 138 capturer_.MuteToBlackThenPause(true); |
| 139 EXPECT_TRUE(capturer_.IsMuted()); |
| 140 for (int i = 0; i < 31; ++i) { |
| 141 EXPECT_TRUE(capturer_.CaptureFrame()); |
| 142 EXPECT_TRUE(renderer_.black_frame()); |
| 143 } |
| 144 EXPECT_EQ(32, renderer_.num_rendered_frames()); |
| 145 EXPECT_EQ_WAIT(cricket::CS_PAUSED, |
| 146 capturer_.capture_state(), kTimeout); |
| 147 |
| 148 // Verify that the camera is off. |
| 149 EXPECT_FALSE(capturer_.CaptureFrame()); |
| 150 EXPECT_EQ(32, renderer_.num_rendered_frames()); |
| 151 |
| 152 // Unmute the camera and expect non-black output frame. |
| 153 capturer_.MuteToBlackThenPause(false); |
| 154 EXPECT_FALSE(capturer_.IsMuted()); |
| 155 EXPECT_EQ_WAIT(cricket::CS_RUNNING, |
| 156 capturer_.capture_state(), kTimeout); |
| 157 EXPECT_TRUE(capturer_.CaptureFrame()); |
| 158 EXPECT_FALSE(renderer_.black_frame()); |
| 159 EXPECT_EQ(33, renderer_.num_rendered_frames()); |
| 160 } |
| 161 |
| 77 TEST_F(VideoCapturerTest, ScreencastScaledOddWidth) { | 162 TEST_F(VideoCapturerTest, ScreencastScaledOddWidth) { |
| 78 capturer_.SetScreencast(true); | 163 capturer_.SetScreencast(true); |
| 79 | 164 |
| 80 int kWidth = 1281; | 165 int kWidth = 1281; |
| 81 int kHeight = 720; | 166 int kHeight = 720; |
| 82 | 167 |
| 83 std::vector<cricket::VideoFormat> formats; | 168 std::vector<cricket::VideoFormat> formats; |
| 84 formats.push_back(cricket::VideoFormat(kWidth, kHeight, | 169 formats.push_back(cricket::VideoFormat(kWidth, kHeight, |
| 85 cricket::VideoFormat::FpsToInterval(5), cricket::FOURCC_ARGB)); | 170 cricket::VideoFormat::FpsToInterval(5), cricket::FOURCC_ARGB)); |
| 86 capturer_.ResetSupportedFormats(formats); | 171 capturer_.ResetSupportedFormats(formats); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 104 int frame_count = 0; | 189 int frame_count = 0; |
| 105 | 190 |
| 106 std::vector<cricket::VideoFormat> formats; | 191 std::vector<cricket::VideoFormat> formats; |
| 107 formats.push_back(cricket::VideoFormat(kWidth, kHeight, | 192 formats.push_back(cricket::VideoFormat(kWidth, kHeight, |
| 108 cricket::VideoFormat::FpsToInterval(5), | 193 cricket::VideoFormat::FpsToInterval(5), |
| 109 cricket::FOURCC_I420)); | 194 cricket::FOURCC_I420)); |
| 110 | 195 |
| 111 capturer_.ResetSupportedFormats(formats); | 196 capturer_.ResetSupportedFormats(formats); |
| 112 | 197 |
| 113 // capturer_ should compensate rotation as default. | 198 // capturer_ should compensate rotation as default. |
| 199 capturer_.UpdateAspectRatio(400, 200); |
| 200 |
| 114 EXPECT_EQ(cricket::CS_RUNNING, | 201 EXPECT_EQ(cricket::CS_RUNNING, |
| 115 capturer_.Start(cricket::VideoFormat( | 202 capturer_.Start(cricket::VideoFormat( |
| 116 kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), | 203 kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), |
| 117 cricket::FOURCC_I420))); | 204 cricket::FOURCC_I420))); |
| 118 EXPECT_TRUE(capturer_.IsRunning()); | 205 EXPECT_TRUE(capturer_.IsRunning()); |
| 119 EXPECT_EQ(0, renderer_.num_rendered_frames()); | 206 EXPECT_EQ(0, renderer_.num_rendered_frames()); |
| 120 | 207 |
| 121 // If the frame's rotation is compensated anywhere in the pipeline based on | 208 // If the frame's rotation is compensated anywhere in the pipeline based on |
| 122 // the rotation information, the renderer should be given the right dimension | 209 // the rotation information, the renderer should be given the right dimension |
| 123 // such that the frame could be rendered. | 210 // such that the frame could be rendered. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 formats.push_back(cricket::VideoFormat(kWidth, kHeight, | 242 formats.push_back(cricket::VideoFormat(kWidth, kHeight, |
| 156 cricket::VideoFormat::FpsToInterval(5), | 243 cricket::VideoFormat::FpsToInterval(5), |
| 157 cricket::FOURCC_I420)); | 244 cricket::FOURCC_I420)); |
| 158 | 245 |
| 159 capturer_.ResetSupportedFormats(formats); | 246 capturer_.ResetSupportedFormats(formats); |
| 160 rtc::VideoSinkWants wants; | 247 rtc::VideoSinkWants wants; |
| 161 // capturer_ should not compensate rotation. | 248 // capturer_ should not compensate rotation. |
| 162 wants.rotation_applied = false; | 249 wants.rotation_applied = false; |
| 163 capturer_.AddOrUpdateSink(&renderer_, wants); | 250 capturer_.AddOrUpdateSink(&renderer_, wants); |
| 164 | 251 |
| 252 capturer_.UpdateAspectRatio(400, 200); |
| 253 |
| 165 EXPECT_EQ(cricket::CS_RUNNING, | 254 EXPECT_EQ(cricket::CS_RUNNING, |
| 166 capturer_.Start(cricket::VideoFormat( | 255 capturer_.Start(cricket::VideoFormat( |
| 167 kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), | 256 kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), |
| 168 cricket::FOURCC_I420))); | 257 cricket::FOURCC_I420))); |
| 169 EXPECT_TRUE(capturer_.IsRunning()); | 258 EXPECT_TRUE(capturer_.IsRunning()); |
| 170 EXPECT_EQ(0, renderer_.num_rendered_frames()); | 259 EXPECT_EQ(0, renderer_.num_rendered_frames()); |
| 171 | 260 |
| 172 // If the frame's rotation is compensated anywhere in the pipeline, the frame | 261 // If the frame's rotation is compensated anywhere in the pipeline, the frame |
| 173 // won't have its original dimension out from capturer. Since the renderer | 262 // won't have its original dimension out from capturer. Since the renderer |
| 174 // here has the same dimension as the capturer, it will skip that frame as the | 263 // here has the same dimension as the capturer, it will skip that frame as the |
| (...skipping 29 matching lines...) Expand all Loading... |
| 204 formats.push_back(cricket::VideoFormat(kWidth, kHeight, | 293 formats.push_back(cricket::VideoFormat(kWidth, kHeight, |
| 205 cricket::VideoFormat::FpsToInterval(5), | 294 cricket::VideoFormat::FpsToInterval(5), |
| 206 cricket::FOURCC_I420)); | 295 cricket::FOURCC_I420)); |
| 207 | 296 |
| 208 capturer_.ResetSupportedFormats(formats); | 297 capturer_.ResetSupportedFormats(formats); |
| 209 rtc::VideoSinkWants wants; | 298 rtc::VideoSinkWants wants; |
| 210 // capturer_ should not compensate rotation. | 299 // capturer_ should not compensate rotation. |
| 211 wants.rotation_applied = false; | 300 wants.rotation_applied = false; |
| 212 capturer_.AddOrUpdateSink(&renderer_, wants); | 301 capturer_.AddOrUpdateSink(&renderer_, wants); |
| 213 | 302 |
| 303 capturer_.UpdateAspectRatio(400, 200); |
| 304 |
| 214 EXPECT_EQ(cricket::CS_RUNNING, | 305 EXPECT_EQ(cricket::CS_RUNNING, |
| 215 capturer_.Start(cricket::VideoFormat( | 306 capturer_.Start(cricket::VideoFormat( |
| 216 kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), | 307 kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), |
| 217 cricket::FOURCC_I420))); | 308 cricket::FOURCC_I420))); |
| 218 EXPECT_TRUE(capturer_.IsRunning()); | 309 EXPECT_TRUE(capturer_.IsRunning()); |
| 219 EXPECT_EQ(0, renderer_.num_rendered_frames()); | 310 EXPECT_EQ(0, renderer_.num_rendered_frames()); |
| 220 | 311 |
| 221 int frame_count = 0; | 312 int frame_count = 0; |
| 222 capturer_.SetRotation(webrtc::kVideoRotation_90); | 313 capturer_.SetRotation(webrtc::kVideoRotation_90); |
| 223 EXPECT_TRUE(capturer_.CaptureFrame()); | 314 EXPECT_TRUE(capturer_.CaptureFrame()); |
| (...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 capturer_.set_enable_camera_list(true); | 804 capturer_.set_enable_camera_list(true); |
| 714 capturer_.ConstrainSupportedFormats(vga_format); | 805 capturer_.ConstrainSupportedFormats(vga_format); |
| 715 EXPECT_EQ(2u, capturer_.GetSupportedFormats()->size()); | 806 EXPECT_EQ(2u, capturer_.GetSupportedFormats()->size()); |
| 716 // To make sure it's not just the camera list being broken, add in VGA and | 807 // To make sure it's not just the camera list being broken, add in VGA and |
| 717 // try again. This time, only the VGA format should be there. | 808 // try again. This time, only the VGA format should be there. |
| 718 supported_formats.push_back(vga_format); | 809 supported_formats.push_back(vga_format); |
| 719 capturer_.ResetSupportedFormats(supported_formats); | 810 capturer_.ResetSupportedFormats(supported_formats); |
| 720 ASSERT_EQ(1u, capturer_.GetSupportedFormats()->size()); | 811 ASSERT_EQ(1u, capturer_.GetSupportedFormats()->size()); |
| 721 EXPECT_EQ(vga_format.height, capturer_.GetSupportedFormats()->at(0).height); | 812 EXPECT_EQ(vga_format.height, capturer_.GetSupportedFormats()->at(0).height); |
| 722 } | 813 } |
| OLD | NEW |