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

Side by Side Diff: content/renderer/media/media_stream_video_capturer_source.cc

Issue 2790823002: Spec compliant video constraints for getUserMedia behind flag. (Closed)
Patch Set: rebase Created 3 years, 8 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "content/renderer/media/media_stream_video_capturer_source.h" 5 #include "content/renderer/media/media_stream_video_capturer_source.h"
6 6
7 #include <algorithm>
7 #include <utility> 8 #include <utility>
8 9
9 #include "base/bind.h" 10 #include "base/bind.h"
10 #include "base/callback_helpers.h" 11 #include "base/callback_helpers.h"
11 #include "base/debug/stack_trace.h" 12 #include "base/debug/stack_trace.h"
12 #include "base/location.h" 13 #include "base/location.h"
13 #include "base/macros.h" 14 #include "base/macros.h"
14 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
15 #include "content/common/media/media_stream_messages.h" 16 #include "content/common/media/media_stream_messages.h"
16 #include "content/public/common/media_stream_request.h" 17 #include "content/public/common/media_stream_request.h"
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 constraints, 188 constraints,
188 &blink::WebMediaTrackConstraintSet::googPowerLineFrequency, &freq)) { 189 &blink::WebMediaTrackConstraintSet::googPowerLineFrequency, &freq)) {
189 return; 190 return;
190 } 191 }
191 if (freq == static_cast<int>(media::PowerLineFrequency::FREQUENCY_50HZ)) 192 if (freq == static_cast<int>(media::PowerLineFrequency::FREQUENCY_50HZ))
192 params->power_line_frequency = media::PowerLineFrequency::FREQUENCY_50HZ; 193 params->power_line_frequency = media::PowerLineFrequency::FREQUENCY_50HZ;
193 else if (freq == static_cast<int>(media::PowerLineFrequency::FREQUENCY_60HZ)) 194 else if (freq == static_cast<int>(media::PowerLineFrequency::FREQUENCY_60HZ))
194 params->power_line_frequency = media::PowerLineFrequency::FREQUENCY_60HZ; 195 params->power_line_frequency = media::PowerLineFrequency::FREQUENCY_60HZ;
195 } 196 }
196 197
197 // LocalVideoCapturerSource is a delegate used by MediaStreamVideoCapturerSource 198 // LegacyLocalVideoCapturerSource is a delegate used by
198 // for local video capture. It uses the Render singleton VideoCaptureImplManager 199 // MediaStreamVideoCapturerSource for local video capture. It uses the Render
199 // to start / stop and receive I420 frames from Chrome's video capture 200 // singleton VideoCaptureImplManager to start / stop and receive I420 frames
200 // implementation. This is a main Render thread only object. 201 // from Chrome's video capture implementation. This is a main Render thread only
201 class LocalVideoCapturerSource final : public media::VideoCapturerSource { 202 // object.
203 // TODO(guidou): Remove this class. http://crbug.com/706408
204 class LegacyLocalVideoCapturerSource final : public media::VideoCapturerSource {
202 public: 205 public:
203 explicit LocalVideoCapturerSource(const StreamDeviceInfo& device_info); 206 explicit LegacyLocalVideoCapturerSource(const StreamDeviceInfo& device_info);
204 ~LocalVideoCapturerSource() override; 207 ~LegacyLocalVideoCapturerSource() override;
205 208
206 // VideoCaptureDelegate Implementation. 209 // VideoCaptureDelegate Implementation.
207 void GetCurrentSupportedFormats( 210 void GetCurrentSupportedFormats(
208 int max_requested_width, 211 int max_requested_width,
209 int max_requested_height, 212 int max_requested_height,
210 double max_requested_frame_rate, 213 double max_requested_frame_rate,
211 const VideoCaptureDeviceFormatsCB& callback) override; 214 const VideoCaptureDeviceFormatsCB& callback) override;
212 media::VideoCaptureFormats GetPreferredFormats() override; 215 media::VideoCaptureFormats GetPreferredFormats() override;
213 void StartCapture(const media::VideoCaptureParams& params, 216 void StartCapture(const media::VideoCaptureParams& params,
214 const VideoCaptureDeliverFrameCB& new_frame_callback, 217 const VideoCaptureDeliverFrameCB& new_frame_callback,
(...skipping 25 matching lines...) Expand all
240 RunningCallback running_callback_; 243 RunningCallback running_callback_;
241 base::Closure stop_capture_cb_; 244 base::Closure stop_capture_cb_;
242 245
243 // Placeholder keeping the callback between asynchronous device enumeration 246 // Placeholder keeping the callback between asynchronous device enumeration
244 // calls. 247 // calls.
245 VideoCaptureDeviceFormatsCB formats_enumerated_callback_; 248 VideoCaptureDeviceFormatsCB formats_enumerated_callback_;
246 249
247 // Bound to the main render thread. 250 // Bound to the main render thread.
248 base::ThreadChecker thread_checker_; 251 base::ThreadChecker thread_checker_;
249 252
250 base::WeakPtrFactory<LocalVideoCapturerSource> weak_factory_; 253 base::WeakPtrFactory<LegacyLocalVideoCapturerSource> weak_factory_;
251 254
252 DISALLOW_COPY_AND_ASSIGN(LocalVideoCapturerSource); 255 DISALLOW_COPY_AND_ASSIGN(LegacyLocalVideoCapturerSource);
253 }; 256 };
254 257
255 } // namespace 258 LegacyLocalVideoCapturerSource::LegacyLocalVideoCapturerSource(
256
257 LocalVideoCapturerSource::LocalVideoCapturerSource(
258 const StreamDeviceInfo& device_info) 259 const StreamDeviceInfo& device_info)
259 : session_id_(device_info.session_id), 260 : session_id_(device_info.session_id),
260 manager_(RenderThreadImpl::current()->video_capture_impl_manager()), 261 manager_(RenderThreadImpl::current()->video_capture_impl_manager()),
261 release_device_cb_(manager_->UseDevice(session_id_)), 262 release_device_cb_(manager_->UseDevice(session_id_)),
262 is_content_capture_(IsContentVideoCaptureDevice(device_info)), 263 is_content_capture_(IsContentVideoCaptureDevice(device_info)),
263 weak_factory_(this) { 264 weak_factory_(this) {
264 DCHECK(RenderThreadImpl::current()); 265 DCHECK(RenderThreadImpl::current());
265 } 266 }
266 267
267 LocalVideoCapturerSource::~LocalVideoCapturerSource() { 268 LegacyLocalVideoCapturerSource::~LegacyLocalVideoCapturerSource() {
268 DCHECK(thread_checker_.CalledOnValidThread()); 269 DCHECK(thread_checker_.CalledOnValidThread());
269 release_device_cb_.Run(); 270 release_device_cb_.Run();
270 } 271 }
271 272
272 void LocalVideoCapturerSource::GetCurrentSupportedFormats( 273 void LegacyLocalVideoCapturerSource::GetCurrentSupportedFormats(
273 int max_requested_width, 274 int max_requested_width,
274 int max_requested_height, 275 int max_requested_height,
275 double max_requested_frame_rate, 276 double max_requested_frame_rate,
276 const VideoCaptureDeviceFormatsCB& callback) { 277 const VideoCaptureDeviceFormatsCB& callback) {
277 DVLOG(3) << "GetCurrentSupportedFormats({ max_requested_height = " 278 DVLOG(3) << "GetCurrentSupportedFormats({ max_requested_height = "
278 << max_requested_height << "}) { max_requested_width = " 279 << max_requested_height << "}) { max_requested_width = "
279 << max_requested_width << "}) { max_requested_frame_rate = " 280 << max_requested_width << "}) { max_requested_frame_rate = "
280 << max_requested_frame_rate << "})"; 281 << max_requested_frame_rate << "})";
281 DCHECK(thread_checker_.CalledOnValidThread()); 282 DCHECK(thread_checker_.CalledOnValidThread());
282 283
283 if (is_content_capture_) { 284 if (is_content_capture_) {
284 const int width = max_requested_width ? 285 const int width = max_requested_width ?
285 max_requested_width : MediaStreamVideoSource::kDefaultWidth; 286 max_requested_width : MediaStreamVideoSource::kDefaultWidth;
286 const int height = max_requested_height ? 287 const int height = max_requested_height ?
287 max_requested_height : MediaStreamVideoSource::kDefaultHeight; 288 max_requested_height : MediaStreamVideoSource::kDefaultHeight;
288 callback.Run(media::VideoCaptureFormats( 289 callback.Run(media::VideoCaptureFormats(
289 1, media::VideoCaptureFormat( 290 1, media::VideoCaptureFormat(
290 gfx::Size(width, height), 291 gfx::Size(width, height),
291 static_cast<float>( 292 static_cast<float>(
292 std::min(kMaxScreenCastFrameRate, max_requested_frame_rate)), 293 std::min(kMaxScreenCastFrameRate, max_requested_frame_rate)),
293 media::PIXEL_FORMAT_I420))); 294 media::PIXEL_FORMAT_I420)));
294 return; 295 return;
295 } 296 }
296 297
297 DCHECK(formats_enumerated_callback_.is_null()); 298 DCHECK(formats_enumerated_callback_.is_null());
298 formats_enumerated_callback_ = callback; 299 formats_enumerated_callback_ = callback;
299 manager_->GetDeviceFormatsInUse( 300 manager_->GetDeviceFormatsInUse(
300 session_id_, media::BindToCurrentLoop(base::Bind( 301 session_id_,
301 &LocalVideoCapturerSource::OnDeviceFormatsInUseReceived, 302 media::BindToCurrentLoop(base::Bind(
302 weak_factory_.GetWeakPtr()))); 303 &LegacyLocalVideoCapturerSource::OnDeviceFormatsInUseReceived,
304 weak_factory_.GetWeakPtr())));
303 } 305 }
304 306
305 media::VideoCaptureFormats LocalVideoCapturerSource::GetPreferredFormats() { 307 media::VideoCaptureFormats
308 LegacyLocalVideoCapturerSource::GetPreferredFormats() {
306 return media::VideoCaptureFormats(); 309 return media::VideoCaptureFormats();
307 } 310 }
308 311
309 void LocalVideoCapturerSource::StartCapture( 312 void LegacyLocalVideoCapturerSource::StartCapture(
310 const media::VideoCaptureParams& params, 313 const media::VideoCaptureParams& params,
311 const VideoCaptureDeliverFrameCB& new_frame_callback, 314 const VideoCaptureDeliverFrameCB& new_frame_callback,
312 const RunningCallback& running_callback) { 315 const RunningCallback& running_callback) {
313 DCHECK(params.requested_format.IsValid()); 316 DCHECK(params.requested_format.IsValid());
314 DCHECK(thread_checker_.CalledOnValidThread()); 317 DCHECK(thread_checker_.CalledOnValidThread());
315 running_callback_ = running_callback; 318 running_callback_ = running_callback;
316 319
317 stop_capture_cb_ = manager_->StartCapture( 320 stop_capture_cb_ =
318 session_id_, params, media::BindToCurrentLoop(base::Bind( 321 manager_->StartCapture(session_id_, params,
319 &LocalVideoCapturerSource::OnStateUpdate, 322 media::BindToCurrentLoop(base::Bind(
320 weak_factory_.GetWeakPtr())), 323 &LegacyLocalVideoCapturerSource::OnStateUpdate,
321 new_frame_callback); 324 weak_factory_.GetWeakPtr())),
325 new_frame_callback);
322 } 326 }
323 327
324 void LocalVideoCapturerSource::RequestRefreshFrame() { 328 void LegacyLocalVideoCapturerSource::RequestRefreshFrame() {
325 DVLOG(3) << __func__; 329 DVLOG(3) << __func__;
326 DCHECK(thread_checker_.CalledOnValidThread()); 330 DCHECK(thread_checker_.CalledOnValidThread());
327 if (stop_capture_cb_.is_null()) 331 if (stop_capture_cb_.is_null())
328 return; // Do not request frames if the source is stopped. 332 return; // Do not request frames if the source is stopped.
329 manager_->RequestRefreshFrame(session_id_); 333 manager_->RequestRefreshFrame(session_id_);
330 } 334 }
331 335
332 void LocalVideoCapturerSource::MaybeSuspend() { 336 void LegacyLocalVideoCapturerSource::MaybeSuspend() {
333 DVLOG(3) << __func__; 337 DVLOG(3) << __func__;
334 DCHECK(thread_checker_.CalledOnValidThread()); 338 DCHECK(thread_checker_.CalledOnValidThread());
335 manager_->Suspend(session_id_); 339 manager_->Suspend(session_id_);
336 } 340 }
337 341
338 void LocalVideoCapturerSource::Resume() { 342 void LegacyLocalVideoCapturerSource::Resume() {
339 DVLOG(3) << __func__; 343 DVLOG(3) << __func__;
340 DCHECK(thread_checker_.CalledOnValidThread()); 344 DCHECK(thread_checker_.CalledOnValidThread());
341 manager_->Resume(session_id_); 345 manager_->Resume(session_id_);
342 } 346 }
343 347
344 void LocalVideoCapturerSource::StopCapture() { 348 void LegacyLocalVideoCapturerSource::StopCapture() {
345 DVLOG(3) << __func__; 349 DVLOG(3) << __func__;
346 DCHECK(thread_checker_.CalledOnValidThread()); 350 DCHECK(thread_checker_.CalledOnValidThread());
347 // Immediately make sure we don't provide more frames. 351 // Immediately make sure we don't provide more frames.
348 if (!stop_capture_cb_.is_null()) 352 if (!stop_capture_cb_.is_null())
349 base::ResetAndReturn(&stop_capture_cb_).Run(); 353 base::ResetAndReturn(&stop_capture_cb_).Run();
350 running_callback_.Reset(); 354 running_callback_.Reset();
351 // Invalidate any potential format enumerations going on. 355 // Invalidate any potential format enumerations going on.
352 formats_enumerated_callback_.Reset(); 356 formats_enumerated_callback_.Reset();
353 } 357 }
354 358
355 void LocalVideoCapturerSource::OnStateUpdate(VideoCaptureState state) { 359 void LegacyLocalVideoCapturerSource::OnStateUpdate(VideoCaptureState state) {
356 DVLOG(3) << __func__ << " state = " << state; 360 DVLOG(3) << __func__ << " state = " << state;
357 DCHECK(thread_checker_.CalledOnValidThread()); 361 DCHECK(thread_checker_.CalledOnValidThread());
358 if (running_callback_.is_null()) 362 if (running_callback_.is_null())
359 return; 363 return;
360 switch (state) { 364 switch (state) {
361 case VIDEO_CAPTURE_STATE_STARTED: 365 case VIDEO_CAPTURE_STATE_STARTED:
362 running_callback_.Run(true); 366 running_callback_.Run(true);
363 break; 367 break;
364 368
365 case VIDEO_CAPTURE_STATE_STOPPING: 369 case VIDEO_CAPTURE_STATE_STOPPING:
366 case VIDEO_CAPTURE_STATE_STOPPED: 370 case VIDEO_CAPTURE_STATE_STOPPED:
367 case VIDEO_CAPTURE_STATE_ERROR: 371 case VIDEO_CAPTURE_STATE_ERROR:
368 case VIDEO_CAPTURE_STATE_ENDED: 372 case VIDEO_CAPTURE_STATE_ENDED:
369 base::ResetAndReturn(&running_callback_).Run(false); 373 base::ResetAndReturn(&running_callback_).Run(false);
370 break; 374 break;
371 375
372 case VIDEO_CAPTURE_STATE_STARTING: 376 case VIDEO_CAPTURE_STATE_STARTING:
373 case VIDEO_CAPTURE_STATE_PAUSED: 377 case VIDEO_CAPTURE_STATE_PAUSED:
374 case VIDEO_CAPTURE_STATE_RESUMED: 378 case VIDEO_CAPTURE_STATE_RESUMED:
375 // Not applicable to reporting on device starts or errors. 379 // Not applicable to reporting on device starts or errors.
376 break; 380 break;
377 } 381 }
378 } 382 }
379 383
380 void LocalVideoCapturerSource::OnDeviceFormatsInUseReceived( 384 void LegacyLocalVideoCapturerSource::OnDeviceFormatsInUseReceived(
381 const media::VideoCaptureFormats& formats_in_use) { 385 const media::VideoCaptureFormats& formats_in_use) {
382 DVLOG(3) << __func__ << ", #formats received: " << formats_in_use.size(); 386 DVLOG(3) << __func__ << ", #formats received: " << formats_in_use.size();
383 DCHECK(thread_checker_.CalledOnValidThread()); 387 DCHECK(thread_checker_.CalledOnValidThread());
384 // StopCapture() might have destroyed |formats_enumerated_callback_| before 388 // StopCapture() might have destroyed |formats_enumerated_callback_| before
385 // arriving here. 389 // arriving here.
386 if (formats_enumerated_callback_.is_null()) 390 if (formats_enumerated_callback_.is_null())
387 return; 391 return;
388 if (formats_in_use.size()) { 392 if (formats_in_use.size()) {
389 base::ResetAndReturn(&formats_enumerated_callback_).Run(formats_in_use); 393 base::ResetAndReturn(&formats_enumerated_callback_).Run(formats_in_use);
390 return; 394 return;
391 } 395 }
392 396
393 // The device doesn't seem to have formats in use so try and retrieve the 397 // The device doesn't seem to have formats in use so try and retrieve the
394 // whole list of supported ones. 398 // whole list of supported ones.
395 manager_->GetDeviceSupportedFormats( 399 manager_->GetDeviceSupportedFormats(
396 session_id_, 400 session_id_,
397 media::BindToCurrentLoop( 401 media::BindToCurrentLoop(base::Bind(
398 base::Bind( 402 &LegacyLocalVideoCapturerSource::OnDeviceSupportedFormatsEnumerated,
399 &LocalVideoCapturerSource::OnDeviceSupportedFormatsEnumerated, 403 weak_factory_.GetWeakPtr())));
400 weak_factory_.GetWeakPtr())));
401 } 404 }
402 405
403 void LocalVideoCapturerSource::OnDeviceSupportedFormatsEnumerated( 406 void LegacyLocalVideoCapturerSource::OnDeviceSupportedFormatsEnumerated(
404 const media::VideoCaptureFormats& formats) { 407 const media::VideoCaptureFormats& formats) {
405 DVLOG(3) << __func__ << ", #formats received: " << formats.size(); 408 DVLOG(3) << __func__ << ", #formats received: " << formats.size();
406 DCHECK(thread_checker_.CalledOnValidThread()); 409 DCHECK(thread_checker_.CalledOnValidThread());
407 // StopCapture() might have destroyed |formats_enumerated_callback_| before 410 // StopCapture() might have destroyed |formats_enumerated_callback_| before
408 // arriving here. 411 // arriving here.
409 if (formats_enumerated_callback_.is_null()) 412 if (formats_enumerated_callback_.is_null())
410 return; 413 return;
411 if (formats.size()) { 414 if (formats.size()) {
412 base::ResetAndReturn(&formats_enumerated_callback_).Run(formats); 415 base::ResetAndReturn(&formats_enumerated_callback_).Run(formats);
413 return; 416 return;
414 } 417 }
415 418
416 // The capture device doesn't seem to support capability enumeration, compose 419 // The capture device doesn't seem to support capability enumeration, compose
417 // a fallback list of capabilities. 420 // a fallback list of capabilities.
418 media::VideoCaptureFormats default_formats; 421 media::VideoCaptureFormats default_formats;
419 for (const auto& resolution : kVideoResolutions) { 422 for (const auto& resolution : kVideoResolutions) {
420 for (const auto frame_rate : kVideoFrameRates) { 423 for (const auto frame_rate : kVideoFrameRates) {
421 default_formats.push_back(media::VideoCaptureFormat( 424 default_formats.push_back(media::VideoCaptureFormat(
422 gfx::Size(resolution.width, resolution.height), frame_rate, 425 gfx::Size(resolution.width, resolution.height), frame_rate,
423 media::PIXEL_FORMAT_I420)); 426 media::PIXEL_FORMAT_I420));
424 } 427 }
425 } 428 }
426 base::ResetAndReturn(&formats_enumerated_callback_).Run(default_formats); 429 base::ResetAndReturn(&formats_enumerated_callback_).Run(default_formats);
427 } 430 }
428 431
432 // LocalVideoCapturerSource is a delegate used by MediaStreamVideoCapturerSource
433 // for local video capture. It uses the Render singleton VideoCaptureImplManager
434 // to start / stop and receive I420 frames from Chrome's video capture
435 // implementation. This is a main Render thread only object.
436 class LocalVideoCapturerSource final : public media::VideoCapturerSource {
437 public:
438 explicit LocalVideoCapturerSource(const StreamDeviceInfo& device_info);
439 ~LocalVideoCapturerSource() override;
440
441 // VideoCaptureDelegate Implementation.
442 media::VideoCaptureFormats GetPreferredFormats() override;
443 void StartCapture(const media::VideoCaptureParams& params,
444 const VideoCaptureDeliverFrameCB& new_frame_callback,
445 const RunningCallback& running_callback) override;
446 void RequestRefreshFrame() override;
447 void MaybeSuspend() override;
448 void Resume() override;
449 void StopCapture() override;
450
451 private:
452 void OnStateUpdate(VideoCaptureState state);
453
454 // |session_id_| identifies the capture device used for this capture session.
455 const media::VideoCaptureSessionId session_id_;
456
457 VideoCaptureImplManager* const manager_;
458
459 const base::Closure release_device_cb_;
460
461 // These two are valid between StartCapture() and StopCapture().
462 // |running_call_back_| is run when capture is successfully started, and when
463 // it is stopped or error happens.
464 RunningCallback running_callback_;
465 base::Closure stop_capture_cb_;
466
467 // Bound to the main render thread.
468 base::ThreadChecker thread_checker_;
469
470 base::WeakPtrFactory<LocalVideoCapturerSource> weak_factory_;
471
472 DISALLOW_COPY_AND_ASSIGN(LocalVideoCapturerSource);
473 };
474
475 LocalVideoCapturerSource::LocalVideoCapturerSource(
476 const StreamDeviceInfo& device_info)
477 : session_id_(device_info.session_id),
478 manager_(RenderThreadImpl::current()->video_capture_impl_manager()),
479 release_device_cb_(manager_->UseDevice(session_id_)),
480 weak_factory_(this) {
481 DCHECK(RenderThreadImpl::current());
482 }
483
484 LocalVideoCapturerSource::~LocalVideoCapturerSource() {
485 DCHECK(thread_checker_.CalledOnValidThread());
486 release_device_cb_.Run();
487 }
488
489 media::VideoCaptureFormats LocalVideoCapturerSource::GetPreferredFormats() {
490 DCHECK(thread_checker_.CalledOnValidThread());
491 return media::VideoCaptureFormats();
492 }
493
494 void LocalVideoCapturerSource::StartCapture(
495 const media::VideoCaptureParams& params,
496 const VideoCaptureDeliverFrameCB& new_frame_callback,
497 const RunningCallback& running_callback) {
498 DCHECK(params.requested_format.IsValid());
499 DCHECK(thread_checker_.CalledOnValidThread());
500 running_callback_ = running_callback;
501
502 stop_capture_cb_ =
503 manager_->StartCapture(session_id_, params,
504 media::BindToCurrentLoop(base::Bind(
505 &LocalVideoCapturerSource::OnStateUpdate,
506 weak_factory_.GetWeakPtr())),
507 new_frame_callback);
508 }
509
510 void LocalVideoCapturerSource::RequestRefreshFrame() {
511 DCHECK(thread_checker_.CalledOnValidThread());
512 if (stop_capture_cb_.is_null())
513 return; // Do not request frames if the source is stopped.
514 manager_->RequestRefreshFrame(session_id_);
515 }
516
517 void LocalVideoCapturerSource::MaybeSuspend() {
518 DCHECK(thread_checker_.CalledOnValidThread());
519 manager_->Suspend(session_id_);
520 }
521
522 void LocalVideoCapturerSource::Resume() {
523 DCHECK(thread_checker_.CalledOnValidThread());
524 manager_->Resume(session_id_);
525 }
526
527 void LocalVideoCapturerSource::StopCapture() {
528 DCHECK(thread_checker_.CalledOnValidThread());
529 // Immediately make sure we don't provide more frames.
530 if (!stop_capture_cb_.is_null())
531 base::ResetAndReturn(&stop_capture_cb_).Run();
532 running_callback_.Reset();
533 }
534
535 void LocalVideoCapturerSource::OnStateUpdate(VideoCaptureState state) {
536 DCHECK(thread_checker_.CalledOnValidThread());
537 if (running_callback_.is_null())
538 return;
539 switch (state) {
540 case VIDEO_CAPTURE_STATE_STARTED:
541 running_callback_.Run(true);
542 break;
543
544 case VIDEO_CAPTURE_STATE_STOPPING:
545 case VIDEO_CAPTURE_STATE_STOPPED:
546 case VIDEO_CAPTURE_STATE_ERROR:
547 case VIDEO_CAPTURE_STATE_ENDED:
548 base::ResetAndReturn(&running_callback_).Run(false);
549 break;
550
551 case VIDEO_CAPTURE_STATE_STARTING:
552 case VIDEO_CAPTURE_STATE_PAUSED:
553 case VIDEO_CAPTURE_STATE_RESUMED:
554 // Not applicable to reporting on device starts or errors.
555 break;
556 }
557 }
558
559 } // namespace
560
429 MediaStreamVideoCapturerSource::MediaStreamVideoCapturerSource( 561 MediaStreamVideoCapturerSource::MediaStreamVideoCapturerSource(
430 const SourceStoppedCallback& stop_callback, 562 const SourceStoppedCallback& stop_callback,
431 std::unique_ptr<media::VideoCapturerSource> source) 563 std::unique_ptr<media::VideoCapturerSource> source)
432 : RenderFrameObserver(nullptr), source_(std::move(source)) { 564 : RenderFrameObserver(nullptr), source_(std::move(source)) {
565 if (!IsOldVideoConstraints()) {
566 media::VideoCaptureFormats preferred_formats =
567 source_->GetPreferredFormats();
568 if (!preferred_formats.empty())
569 capture_params_.requested_format = preferred_formats.front();
570 }
433 SetStopCallback(stop_callback); 571 SetStopCallback(stop_callback);
434 } 572 }
435 573
436 MediaStreamVideoCapturerSource::MediaStreamVideoCapturerSource( 574 MediaStreamVideoCapturerSource::MediaStreamVideoCapturerSource(
437 const SourceStoppedCallback& stop_callback, 575 const SourceStoppedCallback& stop_callback,
438 const StreamDeviceInfo& device_info, 576 const StreamDeviceInfo& device_info,
439 RenderFrame* render_frame) 577 RenderFrame* render_frame)
440 : RenderFrameObserver(render_frame), 578 : RenderFrameObserver(render_frame),
441 source_(new LocalVideoCapturerSource(device_info)) { 579 source_(new LegacyLocalVideoCapturerSource(device_info)) {
580 DCHECK(IsOldVideoConstraints());
442 SetStopCallback(stop_callback); 581 SetStopCallback(stop_callback);
443 SetDeviceInfo(device_info); 582 SetDeviceInfo(device_info);
444 } 583 }
584
585 MediaStreamVideoCapturerSource::MediaStreamVideoCapturerSource(
586 const SourceStoppedCallback& stop_callback,
587 const StreamDeviceInfo& device_info,
588 const media::VideoCaptureParams& capture_params,
589 RenderFrame* render_frame)
590 : RenderFrameObserver(render_frame),
591 source_(new LocalVideoCapturerSource(device_info)),
592 capture_params_(capture_params) {
593 DCHECK(!IsOldVideoConstraints());
594 SetStopCallback(stop_callback);
595 SetDeviceInfo(device_info);
596 }
445 597
446 MediaStreamVideoCapturerSource::~MediaStreamVideoCapturerSource() { 598 MediaStreamVideoCapturerSource::~MediaStreamVideoCapturerSource() {
447 } 599 }
448 600
449 void MediaStreamVideoCapturerSource::RequestRefreshFrame() { 601 void MediaStreamVideoCapturerSource::RequestRefreshFrame() {
450 source_->RequestRefreshFrame(); 602 source_->RequestRefreshFrame();
451 } 603 }
452 604
453 void MediaStreamVideoCapturerSource::OnHasConsumers(bool has_consumers) { 605 void MediaStreamVideoCapturerSource::OnHasConsumers(bool has_consumers) {
454 if (has_consumers) 606 if (has_consumers)
(...skipping 16 matching lines...) Expand all
471 max_requested_width, 623 max_requested_width,
472 max_requested_height, 624 max_requested_height,
473 max_requested_frame_rate, 625 max_requested_frame_rate,
474 callback); 626 callback);
475 } 627 }
476 628
477 void MediaStreamVideoCapturerSource::StartSourceImpl( 629 void MediaStreamVideoCapturerSource::StartSourceImpl(
478 const media::VideoCaptureFormat& format, 630 const media::VideoCaptureFormat& format,
479 const blink::WebMediaConstraints& constraints, 631 const blink::WebMediaConstraints& constraints,
480 const VideoCaptureDeliverFrameCB& frame_callback) { 632 const VideoCaptureDeliverFrameCB& frame_callback) {
481 media::VideoCaptureParams new_params; 633 if (IsOldVideoConstraints()) {
482 new_params.requested_format = format; 634 capture_params_.requested_format = format;
483 if (IsContentVideoCaptureDevice(device_info())) { 635 if (IsContentVideoCaptureDevice(device_info())) {
484 SetContentCaptureParamsFromConstraints( 636 SetContentCaptureParamsFromConstraints(
485 constraints, device_info().device.type, &new_params); 637 constraints, device_info().device.type, &capture_params_);
486 } else if (device_info().device.type == MEDIA_DEVICE_VIDEO_CAPTURE) { 638 } else if (device_info().device.type == MEDIA_DEVICE_VIDEO_CAPTURE) {
487 SetPowerLineFrequencyParamFromConstraints(constraints, &new_params); 639 SetPowerLineFrequencyParamFromConstraints(constraints, &capture_params_);
640 }
488 } 641 }
489 642
490 is_capture_starting_ = true; 643 is_capture_starting_ = true;
491 source_->StartCapture( 644 source_->StartCapture(
492 new_params, frame_callback, 645 capture_params_, frame_callback,
493 base::Bind(&MediaStreamVideoCapturerSource::OnRunStateChanged, 646 base::Bind(&MediaStreamVideoCapturerSource::OnRunStateChanged,
494 base::Unretained(this))); 647 base::Unretained(this)));
495 } 648 }
496 649
497 void MediaStreamVideoCapturerSource::StopSourceImpl() { 650 void MediaStreamVideoCapturerSource::StopSourceImpl() {
498 source_->StopCapture(); 651 source_->StopCapture();
499 } 652 }
500 653
654 base::Optional<media::VideoCaptureFormat>
655 MediaStreamVideoCapturerSource::GetCurrentFormatImpl() const {
656 DCHECK(!IsOldVideoConstraints());
657 return capture_params_.requested_format;
658 }
659
501 void MediaStreamVideoCapturerSource::OnRunStateChanged(bool is_running) { 660 void MediaStreamVideoCapturerSource::OnRunStateChanged(bool is_running) {
502 if (is_capture_starting_) { 661 if (is_capture_starting_) {
503 OnStartDone(is_running ? MEDIA_DEVICE_OK 662 OnStartDone(is_running ? MEDIA_DEVICE_OK
504 : MEDIA_DEVICE_TRACK_START_FAILURE); 663 : MEDIA_DEVICE_TRACK_START_FAILURE);
505 is_capture_starting_ = false; 664 is_capture_starting_ = false;
506 } else if (!is_running) { 665 } else if (!is_running) {
507 StopSource(); 666 StopSource();
508 } 667 }
509 } 668 }
510 669
511 const char* 670 const char*
512 MediaStreamVideoCapturerSource::GetPowerLineFrequencyForTesting() const { 671 MediaStreamVideoCapturerSource::GetPowerLineFrequencyForTesting() const {
513 return kPowerLineFrequency; 672 return kPowerLineFrequency;
514 } 673 }
515 674
516 } // namespace content 675 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698