Index: media/cast/transport/rtcp/rtcp_builder.cc |
diff --git a/media/cast/transport/rtcp/rtcp_builder.cc b/media/cast/transport/rtcp/rtcp_builder.cc |
index e89102378d8e94127dbb4c6fa10293e766a5873b..6ab8c8b763c88b8ace87e24fb54ba036b351f29e 100644 |
--- a/media/cast/transport/rtcp/rtcp_builder.cc |
+++ b/media/cast/transport/rtcp/rtcp_builder.cc |
@@ -55,17 +55,17 @@ void RtcpBuilder::SendRtcpFromRtpSender( |
Packet packet; |
packet.reserve(kMaxIpPacketSize); |
if (packet_type_flags & kRtcpSr) { |
- BuildSR(sender_info, &packet); |
- BuildSdec(&packet); |
+ if (!BuildSR(sender_info, &packet)) return; |
+ if (!BuildSdec(&packet)) return; |
} |
if (packet_type_flags & kRtcpBye) { |
- BuildBye(&packet); |
+ if (!BuildBye(&packet)) return; |
} |
if (packet_type_flags & kRtcpDlrr) { |
- BuildDlrrRb(dlrr, &packet); |
+ if (!BuildDlrrRb(dlrr, &packet)) return; |
} |
if (packet_type_flags & kRtcpSenderLog) { |
- BuildSenderLog(sender_log, &packet); |
+ if (!BuildSenderLog(sender_log, &packet)) return; |
} |
if (packet.empty()) |
return; // Sanity - don't send empty packets. |
@@ -73,12 +73,14 @@ void RtcpBuilder::SendRtcpFromRtpSender( |
transport_->SendRtcpPacket(packet); |
} |
-void RtcpBuilder::BuildSR(const RtcpSenderInfo& sender_info, |
+bool RtcpBuilder::BuildSR(const RtcpSenderInfo& sender_info, |
Packet* packet) const { |
// Sender report. |
size_t start_size = packet->size(); |
- DCHECK_LT(start_size + 52, kMaxIpPacketSize) << "Not enough buffer space"; |
- if (start_size + 52 > kMaxIpPacketSize) return; |
+ if (start_size + 52 > kMaxIpPacketSize) { |
+ DLOG(FATAL) << "Not enough buffer space"; |
+ return false; |
+ } |
uint16 number_of_rows = 6; |
packet->resize(start_size + 28); |
@@ -93,13 +95,15 @@ void RtcpBuilder::BuildSR(const RtcpSenderInfo& sender_info, |
big_endian_writer.WriteU32(sender_info.rtp_timestamp); |
big_endian_writer.WriteU32(sender_info.send_packet_count); |
big_endian_writer.WriteU32(static_cast<uint32>(sender_info.send_octet_count)); |
+ return true; |
} |
-void RtcpBuilder::BuildSdec(Packet* packet) const { |
+bool RtcpBuilder::BuildSdec(Packet* packet) const { |
size_t start_size = packet->size(); |
- DCHECK_LT(start_size + 12 + c_name_.length(), kMaxIpPacketSize) |
- << "Not enough buffer space"; |
- if (start_size + 12 > kMaxIpPacketSize) return; |
+ if (start_size + 12 + c_name_.length() > kMaxIpPacketSize) { |
+ DLOG(FATAL) << "Not enough buffer space"; |
+ return false; |
+ } |
// SDES Source Description. |
packet->resize(start_size + 10); |
@@ -136,12 +140,15 @@ void RtcpBuilder::BuildSdec(Packet* packet) const { |
// In 32-bit words minus one and we don't count the header. |
uint8 buffer_length = static_cast<uint8>((sdes_length / 4) - 1); |
(*packet)[sdes_length_position] = buffer_length; |
+ return true; |
} |
-void RtcpBuilder::BuildBye(Packet* packet) const { |
+bool RtcpBuilder::BuildBye(Packet* packet) const { |
size_t start_size = packet->size(); |
- DCHECK_LT(start_size + 8, kMaxIpPacketSize) << "Not enough buffer space"; |
- if (start_size + 8 > kMaxIpPacketSize) return; |
+ if (start_size + 8 > kMaxIpPacketSize) { |
+ DLOG(FATAL) << "Not enough buffer space"; |
+ return false; |
+ } |
packet->resize(start_size + 8); |
@@ -150,6 +157,7 @@ void RtcpBuilder::BuildBye(Packet* packet) const { |
big_endian_writer.WriteU8(kPacketTypeBye); |
big_endian_writer.WriteU16(1); // Length. |
big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
+ return true; |
} |
/* |
@@ -169,11 +177,13 @@ void RtcpBuilder::BuildBye(Packet* packet) const { |
| delay since last RR (DLRR) | |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ |
*/ |
-void RtcpBuilder::BuildDlrrRb(const RtcpDlrrReportBlock& dlrr, |
+bool RtcpBuilder::BuildDlrrRb(const RtcpDlrrReportBlock& dlrr, |
Packet* packet) const { |
size_t start_size = packet->size(); |
- DCHECK_LT(start_size + 24, kMaxIpPacketSize) << "Not enough buffer space"; |
- if (start_size + 24 > kMaxIpPacketSize) return; |
+ if (start_size + 24 > kMaxIpPacketSize) { |
+ DLOG(FATAL) << "Not enough buffer space"; |
+ return false; |
+ } |
packet->resize(start_size + 24); |
@@ -188,17 +198,18 @@ void RtcpBuilder::BuildDlrrRb(const RtcpDlrrReportBlock& dlrr, |
big_endian_writer.WriteU32(ssrc_); // Add the media (received RTP) SSRC. |
big_endian_writer.WriteU32(dlrr.last_rr); |
big_endian_writer.WriteU32(dlrr.delay_since_last_rr); |
+ return true; |
} |
-void RtcpBuilder::BuildSenderLog(const RtcpSenderLogMessage& sender_log_message, |
+bool RtcpBuilder::BuildSenderLog(const RtcpSenderLogMessage& sender_log_message, |
Packet* packet) const { |
DCHECK(packet); |
size_t start_size = packet->size(); |
size_t remaining_space = kMaxIpPacketSize - start_size; |
- DCHECK_GE(remaining_space, kRtcpCastLogHeaderSize + kRtcpSenderFrameLogSize) |
- << "Not enough buffer space"; |
- if (remaining_space < kRtcpCastLogHeaderSize + kRtcpSenderFrameLogSize) |
- return; |
+ if (remaining_space < kRtcpCastLogHeaderSize + kRtcpSenderFrameLogSize) { |
+ DLOG(FATAL) << "Not enough buffer space"; |
+ return false; |
+ } |
size_t space_for_x_messages = |
(remaining_space - kRtcpCastLogHeaderSize) / kRtcpSenderFrameLogSize; |
@@ -216,7 +227,7 @@ void RtcpBuilder::BuildSenderLog(const RtcpSenderLogMessage& sender_log_message, |
big_endian_writer.WriteU32(ssrc_); // Add our own SSRC. |
big_endian_writer.WriteU32(kCast); |
- std::list<RtcpSenderFrameLogMessage>::const_iterator it = |
+ std::vector<RtcpSenderFrameLogMessage>::const_iterator it = |
sender_log_message.begin(); |
for (; number_of_messages > 0; --number_of_messages) { |
DCHECK(!sender_log_message.empty()); |
@@ -228,6 +239,7 @@ void RtcpBuilder::BuildSenderLog(const RtcpSenderLogMessage& sender_log_message, |
big_endian_writer.WriteU8(static_cast<uint8>(message.rtp_timestamp)); |
++it; |
} |
+ return true; |
} |
} // namespace transport |