| Index: content/renderer/media/media_stream_video_source.cc
|
| diff --git a/content/renderer/media/media_stream_video_source.cc b/content/renderer/media/media_stream_video_source.cc
|
| index 89ddd92bdd510b6450517c9a44fba3b3f571615a..3d67b6d0f47963e6af6f3a4aac58dbe18fa922f7 100644
|
| --- a/content/renderer/media/media_stream_video_source.cc
|
| +++ b/content/renderer/media/media_stream_video_source.cc
|
| @@ -6,13 +6,17 @@
|
|
|
| #include <algorithm>
|
| #include <limits>
|
| +#include <memory>
|
| #include <string>
|
| +#include <utility>
|
|
|
| +#include "base/feature_list.h"
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/trace_event/trace_event.h"
|
| #include "content/child/child_process.h"
|
| +#include "content/public/common/content_features.h"
|
| #include "content/renderer/media/media_stream_constraints_util_video_device.h"
|
| #include "content/renderer/media/media_stream_video_track.h"
|
| #include "content/renderer/media/video_track_adapter.h"
|
| @@ -307,6 +311,11 @@ media::VideoCaptureFormat GetBestCaptureFormat(
|
|
|
| } // anonymous namespace
|
|
|
| +bool IsOldVideoConstraints() {
|
| + return base::FeatureList::IsEnabled(
|
| + features::kMediaStreamOldVideoConstraints);
|
| +}
|
| +
|
| // static
|
| MediaStreamVideoSource* MediaStreamVideoSource::GetVideoSource(
|
| const blink::WebMediaStreamSource& source) {
|
| @@ -327,12 +336,13 @@ MediaStreamVideoSource::~MediaStreamVideoSource() {
|
| DCHECK(CalledOnValidThread());
|
| }
|
|
|
| -void MediaStreamVideoSource::AddTrack(
|
| +void MediaStreamVideoSource::AddTrackLegacy(
|
| MediaStreamVideoTrack* track,
|
| const VideoCaptureDeliverFrameCB& frame_callback,
|
| const blink::WebMediaConstraints& constraints,
|
| const ConstraintsCallback& callback) {
|
| DCHECK(CalledOnValidThread());
|
| + DCHECK(IsOldVideoConstraints());
|
| DCHECK(!constraints.isNull());
|
| DCHECK(std::find(tracks_.begin(), tracks_.end(), track) == tracks_.end());
|
| tracks_.push_back(track);
|
| @@ -377,6 +387,45 @@ void MediaStreamVideoSource::AddTrack(
|
| case ENDED:
|
| case STARTED: {
|
| // Currently, reconfiguring the source is not supported.
|
| + FinalizeAddTrackLegacy();
|
| + }
|
| + }
|
| +}
|
| +
|
| +void MediaStreamVideoSource::AddTrack(
|
| + MediaStreamVideoTrack* track,
|
| + const VideoTrackAdapterSettings& track_adapter_settings,
|
| + const VideoCaptureDeliverFrameCB& frame_callback,
|
| + const ConstraintsCallback& callback) {
|
| + DCHECK(CalledOnValidThread());
|
| + DCHECK(std::find(tracks_.begin(), tracks_.end(), track) == tracks_.end());
|
| + tracks_.push_back(track);
|
| + secure_tracker_.Add(track, true);
|
| +
|
| + track_descriptors_.push_back(TrackDescriptor(
|
| + track, frame_callback,
|
| + base::MakeUnique<VideoTrackAdapterSettings>(track_adapter_settings),
|
| + callback));
|
| +
|
| + switch (state_) {
|
| + case NEW: {
|
| + state_ = STARTING;
|
| + blink::WebMediaConstraints ignored_constraints;
|
| + StartSourceImpl(
|
| + media::VideoCaptureFormat() /* ignored */, ignored_constraints,
|
| + base::Bind(&VideoTrackAdapter::DeliverFrameOnIO, track_adapter_));
|
| + break;
|
| + }
|
| + case STARTING: {
|
| + break;
|
| + }
|
| + case RETRIEVING_CAPABILITIES: {
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| + case ENDED:
|
| + case STARTED: {
|
| + // Currently, reconfiguring the source is not supported.
|
| FinalizeAddTrack();
|
| }
|
| }
|
| @@ -433,12 +482,21 @@ base::SingleThreadTaskRunner* MediaStreamVideoSource::io_task_runner() const {
|
| return track_adapter_->io_task_runner();
|
| }
|
|
|
| -const media::VideoCaptureFormat*
|
| - MediaStreamVideoSource::GetCurrentFormat() const {
|
| +base::Optional<media::VideoCaptureFormat>
|
| +MediaStreamVideoSource::GetCurrentFormat() const {
|
| DCHECK(CalledOnValidThread());
|
| - if (state_ == STARTING || state_ == STARTED)
|
| - return ¤t_format_;
|
| - return nullptr;
|
| + if (IsOldVideoConstraints()) {
|
| + if (state_ == STARTING || state_ == STARTED)
|
| + return current_format_;
|
| + return base::Optional<media::VideoCaptureFormat>();
|
| + } else {
|
| + return GetCurrentFormatImpl();
|
| + }
|
| +}
|
| +
|
| +base::Optional<media::VideoCaptureFormat>
|
| +MediaStreamVideoSource::GetCurrentFormatImpl() const {
|
| + return base::Optional<media::VideoCaptureFormat>();
|
| }
|
|
|
| void MediaStreamVideoSource::DoStopSource() {
|
| @@ -455,6 +513,7 @@ void MediaStreamVideoSource::DoStopSource() {
|
| void MediaStreamVideoSource::OnSupportedFormats(
|
| const media::VideoCaptureFormats& formats) {
|
| DCHECK(CalledOnValidThread());
|
| + DCHECK(IsOldVideoConstraints());
|
| DCHECK_EQ(RETRIEVING_CAPABILITIES, state_);
|
|
|
| supported_formats_ = formats;
|
| @@ -466,7 +525,7 @@ void MediaStreamVideoSource::OnSupportedFormats(
|
| DVLOG(3) << "OnSupportedFormats failed to find an usable format";
|
| // This object can be deleted after calling FinalizeAddTrack. See comment
|
| // in the header file.
|
| - FinalizeAddTrack();
|
| + FinalizeAddTrackLegacy();
|
| return;
|
| }
|
|
|
| @@ -528,23 +587,26 @@ void MediaStreamVideoSource::OnStartDone(MediaStreamRequestResult result) {
|
| DCHECK_EQ(STARTING, state_);
|
| state_ = STARTED;
|
| SetReadyState(blink::WebMediaStreamSource::ReadyStateLive);
|
| -
|
| + double frame_rate =
|
| + GetCurrentFormat() ? GetCurrentFormat()->frame_rate : 0.0;
|
| track_adapter_->StartFrameMonitoring(
|
| - current_format_.frame_rate,
|
| - base::Bind(&MediaStreamVideoSource::SetMutedState,
|
| - weak_factory_.GetWeakPtr()));
|
| -
|
| + frame_rate, base::Bind(&MediaStreamVideoSource::SetMutedState,
|
| + weak_factory_.GetWeakPtr()));
|
| } else {
|
| StopSource();
|
| }
|
|
|
| // This object can be deleted after calling FinalizeAddTrack. See comment in
|
| // the header file.
|
| - FinalizeAddTrack();
|
| + if (IsOldVideoConstraints())
|
| + FinalizeAddTrackLegacy();
|
| + else
|
| + FinalizeAddTrack();
|
| }
|
|
|
| -void MediaStreamVideoSource::FinalizeAddTrack() {
|
| +void MediaStreamVideoSource::FinalizeAddTrackLegacy() {
|
| DCHECK(CalledOnValidThread());
|
| + DCHECK(IsOldVideoConstraints());
|
| const media::VideoCaptureFormats formats(1, current_format_);
|
|
|
| std::vector<TrackDescriptor> track_descriptors;
|
| @@ -557,7 +619,7 @@ void MediaStreamVideoSource::FinalizeAddTrack() {
|
| FilterFormats(track.constraints, formats, &unsatisfied_constraint)
|
| .empty()) {
|
| result = MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED;
|
| - DVLOG(3) << "FinalizeAddTrack() ignoring device on constraint "
|
| + DVLOG(3) << "FinalizeAddTrackLegacy() ignoring device on constraint "
|
| << unsatisfied_constraint;
|
| }
|
|
|
| @@ -592,7 +654,7 @@ void MediaStreamVideoSource::FinalizeAddTrack() {
|
| track.track->SetTargetSize(desired_size.width(), desired_size.height());
|
| }
|
|
|
| - DVLOG(3) << "FinalizeAddTrack() result " << result;
|
| + DVLOG(3) << "FinalizeAddTrackLegacy() result " << result;
|
|
|
| if (!track.callback.is_null())
|
| track.callback.Run(this, result,
|
| @@ -600,6 +662,39 @@ void MediaStreamVideoSource::FinalizeAddTrack() {
|
| }
|
| }
|
|
|
| +void MediaStreamVideoSource::FinalizeAddTrack() {
|
| + DCHECK(CalledOnValidThread());
|
| + DCHECK(!IsOldVideoConstraints());
|
| + std::vector<TrackDescriptor> track_descriptors;
|
| + track_descriptors.swap(track_descriptors_);
|
| + for (const auto& track : track_descriptors) {
|
| + MediaStreamRequestResult result = MEDIA_DEVICE_OK;
|
| + if (state_ != STARTED)
|
| + result = MEDIA_DEVICE_TRACK_START_FAILURE;
|
| +
|
| + if (result == MEDIA_DEVICE_OK) {
|
| + track_adapter_->AddTrack(track.track, track.frame_callback,
|
| + *track.adapter_settings);
|
| +
|
| + // Calculate resulting frame size if the source delivers frames
|
| + // according to the current format. Note: Format may change later.
|
| + gfx::Size desired_size;
|
| + VideoTrackAdapter::CalculateTargetSize(
|
| + GetCurrentFormat() ? GetCurrentFormat()->frame_size
|
| + : gfx::Size(track.adapter_settings->max_width,
|
| + track.adapter_settings->max_height),
|
| + gfx::Size(track.adapter_settings->max_width,
|
| + track.adapter_settings->max_height),
|
| + track.adapter_settings->min_aspect_ratio,
|
| + track.adapter_settings->max_aspect_ratio, &desired_size);
|
| + track.track->SetTargetSize(desired_size.width(), desired_size.height());
|
| + }
|
| +
|
| + if (!track.callback.is_null())
|
| + track.callback.Run(this, result, blink::WebString());
|
| + }
|
| +}
|
| +
|
| void MediaStreamVideoSource::SetReadyState(
|
| blink::WebMediaStreamSource::ReadyState state) {
|
| DVLOG(3) << "MediaStreamVideoSource::SetReadyState state " << state;
|
| @@ -629,10 +724,26 @@ MediaStreamVideoSource::TrackDescriptor::TrackDescriptor(
|
| frame_callback(frame_callback),
|
| constraints(constraints),
|
| callback(callback) {
|
| + DCHECK(IsOldVideoConstraints());
|
| +}
|
| +
|
| +MediaStreamVideoSource::TrackDescriptor::TrackDescriptor(
|
| + MediaStreamVideoTrack* track,
|
| + const VideoCaptureDeliverFrameCB& frame_callback,
|
| + std::unique_ptr<VideoTrackAdapterSettings> adapter_settings,
|
| + const ConstraintsCallback& callback)
|
| + : track(track),
|
| + frame_callback(frame_callback),
|
| + adapter_settings(std::move(adapter_settings)),
|
| + callback(callback) {
|
| + DCHECK(!IsOldVideoConstraints());
|
| }
|
|
|
| MediaStreamVideoSource::TrackDescriptor::TrackDescriptor(
|
| - const TrackDescriptor& other) = default;
|
| + TrackDescriptor&& other) = default;
|
| +MediaStreamVideoSource::TrackDescriptor&
|
| +MediaStreamVideoSource::TrackDescriptor::operator=(
|
| + MediaStreamVideoSource::TrackDescriptor&& other) = default;
|
|
|
| MediaStreamVideoSource::TrackDescriptor::~TrackDescriptor() {
|
| }
|
|
|