| Index: content/renderer/media/video_track_adapter.cc
|
| diff --git a/content/renderer/media/video_track_adapter.cc b/content/renderer/media/video_track_adapter.cc
|
| index 914c54f0f4783522ccd1ea58592ef1d7b5e12f58..72ed2ff94d70be3736585d185724353611116005 100644
|
| --- a/content/renderer/media/video_track_adapter.cc
|
| +++ b/content/renderer/media/video_track_adapter.cc
|
| @@ -12,6 +12,7 @@
|
| #include "base/debug/trace_event.h"
|
| #include "base/location.h"
|
| #include "base/metrics/histogram.h"
|
| +#include "media/base/bind_to_current_loop.h"
|
| #include "media/base/video_util.h"
|
|
|
| namespace content {
|
| @@ -233,8 +234,9 @@ bool VideoTrackAdapter::VideoFrameResolutionAdapter::MaybeDropFrame(
|
| // frame rate is known and is lower than max.
|
| if (max_frame_rate_ == 0.0f ||
|
| (source_frame_rate > 0 &&
|
| - source_frame_rate <= max_frame_rate_))
|
| + source_frame_rate <= max_frame_rate_)) {
|
| return false;
|
| + }
|
|
|
| base::TimeDelta delta = frame->timestamp() - last_time_stamp_;
|
| if (delta.InMilliseconds() < kMinTimeInMsBetweenFrames) {
|
| @@ -334,6 +336,8 @@ VideoTrackAdapter::VideoTrackAdapter(
|
| const scoped_refptr<base::MessageLoopProxy>& io_message_loop)
|
| : io_message_loop_(io_message_loop),
|
| renderer_task_runner_(base::MessageLoopProxy::current()),
|
| + monitoring_frame_rate_(false),
|
| + muted_state_(false),
|
| frame_counter_(0),
|
| source_frame_rate_(0.0f) {
|
| DCHECK(io_message_loop_.get());
|
| @@ -352,16 +356,9 @@ void VideoTrackAdapter::AddTrack(
|
| int max_height,
|
| double min_aspect_ratio,
|
| double max_aspect_ratio,
|
| - double max_frame_rate,
|
| - double source_frame_rate,
|
| - const OnMutedCallback& on_muted_state_callback) {
|
| + double max_frame_rate) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| - // Track monitoring should be scheduled before AddTrackOnIO() so it can find
|
| - // |adapters_| empty.
|
| - io_message_loop_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&VideoTrackAdapter::StartTrackMonitoringOnIO,
|
| - this, on_muted_state_callback, source_frame_rate));
|
| +
|
| io_message_loop_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&VideoTrackAdapter::AddTrackOnIO,
|
| @@ -405,13 +402,28 @@ void VideoTrackAdapter::RemoveTrack(const MediaStreamVideoTrack* track) {
|
| base::Bind(&VideoTrackAdapter::RemoveTrackOnIO, this, track));
|
| }
|
|
|
| -void VideoTrackAdapter::StartTrackMonitoringOnIO(
|
| - const OnMutedCallback& on_muted_state_callback,
|
| +void VideoTrackAdapter::StartFrameMonitoring(
|
| + double source_frame_rate,
|
| + const OnMutedCallback& on_muted_callback) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + VideoTrackAdapter::OnMutedCallback bound_on_muted_callback =
|
| + media::BindToCurrentLoop(on_muted_callback);
|
| +
|
| + io_message_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&VideoTrackAdapter::StartFrameMonitoringOnIO,
|
| + this, bound_on_muted_callback, source_frame_rate));
|
| +}
|
| +
|
| +void VideoTrackAdapter::StartFrameMonitoringOnIO(
|
| + const OnMutedCallback& on_muted_callback,
|
| double source_frame_rate) {
|
| DCHECK(io_message_loop_->BelongsToCurrentThread());
|
| - // Only trigger monitoring for the first Track.
|
| - if (!adapters_.empty())
|
| - return;
|
| + DCHECK(!monitoring_frame_rate_);
|
| +
|
| + monitoring_frame_rate_ = true;
|
| +
|
| // If the source does not know the frame rate, set one by default.
|
| if (source_frame_rate == 0.0f)
|
| source_frame_rate = MediaStreamVideoSource::kDefaultFrameRate;
|
| @@ -420,11 +432,23 @@ void VideoTrackAdapter::StartTrackMonitoringOnIO(
|
| << (kFirstFrameTimeoutInFrameIntervals / source_frame_rate_) << "s";
|
| io_message_loop_->PostDelayedTask(FROM_HERE,
|
| base::Bind(&VideoTrackAdapter::CheckFramesReceivedOnIO, this,
|
| - on_muted_state_callback, frame_counter_),
|
| + on_muted_callback, frame_counter_),
|
| base::TimeDelta::FromSecondsD(kFirstFrameTimeoutInFrameIntervals /
|
| source_frame_rate_));
|
| }
|
|
|
| +void VideoTrackAdapter::StopFrameMonitoring() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + io_message_loop_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&VideoTrackAdapter::StopFrameMonitoringOnIO, this));
|
| +}
|
| +
|
| +void VideoTrackAdapter::StopFrameMonitoringOnIO() {
|
| + DCHECK(io_message_loop_->BelongsToCurrentThread());
|
| + monitoring_frame_rate_ = false;
|
| +}
|
| +
|
| void VideoTrackAdapter::RemoveTrackOnIO(const MediaStreamVideoTrack* track) {
|
| DCHECK(io_message_loop_->BelongsToCurrentThread());
|
| for (FrameAdapters::iterator it = adapters_.begin();
|
| @@ -454,12 +478,19 @@ void VideoTrackAdapter::CheckFramesReceivedOnIO(
|
| const OnMutedCallback& set_muted_state_callback,
|
| uint64 old_frame_counter_snapshot) {
|
| DCHECK(io_message_loop_->BelongsToCurrentThread());
|
| +
|
| + if (!monitoring_frame_rate_)
|
| + return;
|
| +
|
| DVLOG_IF(1, old_frame_counter_snapshot == frame_counter_)
|
| << "No frames have passed, setting source as Muted.";
|
| - set_muted_state_callback.Run(old_frame_counter_snapshot == frame_counter_);
|
|
|
| - // Rearm the monitoring while there are active Tracks, i.e. as long as the
|
| - // owner MediaStreamSource is active.
|
| + bool muted_state = old_frame_counter_snapshot == frame_counter_;
|
| + if (muted_state_ != muted_state) {
|
| + set_muted_state_callback.Run(muted_state);
|
| + muted_state_ = muted_state;
|
| + }
|
| +
|
| io_message_loop_->PostDelayedTask(FROM_HERE,
|
| base::Bind(&VideoTrackAdapter::CheckFramesReceivedOnIO, this,
|
| set_muted_state_callback, frame_counter_),
|
|
|