Chromium Code Reviews| 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 e71d23b8f93bec7238288e7103aaa0fbab753fa2..fd0ad196d60bb12407d12eb0cce896cfa2ece5ea 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,39 @@ 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), |
| + handler_(handler), |
| receiver_event_history_size_(0) {} |
|
miu
2014/07/16 00:09:32
To simplify, consider adding DCHECK(handler_) here
Alpha Left Google
2014/07/17 01:01:45
Done.
|
| RtcpReceiver::~RtcpReceiver() {} |
| +// static |
| +bool RtcpReceiver::IsRtcpPacket(const uint8* packet, size_t length) { |
|
miu
2014/07/16 00:09:32
You could get rid of this method, and roll it into
Alpha Left Google
2014/07/17 01:01:45
0 is a valid SSRC so I would like to keep this met
|
| + DCHECK_GE(length, kMinLengthOfRtcp) << "Invalid RTCP packet"; |
| + if (length < kMinLengthOfRtcp) 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) { |
| + DCHECK_GE(length, kMinLengthOfRtcp) << "Invalid RTCP packet"; |
|
miu
2014/07/16 00:09:32
Don't need this DCHECK if checking big_endian_read
|
| + uint32 ssrc_of_sender; |
| + base::BigEndianReader big_endian_reader( |
| + reinterpret_cast<const char*>(rtcp_buffer), length); |
| + big_endian_reader.Skip(4); // Skip header |
|
miu
2014/07/16 00:09:32
Note: These two method calls on big_endian_reader
Alpha Left Google
2014/07/17 01:01:45
IsRtcpPacket is actually useful because 0 is also
|
| + 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 +102,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 +126,7 @@ void RtcpReceiver::IncomingRtcpPacket(RtcpParser* rtcp_parser) { |
| case kRtcpNotValidCode: |
| case kRtcpReportBlockItemCode: |
| case kRtcpSdesChunkCode: |
| + case kRtcpGenericRtpFeedbackSrReqCode: |
| case kRtcpGenericRtpFeedbackNackItemCode: |
| case kRtcpPayloadSpecificFirItemCode: |
| case kRtcpXrRrtrCode: |
| @@ -145,8 +162,8 @@ 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); |
| + if (handler_) { |
| + handler_->OnReceivedSenderReport(remote_sender_info); |
| } |
| } |
| rtcp_field_type = rtcp_parser->Iterate(); |
| @@ -204,9 +221,9 @@ void RtcpReceiver::HandleReportBlock(const RtcpField* rtcp_field, |
| 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); |
| + if (handler_) { |
| + handler_->OnReceivedDelaySinceLastReport( |
| + rb.last_sender_report, rb.delay_last_sender_report); |
| } |
| } |
| @@ -255,8 +272,8 @@ void RtcpReceiver::HandleRrtr(RtcpParser* rtcp_parser, uint32 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); |
| + if (handler_) { |
| + handler_->OnReceiverReferenceTimeReport(remote_time_report); |
| } |
| } |
| @@ -266,9 +283,8 @@ void RtcpReceiver::HandleDlrr(RtcpParser* rtcp_parser) { |
| // Not to us. |
| return; |
| } |
| - if (rtt_feedback_) { |
| - rtt_feedback_->OnReceivedDelaySinceLastReport( |
| - rtcp_field.dlrr.receivers_ssrc, |
| + if (handler_) { |
| + handler_->OnReceivedDelaySinceLastReport( |
| rtcp_field.dlrr.last_receiver_report, |
| rtcp_field.dlrr.delay_last_receiver_report); |
| } |
| @@ -326,13 +342,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,8 +445,8 @@ void RtcpReceiver::HandleApplicationSpecificCastReceiverLog( |
| receiver_log.push_back(frame_log); |
| } |
| - if (receiver_feedback_ && !receiver_log.empty()) { |
| - receiver_feedback_->OnReceivedReceiverLog(receiver_log); |
| + if (handler_ && !receiver_log.empty()) { |
| + handler_->OnReceivedReceiverLog(receiver_log); |
| } |
| } |
| @@ -502,8 +511,8 @@ void RtcpReceiver::HandlePayloadSpecificCastItem(RtcpParser* rtcp_parser) { |
| &rtcp_field, &cast_message.missing_frames_and_packets_); |
| packet_type = rtcp_parser->Iterate(); |
| } |
| - if (sender_feedback_) { |
| - sender_feedback_->OnReceivedCastFeedback(cast_message); |
| + if (handler_) { |
| + handler_->OnReceivedCastFeedback(cast_message); |
| } |
| } |