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 |