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 c1b700df929ff29a3e9b18a4d9bc53c6c3198cdb..29629679f08b99c31c579c368f1f5ee2dbe8d8a6 100644 |
--- a/media/cast/net/cast_transport_sender_impl.cc |
+++ b/media/cast/net/cast_transport_sender_impl.cc |
@@ -10,28 +10,22 @@ |
#include <utility> |
#include "base/single_thread_task_runner.h" |
-#include "base/values.h" |
#include "build/build_config.h" |
#include "media/cast/net/cast_transport_defines.h" |
#include "media/cast/net/rtcp/receiver_rtcp_session.h" |
#include "media/cast/net/rtcp/sender_rtcp_session.h" |
-#include "media/cast/net/udp_transport.h" |
#include "net/base/net_errors.h" |
-#include "net/base/network_interfaces.h" |
namespace media { |
namespace cast { |
namespace { |
-// See header file for what these mean. |
-const char kOptionDscp[] = "DSCP"; |
-#if defined(OS_WIN) |
-const char kOptionDisableNonBlockingIO[] = "disable_non_blocking_io"; |
-#endif |
-const char kOptionPacerTargetBurstSize[] = "pacer_target_burst_size"; |
+// Options for PaceSender. |
const char kOptionPacerMaxBurstSize[] = "pacer_max_burst_size"; |
-const char kOptionSendBufferMinSize[] = "send_buffer_min_size"; |
+const char kOptionPacerTargetBurstSize[] = "pacer_target_burst_size"; |
+ |
+// Wifi options. |
const char kOptionWifiDisableScan[] = "disable_wifi_scan"; |
const char kOptionWifiMediaStreamingMode[] = "media_streaming_mode"; |
@@ -46,35 +40,17 @@ int LookupOptionWithDefault(const base::DictionaryValue& options, |
} |
} |
-int32_t GetTransportSendBufferSize(const base::DictionaryValue& options) { |
- // Socket send buffer size needs to be at least greater than one burst |
- // size. |
- int32_t max_burst_size = |
- LookupOptionWithDefault(options, kOptionPacerMaxBurstSize, |
- kMaxBurstSize) * |
- kMaxIpPacketSize; |
- int32_t min_send_buffer_size = |
- LookupOptionWithDefault(options, kOptionSendBufferMinSize, 0); |
- return std::max(max_burst_size, min_send_buffer_size); |
-} |
- |
} // 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, |
- scoped_ptr<base::DictionaryValue> options, |
- const CastTransportStatusCallback& status_callback, |
- const BulkRawEventsCallback& raw_events_callback, |
- base::TimeDelta raw_events_callback_interval, |
- const PacketReceiverCallback& packet_callback, |
+ base::TickClock* clock, // Owned by the caller. |
+ base::TimeDelta logging_flush_interval, |
+ scoped_ptr<Client> client, |
+ scoped_ptr<PacketSender> transport, |
const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) { |
return scoped_ptr<CastTransportSender>(new CastTransportSenderImpl( |
- net_log, clock, local_end_point, remote_end_point, std::move(options), |
- status_callback, raw_events_callback, raw_events_callback_interval, |
- transport_task_runner.get(), packet_callback, NULL)); |
+ clock, logging_flush_interval, std::move(client), std::move(transport), |
+ transport_task_runner.get())); |
} |
PacketReceiverCallback CastTransportSender::PacketReceiverForTesting() { |
@@ -82,83 +58,41 @@ 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, |
- PacketSender* external_transport) |
+ base::TimeDelta logging_flush_interval, |
+ scoped_ptr<Client> client, |
+ scoped_ptr<PacketSender> transport, |
+ const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) |
: clock_(clock), |
- status_callback_(status_callback), |
+ logging_flush_interval_(logging_flush_interval), |
+ transport_client_(std::move(client)), |
+ transport_(std::move(transport)), |
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), |
+ pacer_(kTargetBurstSize, |
+ kMaxBurstSize, |
clock, |
- raw_events_callback.is_null() ? nullptr : &recent_packet_events_, |
- external_transport ? external_transport : transport_.get(), |
+ logging_flush_interval > base::TimeDelta() ? &recent_packet_events_ |
+ : nullptr, |
+ transport_.get(), |
transport_task_runner), |
- raw_events_callback_(raw_events_callback), |
- raw_events_callback_interval_(raw_events_callback_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); |
- } |
- if (transport_) { |
- if (options->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)) { |
- transport_->UseNonBlockingIO(); |
- } |
-#endif |
- transport_->StartReceiving( |
- base::Bind(&CastTransportSenderImpl::OnReceivedPacket, |
- base::Unretained(this))); |
- int wifi_options = 0; |
- if (options->HasKey(kOptionWifiDisableScan)) { |
- wifi_options |= net::WIFI_OPTIONS_DISABLE_SCAN; |
- } |
- if (options->HasKey(kOptionWifiMediaStreamingMode)) { |
- wifi_options |= net::WIFI_OPTIONS_MEDIA_STREAMING_MODE; |
- } |
- if (wifi_options) { |
- wifi_options_autoreset_ = net::SetWifiOptions(wifi_options); |
- } |
+ DCHECK(clock); |
+ DCHECK(transport_client_); |
+ DCHECK(transport_); |
+ DCHECK(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_); |
} |
+ transport_->StartReceiving(base::Bind( |
+ &CastTransportSenderImpl::OnReceivedPacket, base::Unretained(this))); |
} |
CastTransportSenderImpl::~CastTransportSenderImpl() { |
- if (transport_) { |
- transport_->StopReceiving(); |
- } |
+ transport_->StopReceiving(); |
} |
void CastTransportSenderImpl::InitializeAudio( |
@@ -168,7 +102,7 @@ void CastTransportSenderImpl::InitializeAudio( |
LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) |
<< "Unsafe to send audio with encryption DISABLED."; |
if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { |
- status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED); |
+ transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED); |
return; |
} |
@@ -177,10 +111,10 @@ void CastTransportSenderImpl::InitializeAudio( |
// Audio packets have a higher priority. |
pacer_.RegisterAudioSsrc(config.ssrc); |
pacer_.RegisterPrioritySsrc(config.ssrc); |
- status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); |
+ transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED); |
} else { |
audio_sender_.reset(); |
- status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED); |
+ transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED); |
return; |
} |
@@ -192,7 +126,7 @@ void CastTransportSenderImpl::InitializeAudio( |
clock_, &pacer_, config.ssrc, config.feedback_ssrc)); |
pacer_.RegisterAudioSsrc(config.ssrc); |
AddValidSsrc(config.feedback_ssrc); |
- status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); |
+ transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED); |
} |
void CastTransportSenderImpl::InitializeVideo( |
@@ -202,14 +136,14 @@ void CastTransportSenderImpl::InitializeVideo( |
LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) |
<< "Unsafe to send video with encryption DISABLED."; |
if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { |
- status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED); |
+ transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED); |
return; |
} |
video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); |
if (!video_sender_->Initialize(config)) { |
video_sender_.reset(); |
- status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED); |
+ transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED); |
return; |
} |
@@ -221,7 +155,7 @@ void CastTransportSenderImpl::InitializeVideo( |
clock_, &pacer_, config.ssrc, config.feedback_ssrc)); |
pacer_.RegisterVideoSsrc(config.ssrc); |
AddValidSsrc(config.feedback_ssrc); |
- status_callback_.Run(TRANSPORT_VIDEO_INITIALIZED); |
+ transport_client_->OnStatusChanged(TRANSPORT_VIDEO_INITIALIZED); |
} |
namespace { |
@@ -327,7 +261,7 @@ PacketReceiverCallback CastTransportSenderImpl::PacketReceiverForTesting() { |
} |
void CastTransportSenderImpl::SendRawEvents() { |
- DCHECK(!raw_events_callback_.is_null()); |
+ DCHECK(logging_flush_interval_ > base::TimeDelta()); |
if (!recent_frame_events_.empty() || !recent_packet_events_.empty()) { |
scoped_ptr<std::vector<FrameEvent>> frame_events( |
@@ -336,14 +270,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(std::move(frame_events), std::move(packet_events)); |
+ transport_client_->OnLoggingEventsReceived(std::move(frame_events), |
+ std::move(packet_events)); |
} |
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) { |
@@ -369,18 +303,14 @@ 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(std::move(packet)); |
+ transport_client_->ProcessRtpPacket(std::move(packet)); |
return true; |
} |
void CastTransportSenderImpl::OnReceivedLogMessage( |
EventMediaType media_type, |
const RtcpReceiverLogMessage& log) { |
- if (raw_events_callback_.is_null()) |
+ if (logging_flush_interval_ <= base::TimeDelta()) |
return; |
// Add received log messages into our log system. |
@@ -460,6 +390,29 @@ void CastTransportSenderImpl::AddValidSsrc(uint32_t ssrc) { |
valid_ssrcs_.insert(ssrc); |
} |
+void CastTransportSenderImpl::SetOptions(const base::DictionaryValue& options) { |
+ // Set PacedSender options. |
+ int burst_size = LookupOptionWithDefault(options, kOptionPacerTargetBurstSize, |
+ media::cast::kTargetBurstSize); |
+ if (burst_size != media::cast::kTargetBurstSize) |
+ pacer_.SetTargetBurstSize(burst_size); |
+ burst_size = LookupOptionWithDefault(options, kOptionPacerMaxBurstSize, |
+ media::cast::kMaxBurstSize); |
+ if (burst_size != media::cast::kMaxBurstSize) |
+ pacer_.SetMaxBurstSize(burst_size); |
+ |
+ // Set Wifi options. |
+ int wifi_options = 0; |
+ if (options.HasKey(kOptionWifiDisableScan)) { |
+ wifi_options |= net::WIFI_OPTIONS_DISABLE_SCAN; |
+ } |
+ if (options.HasKey(kOptionWifiMediaStreamingMode)) { |
+ wifi_options |= net::WIFI_OPTIONS_MEDIA_STREAMING_MODE; |
+ } |
+ if (wifi_options) |
+ wifi_options_autoreset_ = net::SetWifiOptions(wifi_options); |
+} |
+ |
// TODO(isheriff): This interface needs clean up. |
// https://crbug.com/569259 |
void CastTransportSenderImpl::SendRtcpFromRtpReceiver( |