Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/net/rtcp/rtcp_builder.h" | 5 #include "media/cast/net/rtcp/rtcp_builder.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 158 writer_ = base::BigEndianWriter(NULL, 0); | 158 writer_ = base::BigEndianWriter(NULL, 0); |
| 159 PacketRef ret = packet_; | 159 PacketRef ret = packet_; |
| 160 packet_ = NULL; | 160 packet_ = NULL; |
| 161 return ret; | 161 return ret; |
| 162 } | 162 } |
| 163 | 163 |
| 164 PacketRef RtcpBuilder::BuildRtcpFromReceiver( | 164 PacketRef RtcpBuilder::BuildRtcpFromReceiver( |
| 165 const RtcpReportBlock* report_block, | 165 const RtcpReportBlock* report_block, |
| 166 const RtcpReceiverReferenceTimeReport* rrtr, | 166 const RtcpReceiverReferenceTimeReport* rrtr, |
| 167 const RtcpCastMessage* cast_message, | 167 const RtcpCastMessage* cast_message, |
| 168 const RtcpPliMessage* pli_message, | |
| 168 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, | 169 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, |
| 169 base::TimeDelta target_delay) { | 170 base::TimeDelta target_delay) { |
| 170 Start(); | 171 Start(); |
| 171 | 172 |
| 172 if (report_block) | 173 if (report_block) |
| 173 AddRR(report_block); | 174 AddRR(report_block); |
| 174 if (rrtr) | 175 if (rrtr) |
| 175 AddRrtr(rrtr); | 176 AddRrtr(rrtr); |
| 176 if (cast_message) | 177 if (cast_message) |
| 177 AddCast(cast_message, target_delay); | 178 AddCast(cast_message, target_delay); |
| 179 if (pli_message) | |
| 180 AddPli(pli_message); | |
| 178 if (rtcp_events) | 181 if (rtcp_events) |
| 179 AddReceiverLog(*rtcp_events); | 182 AddReceiverLog(*rtcp_events); |
| 180 | 183 |
| 181 return Finish(); | 184 return Finish(); |
| 182 } | 185 } |
| 183 | 186 |
| 184 PacketRef RtcpBuilder::BuildRtcpFromSender(const RtcpSenderInfo& sender_info) { | 187 PacketRef RtcpBuilder::BuildRtcpFromSender(const RtcpSenderInfo& sender_info) { |
| 185 Start(); | 188 Start(); |
| 186 AddSR(sender_info); | 189 AddSR(sender_info); |
| 187 return Finish(); | 190 return Finish(); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 220 writer_.WriteU32(ssrc_); // Add our own SSRC. | 223 writer_.WriteU32(ssrc_); // Add our own SSRC. |
| 221 writer_.WriteU8(4); // Add block type. | 224 writer_.WriteU8(4); // Add block type. |
| 222 writer_.WriteU8(0); // Add reserved. | 225 writer_.WriteU8(0); // Add reserved. |
| 223 writer_.WriteU16(2); // Block length. | 226 writer_.WriteU16(2); // Block length. |
| 224 | 227 |
| 225 // Add the media (received RTP) SSRC. | 228 // Add the media (received RTP) SSRC. |
| 226 writer_.WriteU32(rrtr->ntp_seconds); | 229 writer_.WriteU32(rrtr->ntp_seconds); |
| 227 writer_.WriteU32(rrtr->ntp_fraction); | 230 writer_.WriteU32(rrtr->ntp_fraction); |
| 228 } | 231 } |
| 229 | 232 |
| 233 void RtcpBuilder::AddPli(const RtcpPliMessage* pli_message) { | |
|
dcheng
2016/03/01 23:44:12
How about const RtcpPliMessage&? This should never
xjz
2016/03/02 04:24:17
Done.
| |
| 234 AddRtcpHeader(kPacketTypePayloadSpecific, 1); | |
| 235 writer_.WriteU32(ssrc_); | |
| 236 writer_.WriteU32(pli_message->remote_ssrc); | |
| 237 } | |
| 238 | |
| 230 void RtcpBuilder::AddCast(const RtcpCastMessage* cast, | 239 void RtcpBuilder::AddCast(const RtcpCastMessage* cast, |
| 231 base::TimeDelta target_delay) { | 240 base::TimeDelta target_delay) { |
| 232 // See RTC 4585 Section 6.4 for application specific feedback messages. | 241 // See RTC 4585 Section 6.4 for application specific feedback messages. |
| 233 AddRtcpHeader(kPacketTypePayloadSpecific, 15); | 242 AddRtcpHeader(kPacketTypePayloadSpecific, 15); |
| 234 writer_.WriteU32(ssrc_); // Add our own SSRC. | 243 writer_.WriteU32(ssrc_); // Add our own SSRC. |
| 235 writer_.WriteU32(cast->media_ssrc); // Remote SSRC. | 244 writer_.WriteU32(cast->remote_ssrc); // Remote SSRC. |
| 236 writer_.WriteU32(kCast); | 245 writer_.WriteU32(kCast); |
| 237 writer_.WriteU8(static_cast<uint8_t>(cast->ack_frame_id)); | 246 writer_.WriteU8(static_cast<uint8_t>(cast->ack_frame_id)); |
| 238 uint8_t* cast_loss_field_pos = reinterpret_cast<uint8_t*>(writer_.ptr()); | 247 uint8_t* cast_loss_field_pos = reinterpret_cast<uint8_t*>(writer_.ptr()); |
| 239 writer_.WriteU8(0); // Overwritten with number_of_loss_fields. | 248 writer_.WriteU8(0); // Overwritten with number_of_loss_fields. |
| 240 DCHECK_LE(target_delay.InMilliseconds(), | 249 DCHECK_LE(target_delay.InMilliseconds(), |
| 241 std::numeric_limits<uint16_t>::max()); | 250 std::numeric_limits<uint16_t>::max()); |
| 242 writer_.WriteU16(target_delay.InMilliseconds()); | 251 writer_.WriteU16(target_delay.InMilliseconds()); |
| 243 | 252 |
| 244 size_t number_of_loss_fields = 0; | 253 size_t number_of_loss_fields = 0; |
| 245 size_t max_number_of_loss_fields = std::min<size_t>( | 254 size_t max_number_of_loss_fields = std::min<size_t>( |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 281 } else { | 290 } else { |
| 282 break; | 291 break; |
| 283 } | 292 } |
| 284 } | 293 } |
| 285 writer_.WriteU8(bitmask); | 294 writer_.WriteU8(bitmask); |
| 286 ++number_of_loss_fields; | 295 ++number_of_loss_fields; |
| 287 } | 296 } |
| 288 } | 297 } |
| 289 } | 298 } |
| 290 VLOG_IF(1, !nack_string_builder.Empty()) | 299 VLOG_IF(1, !nack_string_builder.Empty()) |
| 291 << "SSRC: " << cast->media_ssrc | 300 << "SSRC: " << cast->remote_ssrc << ", ACK: " << cast->ack_frame_id |
| 292 << ", ACK: " << cast->ack_frame_id | |
| 293 << ", NACK: " << nack_string_builder.GetString(); | 301 << ", NACK: " << nack_string_builder.GetString(); |
| 294 DCHECK_LE(number_of_loss_fields, kRtcpMaxCastLossFields); | 302 DCHECK_LE(number_of_loss_fields, kRtcpMaxCastLossFields); |
| 295 *cast_loss_field_pos = static_cast<uint8_t>(number_of_loss_fields); | 303 *cast_loss_field_pos = static_cast<uint8_t>(number_of_loss_fields); |
| 296 } | 304 } |
| 297 | 305 |
| 298 void RtcpBuilder::AddSR(const RtcpSenderInfo& sender_info) { | 306 void RtcpBuilder::AddSR(const RtcpSenderInfo& sender_info) { |
| 299 AddRtcpHeader(kPacketTypeSenderReport, 0); | 307 AddRtcpHeader(kPacketTypeSenderReport, 0); |
| 300 writer_.WriteU32(ssrc_); | 308 writer_.WriteU32(ssrc_); |
| 301 writer_.WriteU32(sender_info.ntp_seconds); | 309 writer_.WriteU32(sender_info.ntp_seconds); |
| 302 writer_.WriteU32(sender_info.ntp_fraction); | 310 writer_.WriteU32(sender_info.ntp_fraction); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 477 receiver_log_message->push_front(frame_log); | 485 receiver_log_message->push_front(frame_log); |
| 478 } | 486 } |
| 479 | 487 |
| 480 VLOG(3) << "number of frames: " << number_of_frames; | 488 VLOG(3) << "number of frames: " << number_of_frames; |
| 481 VLOG(3) << "total messages to send: " << *total_number_of_messages_to_send; | 489 VLOG(3) << "total messages to send: " << *total_number_of_messages_to_send; |
| 482 return number_of_frames > 0; | 490 return number_of_frames > 0; |
| 483 } | 491 } |
| 484 | 492 |
| 485 } // namespace cast | 493 } // namespace cast |
| 486 } // namespace media | 494 } // namespace media |
| OLD | NEW |