Chromium Code Reviews| 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 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/debug/trace_event.h" | 12 #include "base/debug/trace_event.h" |
| 13 #include "base/location.h" | 13 #include "base/location.h" |
| 14 #include "media/base/video_util.h" | 14 #include "media/base/video_util.h" |
| 15 | 15 |
| 16 namespace content { | 16 namespace content { |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 static const float kFirstFrameTimeoutInFrameIntervals = 100.0f; | |
|
Henrik Grunell
2014/07/08 11:39:53
Remove static.
Comment on these.
mcasas
2014/07/08 16:12:01
Done.
| |
| 21 static const float kNormalFrameTimeoutInFrameIntervals = 25.0f; | |
| 22 | |
| 20 // Empty method used for keeping a reference to the original media::VideoFrame | 23 // Empty method used for keeping a reference to the original media::VideoFrame |
| 21 // in VideoFrameResolutionAdapter::DeliverFrame if cropping is needed. | 24 // in VideoFrameResolutionAdapter::DeliverFrame if cropping is needed. |
| 22 // The reference to |frame| is kept in the closure that calls this method. | 25 // The reference to |frame| is kept in the closure that calls this method. |
| 23 void ReleaseOriginalFrame( | 26 void ReleaseOriginalFrame( |
| 24 const scoped_refptr<media::VideoFrame>& frame) { | 27 const scoped_refptr<media::VideoFrame>& frame) { |
| 25 } | 28 } |
| 26 | 29 |
| 27 void ResetCallbackOnMainRenderThread( | 30 void ResetCallbackOnMainRenderThread( |
| 28 scoped_ptr<VideoCaptureDeliverFrameCB> callback) { | 31 scoped_ptr<VideoCaptureDeliverFrameCB> callback) { |
| 29 // |callback| will be deleted when this exits. | 32 // |callback| will be deleted when this exits. |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 294 } | 297 } |
| 295 | 298 |
| 296 bool VideoTrackAdapter::VideoFrameResolutionAdapter::IsEmpty() const { | 299 bool VideoTrackAdapter::VideoFrameResolutionAdapter::IsEmpty() const { |
| 297 DCHECK(io_thread_checker_.CalledOnValidThread()); | 300 DCHECK(io_thread_checker_.CalledOnValidThread()); |
| 298 return callbacks_.empty(); | 301 return callbacks_.empty(); |
| 299 } | 302 } |
| 300 | 303 |
| 301 VideoTrackAdapter::VideoTrackAdapter( | 304 VideoTrackAdapter::VideoTrackAdapter( |
| 302 const scoped_refptr<base::MessageLoopProxy>& io_message_loop) | 305 const scoped_refptr<base::MessageLoopProxy>& io_message_loop) |
| 303 : io_message_loop_(io_message_loop), | 306 : io_message_loop_(io_message_loop), |
| 304 renderer_task_runner_(base::MessageLoopProxy::current()) { | 307 renderer_task_runner_(base::MessageLoopProxy::current()), |
| 308 frame_counter_(0), | |
| 309 frame_rate_(0.0f) { | |
| 305 DCHECK(io_message_loop_); | 310 DCHECK(io_message_loop_); |
| 306 } | 311 } |
| 307 | 312 |
| 308 VideoTrackAdapter::~VideoTrackAdapter() { | 313 VideoTrackAdapter::~VideoTrackAdapter() { |
| 309 DCHECK(adapters_.empty()); | 314 DCHECK(adapters_.empty()); |
| 310 } | 315 } |
| 311 | 316 |
| 312 void VideoTrackAdapter::AddTrack(const MediaStreamVideoTrack* track, | 317 void VideoTrackAdapter::AddTrack( |
| 313 VideoCaptureDeliverFrameCB frame_callback, | 318 const MediaStreamVideoTrack* track, |
| 314 int max_width, | 319 VideoCaptureDeliverFrameCB frame_callback, |
| 315 int max_height, | 320 int max_width, |
| 316 double min_aspect_ratio, | 321 int max_height, |
| 317 double max_aspect_ratio, | 322 double min_aspect_ratio, |
| 318 double max_frame_rate) { | 323 double max_aspect_ratio, |
| 324 double max_frame_rate, | |
| 325 double target_frame_rate, | |
| 326 const OnMutedCallback& set_muted_state_callback) { | |
| 319 DCHECK(thread_checker_.CalledOnValidThread()); | 327 DCHECK(thread_checker_.CalledOnValidThread()); |
| 320 io_message_loop_->PostTask( | 328 io_message_loop_->PostTask( |
| 321 FROM_HERE, | 329 FROM_HERE, |
| 322 base::Bind(&VideoTrackAdapter::AddTrackOnIO, | 330 base::Bind(&VideoTrackAdapter::AddTrackOnIO, |
| 323 this, track, frame_callback, gfx::Size(max_width, max_height), | 331 this, track, frame_callback, gfx::Size(max_width, max_height), |
| 324 min_aspect_ratio, max_aspect_ratio, max_frame_rate)); | 332 min_aspect_ratio, max_aspect_ratio, max_frame_rate)); |
| 333 io_message_loop_->PostTask( | |
|
Henrik Grunell
2014/07/08 11:39:53
Could the monitoring possibly be racy initially? S
mcasas
2014/07/08 16:12:01
The posting could be racy with respect to the fram
| |
| 334 FROM_HERE, | |
| 335 base::Bind(&VideoTrackAdapter::StartTrackMonitoringOnIO, | |
| 336 this, set_muted_state_callback, target_frame_rate)); | |
| 325 } | 337 } |
| 326 | 338 |
| 327 void VideoTrackAdapter::AddTrackOnIO( | 339 void VideoTrackAdapter::AddTrackOnIO( |
| 328 const MediaStreamVideoTrack* track, | 340 const MediaStreamVideoTrack* track, |
| 329 VideoCaptureDeliverFrameCB frame_callback, | 341 VideoCaptureDeliverFrameCB frame_callback, |
| 330 const gfx::Size& max_frame_size, | 342 const gfx::Size& max_frame_size, |
| 331 double min_aspect_ratio, | 343 double min_aspect_ratio, |
| 332 double max_aspect_ratio, | 344 double max_aspect_ratio, |
| 333 double max_frame_rate) { | 345 double max_frame_rate) { |
| 334 DCHECK(io_message_loop_->BelongsToCurrentThread()); | 346 DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 353 adapter->AddCallback(track, frame_callback); | 365 adapter->AddCallback(track, frame_callback); |
| 354 } | 366 } |
| 355 | 367 |
| 356 void VideoTrackAdapter::RemoveTrack(const MediaStreamVideoTrack* track) { | 368 void VideoTrackAdapter::RemoveTrack(const MediaStreamVideoTrack* track) { |
| 357 DCHECK(thread_checker_.CalledOnValidThread()); | 369 DCHECK(thread_checker_.CalledOnValidThread()); |
| 358 io_message_loop_->PostTask( | 370 io_message_loop_->PostTask( |
| 359 FROM_HERE, | 371 FROM_HERE, |
| 360 base::Bind(&VideoTrackAdapter::RemoveTrackOnIO, this, track)); | 372 base::Bind(&VideoTrackAdapter::RemoveTrackOnIO, this, track)); |
| 361 } | 373 } |
| 362 | 374 |
| 375 void VideoTrackAdapter::StartTrackMonitoringOnIO( | |
| 376 const OnMutedCallback& set_muted_state_callback, | |
| 377 double target_frame_rate) { | |
| 378 DCHECK(io_message_loop_->BelongsToCurrentThread()); | |
| 379 frame_rate_ = target_frame_rate; | |
|
Henrik Grunell
2014/07/08 11:39:53
Should frame_rate_ be called target_frame_rate_?
mcasas
2014/07/08 16:12:01
Done.
| |
| 380 DCHECK_NE(frame_rate_, 0.0f); | |
|
Henrik Grunell
2014/07/08 11:39:53
Put this dcheck before setting |frame_rate_| and c
mcasas
2014/07/08 16:12:01
Done.
| |
| 381 DVLOG(1) << "Monitoring frame creation, first (large) delay: " | |
| 382 << (kFirstFrameTimeoutInFrameIntervals / frame_rate_) << "s"; | |
| 383 io_message_loop_->PostDelayedTask(FROM_HERE, | |
| 384 base::Bind(&VideoTrackAdapter::CheckFramesReceivedOnIO, this, | |
| 385 set_muted_state_callback, frame_counter_), | |
| 386 base::TimeDelta::FromSecondsD(kFirstFrameTimeoutInFrameIntervals / | |
| 387 frame_rate_)); | |
| 388 } | |
| 389 | |
| 363 void VideoTrackAdapter::RemoveTrackOnIO(const MediaStreamVideoTrack* track) { | 390 void VideoTrackAdapter::RemoveTrackOnIO(const MediaStreamVideoTrack* track) { |
| 364 DCHECK(io_message_loop_->BelongsToCurrentThread()); | 391 DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| 365 for (FrameAdapters::iterator it = adapters_.begin(); | 392 for (FrameAdapters::iterator it = adapters_.begin(); |
| 366 it != adapters_.end(); ++it) { | 393 it != adapters_.end(); ++it) { |
| 367 (*it)->RemoveCallback(track); | 394 (*it)->RemoveCallback(track); |
| 368 if ((*it)->IsEmpty()) { | 395 if ((*it)->IsEmpty()) { |
| 369 adapters_.erase(it); | 396 adapters_.erase(it); |
| 370 break; | 397 break; |
| 371 } | 398 } |
| 372 } | 399 } |
| 373 } | 400 } |
| 374 | 401 |
| 375 void VideoTrackAdapter::DeliverFrameOnIO( | 402 void VideoTrackAdapter::DeliverFrameOnIO( |
| 376 const scoped_refptr<media::VideoFrame>& frame, | 403 const scoped_refptr<media::VideoFrame>& frame, |
| 377 const media::VideoCaptureFormat& format, | 404 const media::VideoCaptureFormat& format, |
| 378 const base::TimeTicks& estimated_capture_time) { | 405 const base::TimeTicks& estimated_capture_time) { |
| 379 DCHECK(io_message_loop_->BelongsToCurrentThread()); | 406 DCHECK(io_message_loop_->BelongsToCurrentThread()); |
| 380 TRACE_EVENT0("video", "VideoTrackAdapter::DeliverFrameOnIO"); | 407 TRACE_EVENT0("video", "VideoTrackAdapter::DeliverFrameOnIO"); |
| 408 ++frame_counter_; | |
| 381 for (FrameAdapters::iterator it = adapters_.begin(); | 409 for (FrameAdapters::iterator it = adapters_.begin(); |
| 382 it != adapters_.end(); ++it) { | 410 it != adapters_.end(); ++it) { |
| 383 (*it)->DeliverFrame(frame, format, estimated_capture_time); | 411 (*it)->DeliverFrame(frame, format, estimated_capture_time); |
| 384 } | 412 } |
| 385 } | 413 } |
| 386 | 414 |
| 415 void VideoTrackAdapter::CheckFramesReceivedOnIO( | |
| 416 const OnMutedCallback& set_muted_state_callback, | |
| 417 uint64 frame_counter_snapshot) { | |
|
Henrik Grunell
2014/07/08 11:39:53
I think the "snapshot" part of the name is somewha
mcasas
2014/07/08 16:12:01
Done.
| |
| 418 DCHECK(io_message_loop_->BelongsToCurrentThread()); | |
| 419 DVLOG_IF(1, frame_counter_snapshot == frame_counter_) | |
| 420 << "No frames have passed, setting source as Muted."; | |
| 421 set_muted_state_callback.Run(frame_counter_snapshot == frame_counter_); | |
| 422 | |
| 423 io_message_loop_->PostDelayedTask(FROM_HERE, | |
| 424 base::Bind(&VideoTrackAdapter::CheckFramesReceivedOnIO, this, | |
| 425 set_muted_state_callback, frame_counter_), | |
| 426 base::TimeDelta::FromSecondsD(kNormalFrameTimeoutInFrameIntervals / | |
| 427 frame_rate_)); | |
| 428 } | |
| 429 | |
| 387 } // namespace content | 430 } // namespace content |
| OLD | NEW |