diff options
Diffstat (limited to 'cast/standalone_sender/looping_file_cast_agent.cc')
-rw-r--r-- | cast/standalone_sender/looping_file_cast_agent.cc | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/cast/standalone_sender/looping_file_cast_agent.cc b/cast/standalone_sender/looping_file_cast_agent.cc index ce9826de..bfb970bf 100644 --- a/cast/standalone_sender/looping_file_cast_agent.cc +++ b/cast/standalone_sender/looping_file_cast_agent.cc @@ -270,6 +270,10 @@ void LoopingFileCastAgent::CreateAndStartSession() { OSP_VLOG << "Starting session negotiation."; Error negotiation_error; if (connection_settings_->use_remoting) { + remoting_sender_ = std::make_unique<RemotingSender>( + current_session_->rpc_messenger(), AudioCodec::kOpus, VideoCodec::kVp8, + [this]() { OnRemotingReceiverReady(); }); + negotiation_error = current_session_->NegotiateRemoting(audio_config, video_config); } else { @@ -298,17 +302,17 @@ void LoopingFileCastAgent::OnNegotiated( void LoopingFileCastAgent::OnRemotingNegotiated( const SenderSession* session, SenderSession::RemotingNegotiation negotiation) { - // TODO(jophba): this needs to be hashed out as part of - // figuring out the embedder workflow. if (negotiation.senders.audio_sender == nullptr && negotiation.senders.video_sender == nullptr) { OSP_LOG_ERROR << "Missing both audio and video, so exiting..."; return; } - file_sender_ = std::make_unique<LoopingFileSender>( - environment_.get(), connection_settings_.value(), session, - std::move(negotiation.senders), [this]() { shutdown_callback_(); }); + current_negotiation_ = + std::make_unique<SenderSession::RemotingNegotiation>(negotiation); + if (is_ready_for_remoting_) { + StartRemotingSenders(); + } } void LoopingFileCastAgent::OnError(const SenderSession* session, Error error) { @@ -316,6 +320,23 @@ void LoopingFileCastAgent::OnError(const SenderSession* session, Error error) { Shutdown(); } +void LoopingFileCastAgent::OnRemotingReceiverReady() { + is_ready_for_remoting_ = true; + if (current_negotiation_) { + StartRemotingSenders(); + } +} + +void LoopingFileCastAgent::StartRemotingSenders() { + OSP_DCHECK(current_negotiation_); + file_sender_ = std::make_unique<LoopingFileSender>( + environment_.get(), connection_settings_.value(), current_session_.get(), + std::move(current_negotiation_->senders), + [this]() { shutdown_callback_(); }); + current_negotiation_.reset(); + is_ready_for_remoting_ = false; +} + void LoopingFileCastAgent::Shutdown() { TRACE_DEFAULT_SCOPED(TraceCategory::kStandaloneSender); |