Index: extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc |
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc |
index 65e4d8ec0a499a8c394a4ec743a6c066d4e482c0..e346de1196b4d849e2c13c45817ed74c15c67d95 100644 |
--- a/extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc |
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc |
@@ -71,31 +71,61 @@ void WiFiDisplayMediaPipeline::RequestIDRPicture() { |
video_encoder_->RequestIDRPicture(); |
} |
+enum WiFiDisplayMediaPipeline::InitializationStep : unsigned { |
+ INITIALIZE_FIRST, |
+ INITIALIZE_MEDIA_PACKETIZER = INITIALIZE_FIRST, |
+ INITIALIZE_VIDEO_ENCODER, |
+ INITIALIZE_MEDIA_SERVICE, |
+ INITIALIZE_LAST = INITIALIZE_MEDIA_SERVICE |
+}; |
+ |
void WiFiDisplayMediaPipeline::Initialize( |
const InitCompletionCallback& callback) { |
- DCHECK(init_completion_callback_.is_null()); |
- init_completion_callback_ = callback; |
- |
- CreateMediaPacketizer(); |
+ DCHECK(!video_encoder_ && !packetizer_); |
+ OnInitialize(callback, INITIALIZE_FIRST, true); |
+} |
- if (type_ & wds::VideoSession) { |
- CreateVideoEncoder(); |
+void WiFiDisplayMediaPipeline::OnInitialize( |
+ const InitCompletionCallback& callback, |
+ InitializationStep current_step, |
+ bool success) { |
+ if (!success) { |
+ callback.Run(false); |
return; |
} |
- service_callback_.Run( |
- mojo::GetProxy(&media_service_), |
- base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, |
- weak_factory_.GetWeakPtr())); |
-} |
+ InitStepCompletionCallback init_step_callback; |
+ if (current_step < INITIALIZE_LAST) { |
+ InitializationStep next_step = |
+ static_cast<InitializationStep>(current_step + 1u); |
+ init_step_callback = base::Bind(&WiFiDisplayMediaPipeline::OnInitialize, |
+ weak_factory_.GetWeakPtr(), callback, next_step); |
+ } |
-void WiFiDisplayMediaPipeline::CreateVideoEncoder() { |
- DCHECK(!video_encoder_); |
- auto result_callback = |
- base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated, |
- weak_factory_.GetWeakPtr()); |
- WiFiDisplayVideoEncoder::Create(video_parameters_, |
- result_callback); |
+ switch (current_step) { |
+ case INITIALIZE_MEDIA_PACKETIZER: |
+ DCHECK(!packetizer_); |
+ CreateMediaPacketizer(); |
+ init_step_callback.Run(true); |
+ break; |
+ case INITIALIZE_VIDEO_ENCODER: |
+ DCHECK(!video_encoder_); |
+ if (type_ & wds::VideoSession) { |
+ auto result_callback = |
+ base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated, |
+ weak_factory_.GetWeakPtr(), init_step_callback); |
+ WiFiDisplayVideoEncoder::Create(video_parameters_, result_callback); |
+ } else { |
+ init_step_callback.Run(true); |
+ } |
+ break; |
+ case INITIALIZE_MEDIA_SERVICE: |
+ service_callback_.Run( |
+ mojo::GetProxy(&media_service_), |
+ base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, |
+ weak_factory_.GetWeakPtr(), callback)); |
+ break; |
+ } |
} |
void WiFiDisplayMediaPipeline::CreateMediaPacketizer() { |
@@ -133,11 +163,15 @@ void WiFiDisplayMediaPipeline::CreateMediaPacketizer() { |
} |
void WiFiDisplayMediaPipeline::OnVideoEncoderCreated( |
+ const InitStepCompletionCallback& callback, |
scoped_refptr<WiFiDisplayVideoEncoder> video_encoder) { |
+ DCHECK(!video_encoder_); |
+ |
if (!video_encoder) { |
- init_completion_callback_.Run(false); |
+ callback.Run(false); |
return; |
} |
+ |
video_encoder_ = std::move(video_encoder); |
auto encoded_callback = base::Bind( |
&WiFiDisplayMediaPipeline::OnEncodedVideoFrame, |
@@ -145,20 +179,18 @@ void WiFiDisplayMediaPipeline::OnVideoEncoderCreated( |
auto error_callback = base::Bind(error_callback_, kErrorVideoEncoderError); |
video_encoder_->SetCallbacks(encoded_callback, error_callback); |
- service_callback_.Run( |
- mojo::GetProxy(&media_service_), |
- base::Bind(&WiFiDisplayMediaPipeline::OnMediaServiceRegistered, |
- weak_factory_.GetWeakPtr())); |
+ callback.Run(true); |
} |
-void WiFiDisplayMediaPipeline::OnMediaServiceRegistered() { |
+void WiFiDisplayMediaPipeline::OnMediaServiceRegistered( |
+ const InitCompletionCallback& callback) { |
DCHECK(media_service_); |
auto error_callback = base::Bind(error_callback_, kErrorUnableSendMedia); |
media_service_.set_connection_error_handler(error_callback); |
media_service_->SetDesinationPoint( |
sink_ip_address_, |
static_cast<int32_t>(sink_rtp_ports_.first), |
- init_completion_callback_); |
+ callback); |
} |
void WiFiDisplayMediaPipeline::OnEncodedVideoFrame( |