| 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_receiver.h" | 5 #include "media/cast/rtcp/rtcp_receiver.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "media/cast/rtcp/rtcp_utility.h" | 8 #include "media/cast/rtcp/rtcp_utility.h" |
| 9 #include "media/cast/transport/cast_transport_defines.h" |
| 9 | 10 |
| 10 namespace { | 11 namespace { |
| 11 | 12 |
| 12 media::cast::CastLoggingEvent TranslateToLogEventFromWireFormat(uint8 event) { | 13 media::cast::CastLoggingEvent TranslateToLogEventFromWireFormat(uint8 event) { |
| 13 switch (event) { | 14 switch (event) { |
| 14 case 1: | 15 case 1: |
| 15 return media::cast::kAckSent; | 16 return media::cast::kAckSent; |
| 16 case 2: | 17 case 2: |
| 17 return media::cast::kAudioPlayoutDelay; | 18 return media::cast::kAudioPlayoutDelay; |
| 18 case 3: | 19 case 3: |
| 19 return media::cast::kAudioFrameDecoded; | 20 return media::cast::kAudioFrameDecoded; |
| 20 case 4: | 21 case 4: |
| 21 return media::cast::kVideoFrameDecoded; | 22 return media::cast::kVideoFrameDecoded; |
| 22 case 5: | 23 case 5: |
| 23 return media::cast::kVideoRenderDelay; | 24 return media::cast::kVideoRenderDelay; |
| 24 case 6: | 25 case 6: |
| 25 return media::cast::kPacketReceived; | 26 return media::cast::kPacketReceived; |
| 26 default: | 27 default: |
| 27 // If the sender adds new log messages we will end up here until we add | 28 // If the sender adds new log messages we will end up here until we add |
| 28 // the new messages in the receiver. | 29 // the new messages in the receiver. |
| 29 VLOG(1) << "Unexpected log message received: " << static_cast<int>(event); | 30 VLOG(1) << "Unexpected log message received: " << static_cast<int>(event); |
| 30 NOTREACHED(); | 31 NOTREACHED(); |
| 31 return media::cast::kUnknown; | 32 return media::cast::kUnknown; |
| 32 } | 33 } |
| 33 } | 34 } |
| 34 | 35 |
| 35 media::cast::RtcpSenderFrameStatus TranslateToFrameStatusFromWireFormat( | 36 media::cast::transport::RtcpSenderFrameStatus |
| 36 uint8 status) { | 37 TranslateToFrameStatusFromWireFormat(uint8 status) { |
| 37 switch (status) { | 38 switch (status) { |
| 38 case 0: | 39 case 0: |
| 39 return media::cast::kRtcpSenderFrameStatusUnknown; | 40 return media::cast::transport::kRtcpSenderFrameStatusUnknown; |
| 40 case 1: | 41 case 1: |
| 41 return media::cast::kRtcpSenderFrameStatusDroppedByEncoder; | 42 return media::cast::transport::kRtcpSenderFrameStatusDroppedByEncoder; |
| 42 case 2: | 43 case 2: |
| 43 return media::cast::kRtcpSenderFrameStatusDroppedByFlowControl; | 44 return media::cast::transport::kRtcpSenderFrameStatusDroppedByFlowControl; |
| 44 case 3: | 45 case 3: |
| 45 return media::cast::kRtcpSenderFrameStatusSentToNetwork; | 46 return media::cast::transport::kRtcpSenderFrameStatusSentToNetwork; |
| 46 default: | 47 default: |
| 47 // If the sender adds new log messages we will end up here until we add | 48 // If the sender adds new log messages we will end up here until we add |
| 48 // the new messages in the receiver. | 49 // the new messages in the receiver. |
| 49 NOTREACHED(); | 50 NOTREACHED(); |
| 50 VLOG(1) << "Unexpected status received: " << static_cast<int>(status); | 51 VLOG(1) << "Unexpected status received: " << static_cast<int>(status); |
| 51 return media::cast::kRtcpSenderFrameStatusUnknown; | 52 return media::cast::transport::kRtcpSenderFrameStatusUnknown; |
| 52 } | 53 } |
| 53 } | 54 } |
| 54 | 55 |
| 55 } // namespace | 56 } // namespace |
| 56 | 57 |
| 57 namespace media { | 58 namespace media { |
| 58 namespace cast { | 59 namespace cast { |
| 59 | 60 |
| 60 RtcpReceiver::RtcpReceiver(scoped_refptr<CastEnvironment> cast_environment, | 61 RtcpReceiver::RtcpReceiver(scoped_refptr<CastEnvironment> cast_environment, |
| 61 RtcpSenderFeedback* sender_feedback, | 62 RtcpSenderFeedback* sender_feedback, |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 const RtcpField& rtcp_field = rtcp_parser->Field(); | 148 const RtcpField& rtcp_field = rtcp_parser->Field(); |
| 148 | 149 |
| 149 DCHECK(rtcp_field_type == kRtcpSrCode) << "Invalid state"; | 150 DCHECK(rtcp_field_type == kRtcpSrCode) << "Invalid state"; |
| 150 | 151 |
| 151 // Synchronization source identifier for the originator of this SR packet. | 152 // Synchronization source identifier for the originator of this SR packet. |
| 152 uint32 remote_ssrc = rtcp_field.sender_report.sender_ssrc; | 153 uint32 remote_ssrc = rtcp_field.sender_report.sender_ssrc; |
| 153 | 154 |
| 154 VLOG(1) << "Cast RTCP received SR from SSRC " << remote_ssrc; | 155 VLOG(1) << "Cast RTCP received SR from SSRC " << remote_ssrc; |
| 155 | 156 |
| 156 if (remote_ssrc_ == remote_ssrc) { | 157 if (remote_ssrc_ == remote_ssrc) { |
| 157 RtcpSenderInfo remote_sender_info; | 158 transport::RtcpSenderInfo remote_sender_info; |
| 158 remote_sender_info.ntp_seconds = | 159 remote_sender_info.ntp_seconds = |
| 159 rtcp_field.sender_report.ntp_most_significant; | 160 rtcp_field.sender_report.ntp_most_significant; |
| 160 remote_sender_info.ntp_fraction = | 161 remote_sender_info.ntp_fraction = |
| 161 rtcp_field.sender_report.ntp_least_significant; | 162 rtcp_field.sender_report.ntp_least_significant; |
| 162 remote_sender_info.rtp_timestamp = | 163 remote_sender_info.rtp_timestamp = |
| 163 rtcp_field.sender_report.rtp_timestamp; | 164 rtcp_field.sender_report.rtp_timestamp; |
| 164 remote_sender_info.send_packet_count = | 165 remote_sender_info.send_packet_count = |
| 165 rtcp_field.sender_report.sender_packet_count; | 166 rtcp_field.sender_report.sender_packet_count; |
| 166 remote_sender_info.send_octet_count = | 167 remote_sender_info.send_octet_count = |
| 167 rtcp_field.sender_report.sender_octet_count; | 168 rtcp_field.sender_report.sender_octet_count; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 // This block is not for us ignore it. | 212 // This block is not for us ignore it. |
| 212 return; | 213 return; |
| 213 } | 214 } |
| 214 VLOG(1) << "Cast RTCP received RB from SSRC " << remote_ssrc; | 215 VLOG(1) << "Cast RTCP received RB from SSRC " << remote_ssrc; |
| 215 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); | 216 base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
| 216 cast_environment_->Logging()->InsertGenericEvent(now, kPacketLoss, | 217 cast_environment_->Logging()->InsertGenericEvent(now, kPacketLoss, |
| 217 rb.fraction_lost); | 218 rb.fraction_lost); |
| 218 cast_environment_->Logging()->InsertGenericEvent(now, kJitterMs, | 219 cast_environment_->Logging()->InsertGenericEvent(now, kJitterMs, |
| 219 rb.jitter); | 220 rb.jitter); |
| 220 | 221 |
| 221 RtcpReportBlock report_block; | 222 transport::RtcpReportBlock report_block; |
| 222 report_block.remote_ssrc = remote_ssrc; | 223 report_block.remote_ssrc = remote_ssrc; |
| 223 report_block.media_ssrc = rb.ssrc; | 224 report_block.media_ssrc = rb.ssrc; |
| 224 report_block.fraction_lost = rb.fraction_lost; | 225 report_block.fraction_lost = rb.fraction_lost; |
| 225 report_block.cumulative_lost = rb.cumulative_number_of_packets_lost; | 226 report_block.cumulative_lost = rb.cumulative_number_of_packets_lost; |
| 226 report_block.extended_high_sequence_number = | 227 report_block.extended_high_sequence_number = |
| 227 rb.extended_highest_sequence_number; | 228 rb.extended_highest_sequence_number; |
| 228 report_block.jitter = rb.jitter; | 229 report_block.jitter = rb.jitter; |
| 229 report_block.last_sr = rb.last_sender_report; | 230 report_block.last_sr = rb.last_sender_report; |
| 230 report_block.delay_since_last_sr = rb.delay_last_sender_report; | 231 report_block.delay_since_last_sr = rb.delay_last_sender_report; |
| 231 | 232 |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 uint32 remote_ssrc = rtcp_field.cast_sender_log.sender_ssrc; | 489 uint32 remote_ssrc = rtcp_field.cast_sender_log.sender_ssrc; |
| 489 | 490 |
| 490 if (remote_ssrc_ != remote_ssrc) { | 491 if (remote_ssrc_ != remote_ssrc) { |
| 491 RtcpFieldTypes field_type; | 492 RtcpFieldTypes field_type; |
| 492 // Message not to us. Iterate until we have passed this message. | 493 // Message not to us. Iterate until we have passed this message. |
| 493 do { | 494 do { |
| 494 field_type = rtcp_parser->Iterate(); | 495 field_type = rtcp_parser->Iterate(); |
| 495 } while (field_type == kRtcpApplicationSpecificCastSenderLogCode); | 496 } while (field_type == kRtcpApplicationSpecificCastSenderLogCode); |
| 496 return; | 497 return; |
| 497 } | 498 } |
| 498 RtcpSenderLogMessage sender_log; | 499 transport::RtcpSenderLogMessage sender_log; |
| 499 | 500 |
| 500 RtcpFieldTypes field_type = rtcp_parser->Iterate(); | 501 RtcpFieldTypes field_type = rtcp_parser->Iterate(); |
| 501 while (field_type == kRtcpApplicationSpecificCastSenderLogCode) { | 502 while (field_type == kRtcpApplicationSpecificCastSenderLogCode) { |
| 502 const RtcpField& rtcp_field = rtcp_parser->Field(); | 503 const RtcpField& rtcp_field = rtcp_parser->Field(); |
| 503 RtcpSenderFrameLogMessage frame_log; | 504 transport::RtcpSenderFrameLogMessage frame_log; |
| 504 frame_log.frame_status = | 505 frame_log.frame_status = |
| 505 TranslateToFrameStatusFromWireFormat(rtcp_field.cast_sender_log.status); | 506 TranslateToFrameStatusFromWireFormat(rtcp_field.cast_sender_log.status); |
| 506 frame_log.rtp_timestamp = rtcp_field.cast_sender_log.rtp_timestamp; | 507 frame_log.rtp_timestamp = rtcp_field.cast_sender_log.rtp_timestamp; |
| 507 sender_log.push_back(frame_log); | 508 sender_log.push_back(frame_log); |
| 508 field_type = rtcp_parser->Iterate(); | 509 field_type = rtcp_parser->Iterate(); |
| 509 } | 510 } |
| 510 if (receiver_feedback_) { | 511 if (receiver_feedback_) { |
| 511 receiver_feedback_->OnReceivedSenderLog(sender_log); | 512 receiver_feedback_->OnReceivedSenderLog(sender_log); |
| 512 } | 513 } |
| 513 } | 514 } |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 | 578 |
| 578 void RtcpReceiver::HandleFIRItem(const RtcpField* rtcp_field) { | 579 void RtcpReceiver::HandleFIRItem(const RtcpField* rtcp_field) { |
| 579 // Is it our sender that is requested to generate a new keyframe. | 580 // Is it our sender that is requested to generate a new keyframe. |
| 580 if (ssrc_ != rtcp_field->fir_item.ssrc) return; | 581 if (ssrc_ != rtcp_field->fir_item.ssrc) return; |
| 581 | 582 |
| 582 VLOG(1) << "Cast RTCP received FIR on our SSRC " << ssrc_; | 583 VLOG(1) << "Cast RTCP received FIR on our SSRC " << ssrc_; |
| 583 } | 584 } |
| 584 | 585 |
| 585 } // namespace cast | 586 } // namespace cast |
| 586 } // namespace media | 587 } // namespace media |
| OLD | NEW |