Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: media/cast/test/transport/transport.cc

Issue 56333003: Adding transport to Cast/test (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix loss calculation Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698