OLD | NEW |
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/video_track_adapter.h" | 5 #include "content/renderer/media/video_track_adapter.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 if (keep_frame_counter_ >= 1) { | 351 if (keep_frame_counter_ >= 1) { |
352 keep_frame_counter_ -= 1; | 352 keep_frame_counter_ -= 1; |
353 // Keep the frame. | 353 // Keep the frame. |
354 return false; | 354 return false; |
355 } | 355 } |
356 DVLOG(3) << "Drop frame. Input frame_rate_ " << frame_rate_ << "."; | 356 DVLOG(3) << "Drop frame. Input frame_rate_ " << frame_rate_ << "."; |
357 return true; | 357 return true; |
358 } | 358 } |
359 | 359 |
360 VideoTrackAdapter::VideoTrackAdapter( | 360 VideoTrackAdapter::VideoTrackAdapter( |
361 const scoped_refptr<base::MessageLoopProxy>& io_message_loop) | 361 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) |
362 : io_message_loop_(io_message_loop), | 362 : io_task_runner_(io_task_runner), |
363 renderer_task_runner_(base::MessageLoopProxy::current()), | 363 renderer_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
364 monitoring_frame_rate_(false), | 364 monitoring_frame_rate_(false), |
365 muted_state_(false), | 365 muted_state_(false), |
366 frame_counter_(0), | 366 frame_counter_(0), |
367 source_frame_rate_(0.0f) { | 367 source_frame_rate_(0.0f) { |
368 DCHECK(io_message_loop_.get()); | 368 DCHECK(io_task_runner); |
369 } | 369 } |
370 | 370 |
371 VideoTrackAdapter::~VideoTrackAdapter() { | 371 VideoTrackAdapter::~VideoTrackAdapter() { |
372 DCHECK(adapters_.empty()); | 372 DCHECK(adapters_.empty()); |
373 } | 373 } |
374 | 374 |
375 void VideoTrackAdapter::AddTrack(const MediaStreamVideoTrack* track, | 375 void VideoTrackAdapter::AddTrack(const MediaStreamVideoTrack* track, |
376 VideoCaptureDeliverFrameCB frame_callback, | 376 VideoCaptureDeliverFrameCB frame_callback, |
377 int max_width, | 377 int max_width, |
378 int max_height, | 378 int max_height, |
379 double min_aspect_ratio, | 379 double min_aspect_ratio, |
380 double max_aspect_ratio, | 380 double max_aspect_ratio, |
381 double max_frame_rate) { | 381 double max_frame_rate) { |
382 DCHECK(thread_checker_.CalledOnValidThread()); | 382 DCHECK(thread_checker_.CalledOnValidThread()); |
383 | 383 |
384 io_message_loop_->PostTask( | 384 io_task_runner_->PostTask( |
385 FROM_HERE, | 385 FROM_HERE, |
386 base::Bind(&VideoTrackAdapter::AddTrackOnIO, | 386 base::Bind(&VideoTrackAdapter::AddTrackOnIO, this, track, frame_callback, |
387 this, track, frame_callback, gfx::Size(max_width, max_height), | 387 gfx::Size(max_width, max_height), min_aspect_ratio, |
388 min_aspect_ratio, max_aspect_ratio, max_frame_rate)); | 388 max_aspect_ratio, max_frame_rate)); |
389 } | 389 } |
390 | 390 |
391 void VideoTrackAdapter::AddTrackOnIO(const MediaStreamVideoTrack* track, | 391 void VideoTrackAdapter::AddTrackOnIO(const MediaStreamVideoTrack* track, |
392 VideoCaptureDeliverFrameCB frame_callback, | 392 VideoCaptureDeliverFrameCB frame_callback, |
393 const gfx::Size& max_frame_size, | 393 const gfx::Size& max_frame_size, |
394 double min_aspect_ratio, | 394 double min_aspect_ratio, |
395 double max_aspect_ratio, | 395 double max_aspect_ratio, |
396 double max_frame_rate) { | 396 double max_frame_rate) { |
397 DCHECK(io_message_loop_->BelongsToCurrentThread()); | 397 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
398 scoped_refptr<VideoFrameResolutionAdapter> adapter; | 398 scoped_refptr<VideoFrameResolutionAdapter> adapter; |
399 for (const auto& frame_adapter : adapters_) { | 399 for (const auto& frame_adapter : adapters_) { |
400 if (frame_adapter->ConstraintsMatch(max_frame_size, min_aspect_ratio, | 400 if (frame_adapter->ConstraintsMatch(max_frame_size, min_aspect_ratio, |
401 max_aspect_ratio, max_frame_rate)) { | 401 max_aspect_ratio, max_frame_rate)) { |
402 adapter = frame_adapter.get(); | 402 adapter = frame_adapter.get(); |
403 break; | 403 break; |
404 } | 404 } |
405 } | 405 } |
406 if (!adapter.get()) { | 406 if (!adapter.get()) { |
407 adapter = new VideoFrameResolutionAdapter(renderer_task_runner_, | 407 adapter = new VideoFrameResolutionAdapter(renderer_task_runner_, |
408 max_frame_size, | 408 max_frame_size, |
409 min_aspect_ratio, | 409 min_aspect_ratio, |
410 max_aspect_ratio, | 410 max_aspect_ratio, |
411 max_frame_rate); | 411 max_frame_rate); |
412 adapters_.push_back(adapter); | 412 adapters_.push_back(adapter); |
413 } | 413 } |
414 | 414 |
415 adapter->AddCallback(track, frame_callback); | 415 adapter->AddCallback(track, frame_callback); |
416 } | 416 } |
417 | 417 |
418 void VideoTrackAdapter::RemoveTrack(const MediaStreamVideoTrack* track) { | 418 void VideoTrackAdapter::RemoveTrack(const MediaStreamVideoTrack* track) { |
419 DCHECK(thread_checker_.CalledOnValidThread()); | 419 DCHECK(thread_checker_.CalledOnValidThread()); |
420 io_message_loop_->PostTask( | 420 io_task_runner_->PostTask( |
421 FROM_HERE, | 421 FROM_HERE, base::Bind(&VideoTrackAdapter::RemoveTrackOnIO, this, track)); |
422 base::Bind(&VideoTrackAdapter::RemoveTrackOnIO, this, track)); | |
423 } | 422 } |
424 | 423 |
425 void VideoTrackAdapter::StartFrameMonitoring( | 424 void VideoTrackAdapter::StartFrameMonitoring( |
426 double source_frame_rate, | 425 double source_frame_rate, |
427 const OnMutedCallback& on_muted_callback) { | 426 const OnMutedCallback& on_muted_callback) { |
428 DCHECK(thread_checker_.CalledOnValidThread()); | 427 DCHECK(thread_checker_.CalledOnValidThread()); |
429 | 428 |
430 VideoTrackAdapter::OnMutedCallback bound_on_muted_callback = | 429 VideoTrackAdapter::OnMutedCallback bound_on_muted_callback = |
431 media::BindToCurrentLoop(on_muted_callback); | 430 media::BindToCurrentLoop(on_muted_callback); |
432 | 431 |
433 io_message_loop_->PostTask( | 432 io_task_runner_->PostTask( |
434 FROM_HERE, | 433 FROM_HERE, base::Bind(&VideoTrackAdapter::StartFrameMonitoringOnIO, this, |
435 base::Bind(&VideoTrackAdapter::StartFrameMonitoringOnIO, | 434 bound_on_muted_callback, source_frame_rate)); |
436 this, bound_on_muted_callback, source_frame_rate)); | |
437 } | 435 } |
438 | 436 |
439 void VideoTrackAdapter::StopFrameMonitoring() { | 437 void VideoTrackAdapter::StopFrameMonitoring() { |
440 DCHECK(thread_checker_.CalledOnValidThread()); | 438 DCHECK(thread_checker_.CalledOnValidThread()); |
441 io_message_loop_->PostTask( | 439 io_task_runner_->PostTask( |
442 FROM_HERE, | 440 FROM_HERE, base::Bind(&VideoTrackAdapter::StopFrameMonitoringOnIO, this)); |
443 base::Bind(&VideoTrackAdapter::StopFrameMonitoringOnIO, this)); | |
444 } | 441 } |
445 | 442 |
446 void VideoTrackAdapter::StartFrameMonitoringOnIO( | 443 void VideoTrackAdapter::StartFrameMonitoringOnIO( |
447 const OnMutedCallback& on_muted_callback, | 444 const OnMutedCallback& on_muted_callback, |
448 double source_frame_rate) { | 445 double source_frame_rate) { |
449 DCHECK(io_message_loop_->BelongsToCurrentThread()); | 446 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
450 DCHECK(!monitoring_frame_rate_); | 447 DCHECK(!monitoring_frame_rate_); |
451 | 448 |
452 monitoring_frame_rate_ = true; | 449 monitoring_frame_rate_ = true; |
453 | 450 |
454 // If the source does not know the frame rate, set one by default. | 451 // If the source does not know the frame rate, set one by default. |
455 if (source_frame_rate == 0.0f) | 452 if (source_frame_rate == 0.0f) |
456 source_frame_rate = MediaStreamVideoSource::kDefaultFrameRate; | 453 source_frame_rate = MediaStreamVideoSource::kDefaultFrameRate; |
457 source_frame_rate_ = source_frame_rate; | 454 source_frame_rate_ = source_frame_rate; |
458 DVLOG(1) << "Monitoring frame creation, first (large) delay: " | 455 DVLOG(1) << "Monitoring frame creation, first (large) delay: " |
459 << (kFirstFrameTimeoutInFrameIntervals / source_frame_rate_) << "s"; | 456 << (kFirstFrameTimeoutInFrameIntervals / source_frame_rate_) << "s"; |
460 io_message_loop_->PostDelayedTask(FROM_HERE, | 457 io_task_runner_->PostDelayedTask( |
461 base::Bind(&VideoTrackAdapter::CheckFramesReceivedOnIO, this, | 458 FROM_HERE, base::Bind(&VideoTrackAdapter::CheckFramesReceivedOnIO, this, |
462 on_muted_callback, frame_counter_), | 459 on_muted_callback, frame_counter_), |
463 base::TimeDelta::FromSecondsD(kFirstFrameTimeoutInFrameIntervals / | 460 base::TimeDelta::FromSecondsD(kFirstFrameTimeoutInFrameIntervals / |
464 source_frame_rate_)); | 461 source_frame_rate_)); |
465 } | 462 } |
466 | 463 |
467 void VideoTrackAdapter::StopFrameMonitoringOnIO() { | 464 void VideoTrackAdapter::StopFrameMonitoringOnIO() { |
468 DCHECK(io_message_loop_->BelongsToCurrentThread()); | 465 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
469 monitoring_frame_rate_ = false; | 466 monitoring_frame_rate_ = false; |
470 } | 467 } |
471 | 468 |
472 void VideoTrackAdapter::RemoveTrackOnIO(const MediaStreamVideoTrack* track) { | 469 void VideoTrackAdapter::RemoveTrackOnIO(const MediaStreamVideoTrack* track) { |
473 DCHECK(io_message_loop_->BelongsToCurrentThread()); | 470 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
474 for (FrameAdapters::iterator it = adapters_.begin(); | 471 for (FrameAdapters::iterator it = adapters_.begin(); |
475 it != adapters_.end(); ++it) { | 472 it != adapters_.end(); ++it) { |
476 (*it)->RemoveCallback(track); | 473 (*it)->RemoveCallback(track); |
477 if ((*it)->IsEmpty()) { | 474 if ((*it)->IsEmpty()) { |
478 adapters_.erase(it); | 475 adapters_.erase(it); |
479 break; | 476 break; |
480 } | 477 } |
481 } | 478 } |
482 } | 479 } |
483 | 480 |
484 void VideoTrackAdapter::DeliverFrameOnIO( | 481 void VideoTrackAdapter::DeliverFrameOnIO( |
485 const scoped_refptr<media::VideoFrame>& frame, | 482 const scoped_refptr<media::VideoFrame>& frame, |
486 const base::TimeTicks& estimated_capture_time) { | 483 const base::TimeTicks& estimated_capture_time) { |
487 DCHECK(io_message_loop_->BelongsToCurrentThread()); | 484 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
488 TRACE_EVENT0("video", "VideoTrackAdapter::DeliverFrameOnIO"); | 485 TRACE_EVENT0("video", "VideoTrackAdapter::DeliverFrameOnIO"); |
489 ++frame_counter_; | 486 ++frame_counter_; |
490 for (const auto& adapter : adapters_) | 487 for (const auto& adapter : adapters_) |
491 adapter->DeliverFrame(frame, estimated_capture_time); | 488 adapter->DeliverFrame(frame, estimated_capture_time); |
492 } | 489 } |
493 | 490 |
494 void VideoTrackAdapter::CheckFramesReceivedOnIO( | 491 void VideoTrackAdapter::CheckFramesReceivedOnIO( |
495 const OnMutedCallback& set_muted_state_callback, | 492 const OnMutedCallback& set_muted_state_callback, |
496 uint64 old_frame_counter_snapshot) { | 493 uint64 old_frame_counter_snapshot) { |
497 DCHECK(io_message_loop_->BelongsToCurrentThread()); | 494 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
498 | 495 |
499 if (!monitoring_frame_rate_) | 496 if (!monitoring_frame_rate_) |
500 return; | 497 return; |
501 | 498 |
502 DVLOG_IF(1, old_frame_counter_snapshot == frame_counter_) | 499 DVLOG_IF(1, old_frame_counter_snapshot == frame_counter_) |
503 << "No frames have passed, setting source as Muted."; | 500 << "No frames have passed, setting source as Muted."; |
504 | 501 |
505 bool muted_state = old_frame_counter_snapshot == frame_counter_; | 502 bool muted_state = old_frame_counter_snapshot == frame_counter_; |
506 if (muted_state_ != muted_state) { | 503 if (muted_state_ != muted_state) { |
507 set_muted_state_callback.Run(muted_state); | 504 set_muted_state_callback.Run(muted_state); |
508 muted_state_ = muted_state; | 505 muted_state_ = muted_state; |
509 } | 506 } |
510 | 507 |
511 io_message_loop_->PostDelayedTask(FROM_HERE, | 508 io_task_runner_->PostDelayedTask( |
512 base::Bind(&VideoTrackAdapter::CheckFramesReceivedOnIO, this, | 509 FROM_HERE, base::Bind(&VideoTrackAdapter::CheckFramesReceivedOnIO, this, |
513 set_muted_state_callback, frame_counter_), | 510 set_muted_state_callback, frame_counter_), |
514 base::TimeDelta::FromSecondsD(kNormalFrameTimeoutInFrameIntervals / | 511 base::TimeDelta::FromSecondsD(kNormalFrameTimeoutInFrameIntervals / |
515 source_frame_rate_)); | 512 source_frame_rate_)); |
516 } | 513 } |
517 | 514 |
518 } // namespace content | 515 } // namespace content |
OLD | NEW |