OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "media/cast/test/transport/transport.h" | |
6 | |
7 #include <stdio.h> | |
Alpha Left Google
2013/11/01 23:23:19
What is this for? I don't see anything related to
mikhal
2013/11/04 17:50:42
Done.
| |
8 #include <stdlib.h> | |
Alpha Left Google
2013/11/01 23:23:19
#include <string> instead, it will give you memcpy
mikhal
2013/11/04 17:50:42
Done.
| |
9 | |
10 #include <cassert> | |
Alpha Left Google
2013/11/01 23:23:19
Don't use <cassert>, use base/logging.h instead wh
mikhal
2013/11/04 17:50:42
Done.
| |
11 | |
12 #include "base/bind.h" | |
13 #include "base/logging.h" | |
14 #include "base/memory/ref_counted.h" | |
15 #include "base/memory/scoped_ptr.h" | |
16 #include "base/message_loop/message_loop.h" | |
Alpha Left Google
2013/11/01 23:23:19
I don't see this being used.
mikhal
2013/11/04 17:50:42
Done.
| |
17 #include "base/rand_util.h" | |
18 #include "net/base/completion_callback.h" | |
19 #include "net/base/io_buffer.h" | |
20 #include "net/base/rand_callback.h" | |
21 #include "net/base/test_completion_callback.h" | |
22 | |
23 namespace media { | |
24 namespace cast { | |
25 namespace test { | |
26 | |
27 const int kMaxPacketSize = 1500; | |
28 | |
29 typedef std::vector<unsigned char> IPAddressNumber; | |
Alpha Left Google
2013/11/01 23:23:19
This is already defined as net::IPAddressNumber.
mikhal
2013/11/04 17:50:42
Done.
| |
30 class LocalUdpTransportData; | |
31 | |
32 void CreateUDPAddress(std::string ip_str, int port, net::IPEndPoint* address) { | |
33 IPAddressNumber ip_number; | |
Alpha Left Google
2013/11/01 23:23:19
Use net::IPAddressNumber instead.
mikhal
2013/11/04 17:50:42
Done.
| |
34 bool rv = net::ParseIPLiteralToNumber(ip_str, &ip_number); | |
35 if (!rv) | |
36 return; | |
37 *address = net::IPEndPoint(ip_number, port); | |
38 } | |
39 | |
40 class LocalUdpTransportData { | |
41 public: | |
42 LocalUdpTransportData(net::DatagramServerSocket* udp_socket) | |
43 : udp_socket_(udp_socket), | |
44 buffer_(new net::IOBufferWithSize(kMaxPacketSize)), | |
45 weak_factory_(this) { | |
46 } | |
47 void DeletePacket(const uint8* packet) { | |
48 delete [] packet; | |
Alpha Left Google
2013/11/01 23:23:19
If you pass in buffer_data->data() to packet_recei
| |
49 RecvFromSocketLoop(); | |
50 } | |
51 | |
52 void ListenTo(net::IPEndPoint bind_address) { | |
53 bind_address_ = bind_address; | |
54 RecvFromSocketLoop(); | |
55 } | |
56 | |
57 void PacketReceived(int result) { | |
58 // Got a packet with length result. | |
59 uint8* data = new uint8[result]; | |
60 memcpy(data, reinterpret_cast<uint8*>(buffer_->data()), result); | |
Alpha Left Google
2013/11/01 23:23:19
Don't do this memcpy just pass buffer_->data() to
mikhal
2013/11/04 17:50:42
Done.
| |
61 packet_receiver_->ReceivedPacket(data, result, | |
62 base::Bind(&LocalUdpTransportData::DeletePacket, | |
63 weak_factory_.GetWeakPtr(), data)); | |
64 } | |
65 | |
66 void RecvFromSocketLoop() { | |
Alpha Left Google
2013/11/01 23:23:19
This is good! Now you know how this async read loo
mikhal
2013/11/04 17:50:42
thanks!
On 2013/11/01 23:23:19, Alpha wrote:
| |
67 // Callback should always trigger with a packet. | |
68 int res = udp_socket_->RecvFrom(buffer_.get(), kMaxPacketSize, | |
69 &bind_address_, base::Bind(&LocalUdpTransportData::PacketReceived, | |
70 weak_factory_.GetWeakPtr())); | |
71 if (res > 0 ) { | |
Alpha Left Google
2013/11/01 23:23:19
nit: (res > 0)
mikhal
2013/11/04 17:50:42
Done.
| |
72 PacketReceived(res); | |
73 } | |
74 } | |
75 | |
76 void set_packet_receiver(PacketReceiver* packet_receiver) { | |
77 packet_receiver_ = packet_receiver; | |
78 } | |
79 | |
80 void Close() { | |
81 udp_socket_->Close(); | |
82 } | |
83 | |
84 private: | |
85 net::DatagramServerSocket* udp_socket_; | |
86 net::IPEndPoint bind_address_; | |
87 PacketReceiver* packet_receiver_; | |
88 scoped_refptr<net::IOBufferWithSize> buffer_; | |
89 base::WeakPtrFactory<LocalUdpTransportData> weak_factory_; | |
90 DISALLOW_COPY_AND_ASSIGN(LocalUdpTransportData); | |
91 }; | |
92 | |
93 | |
Alpha Left Google
2013/11/01 23:23:19
nit: remove this empty line.
mikhal
2013/11/04 17:50:42
Done.
| |
94 class LocalPacketSender : public PacketSender { | |
95 public: | |
96 explicit LocalPacketSender(net::DatagramServerSocket* udp_socket) | |
97 : udp_socket_(udp_socket), | |
98 send_address_(), | |
99 loss_limit_(0) {} | |
100 | |
101 bool UniformLoss(double loss_pct) { | |
Alpha Left Google
2013/11/01 23:23:19
This is not being used.
mikhal
2013/11/04 17:50:42
removed
On 2013/11/01 23:23:19, Alpha wrote:
| |
102 double randVal = base::RandInt(1, 100); | |
103 return randVal < loss_pct; | |
104 } | |
105 | |
106 | |
Alpha Left Google
2013/11/01 23:23:19
nit: remove this extra space.
mikhal
2013/11/04 17:50:42
Done.
| |
107 virtual bool SendPacket(const Packet& packet) { | |
108 const uint8* data = packet.data(); | |
109 if (loss_limit_ > 0) { | |
110 int r = base::RandInt(0, 100); | |
Alpha Left Google
2013/11/01 23:23:19
Maybe use UniformLoss() instead?
mikhal
2013/11/04 17:50:42
Removed uniform loss as we only have one type of l
| |
111 if (r < loss_limit_) { | |
112 VLOG(1) << "Drop packet f:" << static_cast<int>(data[12 + 1]) | |
113 << " p:" << static_cast<int>(data[12 + 3]) | |
114 << " m:" << static_cast<int>(data[12 + 5]); | |
115 return true; | |
116 } | |
117 } | |
118 net::TestCompletionCallback callback; | |
119 scoped_refptr<net::WrappedIOBuffer> buffer( | |
120 new net::WrappedIOBuffer(reinterpret_cast<const char*>(data))); | |
121 int rv = udp_socket_->SendTo( | |
Alpha Left Google
2013/11/01 23:23:19
It will be more clear if you do this:
#include "b
| |
122 buffer.get(), packet.size(), send_address_, callback.callback()); | |
123 return (rv == packet.size()); | |
124 } | |
125 | |
126 virtual bool SendPackets(const PacketList& packets) { | |
127 bool out_val = true; | |
Alpha Left Google
2013/11/01 23:23:19
nit: There's two space after _val.
mikhal
2013/11/04 17:50:42
Done.
| |
128 for (size_t i = 0; i < packets.size(); ++i) { | |
129 const Packet& packet = packets[i]; | |
130 out_val |= SendPacket(packet); | |
131 } | |
132 return out_val; | |
133 } | |
134 | |
135 void SetPacketLoss(int percentage) { | |
136 assert(percentage >= 0); | |
Alpha Left Google
2013/11/01 23:23:19
Use CHECK() instead of assert().
mikhal
2013/11/04 17:50:42
Done.
| |
137 assert(percentage < 100); | |
138 loss_limit_ = percentage; | |
139 } | |
140 | |
141 void SetSendAddress(net::IPEndPoint& send_address) { | |
142 send_address_ = send_address; | |
143 } | |
144 | |
145 private: | |
146 net::DatagramServerSocket* udp_socket_; // Not owned by this class. | |
147 net::IPEndPoint send_address_; | |
148 int loss_limit_; | |
149 }; | |
150 | |
151 Transport::Transport(scoped_refptr<CastEnvironment> cast_environment) | |
152 : udp_socket_(new net::UDPServerSocket(NULL, net::NetLog::Source())), | |
153 local_udp_transport_data_(new LocalUdpTransportData(udp_socket_.get())), | |
154 packet_sender_(new LocalPacketSender(udp_socket_.get())) {} | |
155 | |
156 Transport::~Transport() {} | |
157 | |
158 void Transport::SetSendSidePacketLoss(int percentage) { | |
159 PacketSender* sender = packet_sender_.get(); | |
160 static_cast<LocalPacketSender*>(sender)->SetPacketLoss(percentage); | |
Alpha Left Google
2013/11/01 23:23:19
Since packet_sender_ is always LocalPacketSender I
mikhal
2013/11/04 17:50:42
Done.
| |
161 } | |
162 | |
163 void Transport::StopReceiving() { | |
164 local_udp_transport_data_->Close(); | |
165 } | |
166 | |
167 void Transport::SetLocalReceiver(PacketReceiver* packet_receiver, | |
168 std::string ip_address, | |
169 int port) { | |
170 net::IPEndPoint bind_address; | |
171 CreateUDPAddress(ip_address, port, &bind_address); | |
172 local_udp_transport_data_->set_packet_receiver(packet_receiver); | |
173 udp_socket_->AllowAddressReuse(); | |
174 udp_socket_->SetMulticastLoopbackMode(true); | |
175 udp_socket_->Listen(bind_address); | |
176 | |
177 // Start listening once receiver has been set. | |
178 local_udp_transport_data_->ListenTo(bind_address); | |
179 } | |
180 | |
181 void Transport::SetSendDestination(std::string ip_address, int port) { | |
182 net::IPEndPoint send_address; | |
183 CreateUDPAddress(ip_address, port, &send_address); | |
184 PacketSender* sender = packet_sender_.get(); | |
185 static_cast<LocalPacketSender*>(sender)->SetSendAddress(send_address); | |
186 } | |
187 | |
188 } // namespace test | |
189 } // namespace cast | |
190 } // namespace media | |
OLD | NEW |