| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/rtcp/rtcp_sender.h" | 5 #include "media/cast/rtcp/rtcp_sender.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "media/cast/cast_environment.h" | 11 #include "media/cast/cast_environment.h" |
| 12 #include "media/cast/rtcp/rtcp_utility.h" | 12 #include "media/cast/rtcp/rtcp_utility.h" |
| 13 #include "media/cast/transport/cast_transport_defines.h" | 13 #include "media/cast/transport/cast_transport_defines.h" |
| 14 #include "media/cast/transport/pacing/paced_sender.h" | 14 #include "media/cast/transport/pacing/paced_sender.h" |
| 15 #include "net/base/big_endian.h" | 15 #include "net/base/big_endian.h" |
| 16 | 16 |
| 17 static const size_t kRtcpCastLogHeaderSize = 12; | 17 static const size_t kRtcpCastLogHeaderSize = 12; |
| 18 static const size_t kRtcpSenderFrameLogSize = 4; | 18 static const size_t kRtcpSenderFrameLogSize = 4; |
| 19 static const size_t kRtcpReceiverFrameLogSize = 8; | 19 static const size_t kRtcpReceiverFrameLogSize = 8; |
| 20 static const size_t kRtcpReceiverEventLogSize = 4; | 20 static const size_t kRtcpReceiverEventLogSize = 4; |
| 21 | 21 |
| 22 namespace { | 22 namespace { |
| 23 |
| 24 // Converts a log event type to an integer value. |
| 25 int ConvertEventTypeToWireFormat(const media::cast::CastLoggingEvent& event) { |
| 26 switch (event) { |
| 27 case media::cast::kAudioAckSent: |
| 28 return 1; |
| 29 case media::cast::kAudioPlayoutDelay: |
| 30 return 2; |
| 31 case media::cast::kAudioFrameDecoded: |
| 32 return 3; |
| 33 case media::cast::kAudioPacketReceived: |
| 34 return 4; |
| 35 case media::cast::kVideoAckSent: |
| 36 return 5; |
| 37 case media::cast::kVideoFrameDecoded: |
| 38 return 6; |
| 39 case media::cast::kVideoRenderDelay: |
| 40 return 7; |
| 41 case media::cast::kVideoPacketReceived: |
| 42 return 8; |
| 43 case media::cast::kDuplicatePacketReceived: |
| 44 return 9; |
| 45 default: |
| 46 return 0; // Not an interesting event. |
| 47 } |
| 48 } |
| 49 |
| 23 uint16 MergeEventTypeAndTimestampForWireFormat( | 50 uint16 MergeEventTypeAndTimestampForWireFormat( |
| 24 const media::cast::CastLoggingEvent& event, | 51 const media::cast::CastLoggingEvent& event, |
| 25 const base::TimeDelta& time_delta) { | 52 const base::TimeDelta& time_delta) { |
| 26 int64 time_delta_ms = time_delta.InMilliseconds(); | 53 int64 time_delta_ms = time_delta.InMilliseconds(); |
| 27 // Max delta is 4096 milliseconds. | 54 // Max delta is 4096 milliseconds. |
| 28 DCHECK_GE(GG_INT64_C(0xfff), time_delta_ms); | 55 DCHECK_GE(GG_INT64_C(0xfff), time_delta_ms); |
| 29 | 56 |
| 30 uint16 event_type_and_timestamp_delta = | 57 uint16 event_type_and_timestamp_delta = |
| 31 static_cast<uint16>(time_delta_ms & 0xfff); | 58 static_cast<uint16>(time_delta_ms & 0xfff); |
| 32 | 59 |
| 33 uint16 event_type = 0; | 60 uint16 event_type = ConvertEventTypeToWireFormat(event); |
| 34 switch (event) { | 61 DCHECK(event_type); |
| 35 case media::cast::kAudioAckSent: | |
| 36 event_type = 1; | |
| 37 break; | |
| 38 case media::cast::kAudioPlayoutDelay: | |
| 39 event_type = 2; | |
| 40 break; | |
| 41 case media::cast::kAudioFrameDecoded: | |
| 42 event_type = 3; | |
| 43 break; | |
| 44 case media::cast::kAudioPacketReceived: | |
| 45 event_type = 4; | |
| 46 break; | |
| 47 case media::cast::kVideoAckSent: | |
| 48 event_type = 5; | |
| 49 break; | |
| 50 case media::cast::kVideoFrameDecoded: | |
| 51 event_type = 6; | |
| 52 break; | |
| 53 case media::cast::kVideoRenderDelay: | |
| 54 event_type = 7; | |
| 55 break; | |
| 56 case media::cast::kVideoPacketReceived: | |
| 57 event_type = 8; | |
| 58 break; | |
| 59 case media::cast::kDuplicatePacketReceived: | |
| 60 event_type = 9; | |
| 61 break; | |
| 62 default: | |
| 63 NOTREACHED(); | |
| 64 } | |
| 65 DCHECK(!(event_type & 0xfff0)); | 62 DCHECK(!(event_type & 0xfff0)); |
| 66 return (event_type << 12) + event_type_and_timestamp_delta; | 63 return (event_type << 12) + event_type_and_timestamp_delta; |
| 67 } | 64 } |
| 68 | 65 |
| 69 bool ScanRtcpReceiverLogMessage( | 66 bool ScanRtcpReceiverLogMessage( |
| 70 const media::cast::RtcpReceiverLogMessage& receiver_log_message, | 67 const media::cast::RtcpReceiverLogMessage& receiver_log_message, |
| 71 size_t start_size, | 68 size_t start_size, |
| 72 size_t* number_of_frames, | 69 size_t* number_of_frames, |
| 73 size_t* total_number_of_messages_to_send, | 70 size_t* total_number_of_messages_to_send, |
| 74 size_t* rtcp_log_size) { | 71 size_t* rtcp_log_size) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 const std::string& c_name) | 137 const std::string& c_name) |
| 141 : ssrc_(sending_ssrc), | 138 : ssrc_(sending_ssrc), |
| 142 c_name_(c_name), | 139 c_name_(c_name), |
| 143 transport_(outgoing_transport), | 140 transport_(outgoing_transport), |
| 144 cast_environment_(cast_environment) { | 141 cast_environment_(cast_environment) { |
| 145 DCHECK_LT(c_name_.length(), kRtcpCnameSize) << "Invalid config"; | 142 DCHECK_LT(c_name_.length(), kRtcpCnameSize) << "Invalid config"; |
| 146 } | 143 } |
| 147 | 144 |
| 148 RtcpSender::~RtcpSender() {} | 145 RtcpSender::~RtcpSender() {} |
| 149 | 146 |
| 147 // static |
| 148 bool RtcpSender::IsReceiverEvent(const media::cast::CastLoggingEvent& event) { |
| 149 return ConvertEventTypeToWireFormat(event) != 0; |
| 150 } |
| 151 |
| 150 void RtcpSender::SendRtcpFromRtpReceiver( | 152 void RtcpSender::SendRtcpFromRtpReceiver( |
| 151 uint32 packet_type_flags, | 153 uint32 packet_type_flags, |
| 152 const transport::RtcpReportBlock* report_block, | 154 const transport::RtcpReportBlock* report_block, |
| 153 const RtcpReceiverReferenceTimeReport* rrtr, | 155 const RtcpReceiverReferenceTimeReport* rrtr, |
| 154 const RtcpCastMessage* cast_message, | 156 const RtcpCastMessage* cast_message, |
| 155 RtcpReceiverLogMessage* receiver_log) { | 157 RtcpReceiverLogMessage* receiver_log) { |
| 156 if (packet_type_flags & kRtcpSr || | 158 if (packet_type_flags & kRtcpSr || |
| 157 packet_type_flags & kRtcpDlrr || | 159 packet_type_flags & kRtcpDlrr || |
| 158 packet_type_flags & kRtcpSenderLog) { | 160 packet_type_flags & kRtcpSenderLog) { |
| 159 NOTREACHED() << "Invalid argument"; | 161 NOTREACHED() << "Invalid argument"; |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 662 if (frame_log_messages.event_log_messages_.empty()) { | 664 if (frame_log_messages.event_log_messages_.empty()) { |
| 663 // We sent all messages on this frame; pop the frame header. | 665 // We sent all messages on this frame; pop the frame header. |
| 664 receiver_log_message->pop_front(); | 666 receiver_log_message->pop_front(); |
| 665 } | 667 } |
| 666 } | 668 } |
| 667 DCHECK_EQ(total_number_of_messages_to_send, 0); | 669 DCHECK_EQ(total_number_of_messages_to_send, 0); |
| 668 } | 670 } |
| 669 | 671 |
| 670 } // namespace cast | 672 } // namespace cast |
| 671 } // namespace media | 673 } // namespace media |
| OLD | NEW |