Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1708)

Unified Diff: content/renderer/media/media_stream_video_source.cc

Issue 2790823002: Spec compliant video constraints for getUserMedia behind flag. (Closed)
Patch Set: rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 &current_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() {
}
« no previous file with comments | « content/renderer/media/media_stream_video_source.h ('k') | content/renderer/media/media_stream_video_source_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698