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

Side by Side Diff: content/browser/renderer_host/media/video_capture_controller_unittest.cc

Issue 15906019: Hook up EncodedVideoSource on the browser side (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@screencast_cl_6
Patch Set: 516738a8 IPC/struct changes, courtesy hshi@ Created 7 years, 6 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
OLDNEW
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 // Unit test for VideoCaptureController. 5 // Unit test for VideoCaptureController.
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop.h" 12 #include "base/message_loop.h"
13 #include "base/process_util.h" 13 #include "base/process_util.h"
14 #include "content/browser/browser_thread_impl.h" 14 #include "content/browser/browser_thread_impl.h"
15 #include "content/browser/renderer_host/media/media_stream_provider.h" 15 #include "content/browser/renderer_host/media/media_stream_provider.h"
16 #include "content/browser/renderer_host/media/video_capture_controller.h" 16 #include "content/browser/renderer_host/media/video_capture_controller.h"
17 #include "content/browser/renderer_host/media/video_capture_manager.h" 17 #include "content/browser/renderer_host/media/video_capture_manager.h"
18 #include "content/common/media/media_stream_options.h" 18 #include "content/common/media/media_stream_options.h"
19 #include "media/video/capture/fake_video_capture_device.h" 19 #include "media/video/capture/fake_video_capture_device.h"
20 #include "media/video/capture/video_capture_device.h" 20 #include "media/video/capture/video_capture_device.h"
21 #include "media/video/video_encode_types.h"
21 #include "testing/gmock/include/gmock/gmock.h" 22 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
23 24
24 using ::testing::_; 25 using ::testing::_;
25 using ::testing::AnyNumber; 26 using ::testing::AnyNumber;
26 using ::testing::AtLeast; 27 using ::testing::AtLeast;
27 using ::testing::InSequence; 28 using ::testing::InSequence;
28 using ::testing::Return; 29 using ::testing::Return;
29 30
30 namespace content { 31 namespace content {
31 32
32 enum { kDeviceId = 1 }; 33 enum { kDeviceId = 1 };
33 34
34 ACTION_P4(StopCapture, controller, controller_id, controller_handler, 35 ACTION_P4(StopCapture, controller, controller_id, controller_handler,
35 message_loop) { 36 message_loop) {
36 message_loop->PostTask(FROM_HERE, 37 message_loop->PostTask(FROM_HERE,
37 base::Bind(&VideoCaptureController::StopCapture, 38 base::Bind(&VideoCaptureController::StopCapture,
38 controller, controller_id, controller_handler)); 39 controller, controller_id, controller_handler));
39 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 40 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
40 } 41 }
41 42
42 ACTION_P3(StopSession, controller, session_id, message_loop) { 43 ACTION_P3(StopSession, controller, session_id, message_loop) {
43 message_loop->PostTask(FROM_HERE, 44 message_loop->PostTask(FROM_HERE,
44 base::Bind(&VideoCaptureController::StopSession, 45 base::Bind(&VideoCaptureController::StopSession,
45 controller, session_id)); 46 controller, session_id));
46 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure()); 47 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
47 } 48 }
48 49
50 ACTION_P3(TryConfigureEncodedBitstream, controller, params, message_loop) {
51 message_loop->PostTask(FROM_HERE,
52 base::Bind(&VideoCaptureController::TryConfigureEncodedBitstream,
53 controller, params));
54 }
55
49 class MockVideoCaptureControllerEventHandler 56 class MockVideoCaptureControllerEventHandler
50 : public VideoCaptureControllerEventHandler { 57 : public VideoCaptureControllerEventHandler {
51 public: 58 public:
52 MockVideoCaptureControllerEventHandler(VideoCaptureController* controller, 59 MockVideoCaptureControllerEventHandler(VideoCaptureController* controller,
53 base::MessageLoop* message_loop) 60 base::MessageLoop* message_loop)
54 : controller_(controller), 61 : controller_(controller),
55 message_loop_(message_loop), 62 message_loop_(message_loop),
56 controller_id_(kDeviceId), 63 controller_id_(kDeviceId),
57 process_handle_(base::kNullProcessHandle) { 64 process_handle_(base::kNullProcessHandle) {
58 } 65 }
59 virtual ~MockVideoCaptureControllerEventHandler() {} 66 virtual ~MockVideoCaptureControllerEventHandler() {}
60 67
61 MOCK_METHOD1(DoBufferCreated, void(const VideoCaptureControllerID&));
62 MOCK_METHOD1(DoBufferReady, void(const VideoCaptureControllerID&)); 68 MOCK_METHOD1(DoBufferReady, void(const VideoCaptureControllerID&));
63 MOCK_METHOD1(DoFrameInfo, void(const VideoCaptureControllerID&)); 69 MOCK_METHOD1(DoFrameInfo, void(const VideoCaptureControllerID&));
70 MOCK_METHOD1(DoEncodedFrameInfo, void(const VideoCaptureControllerID&));
71 MOCK_METHOD1(DoBitstreamConfigChanged,
72 void(const VideoCaptureControllerID& id));
64 MOCK_METHOD1(DoEnded, void(const VideoCaptureControllerID&)); 73 MOCK_METHOD1(DoEnded, void(const VideoCaptureControllerID&));
65 74
66 virtual void OnError(const VideoCaptureControllerID& id) OVERRIDE {} 75 virtual void OnError(const VideoCaptureControllerID& id) OVERRIDE {}
67 virtual void OnBufferCreated(const VideoCaptureControllerID& id,
68 base::SharedMemoryHandle handle,
69 int length, int buffer_id) OVERRIDE {
70 EXPECT_EQ(id, controller_id_);
71 DoBufferCreated(id);
72 }
73 virtual void OnBufferReady(const VideoCaptureControllerID& id, 76 virtual void OnBufferReady(const VideoCaptureControllerID& id,
74 int buffer_id, 77 int buffer_id,
75 base::Time timestamp) OVERRIDE { 78 size_t size,
79 base::Time timestamp,
80 bool key_frame) OVERRIDE {
76 EXPECT_EQ(id, controller_id_); 81 EXPECT_EQ(id, controller_id_);
77 DoBufferReady(id); 82 DoBufferReady(id);
78 message_loop_->PostTask(FROM_HERE, 83 message_loop_->PostTask(FROM_HERE,
79 base::Bind(&VideoCaptureController::ReturnBuffer, 84 base::Bind(&VideoCaptureController::ReturnBuffer,
80 controller_, controller_id_, this, buffer_id)); 85 controller_, controller_id_, this, buffer_id));
81 } 86 }
82 virtual void OnFrameInfo(const VideoCaptureControllerID& id, 87 virtual void OnFrameInfo(const VideoCaptureControllerID& id,
83 int width, 88 const media::VideoCaptureParams& params,
84 int height, 89 const std::vector<base::SharedMemoryHandle>& buffers,
85 int frame_per_second) OVERRIDE { 90 size_t buffer_size) OVERRIDE {
86 EXPECT_EQ(id, controller_id_); 91 EXPECT_EQ(id, controller_id_);
87 DoFrameInfo(id); 92 DoFrameInfo(id);
88 } 93 }
94 virtual void OnEncodedFrameInfo(
95 const VideoCaptureControllerID& id,
96 const media::VideoEncodingParameters& params,
97 const std::vector<base::SharedMemoryHandle>& buffers,
98 size_t buffer_size) OVERRIDE {
99 EXPECT_EQ(id, controller_id_);
100 DoEncodedFrameInfo(id);
101 }
102 virtual void OnBitstreamConfigChanged(
103 const VideoCaptureControllerID& id,
104 const media::RuntimeVideoEncodingParameters& params) OVERRIDE {
105 EXPECT_EQ(id, controller_id_);
106 DoBitstreamConfigChanged(id);
107 }
89 virtual void OnEnded(const VideoCaptureControllerID& id) OVERRIDE { 108 virtual void OnEnded(const VideoCaptureControllerID& id) OVERRIDE {
90 EXPECT_EQ(id, controller_id_); 109 EXPECT_EQ(id, controller_id_);
91 DoEnded(id); 110 DoEnded(id);
92 } 111 }
93 112
94 scoped_refptr<VideoCaptureController> controller_; 113 scoped_refptr<VideoCaptureController> controller_;
95 base::MessageLoop* message_loop_; 114 base::MessageLoop* message_loop_;
96 VideoCaptureControllerID controller_id_; 115 VideoCaptureControllerID controller_id_;
97 base::ProcessHandle process_handle_; 116 base::ProcessHandle process_handle_;
98 }; 117 };
99 118
100 class MockVideoCaptureManager : public VideoCaptureManager { 119 class MockVideoCaptureManager : public VideoCaptureManager {
101 public: 120 public:
102 MockVideoCaptureManager() 121 MockVideoCaptureManager()
103 : video_session_id_(kStartOpenSessionId) {} 122 : video_session_id_(kStartOpenSessionId),
123 encoded_capture_(false) {}
104 124
105 void Init() { 125 void Init() {
106 device_name_.unique_id = "/dev/video0"; 126 device_name_.unique_id = "/dev/video0";
107 device_name_.device_name = "fake_device_0"; 127 device_name_.device_name = "fake_device_0";
108
109 video_capture_device_.reset(
110 media::FakeVideoCaptureDevice::Create(device_name_));
111 ASSERT_TRUE(video_capture_device_.get() != NULL);
112 } 128 }
113 129
114 MOCK_METHOD3(StartCapture, void(int, int, 130 MOCK_METHOD3(StartCapture, void(int, int,
115 media::VideoCaptureDevice::EventHandler*)); 131 media::VideoCaptureDevice::EventHandler*));
116 MOCK_METHOD1(StopCapture, void(const media::VideoCaptureSessionId&)); 132 MOCK_METHOD1(StopCapture, void(const media::VideoCaptureSessionId&));
117 133
118 void Start(const media::VideoCaptureParams& capture_params, 134 // Stub MediaStreamProviderListener implementation
135 virtual void Opened(MediaStreamType, int) OVERRIDE {}
136 virtual void Closed(MediaStreamType, int) OVERRIDE {}
137 virtual void DevicesEnumerated(MediaStreamType,
138 const StreamDeviceInfoArray&) OVERRIDE {}
139 virtual void Error(MediaStreamType, int, MediaStreamProviderError) OVERRIDE {}
140
141 virtual void Start(const media::VideoCaptureParams& capture_params,
119 media::VideoCaptureDevice::EventHandler* vc_receiver) OVERRIDE { 142 media::VideoCaptureDevice::EventHandler* vc_receiver) OVERRIDE {
143 video_capture_device_.reset(
144 media::FakeVideoCaptureDevice::Create(device_name_, encoded_capture_));
145 ASSERT_TRUE(video_capture_device_.get() != NULL);
146
120 StartCapture(capture_params.width, capture_params.height, vc_receiver); 147 StartCapture(capture_params.width, capture_params.height, vc_receiver);
121 video_capture_device_->Allocate(capture_params.width, capture_params.height, 148 video_capture_device_->Allocate(capture_params.width, capture_params.height,
122 capture_params.frame_per_second, 149 capture_params.frame_per_second,
123 vc_receiver); 150 vc_receiver);
124 video_capture_device_->Start(); 151 video_capture_device_->Start();
125 } 152 }
126 153
127 void Stop(const media::VideoCaptureSessionId& capture_session_id, 154 virtual void Stop(const media::VideoCaptureSessionId& capture_session_id,
128 base::Closure stopped_cb) OVERRIDE { 155 const base::Closure& stopped_cb) OVERRIDE {
129 StopCapture(capture_session_id); 156 StopCapture(capture_session_id);
130 video_capture_device_->Stop(); 157 video_capture_device_->Stop();
131 video_capture_device_->DeAllocate(); 158 video_capture_device_->DeAllocate();
132 } 159 }
133 160
161 virtual void TryConfigureEncodedBitstream(
162 const media::VideoCaptureSessionId& session_id,
163 const media::RuntimeVideoEncodingParameters& params) OVERRIDE {
164 video_capture_device_->TryConfigureEncodedBitstream(params);
165 }
166
167 void SetEncodedCapture(bool encoded_capture) {
168 encoded_capture_ = encoded_capture;
169 }
170
134 int video_session_id_; 171 int video_session_id_;
135 media::VideoCaptureDevice::Name device_name_; 172 media::VideoCaptureDevice::Name device_name_;
136 scoped_ptr<media::VideoCaptureDevice> video_capture_device_; 173 scoped_ptr<media::VideoCaptureDevice> video_capture_device_;
174 bool encoded_capture_;
137 175
138 private: 176 private:
139 virtual ~MockVideoCaptureManager() {} 177 virtual ~MockVideoCaptureManager() {}
140 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureManager); 178 DISALLOW_COPY_AND_ASSIGN(MockVideoCaptureManager);
141 }; 179 };
142 180
143 // Test class. 181 // Test class.
144 class VideoCaptureControllerTest : public testing::Test { 182 class VideoCaptureControllerTest : public testing::Test {
145 public: 183 public:
146 VideoCaptureControllerTest() {} 184 VideoCaptureControllerTest() {}
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 222
185 InSequence s; 223 InSequence s;
186 EXPECT_CALL(*vcm_.get(), 224 EXPECT_CALL(*vcm_.get(),
187 StartCapture(capture_params.width, 225 StartCapture(capture_params.width,
188 capture_params.height, 226 capture_params.height,
189 controller_.get())).Times(1); 227 controller_.get())).Times(1);
190 EXPECT_CALL(*controller_handler_, 228 EXPECT_CALL(*controller_handler_,
191 DoFrameInfo(controller_handler_->controller_id_)) 229 DoFrameInfo(controller_handler_->controller_id_))
192 .Times(AtLeast(1)); 230 .Times(AtLeast(1));
193 EXPECT_CALL(*controller_handler_, 231 EXPECT_CALL(*controller_handler_,
194 DoBufferCreated(controller_handler_->controller_id_))
195 .Times(AtLeast(1));
196 EXPECT_CALL(*controller_handler_,
197 DoBufferReady(controller_handler_->controller_id_)) 232 DoBufferReady(controller_handler_->controller_id_))
198 .Times(AtLeast(1)) 233 .Times(AtLeast(1))
199 .WillOnce(StopCapture(controller_.get(), 234 .WillOnce(StopCapture(controller_.get(),
200 controller_handler_->controller_id_, 235 controller_handler_->controller_id_,
201 controller_handler_.get(), 236 controller_handler_.get(),
202 message_loop_.get())); 237 message_loop_.get()));
203 EXPECT_CALL(*vcm_.get(), StopCapture(vcm_->video_session_id_)).Times(1); 238 EXPECT_CALL(*vcm_.get(), StopCapture(vcm_->video_session_id_)).Times(1);
204 239
240 // The encoded bitstream functions should not get called.
241 EXPECT_CALL(*controller_handler_,
242 DoEncodedFrameInfo(controller_handler_->controller_id_))
243 .Times(0);
244 EXPECT_CALL(*controller_handler_,
245 DoBitstreamConfigChanged(controller_handler_->controller_id_))
246 .Times(0);
247
205 controller_->StartCapture(controller_handler_->controller_id_, 248 controller_->StartCapture(controller_handler_->controller_id_,
206 controller_handler_.get(), 249 controller_handler_.get(),
207 controller_handler_->process_handle_, 250 controller_handler_->process_handle_,
208 capture_params); 251 capture_params);
209 message_loop_->Run(); 252 message_loop_->Run();
210 } 253 }
211 254
212 // Try to stop session before stopping capture. 255 // Try to stop session before stopping capture.
213 TEST_F(VideoCaptureControllerTest, StopSession) { 256 TEST_F(VideoCaptureControllerTest, StopSession) {
214 media::VideoCaptureParams capture_params; 257 media::VideoCaptureParams capture_params;
215 capture_params.session_id = vcm_->video_session_id_; 258 capture_params.session_id = vcm_->video_session_id_;
216 capture_params.width = 320; 259 capture_params.width = 320;
217 capture_params.height = 240; 260 capture_params.height = 240;
218 capture_params.frame_per_second = 30; 261 capture_params.frame_per_second = 30;
219 262
220 InSequence s; 263 InSequence s;
221 EXPECT_CALL(*vcm_.get(), 264 EXPECT_CALL(*vcm_.get(),
222 StartCapture(capture_params.width, 265 StartCapture(capture_params.width,
223 capture_params.height, 266 capture_params.height,
224 controller_.get())).Times(1); 267 controller_.get())).Times(1);
225 EXPECT_CALL(*controller_handler_, 268 EXPECT_CALL(*controller_handler_,
226 DoFrameInfo(controller_handler_->controller_id_)) 269 DoFrameInfo(controller_handler_->controller_id_))
227 .Times(AtLeast(1)); 270 .Times(AtLeast(1));
228 EXPECT_CALL(*controller_handler_, 271 EXPECT_CALL(*controller_handler_,
229 DoBufferCreated(controller_handler_->controller_id_))
230 .Times(AtLeast(1));
231 EXPECT_CALL(*controller_handler_,
232 DoBufferReady(controller_handler_->controller_id_)) 272 DoBufferReady(controller_handler_->controller_id_))
233 .Times(AtLeast(1)) 273 .Times(AtLeast(1))
234 .WillOnce(StopSession(controller_.get(), 274 .WillOnce(StopSession(controller_.get(),
235 vcm_->video_session_id_, 275 vcm_->video_session_id_,
236 message_loop_.get())); 276 message_loop_.get()));
237 EXPECT_CALL(*controller_handler_, 277 EXPECT_CALL(*controller_handler_,
238 DoEnded(controller_handler_->controller_id_)) 278 DoEnded(controller_handler_->controller_id_))
239 .Times(1); 279 .Times(1);
240 280
281 // The encoded bitstream functions should not get called.
282 EXPECT_CALL(*controller_handler_,
283 DoEncodedFrameInfo(controller_handler_->controller_id_))
284 .Times(0);
285 EXPECT_CALL(*controller_handler_,
286 DoBitstreamConfigChanged(controller_handler_->controller_id_))
287 .Times(0);
288
241 controller_->StartCapture(controller_handler_->controller_id_, 289 controller_->StartCapture(controller_handler_->controller_id_,
242 controller_handler_.get(), 290 controller_handler_.get(),
243 controller_handler_->process_handle_, 291 controller_handler_->process_handle_,
244 capture_params); 292 capture_params);
245 message_loop_->Run(); 293 message_loop_->Run();
246 294
247 // The session is stopped now. There should be no buffer coming from 295 // The session is stopped now. There should be no buffer coming from
248 // controller. 296 // controller.
249 EXPECT_CALL(*controller_handler_, 297 EXPECT_CALL(*controller_handler_,
250 DoBufferReady(controller_handler_->controller_id_)) 298 DoBufferReady(controller_handler_->controller_id_))
251 .Times(0); 299 .Times(0);
252 message_loop_->PostDelayedTask(FROM_HERE, 300 message_loop_->PostDelayedTask(FROM_HERE,
253 base::MessageLoop::QuitClosure(), base::TimeDelta::FromSeconds(1)); 301 base::MessageLoop::QuitClosure(), base::TimeDelta::FromSeconds(1));
254 message_loop_->Run(); 302 message_loop_->Run();
255 303
256 EXPECT_CALL(*vcm_.get(), StopCapture(vcm_->video_session_id_)).Times(1); 304 EXPECT_CALL(*vcm_.get(), StopCapture(vcm_->video_session_id_)).Times(1);
257 controller_->StopCapture(controller_handler_->controller_id_, 305 controller_->StopCapture(controller_handler_->controller_id_,
258 controller_handler_.get()); 306 controller_handler_.get());
259 } 307 }
260 308
309 // Check encoded capturing.
310 TEST_F(VideoCaptureControllerTest, EncodedCapture) {
311 vcm_->SetEncodedCapture(true);
312 media::VideoEncodingParameters encoding_params;
313 encoding_params.codec_name = std::string("VP8");
314 encoding_params.resolution.SetSize(640, 480);
315 encoding_params.frames_per_second = 30;
316 encoding_params.runtime_params.average_bitrate = 1024;
317 encoding_params.runtime_params.max_bitrate = 1024;
318
319 media::RuntimeVideoEncodingParameters params;
320 params.average_bitrate = 1024;
321 params.max_bitrate = 1024;
322
323 InSequence s;
324 EXPECT_CALL(*vcm_.get(),
325 StartCapture(encoding_params.resolution.width(),
326 encoding_params.resolution.height(),
327 controller_.get())).Times(1);
328 EXPECT_CALL(*controller_handler_,
329 DoEncodedFrameInfo(controller_handler_->controller_id_))
330 .Times(AtLeast(1));
331 EXPECT_CALL(*controller_handler_,
332 DoBufferReady(controller_handler_->controller_id_))
333 .Times(AtLeast(1))
334 .WillOnce(TryConfigureEncodedBitstream(controller_.get(),
335 params,
336 message_loop_.get()));
337
338 EXPECT_CALL(*controller_handler_,
339 DoBitstreamConfigChanged(controller_handler_->controller_id_))
340 .Times(1)
341 .WillOnce(StopCapture(controller_.get(),
342 controller_handler_->controller_id_,
343 controller_handler_.get(),
344 message_loop_.get()));
345
346 EXPECT_CALL(*vcm_.get(), StopCapture(vcm_->video_session_id_)).Times(1);
347
348 // The unencoded bitstream functions should not get called.
349 EXPECT_CALL(*controller_handler_,
350 DoFrameInfo(controller_handler_->controller_id_))
351 .Times(0);
352
353 media::VideoCaptureParams capture_params;
354 capture_params.session_id = vcm_->video_session_id_;
355 capture_params.width = encoding_params.resolution.width();
356 capture_params.height = encoding_params.resolution.height();
357 capture_params.frame_per_second = encoding_params.frames_per_second;
358 controller_->StartCapture(controller_handler_->controller_id_,
359 controller_handler_.get(),
360 controller_handler_->process_handle_,
361 capture_params);
362 message_loop_->Run();
363 }
364
261 } // namespace content 365 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698