summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhguihot@chromium.org <hguihot@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-15 05:19:58 +0000
committerhguihot@chromium.org <hguihot@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-15 05:19:58 +0000
commit4436931da94c0f97c6324c4a09cad6d249596e4f (patch)
tree84bac8747bcf69b8f423b74efead2dd8de1717b4
parentcf88528eca7885ef1639f523fe4f70ad0e9cf7fe (diff)
downloadchromium_src-4436931da94c0f97c6324c4a09cad6d249596e4f.zip
chromium_src-4436931da94c0f97c6324c4a09cad6d249596e4f.tar.gz
chromium_src-4436931da94c0f97c6324c4a09cad6d249596e4f.tar.bz2
Log NACK list in Cast message.
Review URL: https://codereview.chromium.org/195573005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@257291 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--media/cast/rtcp/rtcp_sender.cc80
1 files changed, 80 insertions, 0 deletions
diff --git a/media/cast/rtcp/rtcp_sender.cc b/media/cast/rtcp/rtcp_sender.cc
index 86225f9..dc5b8c8 100644
--- a/media/cast/rtcp/rtcp_sender.cc
+++ b/media/cast/rtcp/rtcp_sender.cc
@@ -158,6 +158,77 @@ bool BuildRtcpReceiverLogMessage(
VLOG(3) << "rtcp log size: " << *rtcp_log_size;
return *number_of_frames > 0;
}
+
+// A class to build a string representing the NACK list in Cast message.
+//
+// The string will look like "23:3-6 25:1,5-6", meaning packets 3 to 6 in frame
+// 23 are being NACK'ed (i.e. they are missing from the receiver's point of
+// view) and packets 1, 5 and 6 are missing in frame 25. A frame that is
+// completely missing will show as "26:65535".
+class NackStringBuilder {
+ public:
+ NackStringBuilder()
+ : frame_count_(0),
+ packet_count_(0),
+ last_frame_id_(-1),
+ last_packet_id_(-1),
+ contiguous_sequence_(false) {}
+ ~NackStringBuilder() {}
+
+ bool Empty() const { return frame_count_ == 0; }
+
+ void PushFrame(int frame_id) {
+ DCHECK_GE(frame_id, 0);
+ if (frame_count_ > 0) {
+ if (frame_id == last_frame_id_) {
+ return;
+ }
+ if (contiguous_sequence_) {
+ stream_ << "-" << last_packet_id_;
+ }
+ stream_ << ", ";
+ }
+ stream_ << frame_id;
+ last_frame_id_ = frame_id;
+ packet_count_ = 0;
+ contiguous_sequence_ = false;
+ ++frame_count_;
+ }
+
+ void PushPacket(int packet_id) {
+ DCHECK_GE(last_frame_id_, 0);
+ DCHECK_GE(packet_id, 0);
+ if (packet_count_ == 0) {
+ stream_ << ":" << packet_id;
+ } else if (packet_id == last_packet_id_ + 1) {
+ contiguous_sequence_ = true;
+ } else {
+ if (contiguous_sequence_) {
+ stream_ << "-" << last_packet_id_;
+ contiguous_sequence_ = false;
+ }
+ stream_ << "," << packet_id;
+ }
+ ++packet_count_;
+ last_packet_id_ = packet_id;
+ }
+
+ std::string GetString() {
+ if (contiguous_sequence_) {
+ stream_ << "-" << last_packet_id_;
+ contiguous_sequence_ = false;
+ }
+ return stream_.str();
+ }
+
+ private:
+ std::ostringstream stream_;
+ int frame_count_;
+ int packet_count_;
+ int last_frame_id_;
+ int last_packet_id_;
+ bool contiguous_sequence_;
+};
} // namespace
// TODO(mikhal): This is only used by the receiver. Consider renaming.
@@ -583,9 +654,11 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast,
MissingFramesAndPacketsMap::const_iterator frame_it =
cast->missing_frames_and_packets_.begin();
+ NackStringBuilder nack_string_builder;
for (; frame_it != cast->missing_frames_and_packets_.end() &&
number_of_loss_fields < max_number_of_loss_fields;
++frame_it) {
+ nack_string_builder.PushFrame(frame_it->first);
// Iterate through all frames with missing packets.
if (frame_it->second.empty()) {
// Special case all packets in a frame is missing.
@@ -596,6 +669,7 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast,
big_endian_nack_writer.WriteU8(static_cast<uint8>(frame_it->first));
big_endian_nack_writer.WriteU16(kRtcpCastAllPacketsLost);
big_endian_nack_writer.WriteU8(0);
+ nack_string_builder.PushPacket(kRtcpCastAllPacketsLost);
++number_of_loss_fields;
} else {
PacketIdSet::const_iterator packet_it = frame_it->second.begin();
@@ -610,12 +684,14 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast,
// Write frame and packet id to buffer before calculating bitmask.
big_endian_nack_writer.WriteU8(static_cast<uint8>(frame_it->first));
big_endian_nack_writer.WriteU16(packet_id);
+ nack_string_builder.PushPacket(packet_id);
uint8 bitmask = 0;
++packet_it;
while (packet_it != frame_it->second.end()) {
int shift = static_cast<uint8>(*packet_it - packet_id) - 1;
if (shift >= 0 && shift <= 7) {
+ nack_string_builder.PushPacket(*packet_it);
bitmask |= (1 << shift);
++packet_it;
} else {
@@ -627,6 +703,10 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast,
}
}
}
+ VLOG_IF(1, !nack_string_builder.Empty())
+ << "SSRC: " << cast->media_ssrc_
+ << ", ACK: " << cast->ack_frame_id_
+ << ", NACK: " << nack_string_builder.GetString();
DCHECK_LE(number_of_loss_fields, kRtcpMaxCastLossFields);
(*packet)[cast_size_pos] = static_cast<uint8>(4 + number_of_loss_fields);
(*packet)[cast_loss_field_pos] = static_cast<uint8>(number_of_loss_fields);