OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/voice_engine/channel.h" | 11 #include "webrtc/voice_engine/channel.h" |
12 | 12 |
13 #include <algorithm> | 13 #include <algorithm> |
14 #include <utility> | 14 #include <utility> |
15 | 15 |
16 #include "webrtc/base/checks.h" | 16 #include "webrtc/base/checks.h" |
17 #include "webrtc/base/criticalsection.h" | 17 #include "webrtc/base/criticalsection.h" |
18 #include "webrtc/base/format_macros.h" | 18 #include "webrtc/base/format_macros.h" |
19 #include "webrtc/base/logging.h" | 19 #include "webrtc/base/logging.h" |
20 #include "webrtc/base/thread_checker.h" | 20 #include "webrtc/base/thread_checker.h" |
21 #include "webrtc/base/timeutils.h" | 21 #include "webrtc/base/timeutils.h" |
22 #include "webrtc/call/rtc_event_log.h" | |
23 #include "webrtc/common.h" | 22 #include "webrtc/common.h" |
24 #include "webrtc/config.h" | 23 #include "webrtc/config.h" |
25 #include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h" | 24 #include "webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.h" |
26 #include "webrtc/modules/audio_device/include/audio_device.h" | 25 #include "webrtc/modules/audio_device/include/audio_device.h" |
27 #include "webrtc/modules/audio_processing/include/audio_processing.h" | 26 #include "webrtc/modules/audio_processing/include/audio_processing.h" |
28 #include "webrtc/modules/include/module_common_types.h" | 27 #include "webrtc/modules/include/module_common_types.h" |
29 #include "webrtc/modules/pacing/packet_router.h" | 28 #include "webrtc/modules/pacing/packet_router.h" |
30 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" | 29 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" |
31 #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" | 30 #include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h" |
32 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" | 31 #include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h" |
(...skipping 19 matching lines...) Expand all Loading... |
52 const CodecInst& ci) { | 51 const CodecInst& ci) { |
53 const int result = (*acm)->RegisterReceiveCodec( | 52 const int result = (*acm)->RegisterReceiveCodec( |
54 ci, [&] { return rac->RentIsacDecoder(ci.plfreq); }); | 53 ci, [&] { return rac->RentIsacDecoder(ci.plfreq); }); |
55 return result == 0; | 54 return result == 0; |
56 } | 55 } |
57 | 56 |
58 } // namespace | 57 } // namespace |
59 | 58 |
60 const int kTelephoneEventAttenuationdB = 10; | 59 const int kTelephoneEventAttenuationdB = 10; |
61 | 60 |
62 class RtcEventLogProxy final : public webrtc::RtcEventLog { | |
63 public: | |
64 RtcEventLogProxy() : event_log_(nullptr) {} | |
65 | |
66 bool StartLogging(const std::string& file_name, | |
67 int64_t max_size_bytes) override { | |
68 RTC_NOTREACHED(); | |
69 return false; | |
70 } | |
71 | |
72 bool StartLogging(rtc::PlatformFile log_file, | |
73 int64_t max_size_bytes) override { | |
74 RTC_NOTREACHED(); | |
75 return false; | |
76 } | |
77 | |
78 void StopLogging() override { RTC_NOTREACHED(); } | |
79 | |
80 void LogVideoReceiveStreamConfig( | |
81 const webrtc::VideoReceiveStream::Config& config) override { | |
82 rtc::CritScope lock(&crit_); | |
83 if (event_log_) { | |
84 event_log_->LogVideoReceiveStreamConfig(config); | |
85 } | |
86 } | |
87 | |
88 void LogVideoSendStreamConfig( | |
89 const webrtc::VideoSendStream::Config& config) override { | |
90 rtc::CritScope lock(&crit_); | |
91 if (event_log_) { | |
92 event_log_->LogVideoSendStreamConfig(config); | |
93 } | |
94 } | |
95 | |
96 void LogRtpHeader(webrtc::PacketDirection direction, | |
97 webrtc::MediaType media_type, | |
98 const uint8_t* header, | |
99 size_t packet_length) override { | |
100 rtc::CritScope lock(&crit_); | |
101 if (event_log_) { | |
102 event_log_->LogRtpHeader(direction, media_type, header, packet_length); | |
103 } | |
104 } | |
105 | |
106 void LogRtcpPacket(webrtc::PacketDirection direction, | |
107 webrtc::MediaType media_type, | |
108 const uint8_t* packet, | |
109 size_t length) override { | |
110 rtc::CritScope lock(&crit_); | |
111 if (event_log_) { | |
112 event_log_->LogRtcpPacket(direction, media_type, packet, length); | |
113 } | |
114 } | |
115 | |
116 void LogAudioPlayout(uint32_t ssrc) override { | |
117 rtc::CritScope lock(&crit_); | |
118 if (event_log_) { | |
119 event_log_->LogAudioPlayout(ssrc); | |
120 } | |
121 } | |
122 | |
123 void LogBwePacketLossEvent(int32_t bitrate, | |
124 uint8_t fraction_loss, | |
125 int32_t total_packets) override { | |
126 rtc::CritScope lock(&crit_); | |
127 if (event_log_) { | |
128 event_log_->LogBwePacketLossEvent(bitrate, fraction_loss, total_packets); | |
129 } | |
130 } | |
131 | |
132 void SetEventLog(RtcEventLog* event_log) { | |
133 rtc::CritScope lock(&crit_); | |
134 event_log_ = event_log; | |
135 } | |
136 | |
137 private: | |
138 rtc::CriticalSection crit_; | |
139 RtcEventLog* event_log_ GUARDED_BY(crit_); | |
140 RTC_DISALLOW_COPY_AND_ASSIGN(RtcEventLogProxy); | |
141 }; | |
142 | |
143 class TransportFeedbackProxy : public TransportFeedbackObserver { | 61 class TransportFeedbackProxy : public TransportFeedbackObserver { |
144 public: | 62 public: |
145 TransportFeedbackProxy() : feedback_observer_(nullptr) { | 63 TransportFeedbackProxy() : feedback_observer_(nullptr) { |
146 pacer_thread_.DetachFromThread(); | 64 pacer_thread_.DetachFromThread(); |
147 network_thread_.DetachFromThread(); | 65 network_thread_.DetachFromThread(); |
148 } | 66 } |
149 | 67 |
150 void SetTransportFeedbackObserver( | 68 void SetTransportFeedbackObserver( |
151 TransportFeedbackObserver* feedback_observer) { | 69 TransportFeedbackObserver* feedback_observer) { |
152 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 70 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 header.payload_type_frequency = | 473 header.payload_type_frequency = |
556 rtp_payload_registry_->GetPayloadTypeFrequency(header.payloadType); | 474 rtp_payload_registry_->GetPayloadTypeFrequency(header.payloadType); |
557 if (header.payload_type_frequency < 0) | 475 if (header.payload_type_frequency < 0) |
558 return false; | 476 return false; |
559 return ReceivePacket(rtp_packet, rtp_packet_length, header, false); | 477 return ReceivePacket(rtp_packet, rtp_packet_length, header, false); |
560 } | 478 } |
561 | 479 |
562 MixerParticipant::AudioFrameInfo Channel::GetAudioFrameWithMuted( | 480 MixerParticipant::AudioFrameInfo Channel::GetAudioFrameWithMuted( |
563 int32_t id, | 481 int32_t id, |
564 AudioFrame* audioFrame) { | 482 AudioFrame* audioFrame) { |
565 unsigned int ssrc; | 483 if (event_log_) { |
566 RTC_CHECK_EQ(GetLocalSSRC(ssrc), 0); | 484 unsigned int ssrc; |
567 event_log_proxy_->LogAudioPlayout(ssrc); | 485 RTC_CHECK_EQ(GetLocalSSRC(ssrc), 0); |
| 486 event_log_->LogAudioPlayout(ssrc); |
| 487 } |
568 // Get 10ms raw PCM data from the ACM (mixer limits output frequency) | 488 // Get 10ms raw PCM data from the ACM (mixer limits output frequency) |
569 bool muted; | 489 bool muted; |
570 if (audio_coding_->PlayoutData10Ms(audioFrame->sample_rate_hz_, audioFrame, | 490 if (audio_coding_->PlayoutData10Ms(audioFrame->sample_rate_hz_, audioFrame, |
571 &muted) == -1) { | 491 &muted) == -1) { |
572 WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId), | 492 WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId), |
573 "Channel::GetAudioFrame() PlayoutData10Ms() failed!"); | 493 "Channel::GetAudioFrame() PlayoutData10Ms() failed!"); |
574 // In all likelihood, the audio in this frame is garbage. We return an | 494 // In all likelihood, the audio in this frame is garbage. We return an |
575 // error so that the audio mixer module doesn't add it to the mix. As | 495 // error so that the audio mixer module doesn't add it to the mix. As |
576 // a result, it won't be played out and the actions skipped here are | 496 // a result, it won't be played out and the actions skipped here are |
577 // irrelevant. | 497 // irrelevant. |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
744 } | 664 } |
745 } | 665 } |
746 } | 666 } |
747 | 667 |
748 return (highestNeeded); | 668 return (highestNeeded); |
749 } | 669 } |
750 | 670 |
751 int32_t Channel::CreateChannel(Channel*& channel, | 671 int32_t Channel::CreateChannel(Channel*& channel, |
752 int32_t channelId, | 672 int32_t channelId, |
753 uint32_t instanceId, | 673 uint32_t instanceId, |
| 674 RtcEventLog* const event_log, |
754 const Config& config) { | 675 const Config& config) { |
755 return CreateChannel(channel, channelId, instanceId, config, | 676 return CreateChannel(channel, channelId, instanceId, event_log, config, |
756 CreateBuiltinAudioDecoderFactory()); | 677 CreateBuiltinAudioDecoderFactory()); |
757 } | 678 } |
758 | 679 |
759 int32_t Channel::CreateChannel( | 680 int32_t Channel::CreateChannel( |
760 Channel*& channel, | 681 Channel*& channel, |
761 int32_t channelId, | 682 int32_t channelId, |
762 uint32_t instanceId, | 683 uint32_t instanceId, |
| 684 RtcEventLog* const event_log, |
763 const Config& config, | 685 const Config& config, |
764 const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory) { | 686 const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory) { |
765 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(instanceId, channelId), | 687 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(instanceId, channelId), |
766 "Channel::CreateChannel(channelId=%d, instanceId=%d)", channelId, | 688 "Channel::CreateChannel(channelId=%d, instanceId=%d)", channelId, |
767 instanceId); | 689 instanceId); |
768 | 690 |
769 channel = new Channel(channelId, instanceId, config, decoder_factory); | 691 channel = |
| 692 new Channel(channelId, instanceId, event_log, config, decoder_factory); |
770 if (channel == NULL) { | 693 if (channel == NULL) { |
771 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(instanceId, channelId), | 694 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(instanceId, channelId), |
772 "Channel::CreateChannel() unable to allocate memory for" | 695 "Channel::CreateChannel() unable to allocate memory for" |
773 " channel"); | 696 " channel"); |
774 return -1; | 697 return -1; |
775 } | 698 } |
776 return 0; | 699 return 0; |
777 } | 700 } |
778 | 701 |
779 void Channel::PlayNotification(int32_t id, uint32_t durationMs) { | 702 void Channel::PlayNotification(int32_t id, uint32_t durationMs) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
818 rtc::CritScope cs(&_fileCritSect); | 741 rtc::CritScope cs(&_fileCritSect); |
819 | 742 |
820 _outputFileRecording = false; | 743 _outputFileRecording = false; |
821 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 744 WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
822 "Channel::RecordFileEnded() => output file recorder module is" | 745 "Channel::RecordFileEnded() => output file recorder module is" |
823 " shutdown"); | 746 " shutdown"); |
824 } | 747 } |
825 | 748 |
826 Channel::Channel(int32_t channelId, | 749 Channel::Channel(int32_t channelId, |
827 uint32_t instanceId, | 750 uint32_t instanceId, |
| 751 RtcEventLog* const event_log, |
828 const Config& config, | 752 const Config& config, |
829 const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory) | 753 const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory) |
830 : _instanceId(instanceId), | 754 : _instanceId(instanceId), |
831 _channelId(channelId), | 755 _channelId(channelId), |
832 event_log_proxy_(new RtcEventLogProxy()), | 756 event_log_(event_log), |
833 rtp_header_parser_(RtpHeaderParser::Create()), | 757 rtp_header_parser_(RtpHeaderParser::Create()), |
834 rtp_payload_registry_( | 758 rtp_payload_registry_( |
835 new RTPPayloadRegistry(RTPPayloadStrategy::CreateStrategy(true))), | 759 new RTPPayloadRegistry(RTPPayloadStrategy::CreateStrategy(true))), |
836 rtp_receive_statistics_( | 760 rtp_receive_statistics_( |
837 ReceiveStatistics::Create(Clock::GetRealTimeClock())), | 761 ReceiveStatistics::Create(Clock::GetRealTimeClock())), |
838 rtp_receiver_( | 762 rtp_receiver_( |
839 RtpReceiver::CreateAudioReceiver(Clock::GetRealTimeClock(), | 763 RtpReceiver::CreateAudioReceiver(Clock::GetRealTimeClock(), |
840 this, | 764 this, |
841 this, | 765 this, |
842 rtp_payload_registry_.get())), | 766 rtp_payload_registry_.get())), |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
925 configuration.audio = true; | 849 configuration.audio = true; |
926 configuration.outgoing_transport = this; | 850 configuration.outgoing_transport = this; |
927 configuration.receive_statistics = rtp_receive_statistics_.get(); | 851 configuration.receive_statistics = rtp_receive_statistics_.get(); |
928 configuration.bandwidth_callback = rtcp_observer_.get(); | 852 configuration.bandwidth_callback = rtcp_observer_.get(); |
929 if (pacing_enabled_) { | 853 if (pacing_enabled_) { |
930 configuration.paced_sender = rtp_packet_sender_proxy_.get(); | 854 configuration.paced_sender = rtp_packet_sender_proxy_.get(); |
931 configuration.transport_sequence_number_allocator = | 855 configuration.transport_sequence_number_allocator = |
932 seq_num_allocator_proxy_.get(); | 856 seq_num_allocator_proxy_.get(); |
933 configuration.transport_feedback_callback = feedback_observer_proxy_.get(); | 857 configuration.transport_feedback_callback = feedback_observer_proxy_.get(); |
934 } | 858 } |
935 configuration.event_log = &(*event_log_proxy_); | 859 configuration.event_log = event_log; |
936 | 860 |
937 _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration)); | 861 _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration)); |
938 _rtpRtcpModule->SetSendingMediaStatus(false); | 862 _rtpRtcpModule->SetSendingMediaStatus(false); |
939 | 863 |
940 statistics_proxy_.reset(new StatisticsProxy(_rtpRtcpModule->SSRC())); | 864 statistics_proxy_.reset(new StatisticsProxy(_rtpRtcpModule->SSRC())); |
941 rtp_receive_statistics_->RegisterRtcpStatisticsCallback( | 865 rtp_receive_statistics_->RegisterRtcpStatisticsCallback( |
942 statistics_proxy_.get()); | 866 statistics_proxy_.get()); |
943 | 867 |
944 Config audioproc_config; | 868 Config audioproc_config; |
945 audioproc_config.Set<ExperimentalAgc>(new ExperimentalAgc(false)); | 869 audioproc_config.Set<ExperimentalAgc>(new ExperimentalAgc(false)); |
(...skipping 2131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3077 rtc::CritScope lock(&assoc_send_channel_lock_); | 3001 rtc::CritScope lock(&assoc_send_channel_lock_); |
3078 Channel* channel = associate_send_channel_.channel(); | 3002 Channel* channel = associate_send_channel_.channel(); |
3079 if (channel && channel->ChannelId() == channel_id) { | 3003 if (channel && channel->ChannelId() == channel_id) { |
3080 // If this channel is associated with a send channel of the specified | 3004 // If this channel is associated with a send channel of the specified |
3081 // Channel ID, disassociate with it. | 3005 // Channel ID, disassociate with it. |
3082 ChannelOwner ref(NULL); | 3006 ChannelOwner ref(NULL); |
3083 associate_send_channel_ = ref; | 3007 associate_send_channel_ = ref; |
3084 } | 3008 } |
3085 } | 3009 } |
3086 | 3010 |
3087 void Channel::SetRtcEventLog(RtcEventLog* event_log) { | |
3088 event_log_proxy_->SetEventLog(event_log); | |
3089 } | |
3090 | |
3091 int Channel::RegisterExternalMediaProcessing(ProcessingTypes type, | 3011 int Channel::RegisterExternalMediaProcessing(ProcessingTypes type, |
3092 VoEMediaProcess& processObject) { | 3012 VoEMediaProcess& processObject) { |
3093 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), | 3013 WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId), |
3094 "Channel::RegisterExternalMediaProcessing()"); | 3014 "Channel::RegisterExternalMediaProcessing()"); |
3095 | 3015 |
3096 rtc::CritScope cs(&_callbackCritSect); | 3016 rtc::CritScope cs(&_callbackCritSect); |
3097 | 3017 |
3098 if (kPlaybackPerChannel == type) { | 3018 if (kPlaybackPerChannel == type) { |
3099 if (_outputExternalMediaCallbackPtr) { | 3019 if (_outputExternalMediaCallbackPtr) { |
3100 _engineStatisticsPtr->SetLastError( | 3020 _engineStatisticsPtr->SetLastError( |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3562 int64_t min_rtt = 0; | 3482 int64_t min_rtt = 0; |
3563 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) != | 3483 if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) != |
3564 0) { | 3484 0) { |
3565 return 0; | 3485 return 0; |
3566 } | 3486 } |
3567 return rtt; | 3487 return rtt; |
3568 } | 3488 } |
3569 | 3489 |
3570 } // namespace voe | 3490 } // namespace voe |
3571 } // namespace webrtc | 3491 } // namespace webrtc |
OLD | NEW |