Bug 1291714 - bool to enable dtmf tones in AudioConduit and setup dtmf payload type. r=bwc draft
authorMichael Froman <mfroman@mozilla.com>
Wed, 28 Sep 2016 21:22:44 -0500
changeset 420252 0e65711f7a36f75c8956efb0860fd63f7890a279
parent 420251 e71f97670677c51b96a477c5cfb95f91a3fdef87
child 532766 6784a6581f51434def5012ddca1bef129ce870ba
push id31147
push userbmo:mfroman@nostrum.com
push dateMon, 03 Oct 2016 21:00:03 +0000
reviewersbwc
bugs1291714
milestone52.0a1
Bug 1291714 - bool to enable dtmf tones in AudioConduit and setup dtmf payload type. r=bwc MozReview-Commit-ID: IMneZx9wlhj
media/webrtc/signaling/src/media-conduit/AudioConduit.cpp
media/webrtc/signaling/src/media-conduit/AudioConduit.h
media/webrtc/signaling/src/media-conduit/MediaConduitInterface.h
media/webrtc/signaling/src/peerconnection/MediaPipelineFactory.cpp
--- a/media/webrtc/signaling/src/media-conduit/AudioConduit.cpp
+++ b/media/webrtc/signaling/src/media-conduit/AudioConduit.cpp
@@ -21,16 +21,17 @@
 #if !defined(MOZILLA_EXTERNAL_LINKAGE)
 #include "Latency.h"
 #include "mozilla/Telemetry.h"
 #endif
 
 #include "webrtc/common.h"
 #include "webrtc/modules/audio_processing/include/audio_processing.h"
 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
+#include "webrtc/voice_engine/include/voe_dtmf.h"
 #include "webrtc/voice_engine/include/voe_errors.h"
 #include "webrtc/system_wrappers/interface/clock.h"
 
 #ifdef MOZ_WIDGET_ANDROID
 #include "AndroidJNIWrapper.h"
 #endif
 
 namespace mozilla {
@@ -215,16 +216,34 @@ bool WebrtcAudioConduit::GetRTCPSenderRe
     *timestamp = NTPtoDOMHighResTimeStamp(senderInfo.NTPseconds,
                                           senderInfo.NTPfraction);
     *packetsSent = senderInfo.sendPacketCount;
     *bytesSent = senderInfo.sendOctetCount;
    }
    return result;
  }
 
+bool WebrtcAudioConduit::SetDtmfPayloadType(unsigned char type) {
+  CSFLogInfo(logTag, "%s : setting dtmf payload %d", __FUNCTION__, (int)type);
+
+  ScopedCustomReleasePtr<webrtc::VoEDtmf> mPtrVoEDtmf;
+  mPtrVoEDtmf = webrtc::VoEDtmf::GetInterface(mVoiceEngine);
+  if (!mPtrVoEDtmf) {
+    CSFLogError(logTag, "%s Unable to initialize VoEDtmf", __FUNCTION__);
+    return false;
+  }
+
+  int result = mPtrVoEDtmf->SetSendTelephoneEventPayloadType(mChannel, type);
+  if (result == -1) {
+    CSFLogError(logTag, "%s Failed call to SetSendTelephoneEventPayloadType",
+                        __FUNCTION__);
+  }
+  return result != -1;
+}
+
 /*
  * WebRTCAudioConduit Implementation
  */
 MediaConduitErrorCode WebrtcAudioConduit::Init()
 {
   CSFLogDebug(logTag,  "%s this=%p", __FUNCTION__, this);
 
 #ifdef MOZ_WIDGET_ANDROID
@@ -398,16 +417,18 @@ WebrtcAudioConduit::ConfigureSendMediaCo
 
   // This must be called after SetSendCodec
   if (mPtrVoECodec->SetFECStatus(mChannel, codecConfig->mFECEnabled) == -1) {
     CSFLogError(logTag, "%s SetFECStatus Failed %d ", __FUNCTION__,
                 mPtrVoEBase->LastError());
     return kMediaConduitFECStatusError;
   }
 
+  mDtmfEnabled = codecConfig->mDtmfEnabled;
+
   if (codecConfig->mName == "opus" && codecConfig->mMaxPlaybackRate) {
     if (mPtrVoECodec->SetOpusMaxPlaybackRate(
           mChannel,
           codecConfig->mMaxPlaybackRate) == -1) {
       CSFLogError(logTag, "%s SetOpusMaxPlaybackRate Failed %d ", __FUNCTION__,
                   mPtrVoEBase->LastError());
       return kMediaConduitUnknownError;
     }
--- a/media/webrtc/signaling/src/media-conduit/AudioConduit.h
+++ b/media/webrtc/signaling/src/media-conduit/AudioConduit.h
@@ -164,16 +164,17 @@ public:
   WebrtcAudioConduit():
                       mVoiceEngine(nullptr),
                       mTransportMonitor("WebrtcAudioConduit"),
                       mTransmitterTransport(nullptr),
                       mReceiverTransport(nullptr),
                       mEngineTransmitting(false),
                       mEngineReceiving(false),
                       mChannel(-1),
+                      mDtmfEnabled(false),
                       mCodecMutex("AudioConduit codec db"),
                       mCaptureDelay(150),
 #if !defined(MOZILLA_EXTERNAL_LINKAGE)
                       mLastTimestamp(0),
 #endif // MOZILLA_INTERNAL_API
                       mSamples(0),
                       mLastSyncLog(0)
   {
@@ -214,16 +215,18 @@ public:
                              uint32_t* packetsReceived,
                              uint64_t* bytesReceived,
                              uint32_t *cumulativeLost,
                              int32_t* rttMs) override;
   bool GetRTCPSenderReport(DOMHighResTimeStamp* timestamp,
                            unsigned int* packetsSent,
                            uint64_t* bytesSent) override;
 
+  bool SetDtmfPayloadType(unsigned char type) override;
+
 private:
   WebrtcAudioConduit(const WebrtcAudioConduit& other) = delete;
   void operator=(const WebrtcAudioConduit& other) = delete;
 
   //Local database of currently applied receive codecs
   typedef std::vector<AudioCodecConfig* > RecvCodecList;
 
   //Function to convert between WebRTC and Conduit codec structures
@@ -271,16 +274,17 @@ private:
   // (for when we send data to MediaStreamTracks).  Blocks are aged out as needed.
   struct Processing {
     TimeStamp mTimeStamp;
     uint32_t mRTPTimeStamp; // RTP timestamps received
   };
   AutoTArray<Processing,8> mProcessing;
 
   int mChannel;
+  bool mDtmfEnabled;
   RecvCodecList    mRecvCodecList;
 
   Mutex mCodecMutex; // protects mCurSendCodecConfig
   nsAutoPtr<AudioCodecConfig> mCurSendCodecConfig;
 
   // Current "capture" delay (really output plus input delay)
   int32_t mCaptureDelay;
 
--- a/media/webrtc/signaling/src/media-conduit/MediaConduitInterface.h
+++ b/media/webrtc/signaling/src/media-conduit/MediaConduitInterface.h
@@ -480,11 +480,13 @@ public:
    /**
     * Function to enable the audio level extension
     * @param enabled: enable extension
     * @param id: id to be used for this rtp header extension
     * NOTE: See AudioConduit for more information
     */
   virtual MediaConduitErrorCode EnableAudioLevelExtension(bool enabled, uint8_t id) = 0;
 
+  virtual bool SetDtmfPayloadType(unsigned char type) = 0;
+
 };
 }
 #endif
--- a/media/webrtc/signaling/src/peerconnection/MediaPipelineFactory.cpp
+++ b/media/webrtc/signaling/src/peerconnection/MediaPipelineFactory.cpp
@@ -728,16 +728,23 @@ MediaPipelineFactory::GetOrCreateAudioCo
       if (!conduit->SetLocalSSRC(ssrcs.front())) {
         MOZ_MTLOG(ML_ERROR, "SetLocalSSRC failed");
         return NS_ERROR_FAILURE;
       }
     }
 
     conduit->SetLocalCNAME(aTrack.GetCNAME().c_str());
 
+    if (configs.values.size() > 1
+        && configs.values.back()->mName == "telephone-event") {
+      // we have a telephone event codec, so we need to make sure
+      // the dynamic pt is set properly
+      conduit->SetDtmfPayloadType(configs.values.back()->mType);
+    }
+
     auto error = conduit->ConfigureSendMediaCodec(configs.values[0]);
     if (error) {
       MOZ_MTLOG(ML_ERROR, "ConfigureSendMediaCodec failed: " << error);
       return NS_ERROR_FAILURE;
     }
 
     const SdpExtmapAttributeList::Extmap* audioLevelExt =
         aTrack.GetNegotiatedDetails()->GetExt(