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 ...@@ -309,6 +309,7 @@ class BLINK_MODULES_EXPORT MediaStreamVideoSource
void DidStopSource(RestartResult result); void DidStopSource(RestartResult result);
void NotifyCapturingLinkSecured(size_t num_encoded_sinks); void NotifyCapturingLinkSecured(size_t num_encoded_sinks);
size_t CountEncodedSinks() const; size_t CountEncodedSinks() const;
scoped_refptr<VideoTrackAdapter> GetTrackAdapter();
State state_; State state_;
......
...@@ -43,10 +43,7 @@ MediaStreamVideoSource* MediaStreamVideoSource::GetVideoSource( ...@@ -43,10 +43,7 @@ MediaStreamVideoSource* MediaStreamVideoSource::GetVideoSource(
return static_cast<MediaStreamVideoSource*>(source->GetPlatformSource()); return static_cast<MediaStreamVideoSource*>(source->GetPlatformSource());
} }
MediaStreamVideoSource::MediaStreamVideoSource() : state_(NEW) { MediaStreamVideoSource::MediaStreamVideoSource() : state_(NEW) {}
track_adapter_ = base::MakeRefCounted<VideoTrackAdapter>(
Platform::Current()->GetIOTaskRunner(), GetWeakPtr());
}
MediaStreamVideoSource::~MediaStreamVideoSource() { MediaStreamVideoSource::~MediaStreamVideoSource() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
...@@ -79,10 +76,10 @@ void MediaStreamVideoSource::AddTrack( ...@@ -79,10 +76,10 @@ void MediaStreamVideoSource::AddTrack(
state_ = STARTING; state_ = STARTING;
StartSourceImpl( StartSourceImpl(
ConvertToBaseRepeatingCallback(CrossThreadBindRepeating( ConvertToBaseRepeatingCallback(CrossThreadBindRepeating(
&VideoTrackAdapter::DeliverFrameOnIO, track_adapter_)), &VideoTrackAdapter::DeliverFrameOnIO, GetTrackAdapter())),
ConvertToBaseRepeatingCallback(CrossThreadBindRepeating( ConvertToBaseRepeatingCallback(CrossThreadBindRepeating(
&VideoTrackAdapter::DeliverEncodedVideoFrameOnIO, &VideoTrackAdapter::DeliverEncodedVideoFrameOnIO,
track_adapter_))); GetTrackAdapter())));
break; break;
} }
case STARTING: case STARTING:
...@@ -127,7 +124,7 @@ void MediaStreamVideoSource::RemoveTrack(MediaStreamVideoTrack* video_track, ...@@ -127,7 +124,7 @@ void MediaStreamVideoSource::RemoveTrack(MediaStreamVideoTrack* video_track,
// Call |frame_adapter_->RemoveTrack| here even if adding the track has // Call |frame_adapter_->RemoveTrack| here even if adding the track has
// failed and |frame_adapter_->AddCallback| has not been called. // failed and |frame_adapter_->AddCallback| has not been called.
track_adapter_->RemoveTrack(video_track); GetTrackAdapter()->RemoveTrack(video_track);
if (tracks_.empty()) { if (tracks_.empty()) {
if (callback) { if (callback) {
...@@ -191,7 +188,7 @@ void MediaStreamVideoSource::DidStopSource(RestartResult result) { ...@@ -191,7 +188,7 @@ void MediaStreamVideoSource::DidStopSource(RestartResult result) {
void MediaStreamVideoSource::ReconfigureTrack( void MediaStreamVideoSource::ReconfigureTrack(
MediaStreamVideoTrack* track, MediaStreamVideoTrack* track,
const VideoTrackAdapterSettings& adapter_settings) { 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 // It's OK to reconfigure settings even if ReconfigureTrack fails, provided
// |track| is not connected to a different source, which is a precondition // |track| is not connected to a different source, which is a precondition
// for calling this method. // for calling this method.
...@@ -209,13 +206,13 @@ void MediaStreamVideoSource::StopForRestart(RestartCallback callback, ...@@ -209,13 +206,13 @@ void MediaStreamVideoSource::StopForRestart(RestartCallback callback,
} }
DCHECK(!restart_callback_); DCHECK(!restart_callback_);
track_adapter_->StopFrameMonitoring(); GetTrackAdapter()->StopFrameMonitoring();
state_ = STOPPING_FOR_RESTART; state_ = STOPPING_FOR_RESTART;
restart_callback_ = std::move(callback); restart_callback_ = std::move(callback);
if (send_black_frame) { if (send_black_frame) {
const base::Optional<gfx::Size> source_size = const base::Optional<gfx::Size> source_size =
track_adapter_->source_frame_size(); GetTrackAdapter()->source_frame_size();
scoped_refptr<media::VideoFrame> black_frame = scoped_refptr<media::VideoFrame> black_frame =
media::VideoFrame::CreateBlackFrame( media::VideoFrame::CreateBlackFrame(
source_size.has_value() ? *source_size source_size.has_value() ? *source_size
...@@ -223,7 +220,7 @@ void MediaStreamVideoSource::StopForRestart(RestartCallback callback, ...@@ -223,7 +220,7 @@ void MediaStreamVideoSource::StopForRestart(RestartCallback callback,
PostCrossThreadTask( PostCrossThreadTask(
*io_task_runner(), FROM_HERE, *io_task_runner(), FROM_HERE,
CrossThreadBindOnce(&VideoTrackAdapter::DeliverFrameOnIO, CrossThreadBindOnce(&VideoTrackAdapter::DeliverFrameOnIO,
track_adapter_, black_frame, GetTrackAdapter(), black_frame,
base::TimeTicks::Now())); base::TimeTicks::Now()));
} }
...@@ -336,7 +333,7 @@ void MediaStreamVideoSource::SetDeviceRotationDetection(bool enabled) { ...@@ -336,7 +333,7 @@ void MediaStreamVideoSource::SetDeviceRotationDetection(bool enabled) {
base::SingleThreadTaskRunner* MediaStreamVideoSource::io_task_runner() const { base::SingleThreadTaskRunner* MediaStreamVideoSource::io_task_runner() const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return track_adapter_->io_task_runner(); return Platform::Current()->GetIOTaskRunner().get();
} }
base::Optional<media::VideoCaptureFormat> base::Optional<media::VideoCaptureFormat>
...@@ -388,7 +385,7 @@ void MediaStreamVideoSource::DoStopSource() { ...@@ -388,7 +385,7 @@ void MediaStreamVideoSource::DoStopSource() {
DVLOG(3) << "DoStopSource()"; DVLOG(3) << "DoStopSource()";
if (state_ == ENDED) if (state_ == ENDED)
return; return;
track_adapter_->StopFrameMonitoring(); GetTrackAdapter()->StopFrameMonitoring();
StopSourceImpl(); StopSourceImpl();
state_ = ENDED; state_ = ENDED;
SetReadyState(WebMediaStreamSource::kReadyStateEnded); SetReadyState(WebMediaStreamSource::kReadyStateEnded);
...@@ -432,7 +429,7 @@ void MediaStreamVideoSource::FinalizeAddPendingTracks() { ...@@ -432,7 +429,7 @@ void MediaStreamVideoSource::FinalizeAddPendingTracks() {
} }
if (result == mojom::blink::MediaStreamRequestResult::OK) { if (result == mojom::blink::MediaStreamRequestResult::OK) {
track_adapter_->AddTrack( GetTrackAdapter()->AddTrack(
track_info.track, track_info.frame_callback, track_info.track, track_info.frame_callback,
track_info.encoded_frame_callback, track_info.settings_callback, track_info.encoded_frame_callback, track_info.settings_callback,
track_info.format_callback, *track_info.adapter_settings); track_info.format_callback, *track_info.adapter_settings);
...@@ -457,9 +454,9 @@ void MediaStreamVideoSource::StartFrameMonitoring() { ...@@ -457,9 +454,9 @@ void MediaStreamVideoSource::StartFrameMonitoring() {
base::Optional<media::VideoCaptureFormat> current_format = GetCurrentFormat(); base::Optional<media::VideoCaptureFormat> current_format = GetCurrentFormat();
double frame_rate = current_format ? current_format->frame_rate : 0.0; double frame_rate = current_format ? current_format->frame_rate : 0.0;
if (current_format && enable_device_rotation_detection_) { 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, frame_rate, WTF::BindRepeating(&MediaStreamVideoSource::SetMutedState,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
} }
...@@ -513,6 +510,15 @@ VideoCaptureFeedbackCB MediaStreamVideoSource::GetFeedbackCallback() const { ...@@ -513,6 +510,15 @@ VideoCaptureFeedbackCB MediaStreamVideoSource::GetFeedbackCallback() const {
return base::DoNothing(); 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( MediaStreamVideoSource::PendingTrackInfo::PendingTrackInfo(
MediaStreamVideoTrack* track, MediaStreamVideoTrack* track,
const VideoCaptureDeliverFrameCB& frame_callback, 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