Index: media/cast/net/rtcp/rtcp_receiver.cc |
diff --git a/media/cast/net/rtcp/rtcp_receiver.cc b/media/cast/net/rtcp/rtcp_receiver.cc |
index 99fd9178ae2d2280f2cef5d3003aa0bd6ba1f3d4..d8b81b1a990e9b524f99fc072ecfcfd2f89d31ab 100644 |
--- a/media/cast/net/rtcp/rtcp_receiver.cc |
+++ b/media/cast/net/rtcp/rtcp_receiver.cc |
@@ -4,6 +4,7 @@ |
#include "media/cast/net/rtcp/rtcp_receiver.h" |
+#include "base/big_endian.h" |
#include "base/logging.h" |
#include "media/cast/net/cast_transport_defines.h" |
#include "media/cast/net/rtcp/rtcp_utility.h" |
@@ -38,21 +39,44 @@ std::pair<uint64, uint64> GetReceiverEventKey( |
namespace media { |
namespace cast { |
-RtcpReceiver::RtcpReceiver(scoped_refptr<CastEnvironment> cast_environment, |
- RtcpSenderFeedback* sender_feedback, |
- RtcpReceiverFeedback* receiver_feedback, |
- RtcpRttFeedback* rtt_feedback, |
+RtcpReceiver::RtcpReceiver(RtcpMessageHandler* handler, |
uint32 local_ssrc) |
: ssrc_(local_ssrc), |
remote_ssrc_(0), |
- sender_feedback_(sender_feedback), |
- receiver_feedback_(receiver_feedback), |
- rtt_feedback_(rtt_feedback), |
- cast_environment_(cast_environment), |
- receiver_event_history_size_(0) {} |
+ handler_(handler), |
+ receiver_event_history_size_(0) { |
+ DCHECK(handler_); |
+} |
RtcpReceiver::~RtcpReceiver() {} |
+// static |
+bool RtcpReceiver::IsRtcpPacket(const uint8* packet, size_t length) { |
+ if (length < kMinLengthOfRtcp) { |
+ LOG(ERROR) << "Invalid RTCP packet received."; |
+ return false; |
+ } |
+ |
+ uint8 packet_type = packet[1]; |
+ if (packet_type >= kPacketTypeLow && |
+ packet_type <= kPacketTypeHigh) { |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+// static |
+uint32 RtcpReceiver::GetSsrcOfSender(const uint8* rtcp_buffer, size_t length) { |
+ if (length < kMinLengthOfRtcp) |
+ return 0; |
+ uint32 ssrc_of_sender; |
+ base::BigEndianReader big_endian_reader( |
+ reinterpret_cast<const char*>(rtcp_buffer), length); |
+ big_endian_reader.Skip(4); // Skip header |
+ big_endian_reader.ReadU32(&ssrc_of_sender); |
+ return ssrc_of_sender; |
+} |
+ |
void RtcpReceiver::SetRemoteSSRC(uint32 ssrc) { remote_ssrc_ = ssrc; } |
void RtcpReceiver::SetCastReceiverEventHistorySize(size_t size) { |
@@ -83,9 +107,6 @@ void RtcpReceiver::IncomingRtcpPacket(RtcpParser* rtcp_parser) { |
case kRtcpGenericRtpFeedbackNackCode: |
HandleNACK(rtcp_parser); |
break; |
- case kRtcpGenericRtpFeedbackSrReqCode: |
- HandleSendReportRequest(rtcp_parser); |
- break; |
case kRtcpPayloadSpecificPliCode: |
HandlePLI(rtcp_parser); |
break; |
@@ -110,6 +131,7 @@ void RtcpReceiver::IncomingRtcpPacket(RtcpParser* rtcp_parser) { |
case kRtcpNotValidCode: |
case kRtcpReportBlockItemCode: |
case kRtcpSdesChunkCode: |
+ case kRtcpGenericRtpFeedbackSrReqCode: |
case kRtcpGenericRtpFeedbackNackItemCode: |
case kRtcpPayloadSpecificFirItemCode: |
case kRtcpXrRrtrCode: |
@@ -145,9 +167,7 @@ void RtcpReceiver::HandleSenderReport(RtcpParser* rtcp_parser) { |
rtcp_field.sender_report.sender_packet_count; |
remote_sender_info.send_octet_count = |
rtcp_field.sender_report.sender_octet_count; |
- if (receiver_feedback_) { |
- receiver_feedback_->OnReceivedSenderReport(remote_sender_info); |
- } |
+ handler_->OnReceivedSenderReport(remote_sender_info); |
} |
rtcp_field_type = rtcp_parser->Iterate(); |
while (rtcp_field_type == kRtcpReportBlockItemCode) { |
@@ -203,11 +223,8 @@ void RtcpReceiver::HandleReportBlock(const RtcpField* rtcp_field, |
report_block.jitter = rb.jitter; |
report_block.last_sr = rb.last_sender_report; |
report_block.delay_since_last_sr = rb.delay_last_sender_report; |
- |
- if (rtt_feedback_) { |
- rtt_feedback_->OnReceivedDelaySinceLastReport( |
- rb.ssrc, rb.last_sender_report, rb.delay_last_sender_report); |
- } |
+ handler_->OnReceivedDelaySinceLastReport( |
+ rb.last_sender_report, rb.delay_last_sender_report); |
} |
void RtcpReceiver::HandleSDES(RtcpParser* rtcp_parser) { |
@@ -254,10 +271,7 @@ void RtcpReceiver::HandleRrtr(RtcpParser* rtcp_parser, uint32 remote_ssrc) { |
remote_time_report.remote_ssrc = remote_ssrc; |
remote_time_report.ntp_seconds = rtcp_field.rrtr.ntp_most_significant; |
remote_time_report.ntp_fraction = rtcp_field.rrtr.ntp_least_significant; |
- |
- if (receiver_feedback_) { |
- receiver_feedback_->OnReceiverReferenceTimeReport(remote_time_report); |
- } |
+ handler_->OnReceiverReferenceTimeReport(remote_time_report); |
} |
void RtcpReceiver::HandleDlrr(RtcpParser* rtcp_parser) { |
@@ -266,12 +280,9 @@ void RtcpReceiver::HandleDlrr(RtcpParser* rtcp_parser) { |
// Not to us. |
return; |
} |
- if (rtt_feedback_) { |
- rtt_feedback_->OnReceivedDelaySinceLastReport( |
- rtcp_field.dlrr.receivers_ssrc, |
- rtcp_field.dlrr.last_receiver_report, |
- rtcp_field.dlrr.delay_last_receiver_report); |
- } |
+ handler_->OnReceivedDelaySinceLastReport( |
+ rtcp_field.dlrr.last_receiver_report, |
+ rtcp_field.dlrr.delay_last_receiver_report); |
} |
void RtcpReceiver::HandleNACK(RtcpParser* rtcp_parser) { |
@@ -326,13 +337,6 @@ void RtcpReceiver::HandlePLI(RtcpParser* rtcp_parser) { |
rtcp_parser->Iterate(); |
} |
-void RtcpReceiver::HandleSendReportRequest(RtcpParser* rtcp_parser) { |
- if (receiver_feedback_) { |
- receiver_feedback_->OnReceivedSendReportRequest(); |
- } |
- rtcp_parser->Iterate(); |
-} |
- |
void RtcpReceiver::HandleRpsi(RtcpParser* rtcp_parser) { |
const RtcpField& rtcp_field = rtcp_parser->Field(); |
if (rtcp_parser->Iterate() != kRtcpPayloadSpecificRpsiCode) { |
@@ -436,9 +440,8 @@ void RtcpReceiver::HandleApplicationSpecificCastReceiverLog( |
receiver_log.push_back(frame_log); |
} |
- if (receiver_feedback_ && !receiver_log.empty()) { |
- receiver_feedback_->OnReceivedReceiverLog(receiver_log); |
- } |
+ if (!receiver_log.empty()) |
+ handler_->OnReceivedReceiverLog(receiver_log); |
} |
void RtcpReceiver::HandleApplicationSpecificCastReceiverEventLog( |
@@ -491,20 +494,18 @@ void RtcpReceiver::HandleApplicationSpecificCastReceiverEventLog( |
void RtcpReceiver::HandlePayloadSpecificCastItem(RtcpParser* rtcp_parser) { |
const RtcpField& rtcp_field = rtcp_parser->Field(); |
RtcpCastMessage cast_message(remote_ssrc_); |
- cast_message.ack_frame_id_ = ack_frame_id_wrap_helper_.MapTo32bitsFrameId( |
+ cast_message.ack_frame_id = ack_frame_id_wrap_helper_.MapTo32bitsFrameId( |
rtcp_field.cast_item.last_frame_id); |
- cast_message.target_delay_ms_ = rtcp_field.cast_item.target_delay_ms; |
+ cast_message.target_delay_ms = rtcp_field.cast_item.target_delay_ms; |
RtcpFieldTypes packet_type = rtcp_parser->Iterate(); |
while (packet_type == kRtcpPayloadSpecificCastNackItemCode) { |
const RtcpField& rtcp_field = rtcp_parser->Field(); |
HandlePayloadSpecificCastNackItem( |
- &rtcp_field, &cast_message.missing_frames_and_packets_); |
+ &rtcp_field, &cast_message.missing_frames_and_packets); |
packet_type = rtcp_parser->Iterate(); |
} |
- if (sender_feedback_) { |
- sender_feedback_->OnReceivedCastFeedback(cast_message); |
- } |
+ handler_->OnReceivedCastFeedback(cast_message); |
} |
void RtcpReceiver::HandlePayloadSpecificCastNackItem( |