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.h" | 5 #include "media/cast/rtcp/rtcp.h" |
6 | 6 |
7 #include "base/big_endian.h" | 7 #include "base/big_endian.h" |
8 #include "base/rand_util.h" | 8 #include "base/rand_util.h" |
9 #include "media/cast/cast_config.h" | 9 #include "media/cast/cast_config.h" |
10 #include "media/cast/cast_defines.h" | 10 #include "media/cast/cast_defines.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 rtcp_->OnReceivedNtp(remote_time_report.ntp_seconds, | 61 rtcp_->OnReceivedNtp(remote_time_report.ntp_seconds, |
62 remote_time_report.ntp_fraction); | 62 remote_time_report.ntp_fraction); |
63 } | 63 } |
64 | 64 |
65 virtual void OnReceivedSendReportRequest() OVERRIDE { | 65 virtual void OnReceivedSendReportRequest() OVERRIDE { |
66 rtcp_->OnReceivedSendReportRequest(); | 66 rtcp_->OnReceivedSendReportRequest(); |
67 } | 67 } |
68 | 68 |
69 virtual void OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) | 69 virtual void OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) |
70 OVERRIDE { | 70 OVERRIDE { |
71 // Add received log messages into our log system. | 71 rtcp_->OnReceivedReceiverLog(receiver_log); |
72 RtcpReceiverLogMessage::const_iterator it = receiver_log.begin(); | |
73 | |
74 for (; it != receiver_log.end(); ++it) { | |
75 uint32 rtp_timestamp = it->rtp_timestamp_; | |
76 | |
77 RtcpReceiverEventLogMessages::const_iterator event_it = | |
78 it->event_log_messages_.begin(); | |
79 for (; event_it != it->event_log_messages_.end(); ++event_it) { | |
80 switch (event_it->type) { | |
81 case kAudioPacketReceived: | |
82 case kVideoPacketReceived: | |
83 case kDuplicateAudioPacketReceived: | |
84 case kDuplicateVideoPacketReceived: | |
85 cast_environment_->Logging()->InsertPacketEvent( | |
86 event_it->event_timestamp, event_it->type, rtp_timestamp, | |
87 kFrameIdUnknown, event_it->packet_id, 0, 0); | |
88 break; | |
89 case kAudioAckSent: | |
90 case kVideoAckSent: | |
91 case kAudioFrameDecoded: | |
92 case kVideoFrameDecoded: | |
93 cast_environment_->Logging()->InsertFrameEvent( | |
94 event_it->event_timestamp, event_it->type, rtp_timestamp, | |
95 kFrameIdUnknown); | |
96 break; | |
97 case kAudioPlayoutDelay: | |
98 case kVideoRenderDelay: | |
99 cast_environment_->Logging()->InsertFrameEventWithDelay( | |
100 event_it->event_timestamp, event_it->type, rtp_timestamp, | |
101 kFrameIdUnknown, event_it->delay_delta); | |
102 break; | |
103 default: | |
104 VLOG(2) << "Received log message via RTCP that we did not expect: " | |
105 << static_cast<int>(event_it->type); | |
106 break; | |
107 } | |
108 } | |
109 } | |
110 } | 72 } |
111 | 73 |
112 virtual void OnReceivedSenderLog( | 74 virtual void OnReceivedSenderLog( |
113 const transport::RtcpSenderLogMessage& sender_log) OVERRIDE { | 75 const transport::RtcpSenderLogMessage& sender_log) OVERRIDE { |
114 transport::RtcpSenderLogMessage::const_iterator it = sender_log.begin(); | 76 transport::RtcpSenderLogMessage::const_iterator it = sender_log.begin(); |
115 | 77 |
116 for (; it != sender_log.end(); ++it) { | 78 for (; it != sender_log.end(); ++it) { |
117 uint32 rtp_timestamp = it->rtp_timestamp; | 79 uint32 rtp_timestamp = it->rtp_timestamp; |
118 CastLoggingEvent log_event = kUnknown; | 80 CastLoggingEvent log_event = UNKNOWN; |
119 | 81 |
120 // These events are provided to know the status of frames that never | 82 // These events are provided to know the status of frames that never |
121 // reached the receiver. The timing information for these events are not | 83 // reached the receiver. The timing information for these events are not |
122 // relevant and is not sent over the wire. | 84 // relevant and is not sent over the wire. |
123 switch (it->frame_status) { | 85 switch (it->frame_status) { |
124 case transport::kRtcpSenderFrameStatusDroppedByFlowControl: | 86 case transport::kRtcpSenderFrameStatusDroppedByFlowControl: |
125 // A frame that have been dropped by the flow control would have | 87 // A frame that have been dropped by the flow control would have |
126 // kVideoFrameCaptureBegin as its last event in the log. | 88 // FRAME_CAPTURE_BEGIN as its last event in the log. |
127 log_event = kVideoFrameCaptureBegin; | 89 log_event = FRAME_CAPTURE_BEGIN; |
128 break; | |
129 case transport::kRtcpSenderFrameStatusDroppedByEncoder: | |
130 // A frame that have been dropped by the encoder would have | |
131 // kVideoFrameSentToEncoder as its last event in the log. | |
132 log_event = kVideoFrameSentToEncoder; | |
133 break; | 90 break; |
134 case transport::kRtcpSenderFrameStatusSentToNetwork: | 91 case transport::kRtcpSenderFrameStatusSentToNetwork: |
135 // A frame that have be encoded is always sent to the network. We | 92 // A frame that have be encoded is always sent to the network. We |
136 // do not add a new log entry for this. | 93 // do not add a new log entry for this. |
137 log_event = kVideoFrameEncoded; | 94 log_event = FRAME_ENCODED; |
138 break; | 95 break; |
139 default: | 96 default: |
140 continue; | 97 continue; |
141 } | 98 } |
142 // TODO(pwestin): how do we handle the truncated rtp_timestamp? | 99 // TODO(pwestin): how do we handle the truncated rtp_timestamp? |
143 // Add received log messages into our log system. | 100 // Add received log messages into our log system. |
144 // TODO(pwestin): how do we handle the time? we don't care about it but | 101 // TODO(pwestin): how do we handle the time? we don't care about it but |
145 // we need to send in one. | 102 // we need to send in one. |
146 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 103 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
147 cast_environment_->Logging()->InsertFrameEvent( | 104 cast_environment_->Logging()->InsertFrameEvent( |
148 now, log_event, rtp_timestamp, kFrameIdUnknown); | 105 now, log_event, VIDEO_EVENT, rtp_timestamp, kFrameIdUnknown); |
149 } | 106 } |
150 } | 107 } |
151 | 108 |
152 private: | 109 private: |
153 Rtcp* rtcp_; | 110 Rtcp* rtcp_; |
154 scoped_refptr<CastEnvironment> cast_environment_; | 111 scoped_refptr<CastEnvironment> cast_environment_; |
155 }; | 112 }; |
156 | 113 |
157 Rtcp::Rtcp(scoped_refptr<CastEnvironment> cast_environment, | 114 Rtcp::Rtcp(scoped_refptr<CastEnvironment> cast_environment, |
158 RtcpSenderFeedback* sender_feedback, | 115 RtcpSenderFeedback* sender_feedback, |
159 transport::CastTransportSender* const transport_sender, | 116 transport::CastTransportSender* const transport_sender, |
160 transport::PacedPacketSender* paced_packet_sender, | 117 transport::PacedPacketSender* paced_packet_sender, |
161 RtpReceiverStatistics* rtp_receiver_statistics, RtcpMode rtcp_mode, | 118 RtpReceiverStatistics* rtp_receiver_statistics, RtcpMode rtcp_mode, |
162 const base::TimeDelta& rtcp_interval, uint32 local_ssrc, | 119 const base::TimeDelta& rtcp_interval, uint32 local_ssrc, |
163 uint32 remote_ssrc, const std::string& c_name) | 120 uint32 remote_ssrc, const std::string& c_name, bool is_audio) |
164 : cast_environment_(cast_environment), | 121 : cast_environment_(cast_environment), |
165 transport_sender_(transport_sender), | 122 transport_sender_(transport_sender), |
166 rtcp_interval_(rtcp_interval), | 123 rtcp_interval_(rtcp_interval), |
167 rtcp_mode_(rtcp_mode), | 124 rtcp_mode_(rtcp_mode), |
168 local_ssrc_(local_ssrc), | 125 local_ssrc_(local_ssrc), |
169 remote_ssrc_(remote_ssrc), | 126 remote_ssrc_(remote_ssrc), |
170 c_name_(c_name), | 127 c_name_(c_name), |
171 rtp_receiver_statistics_(rtp_receiver_statistics), | 128 rtp_receiver_statistics_(rtp_receiver_statistics), |
172 rtt_feedback_(new LocalRtcpRttFeedback(this)), | 129 rtt_feedback_(new LocalRtcpRttFeedback(this)), |
173 receiver_feedback_(new LocalRtcpReceiverFeedback(this, cast_environment)), | 130 receiver_feedback_(new LocalRtcpReceiverFeedback(this, cast_environment)), |
174 rtcp_sender_(new RtcpSender(cast_environment, paced_packet_sender, | 131 rtcp_sender_(new RtcpSender(cast_environment, paced_packet_sender, |
175 local_ssrc, c_name)), | 132 local_ssrc, c_name)), |
176 last_report_received_(0), | 133 last_report_received_(0), |
177 last_received_rtp_timestamp_(0), | 134 last_received_rtp_timestamp_(0), |
178 last_received_ntp_seconds_(0), | 135 last_received_ntp_seconds_(0), |
179 last_received_ntp_fraction_(0), | 136 last_received_ntp_fraction_(0), |
180 min_rtt_(base::TimeDelta::FromMilliseconds(kMaxRttMs)), | 137 min_rtt_(base::TimeDelta::FromMilliseconds(kMaxRttMs)), |
181 number_of_rtt_in_avg_(0) { | 138 number_of_rtt_in_avg_(0), |
| 139 is_audio_(is_audio) { |
182 rtcp_receiver_.reset(new RtcpReceiver(cast_environment, sender_feedback, | 140 rtcp_receiver_.reset(new RtcpReceiver(cast_environment, sender_feedback, |
183 receiver_feedback_.get(), | 141 receiver_feedback_.get(), |
184 rtt_feedback_.get(), local_ssrc)); | 142 rtt_feedback_.get(), local_ssrc)); |
185 rtcp_receiver_->SetRemoteSSRC(remote_ssrc); | 143 rtcp_receiver_->SetRemoteSSRC(remote_ssrc); |
186 } | 144 } |
187 | 145 |
188 Rtcp::~Rtcp() {} | 146 Rtcp::~Rtcp() {} |
189 | 147 |
190 // static | 148 // static |
191 bool Rtcp::IsRtcpPacket(const uint8* packet, size_t length) { | 149 bool Rtcp::IsRtcpPacket(const uint8* packet, size_t length) { |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 | 428 |
471 void Rtcp::UpdateNextTimeToSendRtcp() { | 429 void Rtcp::UpdateNextTimeToSendRtcp() { |
472 int random = base::RandInt(0, 999); | 430 int random = base::RandInt(0, 999); |
473 base::TimeDelta time_to_next = | 431 base::TimeDelta time_to_next = |
474 (rtcp_interval_ / 2) + (rtcp_interval_ * random / 1000); | 432 (rtcp_interval_ / 2) + (rtcp_interval_ * random / 1000); |
475 | 433 |
476 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 434 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
477 next_time_to_send_rtcp_ = now + time_to_next; | 435 next_time_to_send_rtcp_ = now + time_to_next; |
478 } | 436 } |
479 | 437 |
| 438 void Rtcp::OnReceivedReceiverLog(const RtcpReceiverLogMessage& receiver_log) { |
| 439 // Add received log messages into our log system. |
| 440 RtcpReceiverLogMessage::const_iterator it = receiver_log.begin(); |
| 441 EventMediaType media_type = is_audio_ ? AUDIO_EVENT : VIDEO_EVENT; |
| 442 for (; it != receiver_log.end(); ++it) { |
| 443 uint32 rtp_timestamp = it->rtp_timestamp_; |
| 444 |
| 445 RtcpReceiverEventLogMessages::const_iterator event_it = |
| 446 it->event_log_messages_.begin(); |
| 447 for (; event_it != it->event_log_messages_.end(); ++event_it) { |
| 448 switch (event_it->type) { |
| 449 case PACKET_RECEIVED: |
| 450 cast_environment_->Logging()->InsertPacketEvent( |
| 451 event_it->event_timestamp, event_it->type, |
| 452 media_type, rtp_timestamp, |
| 453 kFrameIdUnknown, event_it->packet_id, 0, 0); |
| 454 break; |
| 455 case FRAME_ACK_SENT: |
| 456 case FRAME_DECODED: |
| 457 cast_environment_->Logging()->InsertFrameEvent( |
| 458 event_it->event_timestamp, event_it->type, media_type, |
| 459 rtp_timestamp, kFrameIdUnknown); |
| 460 break; |
| 461 case FRAME_PLAYOUT: |
| 462 cast_environment_->Logging()->InsertFrameEventWithDelay( |
| 463 event_it->event_timestamp, event_it->type, media_type, |
| 464 rtp_timestamp, kFrameIdUnknown, event_it->delay_delta); |
| 465 break; |
| 466 default: |
| 467 VLOG(2) << "Received log message via RTCP that we did not expect: " |
| 468 << static_cast<int>(event_it->type); |
| 469 break; |
| 470 } |
| 471 } |
| 472 } |
| 473 } |
| 474 |
480 } // namespace cast | 475 } // namespace cast |
481 } // namespace media | 476 } // namespace media |
OLD | NEW |