Commit abd675c9 authored by Guido Urdaneta's avatar Guido Urdaneta Committed by Chromium LUCI CQ

[MediaStream] Construct track adapter lazily in MediaStreamVideoSource

This is a preparation CL to make GetWeakPtr() pure virtual.
Since creating the track adapter requires a weak pointer to the source,
it will not be possible to create it in the source constructor when
GetWeakPtr becomes virtual.

Bug: 1158227
Change-Id: I480d22da45632aacb227776c326a9f00135215f4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2588908Reviewed-by: default avatarElad Alon <eladalon@chromium.org>
Commit-Queue: Guido Urdaneta <guidou@chromium.org>
Cr-Commit-Position: refs/heads/master@{#837064}
parent 21935e16
......@@ -309,6 +309,7 @@ class BLINK_MODULES_EXPORT MediaStreamVideoSource
void DidStopSource(RestartResult result);
void NotifyCapturingLinkSecured(size_t num_encoded_sinks);
size_t CountEncodedSinks() const;
scoped_refptr<VideoTrackAdapter> GetTrackAdapter();
State state_;
......
......@@ -43,10 +43,7 @@ MediaStreamVideoSource* MediaStreamVideoSource::GetVideoSource(
return static_cast<MediaStreamVideoSource*>(source->GetPlatformSource());
}
MediaStreamVideoSource::MediaStreamVideoSource() : state_(NEW) {
track_adapter_ = base::MakeRefCounted<VideoTrackAdapter>(
Platform::Current()->GetIOTaskRunner(), GetWeakPtr());
}
MediaStreamVideoSource::MediaStreamVideoSource() : state_(NEW) {}
MediaStreamVideoSource::~MediaStreamVideoSource() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
......@@ -79,10 +76,10 @@ void MediaStreamVideoSource::AddTrack(
state_ = STARTING;
StartSourceImpl(
ConvertToBaseRepeatingCallback(CrossThreadBindRepeating(
&VideoTrackAdapter::DeliverFrameOnIO, track_adapter_)),
&VideoTrackAdapter::DeliverFrameOnIO, GetTrackAdapter())),
ConvertToBaseRepeatingCallback(CrossThreadBindRepeating(
&VideoTrackAdapter::DeliverEncodedVideoFrameOnIO,
track_adapter_)));
GetTrackAdapter())));
break;
}
case STARTING:
......@@ -127,7 +124,7 @@ void MediaStreamVideoSource::RemoveTrack(MediaStreamVideoTrack* video_track,
// Call |frame_adapter_->RemoveTrack| here even if adding the track has
// failed and |frame_adapter_->AddCallback| has not been called.
track_adapter_->RemoveTrack(video_track);
GetTrackAdapter()->RemoveTrack(video_track);
if (tracks_.empty()) {
if (callback) {
......@@ -191,7 +188,7 @@ void MediaStreamVideoSource::DidStopSource(RestartResult result) {
void MediaStreamVideoSource::ReconfigureTrack(
MediaStreamVideoTrack* track,
const VideoTrackAdapterSettings& adapter_settings) {
track_adapter_->ReconfigureTrack(track, adapter_settings);
GetTrackAdapter()->ReconfigureTrack(track, adapter_settings);
// It's OK to reconfigure settings even if ReconfigureTrack fails, provided
// |track| is not connected to a different source, which is a precondition
// for calling this method.
......@@ -209,13 +206,13 @@ void MediaStreamVideoSource::StopForRestart(RestartCallback callback,
}
DCHECK(!restart_callback_);
track_adapter_->StopFrameMonitoring();
GetTrackAdapter()->StopFrameMonitoring();
state_ = STOPPING_FOR_RESTART;
restart_callback_ = std::move(callback);
if (send_black_frame) {
const base::Optional<gfx::Size> source_size =
track_adapter_->source_frame_size();
GetTrackAdapter()->source_frame_size();
scoped_refptr<media::VideoFrame> black_frame =
media::VideoFrame::CreateBlackFrame(
source_size.has_value() ? *source_size
......@@ -223,7 +220,7 @@ void MediaStreamVideoSource::StopForRestart(RestartCallback callback,
PostCrossThreadTask(
*io_task_runner(), FROM_HERE,
CrossThreadBindOnce(&VideoTrackAdapter::DeliverFrameOnIO,
track_adapter_, black_frame,
GetTrackAdapter(), black_frame,
base::TimeTicks::Now()));
}
......@@ -336,7 +333,7 @@ void MediaStreamVideoSource::SetDeviceRotationDetection(bool enabled) {
base::SingleThreadTaskRunner* MediaStreamVideoSource::io_task_runner() const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return track_adapter_->io_task_runner();
return Platform::Current()->GetIOTaskRunner().get();
}
base::Optional<media::VideoCaptureFormat>
......@@ -388,7 +385,7 @@ void MediaStreamVideoSource::DoStopSource() {
DVLOG(3) << "DoStopSource()";
if (state_ == ENDED)
return;
track_adapter_->StopFrameMonitoring();
GetTrackAdapter()->StopFrameMonitoring();
StopSourceImpl();
state_ = ENDED;
SetReadyState(WebMediaStreamSource::kReadyStateEnded);
......@@ -432,7 +429,7 @@ void MediaStreamVideoSource::FinalizeAddPendingTracks() {
}
if (result == mojom::blink::MediaStreamRequestResult::OK) {
track_adapter_->AddTrack(
GetTrackAdapter()->AddTrack(
track_info.track, track_info.frame_callback,
track_info.encoded_frame_callback, track_info.settings_callback,
track_info.format_callback, *track_info.adapter_settings);
......@@ -457,9 +454,9 @@ void MediaStreamVideoSource::StartFrameMonitoring() {
base::Optional<media::VideoCaptureFormat> current_format = GetCurrentFormat();
double frame_rate = current_format ? current_format->frame_rate : 0.0;
if (current_format && enable_device_rotation_detection_) {
track_adapter_->SetSourceFrameSize(current_format->frame_size);
GetTrackAdapter()->SetSourceFrameSize(current_format->frame_size);
}
track_adapter_->StartFrameMonitoring(
GetTrackAdapter()->StartFrameMonitoring(
frame_rate, WTF::BindRepeating(&MediaStreamVideoSource::SetMutedState,
weak_factory_.GetWeakPtr()));
}
......@@ -513,6 +510,15 @@ VideoCaptureFeedbackCB MediaStreamVideoSource::GetFeedbackCallback() const {
return base::DoNothing();
}
scoped_refptr<VideoTrackAdapter> MediaStreamVideoSource::GetTrackAdapter() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (!track_adapter_) {
track_adapter_ =
base::MakeRefCounted<VideoTrackAdapter>(io_task_runner(), GetWeakPtr());
}
return track_adapter_;
}
MediaStreamVideoSource::PendingTrackInfo::PendingTrackInfo(
MediaStreamVideoTrack* track,
const VideoCaptureDeliverFrameCB& frame_callback,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment