| Index: media/cast/net/udp_transport.cc
|
| diff --git a/media/cast/net/udp_transport.cc b/media/cast/net/udp_transport.cc
|
| index 2560b4594c20cc0a8315d069063de0e0c7aa67fb..bf126bc6c5877684bdc80773a668bf8878954dd0 100644
|
| --- a/media/cast/net/udp_transport.cc
|
| +++ b/media/cast/net/udp_transport.cc
|
| @@ -21,7 +21,13 @@ namespace media {
|
| namespace cast {
|
|
|
| namespace {
|
| -const int kMaxPacketSize = 1500;
|
| +
|
| +const char kOptionDscp[] = "DSCP";
|
| +#if defined(OS_WIN)
|
| +const char kOptionDisableNonBlockingIO[] = "disable_non_blocking_io";
|
| +#endif
|
| +const char kOptionSendBufferMinSize[] = "send_buffer_min_size";
|
| +const char kOptionPacerMaxBurstSize[] = "pacer_max_burst_size";
|
|
|
| bool IsEmpty(const net::IPEndPoint& addr) {
|
| net::IPAddressNumber empty_addr(addr.address().size());
|
| @@ -30,6 +36,29 @@ bool IsEmpty(const net::IPEndPoint& addr) {
|
| !addr.port();
|
| }
|
|
|
| +int LookupOptionWithDefault(const base::DictionaryValue& options,
|
| + const std::string& path,
|
| + int default_value) {
|
| + int ret;
|
| + if (options.GetInteger(path, &ret)) {
|
| + return ret;
|
| + } else {
|
| + return default_value;
|
| + }
|
| +}
|
| +
|
| +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,
|
| + media::cast::kMaxBurstSize) *
|
| + media::cast::kMaxIpPacketSize;
|
| + int32_t min_send_buffer_size =
|
| + LookupOptionWithDefault(options, kOptionSendBufferMinSize, 0);
|
| + return std::max(max_burst_size, min_send_buffer_size);
|
| +}
|
| +
|
| } // namespace
|
|
|
| UdpTransport::UdpTransport(
|
| @@ -37,7 +66,6 @@ UdpTransport::UdpTransport(
|
| const scoped_refptr<base::SingleThreadTaskRunner>& io_thread_proxy,
|
| const net::IPEndPoint& local_end_point,
|
| const net::IPEndPoint& remote_end_point,
|
| - int32_t send_buffer_size,
|
| const CastTransportStatusCallback& status_callback)
|
| : io_thread_proxy_(io_thread_proxy),
|
| local_addr_(local_end_point),
|
| @@ -50,7 +78,8 @@ UdpTransport::UdpTransport(
|
| receive_pending_(false),
|
| client_connected_(false),
|
| next_dscp_value_(net::DSCP_NO_CHANGE),
|
| - send_buffer_size_(send_buffer_size),
|
| + send_buffer_size_(media::cast::kMaxBurstSize *
|
| + media::cast::kMaxIpPacketSize),
|
| status_callback_(status_callback),
|
| bytes_sent_(0),
|
| weak_factory_(this) {
|
| @@ -145,15 +174,13 @@ void UdpTransport::ReceiveNextPacket(int length_or_status) {
|
| // the future when a packet is ready.
|
| while (true) {
|
| if (length_or_status == net::ERR_IO_PENDING) {
|
| - next_packet_.reset(new Packet(kMaxPacketSize));
|
| + next_packet_.reset(new Packet(media::cast::kMaxIpPacketSize));
|
| recv_buf_ = new net::WrappedIOBuffer(
|
| reinterpret_cast<char*>(&next_packet_->front()));
|
| - length_or_status =
|
| - udp_socket_->RecvFrom(recv_buf_.get(),
|
| - kMaxPacketSize,
|
| - &recv_addr_,
|
| - base::Bind(&UdpTransport::ReceiveNextPacket,
|
| - weak_factory_.GetWeakPtr()));
|
| + length_or_status = udp_socket_->RecvFrom(
|
| + recv_buf_.get(), media::cast::kMaxIpPacketSize, &recv_addr_,
|
| + base::Bind(&UdpTransport::ReceiveNextPacket,
|
| + weak_factory_.GetWeakPtr()));
|
| if (length_or_status == net::ERR_IO_PENDING) {
|
| receive_pending_ = true;
|
| return;
|
| @@ -275,5 +302,23 @@ void UdpTransport::OnSent(const scoped_refptr<net::IOBuffer>& buf,
|
| }
|
| }
|
|
|
| +void UdpTransport::SetUdpOptions(const base::DictionaryValue& options) {
|
| + SetSendBufferSize(GetTransportSendBufferSize(options));
|
| + if (options.HasKey(kOptionDscp)) {
|
| + // The default DSCP value for cast is AF41. Which gives it a higher
|
| + // priority over other traffic.
|
| + SetDscp(net::DSCP_AF41);
|
| + }
|
| +#if defined(OS_WIN)
|
| + if (!options.HasKey(kOptionDisableNonBlockingIO)) {
|
| + UseNonBlockingIO();
|
| + }
|
| +#endif
|
| +}
|
| +
|
| +void UdpTransport::SetSendBufferSize(int32_t send_buffer_size) {
|
| + send_buffer_size_ = send_buffer_size;
|
| +}
|
| +
|
| } // namespace cast
|
| } // namespace media
|
|
|