Index: media/cast/sender/video_sender.cc |
diff --git a/media/cast/sender/video_sender.cc b/media/cast/sender/video_sender.cc |
index 9f8b6f9bd2e0f9c7eaf49019d46c219e930f72e5..f4dcb6e020687f071aaaf10fce0776fe5c9b51c4 100644 |
--- a/media/cast/sender/video_sender.cc |
+++ b/media/cast/sender/video_sender.cc |
@@ -26,6 +26,7 @@ namespace cast { |
VideoSender::VideoSender( |
scoped_refptr<CastEnvironment> cast_environment, |
const VideoSenderConfig& video_config, |
+ const CastInitializationCallback& initialization_cb, |
const CreateVideoEncodeAcceleratorCallback& create_vea_cb, |
const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, |
CastTransportSender* const transport_sender) |
@@ -51,11 +52,15 @@ VideoSender::VideoSender( |
DCHECK_GT(max_unacked_frames_, 0); |
if (video_config.use_external_encoder) { |
- video_encoder_.reset(new ExternalVideoEncoder(cast_environment, |
- video_config, |
- create_vea_cb, |
- create_video_encode_mem_cb)); |
+ video_encoder_.reset(new ExternalVideoEncoder( |
+ cast_environment, |
+ video_config, |
+ base::Bind(&VideoSender::OnEncoderInitialized, |
+ weak_factory_.GetWeakPtr(), initialization_cb), |
+ create_vea_cb, |
+ create_video_encode_mem_cb)); |
} else { |
+ // Software encoder is initialized immediately. |
congestion_control_.reset( |
NewAdaptiveCongestionControl(cast_environment->Clock(), |
video_config.max_bitrate, |
@@ -63,8 +68,15 @@ VideoSender::VideoSender( |
max_unacked_frames_)); |
video_encoder_.reset(new VideoEncoderImpl( |
cast_environment, video_config, max_unacked_frames_)); |
+ cast_initialization_status_ = STATUS_VIDEO_INITIALIZED; |
+ } |
+ |
+ if (cast_initialization_status_ == STATUS_VIDEO_INITIALIZED) { |
+ cast_environment->PostTask( |
+ CastEnvironment::MAIN, |
+ FROM_HERE, |
+ base::Bind(initialization_cb, cast_initialization_status_)); |
} |
- cast_initialization_status_ = STATUS_VIDEO_INITIALIZED; |
media::cast::CastTransportRtpConfig transport_config; |
transport_config.ssrc = video_config.ssrc; |
@@ -144,6 +156,13 @@ void VideoSender::OnAck(uint32 frame_id) { |
video_encoder_->LatestFrameIdToReference(frame_id); |
} |
+void VideoSender::OnEncoderInitialized( |
+ const CastInitializationCallback& initialization_cb, |
+ CastInitializationStatus status) { |
+ cast_initialization_status_ = status; |
+ initialization_cb.Run(status); |
+} |
+ |
void VideoSender::OnEncodedVideoFrame( |
int encoder_bitrate, |
scoped_ptr<EncodedFrame> encoded_frame) { |