Bug 1291714 - bool to enable dtmf tones in AudioConduit and setup dtmf payload type. r=bwc
MozReview-Commit-ID: IMneZx9wlhj
--- 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(