Chromium Code Reviews| Index: media/cast/net/cast_transport_sender_impl.cc |
| diff --git a/media/cast/net/cast_transport_sender_impl.cc b/media/cast/net/cast_transport_sender_impl.cc |
| index f4732193e3e7d694b8ef328d8e83b2d54d31368d..15c21a60a9fe6a4e9b0678c54f0ef55dda2789ae 100644 |
| --- a/media/cast/net/cast_transport_sender_impl.cc |
| +++ b/media/cast/net/cast_transport_sender_impl.cc |
| @@ -51,29 +51,32 @@ int32 GetTransportSendBufferSize(const base::DictionaryValue& options) { |
| } // namespace |
| -scoped_ptr<CastTransportSender> CastTransportSender::Create( |
| - net::NetLog* net_log, |
| - base::TickClock* clock, |
| - const net::IPEndPoint& local_end_point, |
| - const net::IPEndPoint& remote_end_point, |
| +CastTransportSender::CreateParams::CreateParams( |
| + net::NetLog* log, |
| + base::TickClock* input_clock, |
| + net::IPEndPoint local_addr, |
| + net::IPEndPoint remote_addr, |
| + scoped_ptr<Client> transport_client, |
| + base::TimeDelta transport_logging_flush_interval, |
| scoped_ptr<base::DictionaryValue> options, |
| - const CastTransportStatusCallback& status_callback, |
| - const BulkRawEventsCallback& raw_events_callback, |
| - base::TimeDelta raw_events_callback_interval, |
| - const PacketReceiverCallback& packet_callback, |
| - const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) { |
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) |
| + : net_log(log), |
| + clock(input_clock), |
| + local_end_point(local_addr), |
| + remote_end_point(remote_addr), |
| + client(transport_client.Pass()), |
| + logging_flush_interval(transport_logging_flush_interval), |
| + optional_config(options.Pass()), |
| + transport_task_runner(task_runner) {} |
| + |
| +CastTransportSender::CreateParams::~CreateParams() {} |
| + |
| +CastTransportSender::Client::~Client() {} |
|
imcheng
2015/12/17 00:18:11
Can this be inlined into cast_transport_sender.h?
xjz
2015/12/17 22:54:58
Done.
|
| + |
| +scoped_ptr<CastTransportSender> CastTransportSender::Create( |
| + const CreateParams& params) { |
| return scoped_ptr<CastTransportSender>( |
| - new CastTransportSenderImpl(net_log, |
| - clock, |
| - local_end_point, |
| - remote_end_point, |
| - options.Pass(), |
| - status_callback, |
| - raw_events_callback, |
| - raw_events_callback_interval, |
| - transport_task_runner.get(), |
| - packet_callback, |
| - NULL)); |
| + new CastTransportSenderImpl(params, nullptr)); |
| } |
| PacketReceiverCallback CastTransportSender::PacketReceiverForTesting() { |
| @@ -81,60 +84,48 @@ PacketReceiverCallback CastTransportSender::PacketReceiverForTesting() { |
| } |
| CastTransportSenderImpl::CastTransportSenderImpl( |
| - net::NetLog* net_log, |
| - base::TickClock* clock, |
| - const net::IPEndPoint& local_end_point, |
| - const net::IPEndPoint& remote_end_point, |
| - scoped_ptr<base::DictionaryValue> options, |
| - const CastTransportStatusCallback& status_callback, |
| - const BulkRawEventsCallback& raw_events_callback, |
| - base::TimeDelta raw_events_callback_interval, |
| - const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner, |
| - const PacketReceiverCallback& packet_callback, |
| + const CreateParams& params, |
| PacketSender* external_transport) |
| - : clock_(clock), |
| - status_callback_(status_callback), |
| - transport_task_runner_(transport_task_runner), |
| - transport_(external_transport |
| - ? nullptr |
| - : new UdpTransport(net_log, |
| - transport_task_runner, |
| - local_end_point, |
| - remote_end_point, |
| - GetTransportSendBufferSize(*options), |
| - status_callback)), |
| - pacer_(LookupOptionWithDefault(*options, |
| - kOptionPacerTargetBurstSize, |
| - kTargetBurstSize), |
| - LookupOptionWithDefault(*options, |
| - kOptionPacerMaxBurstSize, |
| - kMaxBurstSize), |
| - clock, |
| - raw_events_callback.is_null() ? nullptr : &recent_packet_events_, |
| - external_transport ? external_transport : transport_.get(), |
| - transport_task_runner), |
| - raw_events_callback_(raw_events_callback), |
| - raw_events_callback_interval_(raw_events_callback_interval), |
| + : transport_params_(params), |
| + clock_(params.clock), |
| + transport_task_runner_(params.transport_task_runner), |
| + logging_flush_interval_(params.logging_flush_interval), |
| last_byte_acked_for_audio_(0), |
| - packet_callback_(packet_callback), |
| weak_factory_(this) { |
| - DCHECK(clock_); |
| - if (!raw_events_callback_.is_null()) { |
| - DCHECK(raw_events_callback_interval > base::TimeDelta()); |
| - transport_task_runner->PostDelayedTask( |
| - FROM_HERE, |
| - base::Bind(&CastTransportSenderImpl::SendRawEvents, |
| - weak_factory_.GetWeakPtr()), |
| - raw_events_callback_interval); |
| + DCHECK(params.clock); |
| + transport_.reset( |
| + external_transport |
| + ? nullptr |
| + : new UdpTransport( |
| + params.net_log, transport_task_runner_, params.local_end_point, |
| + params.remote_end_point, |
| + GetTransportSendBufferSize(*(params.optional_config)), |
| + base::Bind(&CastTransportSenderImpl::OnStatusChange, |
| + weak_factory_.GetWeakPtr()))); |
| + pacer_.reset(new PacedSender( |
| + LookupOptionWithDefault(*(params.optional_config), |
| + kOptionPacerTargetBurstSize, kTargetBurstSize), |
| + LookupOptionWithDefault(*(params.optional_config), |
| + kOptionPacerMaxBurstSize, kMaxBurstSize), |
| + params.clock, |
| + params.logging_flush_interval > base::TimeDelta() ? &recent_packet_events_ |
| + : nullptr, |
| + external_transport ? external_transport : transport_.get(), |
| + params.transport_task_runner)); |
| + if (logging_flush_interval_ > base::TimeDelta()) { |
| + transport_task_runner_->PostDelayedTask( |
| + FROM_HERE, base::Bind(&CastTransportSenderImpl::SendRawEvents, |
| + weak_factory_.GetWeakPtr()), |
| + logging_flush_interval_); |
| } |
| if (transport_) { |
| - if (options->HasKey(kOptionDscp)) { |
| + if (params.optional_config->HasKey(kOptionDscp)) { |
| // The default DSCP value for cast is AF41. Which gives it a higher |
| // priority over other traffic. |
| transport_->SetDscp(net::DSCP_AF41); |
| } |
| #if defined(OS_WIN) |
| - if (!options->HasKey(kOptionDisableNonBlockingIO)) { |
| + if (!params.optional_config->HasKey(kOptionDisableNonBlockingIO)) { |
| transport_->UseNonBlockingIO(); |
| } |
| #endif |
| @@ -142,10 +133,10 @@ CastTransportSenderImpl::CastTransportSenderImpl( |
| base::Bind(&CastTransportSenderImpl::OnReceivedPacket, |
| base::Unretained(this))); |
| int wifi_options = 0; |
| - if (options->HasKey(kOptionWifiDisableScan)) { |
| + if (params.optional_config->HasKey(kOptionWifiDisableScan)) { |
| wifi_options |= net::WIFI_OPTIONS_DISABLE_SCAN; |
| } |
| - if (options->HasKey(kOptionWifiMediaStreamingMode)) { |
| + if (params.optional_config->HasKey(kOptionWifiMediaStreamingMode)) { |
| wifi_options |= net::WIFI_OPTIONS_MEDIA_STREAMING_MODE; |
| } |
| if (wifi_options) { |
| @@ -166,37 +157,33 @@ void CastTransportSenderImpl::InitializeAudio( |
| const RtcpRttCallback& rtt_cb) { |
| LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) |
| << "Unsafe to send audio with encryption DISABLED."; |
| + DCHECK(transport_params_.client); |
| if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { |
| - status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED); |
| + transport_params_.client->OnStatusChange(TRANSPORT_AUDIO_UNINITIALIZED); |
| return; |
| } |
| - audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); |
| + audio_sender_.reset(new RtpSender(transport_task_runner_, pacer_.get())); |
| if (audio_sender_->Initialize(config)) { |
| // Audio packets have a higher priority. |
| - pacer_.RegisterAudioSsrc(config.ssrc); |
| - pacer_.RegisterPrioritySsrc(config.ssrc); |
| - status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); |
| + pacer_->RegisterAudioSsrc(config.ssrc); |
| + pacer_->RegisterPrioritySsrc(config.ssrc); |
| + transport_params_.client->OnStatusChange(TRANSPORT_AUDIO_INITIALIZED); |
| } else { |
| audio_sender_.reset(); |
| - status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED); |
| + transport_params_.client->OnStatusChange(TRANSPORT_AUDIO_UNINITIALIZED); |
| return; |
| } |
| - audio_rtcp_session_.reset( |
| - new Rtcp(base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, |
| - weak_factory_.GetWeakPtr(), config.ssrc, |
| - cast_message_cb), |
| - rtt_cb, |
| - base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, |
| - weak_factory_.GetWeakPtr(), AUDIO_EVENT), |
| - clock_, |
| - &pacer_, |
| - config.ssrc, |
| - config.feedback_ssrc)); |
| - pacer_.RegisterAudioSsrc(config.ssrc); |
| + audio_rtcp_session_.reset(new Rtcp( |
| + base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, |
| + weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), |
| + rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, |
| + weak_factory_.GetWeakPtr(), AUDIO_EVENT), |
| + clock_, pacer_.get(), config.ssrc, config.feedback_ssrc)); |
| + pacer_->RegisterAudioSsrc(config.ssrc); |
| AddValidSsrc(config.feedback_ssrc); |
| - status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); |
| + transport_params_.client->OnStatusChange(TRANSPORT_AUDIO_INITIALIZED); |
| } |
| void CastTransportSenderImpl::InitializeVideo( |
| @@ -205,32 +192,28 @@ void CastTransportSenderImpl::InitializeVideo( |
| const RtcpRttCallback& rtt_cb) { |
| LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) |
| << "Unsafe to send video with encryption DISABLED."; |
| + DCHECK(transport_params_.client); |
| if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { |
| - status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED); |
| + transport_params_.client->OnStatusChange(TRANSPORT_VIDEO_UNINITIALIZED); |
| return; |
| } |
| - video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); |
| + video_sender_.reset(new RtpSender(transport_task_runner_, pacer_.get())); |
| if (!video_sender_->Initialize(config)) { |
| video_sender_.reset(); |
| - status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED); |
| + transport_params_.client->OnStatusChange(TRANSPORT_VIDEO_UNINITIALIZED); |
| return; |
| } |
| - video_rtcp_session_.reset( |
| - new Rtcp(base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, |
| - weak_factory_.GetWeakPtr(), config.ssrc, |
| - cast_message_cb), |
| - rtt_cb, |
| - base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, |
| - weak_factory_.GetWeakPtr(), VIDEO_EVENT), |
| - clock_, |
| - &pacer_, |
| - config.ssrc, |
| - config.feedback_ssrc)); |
| - pacer_.RegisterVideoSsrc(config.ssrc); |
| + video_rtcp_session_.reset(new Rtcp( |
| + base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, |
| + weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), |
| + rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, |
| + weak_factory_.GetWeakPtr(), VIDEO_EVENT), |
| + clock_, pacer_.get(), config.ssrc, config.feedback_ssrc)); |
| + pacer_->RegisterVideoSsrc(config.ssrc); |
| AddValidSsrc(config.feedback_ssrc); |
| - status_callback_.Run(TRANSPORT_VIDEO_INITIALIZED); |
| + transport_params_.client->OnStatusChange(TRANSPORT_VIDEO_INITIALIZED); |
| } |
| namespace { |
| @@ -336,7 +319,8 @@ PacketReceiverCallback CastTransportSenderImpl::PacketReceiverForTesting() { |
| } |
| void CastTransportSenderImpl::SendRawEvents() { |
| - DCHECK(!raw_events_callback_.is_null()); |
| + DCHECK(transport_params_.client && |
| + logging_flush_interval_ > base::TimeDelta()); |
| if (!recent_frame_events_.empty() || !recent_packet_events_.empty()) { |
| scoped_ptr<std::vector<FrameEvent>> frame_events( |
| @@ -345,14 +329,14 @@ void CastTransportSenderImpl::SendRawEvents() { |
| scoped_ptr<std::vector<PacketEvent>> packet_events( |
| new std::vector<PacketEvent>()); |
| packet_events->swap(recent_packet_events_); |
| - raw_events_callback_.Run(frame_events.Pass(), packet_events.Pass()); |
| + transport_params_.client->OnReceivedLoggingEvents(frame_events.Pass(), |
| + packet_events.Pass()); |
| } |
| transport_task_runner_->PostDelayedTask( |
| - FROM_HERE, |
| - base::Bind(&CastTransportSenderImpl::SendRawEvents, |
| - weak_factory_.GetWeakPtr()), |
| - raw_events_callback_interval_); |
| + FROM_HERE, base::Bind(&CastTransportSenderImpl::SendRawEvents, |
| + weak_factory_.GetWeakPtr()), |
| + logging_flush_interval_); |
| } |
| bool CastTransportSenderImpl::OnReceivedPacket(scoped_ptr<Packet> packet) { |
| @@ -378,18 +362,16 @@ bool CastTransportSenderImpl::OnReceivedPacket(scoped_ptr<Packet> packet) { |
| video_rtcp_session_->IncomingRtcpPacket(data, length)) { |
| return true; |
| } |
| - if (packet_callback_.is_null()) { |
| - VLOG(1) << "Stale packet received."; |
| - return false; |
| - } |
| - packet_callback_.Run(packet.Pass()); |
| + DCHECK(transport_params_.client); |
|
imcheng
2015/12/17 00:18:11
If this DCHECK and other needed? If client is null
xjz
2015/12/17 22:54:58
Done. Removed DCHECKs.
|
| + transport_params_.client->OnReceivedPackets(packet.Pass()); |
| return true; |
| } |
| void CastTransportSenderImpl::OnReceivedLogMessage( |
| EventMediaType media_type, |
| const RtcpReceiverLogMessage& log) { |
| - if (raw_events_callback_.is_null()) |
| + if ((!transport_params_.client) || |
| + (logging_flush_interval_ == base::TimeDelta())) |
| return; |
| // Add received log messages into our log system. |
| @@ -477,12 +459,8 @@ void CastTransportSenderImpl::SendRtcpFromRtpReceiver( |
| base::TimeDelta target_delay, |
| const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, |
| const RtpReceiverStatistics* rtp_receiver_statistics) { |
| - const Rtcp rtcp(RtcpCastMessageCallback(), |
| - RtcpRttCallback(), |
| - RtcpLogMessageCallback(), |
| - clock_, |
| - &pacer_, |
| - ssrc, |
| + const Rtcp rtcp(RtcpCastMessageCallback(), RtcpRttCallback(), |
| + RtcpLogMessageCallback(), clock_, pacer_.get(), ssrc, |
| sender_ssrc); |
| rtcp.SendRtcpFromRtpReceiver(time_data, |
| cast_message, |
| @@ -491,5 +469,9 @@ void CastTransportSenderImpl::SendRtcpFromRtpReceiver( |
| rtp_receiver_statistics); |
| } |
| +void CastTransportSenderImpl::OnStatusChange(CastTransportStatus status) { |
| + transport_params_.client->OnStatusChange(status); |
| +} |
| + |
| } // namespace cast |
| } // namespace media |