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 |