| Index: content/renderer/media/media_stream_video_capturer_source.cc
|
| diff --git a/content/renderer/media/media_stream_video_capturer_source.cc b/content/renderer/media/media_stream_video_capturer_source.cc
|
| index d53f4d48c4299abce08046f1f2005d456bc5ba8f..74c4121fa6f449ad082d693f4d37e3b3b5cc27e7 100644
|
| --- a/content/renderer/media/media_stream_video_capturer_source.cc
|
| +++ b/content/renderer/media/media_stream_video_capturer_source.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "content/renderer/media/media_stream_video_capturer_source.h"
|
|
|
| +#include <algorithm>
|
| #include <utility>
|
|
|
| #include "base/bind.h"
|
| @@ -194,14 +195,16 @@ void SetPowerLineFrequencyParamFromConstraints(
|
| params->power_line_frequency = media::PowerLineFrequency::FREQUENCY_60HZ;
|
| }
|
|
|
| -// LocalVideoCapturerSource is a delegate used by MediaStreamVideoCapturerSource
|
| -// for local video capture. It uses the Render singleton VideoCaptureImplManager
|
| -// to start / stop and receive I420 frames from Chrome's video capture
|
| -// implementation. This is a main Render thread only object.
|
| -class LocalVideoCapturerSource final : public media::VideoCapturerSource {
|
| +// LegacyLocalVideoCapturerSource is a delegate used by
|
| +// MediaStreamVideoCapturerSource for local video capture. It uses the Render
|
| +// singleton VideoCaptureImplManager to start / stop and receive I420 frames
|
| +// from Chrome's video capture implementation. This is a main Render thread only
|
| +// object.
|
| +// TODO(guidou): Remove this class. http://crbug.com/706408
|
| +class LegacyLocalVideoCapturerSource final : public media::VideoCapturerSource {
|
| public:
|
| - explicit LocalVideoCapturerSource(const StreamDeviceInfo& device_info);
|
| - ~LocalVideoCapturerSource() override;
|
| + explicit LegacyLocalVideoCapturerSource(const StreamDeviceInfo& device_info);
|
| + ~LegacyLocalVideoCapturerSource() override;
|
|
|
| // VideoCaptureDelegate Implementation.
|
| void GetCurrentSupportedFormats(
|
| @@ -247,14 +250,12 @@ class LocalVideoCapturerSource final : public media::VideoCapturerSource {
|
| // Bound to the main render thread.
|
| base::ThreadChecker thread_checker_;
|
|
|
| - base::WeakPtrFactory<LocalVideoCapturerSource> weak_factory_;
|
| + base::WeakPtrFactory<LegacyLocalVideoCapturerSource> weak_factory_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(LocalVideoCapturerSource);
|
| + DISALLOW_COPY_AND_ASSIGN(LegacyLocalVideoCapturerSource);
|
| };
|
|
|
| -} // namespace
|
| -
|
| -LocalVideoCapturerSource::LocalVideoCapturerSource(
|
| +LegacyLocalVideoCapturerSource::LegacyLocalVideoCapturerSource(
|
| const StreamDeviceInfo& device_info)
|
| : session_id_(device_info.session_id),
|
| manager_(RenderThreadImpl::current()->video_capture_impl_manager()),
|
| @@ -264,12 +265,12 @@ LocalVideoCapturerSource::LocalVideoCapturerSource(
|
| DCHECK(RenderThreadImpl::current());
|
| }
|
|
|
| -LocalVideoCapturerSource::~LocalVideoCapturerSource() {
|
| +LegacyLocalVideoCapturerSource::~LegacyLocalVideoCapturerSource() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| release_device_cb_.Run();
|
| }
|
|
|
| -void LocalVideoCapturerSource::GetCurrentSupportedFormats(
|
| +void LegacyLocalVideoCapturerSource::GetCurrentSupportedFormats(
|
| int max_requested_width,
|
| int max_requested_height,
|
| double max_requested_frame_rate,
|
| @@ -297,16 +298,18 @@ void LocalVideoCapturerSource::GetCurrentSupportedFormats(
|
| DCHECK(formats_enumerated_callback_.is_null());
|
| formats_enumerated_callback_ = callback;
|
| manager_->GetDeviceFormatsInUse(
|
| - session_id_, media::BindToCurrentLoop(base::Bind(
|
| - &LocalVideoCapturerSource::OnDeviceFormatsInUseReceived,
|
| - weak_factory_.GetWeakPtr())));
|
| + session_id_,
|
| + media::BindToCurrentLoop(base::Bind(
|
| + &LegacyLocalVideoCapturerSource::OnDeviceFormatsInUseReceived,
|
| + weak_factory_.GetWeakPtr())));
|
| }
|
|
|
| -media::VideoCaptureFormats LocalVideoCapturerSource::GetPreferredFormats() {
|
| +media::VideoCaptureFormats
|
| +LegacyLocalVideoCapturerSource::GetPreferredFormats() {
|
| return media::VideoCaptureFormats();
|
| }
|
|
|
| -void LocalVideoCapturerSource::StartCapture(
|
| +void LegacyLocalVideoCapturerSource::StartCapture(
|
| const media::VideoCaptureParams& params,
|
| const VideoCaptureDeliverFrameCB& new_frame_callback,
|
| const RunningCallback& running_callback) {
|
| @@ -314,14 +317,15 @@ void LocalVideoCapturerSource::StartCapture(
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| running_callback_ = running_callback;
|
|
|
| - stop_capture_cb_ = manager_->StartCapture(
|
| - session_id_, params, media::BindToCurrentLoop(base::Bind(
|
| - &LocalVideoCapturerSource::OnStateUpdate,
|
| - weak_factory_.GetWeakPtr())),
|
| - new_frame_callback);
|
| + stop_capture_cb_ =
|
| + manager_->StartCapture(session_id_, params,
|
| + media::BindToCurrentLoop(base::Bind(
|
| + &LegacyLocalVideoCapturerSource::OnStateUpdate,
|
| + weak_factory_.GetWeakPtr())),
|
| + new_frame_callback);
|
| }
|
|
|
| -void LocalVideoCapturerSource::RequestRefreshFrame() {
|
| +void LegacyLocalVideoCapturerSource::RequestRefreshFrame() {
|
| DVLOG(3) << __func__;
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| if (stop_capture_cb_.is_null())
|
| @@ -329,19 +333,19 @@ void LocalVideoCapturerSource::RequestRefreshFrame() {
|
| manager_->RequestRefreshFrame(session_id_);
|
| }
|
|
|
| -void LocalVideoCapturerSource::MaybeSuspend() {
|
| +void LegacyLocalVideoCapturerSource::MaybeSuspend() {
|
| DVLOG(3) << __func__;
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| manager_->Suspend(session_id_);
|
| }
|
|
|
| -void LocalVideoCapturerSource::Resume() {
|
| +void LegacyLocalVideoCapturerSource::Resume() {
|
| DVLOG(3) << __func__;
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| manager_->Resume(session_id_);
|
| }
|
|
|
| -void LocalVideoCapturerSource::StopCapture() {
|
| +void LegacyLocalVideoCapturerSource::StopCapture() {
|
| DVLOG(3) << __func__;
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| // Immediately make sure we don't provide more frames.
|
| @@ -352,7 +356,7 @@ void LocalVideoCapturerSource::StopCapture() {
|
| formats_enumerated_callback_.Reset();
|
| }
|
|
|
| -void LocalVideoCapturerSource::OnStateUpdate(VideoCaptureState state) {
|
| +void LegacyLocalVideoCapturerSource::OnStateUpdate(VideoCaptureState state) {
|
| DVLOG(3) << __func__ << " state = " << state;
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| if (running_callback_.is_null())
|
| @@ -377,7 +381,7 @@ void LocalVideoCapturerSource::OnStateUpdate(VideoCaptureState state) {
|
| }
|
| }
|
|
|
| -void LocalVideoCapturerSource::OnDeviceFormatsInUseReceived(
|
| +void LegacyLocalVideoCapturerSource::OnDeviceFormatsInUseReceived(
|
| const media::VideoCaptureFormats& formats_in_use) {
|
| DVLOG(3) << __func__ << ", #formats received: " << formats_in_use.size();
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| @@ -394,13 +398,12 @@ void LocalVideoCapturerSource::OnDeviceFormatsInUseReceived(
|
| // whole list of supported ones.
|
| manager_->GetDeviceSupportedFormats(
|
| session_id_,
|
| - media::BindToCurrentLoop(
|
| - base::Bind(
|
| - &LocalVideoCapturerSource::OnDeviceSupportedFormatsEnumerated,
|
| - weak_factory_.GetWeakPtr())));
|
| + media::BindToCurrentLoop(base::Bind(
|
| + &LegacyLocalVideoCapturerSource::OnDeviceSupportedFormatsEnumerated,
|
| + weak_factory_.GetWeakPtr())));
|
| }
|
|
|
| -void LocalVideoCapturerSource::OnDeviceSupportedFormatsEnumerated(
|
| +void LegacyLocalVideoCapturerSource::OnDeviceSupportedFormatsEnumerated(
|
| const media::VideoCaptureFormats& formats) {
|
| DVLOG(3) << __func__ << ", #formats received: " << formats.size();
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| @@ -426,10 +429,145 @@ void LocalVideoCapturerSource::OnDeviceSupportedFormatsEnumerated(
|
| base::ResetAndReturn(&formats_enumerated_callback_).Run(default_formats);
|
| }
|
|
|
| +// LocalVideoCapturerSource is a delegate used by MediaStreamVideoCapturerSource
|
| +// for local video capture. It uses the Render singleton VideoCaptureImplManager
|
| +// to start / stop and receive I420 frames from Chrome's video capture
|
| +// implementation. This is a main Render thread only object.
|
| +class LocalVideoCapturerSource final : public media::VideoCapturerSource {
|
| + public:
|
| + explicit LocalVideoCapturerSource(const StreamDeviceInfo& device_info);
|
| + ~LocalVideoCapturerSource() override;
|
| +
|
| + // VideoCaptureDelegate Implementation.
|
| + media::VideoCaptureFormats GetPreferredFormats() override;
|
| + void StartCapture(const media::VideoCaptureParams& params,
|
| + const VideoCaptureDeliverFrameCB& new_frame_callback,
|
| + const RunningCallback& running_callback) override;
|
| + void RequestRefreshFrame() override;
|
| + void MaybeSuspend() override;
|
| + void Resume() override;
|
| + void StopCapture() override;
|
| +
|
| + private:
|
| + void OnStateUpdate(VideoCaptureState state);
|
| +
|
| + // |session_id_| identifies the capture device used for this capture session.
|
| + const media::VideoCaptureSessionId session_id_;
|
| +
|
| + VideoCaptureImplManager* const manager_;
|
| +
|
| + const base::Closure release_device_cb_;
|
| +
|
| + // These two are valid between StartCapture() and StopCapture().
|
| + // |running_call_back_| is run when capture is successfully started, and when
|
| + // it is stopped or error happens.
|
| + RunningCallback running_callback_;
|
| + base::Closure stop_capture_cb_;
|
| +
|
| + // Bound to the main render thread.
|
| + base::ThreadChecker thread_checker_;
|
| +
|
| + base::WeakPtrFactory<LocalVideoCapturerSource> weak_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(LocalVideoCapturerSource);
|
| +};
|
| +
|
| +LocalVideoCapturerSource::LocalVideoCapturerSource(
|
| + const StreamDeviceInfo& device_info)
|
| + : session_id_(device_info.session_id),
|
| + manager_(RenderThreadImpl::current()->video_capture_impl_manager()),
|
| + release_device_cb_(manager_->UseDevice(session_id_)),
|
| + weak_factory_(this) {
|
| + DCHECK(RenderThreadImpl::current());
|
| +}
|
| +
|
| +LocalVideoCapturerSource::~LocalVideoCapturerSource() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + release_device_cb_.Run();
|
| +}
|
| +
|
| +media::VideoCaptureFormats LocalVideoCapturerSource::GetPreferredFormats() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + return media::VideoCaptureFormats();
|
| +}
|
| +
|
| +void LocalVideoCapturerSource::StartCapture(
|
| + const media::VideoCaptureParams& params,
|
| + const VideoCaptureDeliverFrameCB& new_frame_callback,
|
| + const RunningCallback& running_callback) {
|
| + DCHECK(params.requested_format.IsValid());
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + running_callback_ = running_callback;
|
| +
|
| + stop_capture_cb_ =
|
| + manager_->StartCapture(session_id_, params,
|
| + media::BindToCurrentLoop(base::Bind(
|
| + &LocalVideoCapturerSource::OnStateUpdate,
|
| + weak_factory_.GetWeakPtr())),
|
| + new_frame_callback);
|
| +}
|
| +
|
| +void LocalVideoCapturerSource::RequestRefreshFrame() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (stop_capture_cb_.is_null())
|
| + return; // Do not request frames if the source is stopped.
|
| + manager_->RequestRefreshFrame(session_id_);
|
| +}
|
| +
|
| +void LocalVideoCapturerSource::MaybeSuspend() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + manager_->Suspend(session_id_);
|
| +}
|
| +
|
| +void LocalVideoCapturerSource::Resume() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + manager_->Resume(session_id_);
|
| +}
|
| +
|
| +void LocalVideoCapturerSource::StopCapture() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + // Immediately make sure we don't provide more frames.
|
| + if (!stop_capture_cb_.is_null())
|
| + base::ResetAndReturn(&stop_capture_cb_).Run();
|
| + running_callback_.Reset();
|
| +}
|
| +
|
| +void LocalVideoCapturerSource::OnStateUpdate(VideoCaptureState state) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (running_callback_.is_null())
|
| + return;
|
| + switch (state) {
|
| + case VIDEO_CAPTURE_STATE_STARTED:
|
| + running_callback_.Run(true);
|
| + break;
|
| +
|
| + case VIDEO_CAPTURE_STATE_STOPPING:
|
| + case VIDEO_CAPTURE_STATE_STOPPED:
|
| + case VIDEO_CAPTURE_STATE_ERROR:
|
| + case VIDEO_CAPTURE_STATE_ENDED:
|
| + base::ResetAndReturn(&running_callback_).Run(false);
|
| + break;
|
| +
|
| + case VIDEO_CAPTURE_STATE_STARTING:
|
| + case VIDEO_CAPTURE_STATE_PAUSED:
|
| + case VIDEO_CAPTURE_STATE_RESUMED:
|
| + // Not applicable to reporting on device starts or errors.
|
| + break;
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| MediaStreamVideoCapturerSource::MediaStreamVideoCapturerSource(
|
| const SourceStoppedCallback& stop_callback,
|
| std::unique_ptr<media::VideoCapturerSource> source)
|
| : RenderFrameObserver(nullptr), source_(std::move(source)) {
|
| + if (!IsOldVideoConstraints()) {
|
| + media::VideoCaptureFormats preferred_formats =
|
| + source_->GetPreferredFormats();
|
| + if (!preferred_formats.empty())
|
| + capture_params_.requested_format = preferred_formats.front();
|
| + }
|
| SetStopCallback(stop_callback);
|
| }
|
|
|
| @@ -438,7 +576,21 @@ MediaStreamVideoCapturerSource::MediaStreamVideoCapturerSource(
|
| const StreamDeviceInfo& device_info,
|
| RenderFrame* render_frame)
|
| : RenderFrameObserver(render_frame),
|
| - source_(new LocalVideoCapturerSource(device_info)) {
|
| + source_(new LegacyLocalVideoCapturerSource(device_info)) {
|
| + DCHECK(IsOldVideoConstraints());
|
| + SetStopCallback(stop_callback);
|
| + SetDeviceInfo(device_info);
|
| +}
|
| +
|
| +MediaStreamVideoCapturerSource::MediaStreamVideoCapturerSource(
|
| + const SourceStoppedCallback& stop_callback,
|
| + const StreamDeviceInfo& device_info,
|
| + const media::VideoCaptureParams& capture_params,
|
| + RenderFrame* render_frame)
|
| + : RenderFrameObserver(render_frame),
|
| + source_(new LocalVideoCapturerSource(device_info)),
|
| + capture_params_(capture_params) {
|
| + DCHECK(!IsOldVideoConstraints());
|
| SetStopCallback(stop_callback);
|
| SetDeviceInfo(device_info);
|
| }
|
| @@ -478,18 +630,19 @@ void MediaStreamVideoCapturerSource::StartSourceImpl(
|
| const media::VideoCaptureFormat& format,
|
| const blink::WebMediaConstraints& constraints,
|
| const VideoCaptureDeliverFrameCB& frame_callback) {
|
| - media::VideoCaptureParams new_params;
|
| - new_params.requested_format = format;
|
| - if (IsContentVideoCaptureDevice(device_info())) {
|
| - SetContentCaptureParamsFromConstraints(
|
| - constraints, device_info().device.type, &new_params);
|
| - } else if (device_info().device.type == MEDIA_DEVICE_VIDEO_CAPTURE) {
|
| - SetPowerLineFrequencyParamFromConstraints(constraints, &new_params);
|
| + if (IsOldVideoConstraints()) {
|
| + capture_params_.requested_format = format;
|
| + if (IsContentVideoCaptureDevice(device_info())) {
|
| + SetContentCaptureParamsFromConstraints(
|
| + constraints, device_info().device.type, &capture_params_);
|
| + } else if (device_info().device.type == MEDIA_DEVICE_VIDEO_CAPTURE) {
|
| + SetPowerLineFrequencyParamFromConstraints(constraints, &capture_params_);
|
| + }
|
| }
|
|
|
| is_capture_starting_ = true;
|
| source_->StartCapture(
|
| - new_params, frame_callback,
|
| + capture_params_, frame_callback,
|
| base::Bind(&MediaStreamVideoCapturerSource::OnRunStateChanged,
|
| base::Unretained(this)));
|
| }
|
| @@ -498,6 +651,12 @@ void MediaStreamVideoCapturerSource::StopSourceImpl() {
|
| source_->StopCapture();
|
| }
|
|
|
| +base::Optional<media::VideoCaptureFormat>
|
| +MediaStreamVideoCapturerSource::GetCurrentFormatImpl() const {
|
| + DCHECK(!IsOldVideoConstraints());
|
| + return capture_params_.requested_format;
|
| +}
|
| +
|
| void MediaStreamVideoCapturerSource::OnRunStateChanged(bool is_running) {
|
| if (is_capture_starting_) {
|
| OnStartDone(is_running ? MEDIA_DEVICE_OK
|
|
|