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

Side by Side Diff: media/cast/transport/rtcp/rtcp_builder.cc

Issue 126843003: Revert of Cast:Adding cast_transport_config and cleaning up (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 months 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/cast/transport/rtcp/rtcp_builder.h" 5 #include "media/cast/transport/rtcp/rtcp_builder.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "media/cast/rtcp/rtcp_utility.h"
12 #include "media/cast/transport/cast_transport_defines.h" 13 #include "media/cast/transport/cast_transport_defines.h"
13 #include "media/cast/transport/pacing/paced_sender.h" 14 #include "media/cast/transport/pacing/paced_sender.h"
14 #include "net/base/big_endian.h" 15 #include "net/base/big_endian.h"
15 16
16 static const size_t kRtcpCastLogHeaderSize = 12; 17 static const size_t kRtcpCastLogHeaderSize = 12;
17 static const size_t kRtcpSenderFrameLogSize = 4; 18 static const size_t kRtcpSenderFrameLogSize = 4;
18 19
19 namespace media { 20 namespace media {
20 namespace cast { 21 namespace cast {
21 namespace transport { 22 namespace transport {
22 23
23 namespace {
24 // RFC 3550 page 44, including end null.
25 static const size_t kRtcpCnameSize = 256;
26 static const uint32 kCast = ('C' << 24) + ('A' << 16) + ('S' << 8) + 'T';
27 static const uint8 kSenderLogSubtype = 1;
28 };
29
30 RtcpBuilder::RtcpBuilder(PacedPacketSender* outgoing_transport, 24 RtcpBuilder::RtcpBuilder(PacedPacketSender* outgoing_transport,
31 uint32 sending_ssrc, 25 uint32 sending_ssrc,
32 const std::string& c_name) 26 const std::string& c_name)
33 : ssrc_(sending_ssrc), 27 : ssrc_(sending_ssrc),
34 c_name_(c_name), 28 c_name_(c_name),
35 transport_(outgoing_transport) { 29 transport_(outgoing_transport) {
36 DCHECK_LT(c_name_.length(), kRtcpCnameSize) << "Invalid config"; 30 DCHECK_LT(c_name_.length(), kRtcpCnameSize) << "Invalid config";
37 } 31 }
38 32
39 RtcpBuilder::~RtcpBuilder() {} 33 RtcpBuilder::~RtcpBuilder() {}
40 34
41 void RtcpBuilder::SendRtcpFromRtpSender(uint32 packet_type_flags, 35 void RtcpBuilder::SendRtcpFromRtpSender(uint32 packet_type_flags,
42 const RtcpSenderInfo* sender_info, 36 const RtcpSenderInfo* sender_info,
43 const RtcpDlrrReportBlock* dlrr, 37 const RtcpDlrrReportBlock* dlrr,
44 RtcpSenderLogMessage* sender_log) { 38 RtcpSenderLogMessage* sender_log) {
45 if (packet_type_flags & kRtcpRr || 39 if (packet_type_flags & kRtcpRr ||
46 packet_type_flags & kRtcpPli || 40 packet_type_flags & kRtcpPli ||
47 packet_type_flags & kRtcpRrtr || 41 packet_type_flags & kRtcpRrtr ||
48 packet_type_flags & kRtcpCast || 42 packet_type_flags & kRtcpCast ||
49 packet_type_flags & kRtcpReceiverLog || 43 packet_type_flags & kRtcpReceiverLog ||
50 packet_type_flags & kRtcpRpsi || 44 packet_type_flags & kRtcpRpsi ||
51 packet_type_flags & kRtcpRemb || 45 packet_type_flags & kRtcpRemb ||
52 packet_type_flags & kRtcpNack) { 46 packet_type_flags & kRtcpNack) {
53 NOTREACHED() << "Invalid argument"; 47 NOTREACHED() << "Invalid argument";
54 } 48 }
55 49
56 std::vector<uint8> packet; 50 std::vector<uint8> packet;
57 packet.reserve(kMaxIpPacketSize); 51 packet.reserve(kIpPacketSize);
58 if (packet_type_flags & kRtcpSr) { 52 if (packet_type_flags & kRtcpSr) {
59 DCHECK(sender_info) << "Invalid argument"; 53 DCHECK(sender_info) << "Invalid argument";
60 BuildSR(*sender_info, NULL, &packet); 54 BuildSR(*sender_info, NULL, &packet);
61 BuildSdec(&packet); 55 BuildSdec(&packet);
62 } 56 }
63 if (packet_type_flags & kRtcpBye) { 57 if (packet_type_flags & kRtcpBye) {
64 BuildBye(&packet); 58 BuildBye(&packet);
65 } 59 }
66 if (packet_type_flags & kRtcpDlrr) { 60 if (packet_type_flags & kRtcpDlrr) {
67 DCHECK(dlrr) << "Invalid argument"; 61 DCHECK(dlrr) << "Invalid argument";
68 BuildDlrrRb(dlrr, &packet); 62 BuildDlrrRb(dlrr, &packet);
69 } 63 }
70 if (packet_type_flags & kRtcpSenderLog) { 64 if (packet_type_flags & kRtcpSenderLog) {
71 DCHECK(sender_log) << "Invalid argument"; 65 DCHECK(sender_log) << "Invalid argument";
72 BuildSenderLog(sender_log, &packet); 66 BuildSenderLog(sender_log, &packet);
73 } 67 }
74 if (packet.empty()) 68 if (packet.empty())
75 return; // Sanity don't send empty packets. 69 return; // Sanity don't send empty packets.
76 70
77 transport_->SendRtcpPacket(packet); 71 transport_->SendRtcpPacket(packet);
78 } 72 }
79 73
80 void RtcpBuilder::BuildSR(const RtcpSenderInfo& sender_info, 74 void RtcpBuilder::BuildSR(const RtcpSenderInfo& sender_info,
81 const RtcpReportBlock* report_block, 75 const RtcpReportBlock* report_block,
82 std::vector<uint8>* packet) const { 76 std::vector<uint8>* packet) const {
83 // Sender report. 77 // Sender report.
84 size_t start_size = packet->size(); 78 size_t start_size = packet->size();
85 DCHECK_LT(start_size + 52, kMaxIpPacketSize) << "Not enough buffer space"; 79 DCHECK_LT(start_size + 52, kIpPacketSize) << "Not enough buffer space";
86 if (start_size + 52 > kMaxIpPacketSize) return; 80 if (start_size + 52 > kIpPacketSize) return;
87 81
88 uint16 number_of_rows = (report_block) ? 12 : 6; 82 uint16 number_of_rows = (report_block) ? 12 : 6;
89 packet->resize(start_size + 28); 83 packet->resize(start_size + 28);
90 84
91 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 28); 85 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 28);
92 big_endian_writer.WriteU8(0x80 + (report_block ? 1 : 0)); 86 big_endian_writer.WriteU8(0x80 + (report_block ? 1 : 0));
93 big_endian_writer.WriteU8(kPacketTypeSenderReport); 87 big_endian_writer.WriteU8(kPacketTypeSenderReport);
94 big_endian_writer.WriteU16(number_of_rows); 88 big_endian_writer.WriteU16(number_of_rows);
95 big_endian_writer.WriteU32(ssrc_); 89 big_endian_writer.WriteU32(ssrc_);
96 big_endian_writer.WriteU32(sender_info.ntp_seconds); 90 big_endian_writer.WriteU32(sender_info.ntp_seconds);
97 big_endian_writer.WriteU32(sender_info.ntp_fraction); 91 big_endian_writer.WriteU32(sender_info.ntp_fraction);
98 big_endian_writer.WriteU32(sender_info.rtp_timestamp); 92 big_endian_writer.WriteU32(sender_info.rtp_timestamp);
99 big_endian_writer.WriteU32(sender_info.send_packet_count); 93 big_endian_writer.WriteU32(sender_info.send_packet_count);
100 big_endian_writer.WriteU32(static_cast<uint32>(sender_info.send_octet_count)); 94 big_endian_writer.WriteU32(static_cast<uint32>(sender_info.send_octet_count));
101 95
102 if (report_block) { 96 if (report_block) {
103 AddReportBlocks(*report_block, packet); // Adds 24 bytes. 97 AddReportBlocks(*report_block, packet); // Adds 24 bytes.
104 } 98 }
105 } 99 }
106 100
107 void RtcpBuilder::AddReportBlocks(const RtcpReportBlock& report_block, 101 void RtcpBuilder::AddReportBlocks(const RtcpReportBlock& report_block,
108 std::vector<uint8>* packet) const { 102 std::vector<uint8>* packet) const {
109 size_t start_size = packet->size(); 103 size_t start_size = packet->size();
110 DCHECK_LT(start_size + 24, kMaxIpPacketSize) << "Not enough buffer space"; 104 DCHECK_LT(start_size + 24, kIpPacketSize) << "Not enough buffer space";
111 if (start_size + 24 > kMaxIpPacketSize) return; 105 if (start_size + 24 > kIpPacketSize) return;
112 106
113 packet->resize(start_size + 24); 107 packet->resize(start_size + 24);
114 108
115 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 24); 109 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 24);
116 big_endian_writer.WriteU32(report_block.media_ssrc); 110 big_endian_writer.WriteU32(report_block.media_ssrc);
117 big_endian_writer.WriteU8(report_block.fraction_lost); 111 big_endian_writer.WriteU8(report_block.fraction_lost);
118 big_endian_writer.WriteU8(report_block.cumulative_lost >> 16); 112 big_endian_writer.WriteU8(report_block.cumulative_lost >> 16);
119 big_endian_writer.WriteU8(report_block.cumulative_lost >> 8); 113 big_endian_writer.WriteU8(report_block.cumulative_lost >> 8);
120 big_endian_writer.WriteU8(report_block.cumulative_lost); 114 big_endian_writer.WriteU8(report_block.cumulative_lost);
121 115
122 // Extended highest seq_no, contain the highest sequence number received. 116 // Extended highest seq_no, contain the highest sequence number received.
123 big_endian_writer.WriteU32(report_block.extended_high_sequence_number); 117 big_endian_writer.WriteU32(report_block.extended_high_sequence_number);
124 big_endian_writer.WriteU32(report_block.jitter); 118 big_endian_writer.WriteU32(report_block.jitter);
125 119
126 // Last SR timestamp; our NTP time when we received the last report. 120 // Last SR timestamp; our NTP time when we received the last report.
127 // This is the value that we read from the send report packet not when we 121 // This is the value that we read from the send report packet not when we
128 // received it. 122 // received it.
129 big_endian_writer.WriteU32(report_block.last_sr); 123 big_endian_writer.WriteU32(report_block.last_sr);
130 124
131 // Delay since last received report, time since we received the report. 125 // Delay since last received report, time since we received the report.
132 big_endian_writer.WriteU32(report_block.delay_since_last_sr); 126 big_endian_writer.WriteU32(report_block.delay_since_last_sr);
133 } 127 }
134 128
135 void RtcpBuilder::BuildSdec(std::vector<uint8>* packet) const { 129 void RtcpBuilder::BuildSdec(std::vector<uint8>* packet) const {
136 size_t start_size = packet->size(); 130 size_t start_size = packet->size();
137 DCHECK_LT(start_size + 12 + c_name_.length(), kMaxIpPacketSize) 131 DCHECK_LT(start_size + 12 + c_name_.length(), kIpPacketSize)
138 << "Not enough buffer space"; 132 << "Not enough buffer space";
139 if (start_size + 12 > kMaxIpPacketSize) return; 133 if (start_size + 12 > kIpPacketSize) return;
140 134
141 // SDES Source Description. 135 // SDES Source Description.
142 packet->resize(start_size + 10); 136 packet->resize(start_size + 10);
143 137
144 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 10); 138 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 10);
145 // We always need to add one SDES CNAME. 139 // We always need to add one SDES CNAME.
146 big_endian_writer.WriteU8(0x80 + 1); 140 big_endian_writer.WriteU8(0x80 + 1);
147 big_endian_writer.WriteU8(kPacketTypeSdes); 141 big_endian_writer.WriteU8(kPacketTypeSdes);
148 142
149 // Handle SDES length later on. 143 // Handle SDES length later on.
(...skipping 20 matching lines...) Expand all
170 } 164 }
171 sdes_length += padding; 165 sdes_length += padding;
172 166
173 // In 32-bit words minus one and we don't count the header. 167 // In 32-bit words minus one and we don't count the header.
174 uint8 buffer_length = static_cast<uint8>((sdes_length / 4) - 1); 168 uint8 buffer_length = static_cast<uint8>((sdes_length / 4) - 1);
175 (*packet)[sdes_length_position] = buffer_length; 169 (*packet)[sdes_length_position] = buffer_length;
176 } 170 }
177 171
178 void RtcpBuilder::BuildBye(std::vector<uint8>* packet) const { 172 void RtcpBuilder::BuildBye(std::vector<uint8>* packet) const {
179 size_t start_size = packet->size(); 173 size_t start_size = packet->size();
180 DCHECK_LT(start_size + 8, kMaxIpPacketSize) << "Not enough buffer space"; 174 DCHECK_LT(start_size + 8, kIpPacketSize) << "Not enough buffer space";
181 if (start_size + 8 > kMaxIpPacketSize) return; 175 if (start_size + 8 > kIpPacketSize) return;
182 176
183 packet->resize(start_size + 8); 177 packet->resize(start_size + 8);
184 178
185 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8); 179 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 8);
186 big_endian_writer.WriteU8(0x80 + 1); 180 big_endian_writer.WriteU8(0x80 + 1);
187 big_endian_writer.WriteU8(kPacketTypeBye); 181 big_endian_writer.WriteU8(kPacketTypeBye);
188 big_endian_writer.WriteU16(1); // Length. 182 big_endian_writer.WriteU16(1); // Length.
189 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. 183 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC.
190 } 184 }
191 185
(...skipping 10 matching lines...) Expand all
202 | SSRC_1 (SSRC of first receiver) | sub- 196 | SSRC_1 (SSRC of first receiver) | sub-
203 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block 197 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block
204 | last RR (LRR) | 1 198 | last RR (LRR) | 1
205 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 199 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
206 | delay since last RR (DLRR) | 200 | delay since last RR (DLRR) |
207 +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ 201 +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
208 */ 202 */
209 void RtcpBuilder::BuildDlrrRb(const RtcpDlrrReportBlock* dlrr, 203 void RtcpBuilder::BuildDlrrRb(const RtcpDlrrReportBlock* dlrr,
210 std::vector<uint8>* packet) const { 204 std::vector<uint8>* packet) const {
211 size_t start_size = packet->size(); 205 size_t start_size = packet->size();
212 DCHECK_LT(start_size + 24, kMaxIpPacketSize) << "Not enough buffer space"; 206 DCHECK_LT(start_size + 24, kIpPacketSize) << "Not enough buffer space";
213 if (start_size + 24 > kMaxIpPacketSize) return; 207 if (start_size + 24 > kIpPacketSize) return;
214 208
215 packet->resize(start_size + 24); 209 packet->resize(start_size + 24);
216 210
217 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 24); 211 net::BigEndianWriter big_endian_writer(&((*packet)[start_size]), 24);
218 big_endian_writer.WriteU8(0x80); 212 big_endian_writer.WriteU8(0x80);
219 big_endian_writer.WriteU8(kPacketTypeXr); 213 big_endian_writer.WriteU8(kPacketTypeXr);
220 big_endian_writer.WriteU16(5); // Length. 214 big_endian_writer.WriteU16(5); // Length.
221 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. 215 big_endian_writer.WriteU32(ssrc_); // Add our own SSRC.
222 big_endian_writer.WriteU8(5); // Add block type. 216 big_endian_writer.WriteU8(5); // Add block type.
223 big_endian_writer.WriteU8(0); // Add reserved. 217 big_endian_writer.WriteU8(0); // Add reserved.
224 big_endian_writer.WriteU16(3); // Block length. 218 big_endian_writer.WriteU16(3); // Block length.
225 big_endian_writer.WriteU32(ssrc_); // Add the media (received RTP) SSRC. 219 big_endian_writer.WriteU32(ssrc_); // Add the media (received RTP) SSRC.
226 big_endian_writer.WriteU32(dlrr->last_rr); 220 big_endian_writer.WriteU32(dlrr->last_rr);
227 big_endian_writer.WriteU32(dlrr->delay_since_last_rr); 221 big_endian_writer.WriteU32(dlrr->delay_since_last_rr);
228 } 222 }
229 223
230 void RtcpBuilder::BuildSenderLog(RtcpSenderLogMessage* sender_log_message, 224 void RtcpBuilder::BuildSenderLog(RtcpSenderLogMessage* sender_log_message,
231 std::vector<uint8>* packet) const { 225 std::vector<uint8>* packet) const {
232 DCHECK(sender_log_message); 226 DCHECK(sender_log_message);
233 DCHECK(packet); 227 DCHECK(packet);
234 size_t start_size = packet->size(); 228 size_t start_size = packet->size();
235 size_t remaining_space = kMaxIpPacketSize - start_size; 229 size_t remaining_space = kIpPacketSize - start_size;
236 DCHECK_GE(remaining_space, kRtcpCastLogHeaderSize + kRtcpSenderFrameLogSize) 230 DCHECK_GE(remaining_space, kRtcpCastLogHeaderSize + kRtcpSenderFrameLogSize)
237 << "Not enough buffer space"; 231 << "Not enough buffer space";
238 if (remaining_space < kRtcpCastLogHeaderSize + kRtcpSenderFrameLogSize) 232 if (remaining_space < kRtcpCastLogHeaderSize + kRtcpSenderFrameLogSize)
239 return; 233 return;
240 234
241 size_t space_for_x_messages = 235 size_t space_for_x_messages =
242 (remaining_space - kRtcpCastLogHeaderSize) / kRtcpSenderFrameLogSize; 236 (remaining_space - kRtcpCastLogHeaderSize) / kRtcpSenderFrameLogSize;
243 size_t number_of_messages = std::min(space_for_x_messages, 237 size_t number_of_messages = std::min(space_for_x_messages,
244 sender_log_message->size()); 238 sender_log_message->size());
245 239
(...skipping 16 matching lines...) Expand all
262 big_endian_writer.WriteU8(static_cast<uint8>(message.rtp_timestamp >> 16)); 256 big_endian_writer.WriteU8(static_cast<uint8>(message.rtp_timestamp >> 16));
263 big_endian_writer.WriteU8(static_cast<uint8>(message.rtp_timestamp >> 8)); 257 big_endian_writer.WriteU8(static_cast<uint8>(message.rtp_timestamp >> 8));
264 big_endian_writer.WriteU8(static_cast<uint8>(message.rtp_timestamp)); 258 big_endian_writer.WriteU8(static_cast<uint8>(message.rtp_timestamp));
265 sender_log_message->pop_front(); 259 sender_log_message->pop_front();
266 } 260 }
267 } 261 }
268 262
269 } // namespace transport 263 } // namespace transport
270 } // namespace cast 264 } // namespace cast
271 } // namespace media 265 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/transport/pacing/paced_sender_unittest.cc ('k') | media/cast/transport/rtcp/rtcp_builder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698