From f5093cd628b7308a28e890918e5453408d9f140a Mon Sep 17 00:00:00 2001 From: bodamnam Date: Fri, 13 Jan 2023 09:45:26 +0000 Subject: Fix to increase the dtmf payload timestamp 1) Fix to use increasing timestamp for dtmf frame in the RtpEncoderNode 2) DtmfSenderNode operates asynchronous thread operation to keep the constant interval, but it is already done in RtpEncoderNode, so I removed the node. Bug: 264831620 Test: loopback test in ImsMediaTestingApp, atest ImsMediaNativeTests, Verified by ATT LTE_BTR_5_5466 case passed. Change-Id: I6027007cfd3e09a541316197566f8724c0b7ca3a --- .../core/audio/AudioStreamGraphRtpTx.cpp | 10 +- .../core/audio/nodes/DtmfSenderNode.cpp | 128 --------------------- .../core/include/audio/AudioStreamGraphRtpTx.h | 2 +- .../core/include/audio/nodes/DtmfSenderNode.h | 43 ------- .../lib/libimsmedia/core/include/nodes/BaseNode.h | 1 - .../core/include/nodes/RtpEncoderNode.h | 4 +- .../lib/libimsmedia/core/nodes/BaseNode.cpp | 1 - .../lib/libimsmedia/core/nodes/RtpEncoderNode.cpp | 34 ++---- 8 files changed, 14 insertions(+), 209 deletions(-) delete mode 100644 service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/DtmfSenderNode.cpp delete mode 100644 service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/nodes/DtmfSenderNode.h (limited to 'service') diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioStreamGraphRtpTx.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioStreamGraphRtpTx.cpp index 372a137d..3444ab43 100644 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioStreamGraphRtpTx.cpp +++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioStreamGraphRtpTx.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -175,16 +174,9 @@ bool AudioStreamGraphRtpTx::createDtmfGraph(RtpConfig* config, BaseNode* rtpEnco AddNode(pDtmfEncoderNode); mListDtmfNodes.push_back(pDtmfEncoderNode); - BaseNode* pDtmfSenderNode = new DtmfSenderNode(mCallback); - pDtmfSenderNode->SetMediaType(IMS_MEDIA_AUDIO); - pDtmfSenderNode->SetConfig(audioConfig); - pDtmfEncoderNode->ConnectRearNode(pDtmfSenderNode); - AddNode(pDtmfSenderNode); - mListDtmfNodes.push_back(pDtmfSenderNode); - if (rtpEncoderNode != nullptr) { - pDtmfSenderNode->ConnectRearNode(rtpEncoderNode); + pDtmfEncoderNode->ConnectRearNode(rtpEncoderNode); } return true; diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/DtmfSenderNode.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/DtmfSenderNode.cpp deleted file mode 100644 index d0c75835..00000000 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/DtmfSenderNode.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include - -DtmfSenderNode::DtmfSenderNode(BaseSessionCallback* callback) : - BaseNode(callback) -{ - mNextTime = 0; - mPrevTime = 0; - mPtime = 20; -} - -DtmfSenderNode::~DtmfSenderNode() {} - -kBaseNodeId DtmfSenderNode::GetNodeId() -{ - return kNodeIdDtmfSender; -} - -ImsMediaResult DtmfSenderNode::Start() -{ - mNextTime = 0; - mNodeState = kNodeStateRunning; - return RESULT_SUCCESS; -} - -void DtmfSenderNode::Stop() -{ - mNextTime = 0; - ClearDataQueue(); - mNodeState = kNodeStateStopped; -} - -bool DtmfSenderNode::IsRunTime() -{ - return false; -} - -bool DtmfSenderNode::IsSourceNode() -{ - return false; -} - -void DtmfSenderNode::SetConfig(void* config) -{ - AudioConfig* pConfig = reinterpret_cast(config); - - if (pConfig != nullptr) - { - mPtime = pConfig->getPtimeMillis(); - } -} - -bool DtmfSenderNode::IsSameConfig(void* config) -{ - if (config == nullptr) - { - return true; - } - - AudioConfig* pConfig = reinterpret_cast(config); - return (mPtime == pConfig->getPtimeMillis()); -} - -void DtmfSenderNode::ProcessData() -{ - ImsMediaSubType subtype; - uint8_t* pData; - uint32_t nDataSize; - uint32_t nTimeStamp; - bool bMark; - uint32_t nCurrTime; - - if (GetData(&subtype, &pData, &nDataSize, &nTimeStamp, &bMark, nullptr) == false) - { - return; - } - - nCurrTime = ImsMediaTimer::GetTimeInMilliSeconds(); - - if (mNextTime && !(nCurrTime >= mNextTime || nCurrTime < mPrevTime || mNextTime < mPrevTime)) - { - mPrevTime = nCurrTime; - return; - } - - if (subtype == MEDIASUBTYPE_DTMFSTART) - { - SendDataToRearNode(subtype, pData, nDataSize, nTimeStamp, bMark, 0); - DeleteData(); - mNextTime = nCurrTime; - - // send the first dtmf packet - if (GetData(&subtype, &pData, &nDataSize, &nTimeStamp, &bMark, nullptr, nullptr) && - subtype == MEDIASUBTYPE_DTMF_PAYLOAD) - { - SendDataToRearNode(subtype, pData, nDataSize, nTimeStamp, bMark, 0); - DeleteData(); - mNextTime += mPtime; - } - } - else - { - SendDataToRearNode(subtype, pData, nDataSize, nTimeStamp, bMark, 0); - DeleteData(); - mNextTime += mPtime; - } - - mPrevTime = nCurrTime; -} diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraphRtpTx.h b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraphRtpTx.h index 5853de91..c042b7c7 100644 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraphRtpTx.h +++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraphRtpTx.h @@ -33,7 +33,7 @@ public: * * @param config AudioConfig for setting the parameters for nodes * @param rtpEncoderNode The RtpEncoderNode instance to connect as a rear node after the - * DtmfSenderNode, if it is null, no dtmf packet will be delivered to RtpEncoderNode. + * DtmfEncoderNode, if it is null, no dtmf packet will be delivered to RtpEncoderNode. * @return true Returns when the graph created without error * @return false Returns when the given parameters are invalid. */ diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/nodes/DtmfSenderNode.h b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/nodes/DtmfSenderNode.h deleted file mode 100644 index 8956b90b..00000000 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/nodes/DtmfSenderNode.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef DTMFSENDERNODE_H_INCLUDED -#define DTMFSENDERNODE_H_INCLUDED - -#include -#include - -class DtmfSenderNode : public BaseNode -{ -public: - DtmfSenderNode(BaseSessionCallback* callback = nullptr); - virtual ~DtmfSenderNode(); - virtual kBaseNodeId GetNodeId(); - virtual ImsMediaResult Start(); - virtual void Stop(); - virtual bool IsRunTime(); - virtual bool IsSourceNode(); - virtual void SetConfig(void* config); - virtual bool IsSameConfig(void* config); - virtual void ProcessData(); - -private: - uint32_t mNextTime; - uint32_t mPrevTime; - int8_t mPtime; // msec unit, interval between dtmf packets -}; - -#endif // DTMFSENDERNODE_H_INCLUDED diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/nodes/BaseNode.h b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/nodes/BaseNode.h index 78dde778..360c46bc 100644 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/nodes/BaseNode.h +++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/nodes/BaseNode.h @@ -49,7 +49,6 @@ enum kBaseNodeId kNodeIdAudioSource, kNodeIdAudioPlayer, kNodeIdDtmfEncoder, - kNodeIdDtmfSender, kNodeIdAudioPayloadEncoder, kNodeIdAudioPayloadDecoder, // for Video diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/nodes/RtpEncoderNode.h b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/nodes/RtpEncoderNode.h index d134f435..788f227e 100644 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/nodes/RtpEncoderNode.h +++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/nodes/RtpEncoderNode.h @@ -58,8 +58,7 @@ public: void SetRtpHeaderExtension(tRtpHeaderExtensionInfo& tExtension); private: - bool ProcessAudioData( - ImsMediaSubType subtype, uint8_t* pData, uint32_t nDataSize, uint32_t timestamp); + bool ProcessAudioData(ImsMediaSubType subtype, uint8_t* pData, uint32_t nDataSize); void ProcessVideoData(ImsMediaSubType subtype, uint8_t* pData, uint32_t nDataSize, uint32_t timestamp, bool mark); void ProcessTextData(ImsMediaSubType subtype, uint8_t* pData, uint32_t nDataSize, @@ -72,7 +71,6 @@ private: bool mDTMFMode; bool mMark; uint32_t mPrevTimestamp; - uint32_t mDTMFTimestamp; int8_t mSamplingRate; int8_t mRtpPayloadTx; int8_t mRtpPayloadRx; diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/BaseNode.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/BaseNode.cpp index 4e29d706..b2fb076f 100644 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/BaseNode.cpp +++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/BaseNode.cpp @@ -30,7 +30,6 @@ static std::vector vectorNodeId{ std::make_pair(kNodeIdAudioSource, "AudioSource"), std::make_pair(kNodeIdAudioPlayer, "AudioPlayer"), std::make_pair(kNodeIdDtmfEncoder, "DtmfEncoder"), - std::make_pair(kNodeIdDtmfSender, "DtmfSender"), std::make_pair(kNodeIdAudioPayloadEncoder, "AudioPayloadEncoder"), std::make_pair(kNodeIdAudioPayloadDecoder, "AudioPayloadDecoder"), std::make_pair(kNodeIdVideoSource, "VideoSource"), diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/RtpEncoderNode.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/RtpEncoderNode.cpp index ff45e252..d89d5bed 100644 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/RtpEncoderNode.cpp +++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/RtpEncoderNode.cpp @@ -30,7 +30,6 @@ RtpEncoderNode::RtpEncoderNode(BaseSessionCallback* callback) : mDTMFMode = false; mMark = false; mPrevTimestamp = 0; - mDTMFTimestamp = 0; mSamplingRate = 0; mRtpPayloadTx = 0; mRtpPayloadRx = 0; @@ -108,7 +107,6 @@ ImsMediaResult RtpEncoderNode::Start() mDTMFMode = false; mMark = true; mPrevTimestamp = 0; - mDTMFTimestamp = 0; #ifdef DEBUG_JITTER_GEN_SIMULATION_DELAY mNextTime = 0; #endif @@ -156,7 +154,7 @@ void RtpEncoderNode::ProcessData() { if (mMediaType == IMS_MEDIA_AUDIO) { - if (!ProcessAudioData(subtype, data, size, timestamp)) + if (!ProcessAudioData(subtype, data, size)) { return; } @@ -350,8 +348,7 @@ void RtpEncoderNode::SetRtpHeaderExtension(tRtpHeaderExtensionInfo& tExtension) mRtpExtension = tExtension; } -bool RtpEncoderNode::ProcessAudioData( - ImsMediaSubType subtype, uint8_t* data, uint32_t size, uint32_t timestamp) +bool RtpEncoderNode::ProcessAudioData(ImsMediaSubType subtype, uint8_t* data, uint32_t size) { uint32_t currentTimestamp; uint32_t timeDiff; @@ -373,30 +370,21 @@ bool RtpEncoderNode::ProcessAudioData( { if (mDTMFMode) { - IMLOGD_PACKET2(IM_PACKET_LOG_RTP, "[ProcessAudioData] DTMF - size[%d], TS[%d]", size, - mDTMFTimestamp); - // the first dtmf event - if (timestamp == 0) - { - currentTimestamp = ImsMediaTimer::GetTimeInMilliSeconds(); - mDTMFTimestamp = currentTimestamp; - timeDiff = ((currentTimestamp - mPrevTimestamp) + 10) / 20 * 20; - - if (timeDiff == 0) - { - timeDiff = 20; - } + currentTimestamp = ImsMediaTimer::GetTimeInMilliSeconds(); + timeDiff = currentTimestamp - mPrevTimestamp; - mPrevTimestamp += timeDiff; - } - else + if (timeDiff < 20) { - timeDiff = 0; + return false; } + mPrevTimestamp = currentTimestamp; timestampDiff = timeDiff * mSamplingRate; + + IMLOGD_PACKET2(IM_PACKET_LOG_RTP, "[ProcessAudioData] dtmf payload, size[%u], TS[%u]", + size, currentTimestamp); mRtpSession->SendRtpPacket( - mRtpTxDtmfPayload, data, size, mDTMFTimestamp, mMark, timestampDiff); + mRtpTxDtmfPayload, data, size, currentTimestamp, mMark, timestampDiff); if (mMark) { -- cgit v1.2.3