| 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(
|
|
|