| 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 |