From 799a9d017a807cefb62a15a38d81fe2ad16a586a Mon Sep 17 00:00:00 2001 From: danilchap Date: Thu, 22 Sep 2016 03:36:27 -0700 Subject: [PATCH] Revert of Remove unnecessary interface TelephoneEventHandler (patchset #3 id:40001 of https://codereview.webrtc.org/2357583002/ ) Reason for revert: breaks downstream code Original issue's description: > Remove unnecessary interface TelephoneEventHandler. > > BUG=webrtc:2795 > > Committed: https://crrev.com/2beb42983ca24e1326a9a7f2c06b3ad740eea2c3 > Cr-Commit-Position: refs/heads/master@{#14346} TBR=henrik.lundin@webrtc.org,solenberg@webrtc.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=webrtc:2795 Review-Url: https://codereview.webrtc.org/2362673002 Cr-Commit-Position: refs/heads/master@{#14348} --- .../modules/rtp_rtcp/include/rtp_receiver.h | 18 ++++++++++++++++++ .../rtp_rtcp/source/rtp_receiver_audio.cc | 19 +++++++++++++++++++ .../rtp_rtcp/source/rtp_receiver_audio.h | 14 ++++++++++++-- .../rtp_rtcp/source/rtp_receiver_impl.cc | 4 ++++ .../rtp_rtcp/source/rtp_receiver_impl.h | 2 ++ .../rtp_rtcp/source/rtp_receiver_strategy.h | 2 ++ .../rtp_rtcp/source/rtp_receiver_video.h | 2 ++ .../rtp_rtcp/test/testAPI/test_api_audio.cc | 3 +++ webrtc/voice_engine/channel.cc | 2 ++ webrtc/voice_engine/channel.h | 1 + 10 files changed, 65 insertions(+), 2 deletions(-) diff --git a/webrtc/modules/rtp_rtcp/include/rtp_receiver.h b/webrtc/modules/rtp_rtcp/include/rtp_receiver.h index c04a173ff4..9db1c63da7 100644 --- a/webrtc/modules/rtp_rtcp/include/rtp_receiver.h +++ b/webrtc/modules/rtp_rtcp/include/rtp_receiver.h @@ -18,6 +18,21 @@ namespace webrtc { class RTPPayloadRegistry; +class TelephoneEventHandler { + public: + virtual ~TelephoneEventHandler() {} + + // The following three methods implement the TelephoneEventHandler interface. + // Forward DTMFs to decoder for playout. + virtual void SetTelephoneEventForwardToDecoder(bool forward_to_decoder) = 0; + + // Is forwarding of outband telephone events turned on/off? + virtual bool TelephoneEventForwardToDecoder() const = 0; + + // Is TelephoneEvent configured with payload type payload_type + virtual bool TelephoneEventPayloadType(const int8_t payload_type) const = 0; +}; + class RtpReceiver { public: // Creates a video-enabled RTP receiver. @@ -36,6 +51,9 @@ class RtpReceiver { virtual ~RtpReceiver() {} + // Returns a TelephoneEventHandler if available. + virtual TelephoneEventHandler* GetTelephoneEventHandler() = 0; + // Registers a receive payload in the payload registry and notifies the media // receiver strategy. virtual int32_t RegisterReceivePayload( diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.cc b/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.cc index cd25d9ef87..38b2830b79 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.cc @@ -25,7 +25,9 @@ RTPReceiverStrategy* RTPReceiverStrategy::CreateAudioStrategy( RTPReceiverAudio::RTPReceiverAudio(RtpData* data_callback) : RTPReceiverStrategy(data_callback), + TelephoneEventHandler(), last_received_frequency_(8000), + telephone_event_forward_to_decoder_(false), telephone_event_payload_type_(-1), cng_nb_payload_type_(-1), cng_wb_payload_type_(-1), @@ -40,6 +42,19 @@ RTPReceiverAudio::RTPReceiverAudio(RtpData* data_callback) memset(current_remote_energy_, 0, sizeof(current_remote_energy_)); } +// Outband TelephoneEvent(DTMF) detection +void RTPReceiverAudio::SetTelephoneEventForwardToDecoder( + bool forward_to_decoder) { + rtc::CritScope lock(&crit_sect_); + telephone_event_forward_to_decoder_ = forward_to_decoder; +} + +// Is forwarding of outband telephone events turned on/off? +bool RTPReceiverAudio::TelephoneEventForwardToDecoder() const { + rtc::CritScope lock(&crit_sect_); + return telephone_event_forward_to_decoder_; +} + bool RTPReceiverAudio::TelephoneEventPayloadType( int8_t payload_type) const { rtc::CritScope lock(&crit_sect_); @@ -341,6 +356,10 @@ int32_t RTPReceiverAudio::ParseAudioCodecSpecific( // check if it's a DTMF event, hence something we can playout if (telephone_event_packet) { + if (!telephone_event_forward_to_decoder_) { + // don't forward event to decoder + return 0; + } std::set::iterator first = telephone_event_reported_.begin(); if (first != telephone_event_reported_.end() && *first > 15) { diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.h b/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.h index c1bccc2087..d5d89bae2d 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.h @@ -23,13 +23,23 @@ namespace webrtc { // Handles audio RTP packets. This class is thread-safe. -class RTPReceiverAudio : public RTPReceiverStrategy { +class RTPReceiverAudio : public RTPReceiverStrategy, + public TelephoneEventHandler { public: explicit RTPReceiverAudio(RtpData* data_callback); virtual ~RTPReceiverAudio() {} + // The following three methods implement the TelephoneEventHandler interface. + // Forward DTMFs to decoder for playout. + void SetTelephoneEventForwardToDecoder(bool forward_to_decoder) override; + + // Is forwarding of outband telephone events turned on/off? + bool TelephoneEventForwardToDecoder() const override; + // Is TelephoneEvent configured with payload type payload_type - bool TelephoneEventPayloadType(const int8_t payload_type) const; + bool TelephoneEventPayloadType(const int8_t payload_type) const override; + + TelephoneEventHandler* GetTelephoneEventHandler() override { return this; } // Returns true if CNG is configured with payload type payload_type. If so, // the frequency and cng_payload_type_has_changed are filled in. diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_impl.cc b/webrtc/modules/rtp_rtcp/source/rtp_receiver_impl.cc index babad1c069..190449b3dd 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_impl.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_impl.cc @@ -200,6 +200,10 @@ bool RtpReceiverImpl::IncomingRtpPacket( return true; } +TelephoneEventHandler* RtpReceiverImpl::GetTelephoneEventHandler() { + return rtp_media_receiver_->GetTelephoneEventHandler(); +} + bool RtpReceiverImpl::Timestamp(uint32_t* timestamp) const { rtc::CritScope lock(&critical_section_rtp_receiver_); if (!HaveReceivedFrame()) diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_impl.h b/webrtc/modules/rtp_rtcp/source/rtp_receiver_impl.h index 7ac81d9231..1ae1c9168a 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_impl.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_impl.h @@ -57,6 +57,8 @@ class RtpReceiverImpl : public RtpReceiver { int32_t Energy(uint8_t array_of_energy[kRtpCsrcSize]) const override; + TelephoneEventHandler* GetTelephoneEventHandler() override; + private: bool HaveReceivedFrame() const; diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h b/webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h index 02ec8f836a..663b883295 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h @@ -44,6 +44,8 @@ class RTPReceiverStrategy { int64_t timestamp_ms, bool is_first_packet) = 0; + virtual TelephoneEventHandler* GetTelephoneEventHandler() = 0; + // Retrieves the last known applicable frequency. virtual int GetPayloadTypeFrequency() const = 0; diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h b/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h index 1a3b41b9d9..a8aaf5da18 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h @@ -33,6 +33,8 @@ class RTPReceiverVideo : public RTPReceiverStrategy { int64_t timestamp, bool is_first_packet) override; + TelephoneEventHandler* GetTelephoneEventHandler() override { return NULL; } + int GetPayloadTypeFrequency() const override; RTPAliveType ProcessDeadOrAlive(uint16_t last_payload_length) const override; diff --git a/webrtc/modules/rtp_rtcp/test/testAPI/test_api_audio.cc b/webrtc/modules/rtp_rtcp/test/testAPI/test_api_audio.cc index bb93f57e93..291dded3b2 100644 --- a/webrtc/modules/rtp_rtcp/test/testAPI/test_api_audio.cc +++ b/webrtc/modules/rtp_rtcp/test/testAPI/test_api_audio.cc @@ -162,6 +162,9 @@ TEST_F(RtpRtcpAudioTest, Basic) { module1->SetSSRC(test_ssrc); module1->SetStartTimestamp(test_timestamp); + // Test detection at the end of a DTMF tone. + // EXPECT_EQ(0, module2->SetTelephoneEventForwardToDecoder(true)); + EXPECT_EQ(0, module1->SetSendingStatus(true)); // Start basic RTP test. diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc index 7895e9b9e1..582bde5f26 100644 --- a/webrtc/voice_engine/channel.cc +++ b/webrtc/voice_engine/channel.cc @@ -809,6 +809,7 @@ Channel::Channel(int32_t channelId, this, this, rtp_payload_registry_.get())), + telephone_event_handler_(rtp_receiver_->GetTelephoneEventHandler()), _outputAudioLevel(), _externalTransport(false), // Avoid conflict with other channels by adding 1024 - 1026, @@ -978,6 +979,7 @@ int32_t Channel::Init() { // disabled by the user. // After StopListen (when no sockets exists), RTCP packets will no longer // be transmitted since the Transport object will then be invalid. + telephone_event_handler_->SetTelephoneEventForwardToDecoder(true); // RTCP is enabled by default. _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound); // --- Register all permanent callbacks diff --git a/webrtc/voice_engine/channel.h b/webrtc/voice_engine/channel.h index ab46d2e468..4988e079d1 100644 --- a/webrtc/voice_engine/channel.h +++ b/webrtc/voice_engine/channel.h @@ -458,6 +458,7 @@ class Channel std::unique_ptr rtp_receive_statistics_; std::unique_ptr statistics_proxy_; std::unique_ptr rtp_receiver_; + TelephoneEventHandler* telephone_event_handler_; std::unique_ptr _rtpRtcpModule; std::unique_ptr audio_coding_; acm2::CodecManager codec_manager_;