summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-02-15 23:36:14 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-02-15 23:36:14 +0000
commitb2f694f844c3f1ac1b1d95c032e47293e0a462c1 (patch)
treef21b838def0f83df4a8d395294accd66453e53e9
parent836e0e8a2c1812174c89b3ed2c48892eb7965bc9 (diff)
parentb571b0c282de387f3b246d5bb292b2aa3bb078df (diff)
downloadImsMedia-b2f694f844c3f1ac1b1d95c032e47293e0a462c1.tar.gz
Snap for 9611449 from b571b0c282de387f3b246d5bb292b2aa3bb078df to mainline-rkpd-release
Change-Id: I78d7836d6fd56962ef72e682c8c26d8d1894c355
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioManager.cpp3
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioSession.cpp294
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioStreamGraphRtpRx.cpp21
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioStreamGraphRtpTx.cpp32
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp16
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/RtcpXrEncoder.cpp3
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/android/ImsMediaAudioSource.cpp6
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/android/include/ImsMediaAudioSource.h8
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/AudioRtpPayloadEncoderNode.cpp3
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/DtmfSenderNode.cpp128
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/IAudioSourceNode.cpp9
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/ImsMediaDefine.h6
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioSession.h8
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraph.h8
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraphRtpRx.h1
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraphRtpTx.h3
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/nodes/DtmfSenderNode.h43
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/nodes/IAudioSourceNode.h1
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/nodes/BaseNode.h1
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/nodes/RtpEncoderNode.h4
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/BaseNode.cpp1
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/nodes/RtpEncoderNode.cpp34
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaCamera.cpp10
-rw-r--r--service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaVideoSource.cpp31
-rw-r--r--tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioSessionTest.cpp337
-rw-r--r--tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoStreamGraphRtpTxTest.cpp7
26 files changed, 561 insertions, 457 deletions
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioManager.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioManager.cpp
index faabe4fc..357a1d71 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioManager.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioManager.cpp
@@ -97,7 +97,8 @@ ImsMediaResult AudioManager::modifySession(int sessionId, AudioConfig* config)
IMLOGI1("[modifySession] sessionId[%d]", sessionId);
if (session != mSessions.end())
{
- if ((session->second)->IsGraphAlreadyExist(config))
+ if ((session->second)->IsGraphAlreadyExist(config) ||
+ (session->second)->getGraphSize(kStreamRtpTx) == 0)
{
return (session->second)->startGraph(config);
}
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioSession.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioSession.cpp
index b2bb681b..e17112f6 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioSession.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioSession.cpp
@@ -18,9 +18,7 @@
#include <ImsMediaTrace.h>
#include <ImsMediaEventHandler.h>
#include <ImsMediaAudioUtil.h>
-
#include <AudioConfig.h>
-
#include <string>
AudioSession::AudioSession()
@@ -85,7 +83,8 @@ SessionState AudioSession::getState()
{
if (graph != nullptr && graph->getState() == kStreamStateRunning)
{
- return kSessionStateActive;
+ state = kSessionStateSending;
+ break;
}
}
@@ -93,7 +92,7 @@ SessionState AudioSession::getState()
{
if (graph != nullptr && graph->getState() == kStreamStateRunning)
{
- return kSessionStateActive;
+ return state == kSessionStateSending ? kSessionStateActive : kSessionStateReceiving;
}
}
@@ -101,7 +100,7 @@ SessionState AudioSession::getState()
{
if (graph != nullptr && graph->getState() == kStreamStateRunning)
{
- return kSessionStateSuspended;
+ return state == kSessionStateSending ? kSessionStateSending : kSessionStateSuspended;
}
}
@@ -127,16 +126,15 @@ ImsMediaResult AudioSession::startGraph(RtpConfig* config)
ImsMediaResult ret = RESULT_NOT_READY;
IMLOGD1("[startGraph] mListGraphRtpTx size[%d]", mListGraphRtpTx.size());
- if (mListGraphRtpTx.size() != 0)
- {
- for (auto& graph : mListGraphRtpTx)
- {
- if (graph != nullptr && graph->isSameGraph(config))
+ AudioStreamGraphRtpTx* graphTx = AudioStreamGraph::findGraph(mListGraphRtpTx,
+ [&config](AudioStreamGraphRtpTx* graph)
{
- ret = graph->update(config);
- break;
- }
- }
+ return graph != nullptr && graph->isSameGraph(config);
+ });
+
+ if (graphTx != nullptr)
+ {
+ ret = graphTx->update(config);
if (ret != RESULT_SUCCESS)
{
@@ -147,13 +145,11 @@ ImsMediaResult AudioSession::startGraph(RtpConfig* config)
else
{
mListGraphRtpTx.push_back(new AudioStreamGraphRtpTx(this, mRtpFd));
- ret = mListGraphRtpTx.back()->create(config);
- if (ret == RESULT_SUCCESS &&
- (pConfig->getMediaDirection() == RtpConfig::MEDIA_DIRECTION_SEND_ONLY ||
- pConfig->getMediaDirection() == RtpConfig::MEDIA_DIRECTION_SEND_RECEIVE))
+ if (mListGraphRtpTx.back()->create(config) == RESULT_SUCCESS)
{
ret = mListGraphRtpTx.back()->start();
+
if (ret != RESULT_SUCCESS)
{
IMLOGE1("[startGraph] start error[%d]", ret);
@@ -162,19 +158,18 @@ ImsMediaResult AudioSession::startGraph(RtpConfig* config)
}
}
- IMLOGD1("[startGraph] mListGraphRtpRx size[%d]", mListGraphRtpRx.size());
+ IMLOGD1("[startGraph] ListGraphRtpRx size[%d]", mListGraphRtpRx.size());
- if (mListGraphRtpRx.size() != 0)
- {
- for (auto& graph : mListGraphRtpRx)
- {
- if (graph != nullptr && graph->isSameGraph(config))
+ AudioStreamGraphRtpRx* graphRx = AudioStreamGraph::findGraph(mListGraphRtpRx,
+ [&config](AudioStreamGraphRtpRx* graph)
{
- graph->setMediaQualityThreshold(&mThreshold);
- ret = graph->update(config);
- break;
- }
- }
+ return graph != nullptr && graph->isSameGraph(config);
+ });
+
+ if (graphRx != nullptr)
+ {
+ graphRx->setMediaQualityThreshold(&mThreshold);
+ ret = graphRx->update(config);
if (ret != RESULT_SUCCESS)
{
@@ -185,11 +180,8 @@ ImsMediaResult AudioSession::startGraph(RtpConfig* config)
else
{
mListGraphRtpRx.push_back(new AudioStreamGraphRtpRx(this, mRtpFd));
- ret = mListGraphRtpRx.back()->create(config);
- if (ret == RESULT_SUCCESS &&
- (pConfig->getMediaDirection() == RtpConfig::MEDIA_DIRECTION_RECEIVE_ONLY ||
- pConfig->getMediaDirection() == RtpConfig::MEDIA_DIRECTION_SEND_RECEIVE))
+ if (mListGraphRtpRx.back()->create(config) == RESULT_SUCCESS)
{
mListGraphRtpRx.back()->setMediaQualityThreshold(&mThreshold);
ret = mListGraphRtpRx.back()->start();
@@ -204,17 +196,16 @@ ImsMediaResult AudioSession::startGraph(RtpConfig* config)
IMLOGD1("[startGraph] mListGraphRtcp size[%d]", mListGraphRtcp.size());
- if (mListGraphRtcp.size() != 0)
- {
- for (auto& graph : mListGraphRtcp)
- {
- if (graph != nullptr && graph->isSameGraph(config))
+ AudioStreamGraphRtcp* graphRtcp = AudioStreamGraph::findGraph(mListGraphRtcp,
+ [&config](AudioStreamGraphRtcp* graph)
{
- graph->setMediaQualityThreshold(&mThreshold);
- ret = graph->update(config);
- break;
- }
- }
+ return graph != nullptr && graph->isSameGraph(config);
+ });
+
+ if (graphRtcp != nullptr)
+ {
+ graphRtcp->setMediaQualityThreshold(&mThreshold);
+ ret = graphRtcp->update(config);
if (ret != RESULT_SUCCESS)
{
@@ -225,12 +216,12 @@ ImsMediaResult AudioSession::startGraph(RtpConfig* config)
else
{
mListGraphRtcp.push_back(new AudioStreamGraphRtcp(this, mRtcpFd));
- ret = mListGraphRtcp.back()->create(config);
- if (ret == RESULT_SUCCESS)
+ if (mListGraphRtcp.back()->create(config) == RESULT_SUCCESS)
{
mListGraphRtcp.back()->setMediaQualityThreshold(&mThreshold);
ret = mListGraphRtcp.back()->start();
+
if (ret != RESULT_SUCCESS)
{
IMLOGE1("[startGraph] start error[%d]", ret);
@@ -262,97 +253,43 @@ ImsMediaResult AudioSession::addGraph(RtpConfig* config, bool enableRtcp)
return RESULT_INVALID_PARAM;
}
- for (auto& graph : mListGraphRtpTx)
- {
- if (graph != nullptr && graph->isSameGraph(config))
- {
- IMLOGW0("[addGraph] same config is exist");
- return startGraph(config);
- }
- }
-
- for (auto& graph : mListGraphRtpTx)
+ if (IsGraphAlreadyExist(config) || mListGraphRtpTx.empty())
{
- if (graph != nullptr)
- {
- graph->stop();
- }
+ return startGraph(config);
}
- for (auto& graph : mListGraphRtpRx)
+ if (enableRtcp) // update current graph to inactive mode
{
- if (graph != nullptr)
+ for (auto& graph : mListGraphRtpTx)
{
- graph->stop();
+ if (graph != nullptr)
+ {
+ graph->stop();
+ }
}
- }
- for (auto& graph : mListGraphRtcp)
- {
- if (graph != nullptr && graph->getState() != kStreamStateRunning)
+ for (auto& graph : mListGraphRtpRx)
{
- enableRtcp ? graph->start() : graph->stop();
+ if (graph != nullptr)
+ {
+ graph->stop();
+ }
}
- }
-
- ImsMediaResult ret = RESULT_NOT_READY;
-
- mListGraphRtpTx.push_back(new AudioStreamGraphRtpTx(this, mRtpFd));
- ret = mListGraphRtpTx.back()->create(config);
- if (ret == RESULT_SUCCESS)
- {
- ret = mListGraphRtpTx.back()->start();
- if (ret != RESULT_SUCCESS)
+ for (auto& graph : mListGraphRtcp)
{
- IMLOGE1("[addGraph] start error[%d]", ret);
- return ret;
+ if (graph != nullptr && graph->getState() != kStreamStateRunning)
+ {
+ graph->start();
+ }
}
- }
-
- IMLOGD1("[addGraph] mListGraphTx size[%d]", mListGraphRtpTx.size());
-
- mListGraphRtpRx.push_back(new AudioStreamGraphRtpRx(this, mRtpFd));
- ret = mListGraphRtpRx.back()->create(config);
- if (ret == RESULT_SUCCESS)
- {
- mListGraphRtpRx.back()->setMediaQualityThreshold(&mThreshold);
- ret = mListGraphRtpRx.back()->start();
- if (ret != RESULT_SUCCESS)
- {
- IMLOGE1("[addGraph] start error[%d]", ret);
- return ret;
- }
+ return startGraph(config);
}
-
- IMLOGD1("[addGraph] mListGraphRx size[%d]", mListGraphRtpRx.size());
-
- mListGraphRtcp.push_back(new AudioStreamGraphRtcp(this, mRtcpFd));
- ret = mListGraphRtcp.back()->create(config);
-
- if (ret == RESULT_SUCCESS)
+ else
{
- mListGraphRtcp.back()->setMediaQualityThreshold(&mThreshold);
- ret = mListGraphRtcp.back()->start();
- if (ret != RESULT_SUCCESS)
- {
- IMLOGE1("[addGraph] start error[%d]", ret);
- return ret;
- }
+ return confirmGraph(config);
}
-
- IMLOGD1("[addGraph] mListGraphRtcp size[%d]", mListGraphRtcp.size());
-
- if (mMediaQualityAnalyzer != nullptr &&
- !mMediaQualityAnalyzer->isSameConfig(reinterpret_cast<AudioConfig*>(config)))
- {
- mMediaQualityAnalyzer->stop();
- mMediaQualityAnalyzer->setConfig(reinterpret_cast<AudioConfig*>(config));
- mMediaQualityAnalyzer->start();
- }
-
- return RESULT_SUCCESS;
}
ImsMediaResult AudioSession::confirmGraph(RtpConfig* config)
@@ -362,99 +299,44 @@ ImsMediaResult AudioSession::confirmGraph(RtpConfig* config)
return RESULT_INVALID_PARAM;
}
- ImsMediaResult ret = RESULT_NOT_READY;
-
- /** Stop unmatched running instances of StreamGraph. */
- for (auto& graph : mListGraphRtpTx)
- {
- if (graph != nullptr && !graph->isSameGraph(config))
- {
- graph->stop();
- }
- }
-
- for (auto& graph : mListGraphRtpRx)
+ if (mListGraphRtpTx.empty() || mListGraphRtpRx.empty() || mListGraphRtcp.empty())
{
- if (graph != nullptr && !graph->isSameGraph(config))
- {
- graph->stop();
- }
+ return startGraph(config);
}
- for (auto& graph : mListGraphRtcp)
- {
- if (graph != nullptr && !graph->isSameGraph(config))
- {
- graph->stop();
- }
- }
-
- bool bFound = false;
+ /** Stop and delete unmatched running instances of StreamGraph. */
for (std::list<AudioStreamGraphRtpTx*>::iterator iter = mListGraphRtpTx.begin();
iter != mListGraphRtpTx.end();)
{
AudioStreamGraphRtpTx* graph = *iter;
- if (graph == nullptr)
- {
- continue;
- }
-
- if (!graph->isSameGraph(config))
+ if (graph != nullptr && !graph->isSameGraph(config))
{
+ graph->stop();
iter = mListGraphRtpTx.erase(iter);
delete graph;
}
else
{
- if (graph->getState() != kStreamStateRunning)
- {
- ret = graph->start();
- if (ret != RESULT_SUCCESS)
- {
- IMLOGE1("[confirmGraph] start tx error[%d]", ret);
- return ret;
- }
- }
iter++;
- bFound = true;
}
}
IMLOGD1("[confirmGraph] mListGraphTx size[%d]", mListGraphRtpTx.size());
- if (bFound == false)
- {
- IMLOGE0("[confirmGraph] no graph to confirm");
- return RESULT_INVALID_PARAM;
- }
-
for (std::list<AudioStreamGraphRtpRx*>::iterator iter = mListGraphRtpRx.begin();
iter != mListGraphRtpRx.end();)
{
AudioStreamGraphRtpRx* graph = *iter;
- if (graph == nullptr)
- {
- continue;
- }
-
- if (!graph->isSameGraph(config))
+ if (graph != nullptr && !graph->isSameGraph(config))
{
+ graph->stop();
iter = mListGraphRtpRx.erase(iter);
delete graph;
}
else
{
- if (graph->getState() != kStreamStateRunning)
- {
- ret = graph->start();
- if (ret != RESULT_SUCCESS)
- {
- IMLOGE1("[confirmGraph] start rx error[%d]", ret);
- return ret;
- }
- }
iter++;
}
}
@@ -466,35 +348,21 @@ ImsMediaResult AudioSession::confirmGraph(RtpConfig* config)
{
AudioStreamGraphRtcp* graph = *iter;
- if (graph == nullptr)
- {
- continue;
- }
-
- if (!graph->isSameGraph(config))
+ if (graph != nullptr && !graph->isSameGraph(config))
{
+ graph->stop();
iter = mListGraphRtcp.erase(iter);
delete graph;
}
else
{
- if (graph->getState() != kStreamStateRunning)
- {
- ret = graph->start();
- if (ret != RESULT_SUCCESS)
- {
- IMLOGE1("[confirmGraph] start rtcp error[%d]", ret);
- return ret;
- }
- }
-
iter++;
}
}
IMLOGD1("[confirmGraph] mListGraphRtcp size[%d]", mListGraphRtcp.size());
- return RESULT_SUCCESS;
+ return startGraph(config);
}
ImsMediaResult AudioSession::deleteGraph(RtpConfig* config)
@@ -514,11 +382,7 @@ ImsMediaResult AudioSession::deleteGraph(RtpConfig* config)
if (graph->isSameGraph(config))
{
- if (graph->getState() == kStreamStateRunning)
- {
- graph->stop();
- }
-
+ graph->stop();
iter = mListGraphRtpTx.erase(iter);
delete graph;
bFound = true;
@@ -553,6 +417,7 @@ ImsMediaResult AudioSession::deleteGraph(RtpConfig* config)
{
graph->stop();
}
+
iter = mListGraphRtpRx.erase(iter);
delete graph;
break;
@@ -581,6 +446,7 @@ ImsMediaResult AudioSession::deleteGraph(RtpConfig* config)
{
graph->stop();
}
+
iter = mListGraphRtcp.erase(iter);
delete graph;
break;
@@ -664,6 +530,11 @@ void AudioSession::setMediaQualityThreshold(const MediaQualityThreshold& thresho
void AudioSession::sendDtmf(char digit, int duration)
{
+ if (mListGraphRtpTx.empty())
+ {
+ return;
+ }
+
for (std::list<AudioStreamGraphRtpTx*>::iterator iter = mListGraphRtpTx.begin();
iter != mListGraphRtpTx.end(); iter++)
{
@@ -692,6 +563,21 @@ bool AudioSession::IsGraphAlreadyExist(RtpConfig* config)
return false;
}
+uint32_t AudioSession::getGraphSize(ImsMediaStreamType type)
+{
+ switch (type)
+ {
+ case kStreamRtpTx:
+ return mListGraphRtpTx.size();
+ case kStreamRtpRx:
+ return mListGraphRtpRx.size();
+ case kStreamRtcp:
+ return mListGraphRtcp.size();
+ }
+
+ return 0;
+}
+
void AudioSession::SendInternalEvent(int32_t type, uint64_t param1, uint64_t param2)
{
(void)param2;
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioStreamGraphRtpRx.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioStreamGraphRtpRx.cpp
index d3d0d791..70963147 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioStreamGraphRtpRx.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioStreamGraphRtpRx.cpp
@@ -106,15 +106,18 @@ ImsMediaResult AudioStreamGraphRtpRx::update(RtpConfig* config)
IMLOGI0("[update] pause RX");
return stop();
}
+
ImsMediaResult ret = RESULT_NOT_READY;
if (mGraphState == kStreamStateRunning)
{
mScheduler->Stop();
+
for (auto& node : mListNodeStarted)
{
IMLOGD1("[update] update node[%s]", node->GetNodeName());
ret = node->UpdateConfig(mConfig);
+
if (ret != RESULT_SUCCESS)
{
IMLOGE2("[update] error in update node[%s], ret[%d]", node->GetNodeName(), ret);
@@ -128,6 +131,7 @@ ImsMediaResult AudioStreamGraphRtpRx::update(RtpConfig* config)
{
IMLOGD1("[update] update node[%s]", node->GetNodeName());
ret = node->UpdateConfig(mConfig);
+
if (ret != RESULT_SUCCESS)
{
IMLOGE2("[update] error in update node[%s], ret[%d]", node->GetNodeName(), ret);
@@ -144,4 +148,21 @@ ImsMediaResult AudioStreamGraphRtpRx::update(RtpConfig* config)
}
return ret;
+}
+
+ImsMediaResult AudioStreamGraphRtpRx::start()
+{
+ if (mConfig == nullptr)
+ {
+ return RESULT_NOT_READY;
+ }
+
+ if (mConfig->getMediaDirection() == RtpConfig::MEDIA_DIRECTION_RECEIVE_ONLY ||
+ mConfig->getMediaDirection() == RtpConfig::MEDIA_DIRECTION_SEND_RECEIVE)
+ {
+ return BaseStreamGraph::start();
+ }
+
+ // not started
+ return RESULT_SUCCESS;
} \ No newline at end of file
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..4a991320 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 <AudioConfig.h>
#include <IAudioSourceNode.h>
#include <DtmfEncoderNode.h>
-#include <DtmfSenderNode.h>
#include <AudioRtpPayloadEncoderNode.h>
#include <RtpEncoderNode.h>
#include <SocketWriterNode.h>
@@ -155,6 +154,23 @@ ImsMediaResult AudioStreamGraphRtpTx::update(RtpConfig* config)
return ret;
}
+ImsMediaResult AudioStreamGraphRtpTx::start()
+{
+ if (mConfig == nullptr)
+ {
+ return RESULT_NOT_READY;
+ }
+
+ if (mConfig->getMediaDirection() == RtpConfig::MEDIA_DIRECTION_SEND_ONLY ||
+ mConfig->getMediaDirection() == RtpConfig::MEDIA_DIRECTION_SEND_RECEIVE)
+ {
+ return BaseStreamGraph::start();
+ }
+
+ // not started
+ return RESULT_SUCCESS;
+}
+
bool AudioStreamGraphRtpTx::createDtmfGraph(RtpConfig* config, BaseNode* rtpEncoderNode)
{
if (config == nullptr)
@@ -169,22 +185,20 @@ bool AudioStreamGraphRtpTx::createDtmfGraph(RtpConfig* config, BaseNode* rtpEnco
return false;
}
+ if (mConfig == nullptr)
+ {
+ mConfig = new AudioConfig(*audioConfig);
+ }
+
BaseNode* pDtmfEncoderNode = new DtmfEncoderNode(mCallback);
pDtmfEncoderNode->SetMediaType(IMS_MEDIA_AUDIO);
pDtmfEncoderNode->SetConfig(audioConfig);
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/MediaQualityAnalyzer.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp
index f4ef92eb..c8fc8850 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/MediaQualityAnalyzer.cpp
@@ -403,7 +403,7 @@ void MediaQualityAnalyzer::processData(const int32_t timeCount)
void MediaQualityAnalyzer::processMediaQuality()
{
// media quality rtp inactivity
- if (!mCurrentRtpInactivityTimes.empty() && mNumRxPacket == 0)
+ if (mNumRxPacket == 0)
{
mCountRtpInactivity += 1000;
}
@@ -415,7 +415,7 @@ void MediaQualityAnalyzer::processMediaQuality()
}
// media quality rtcp inactivity
- if (mRtcpInactivityTime != 0 && mNumRtcpPacketReceived == 0)
+ if (mNumRtcpPacketReceived == 0)
{
mCountRtcpInactivity += 1000;
}
@@ -499,10 +499,10 @@ void MediaQualityAnalyzer::processMediaQuality()
}
}
- if (mRtcpInactivityTime != 0 && mCountRtcpInactivity >= mRtcpInactivityTime)
+ if (mRtcpInactivityTime != 0 && mCountRtcpInactivity == mRtcpInactivityTime)
{
notifyMediaQualityStatus();
- mCountRtcpInactivity = 0; // reset
+ mCountRtcpInactivity = 0;
return;
}
@@ -545,10 +545,10 @@ bool MediaQualityAnalyzer::getRtcpXrReportBlock(
return false;
}
- if (mRtcpXrEncoder->createRtcpXrReport(rtcpXrReport, &mListRxPacket, &mListLostPacket,
- mBeginSeq, mEndSeq, data, size) == false)
+ if (!mRtcpXrEncoder->createRtcpXrReport(
+ rtcpXrReport, &mListRxPacket, &mListLostPacket, mBeginSeq, mEndSeq, data, size))
{
- IMLOGE0("[getRtcpXrReportBlock] error createRtcpXrReport");
+ IMLOGW0("[getRtcpXrReportBlock] fail to createRtcpXrReport");
return false;
}
@@ -629,7 +629,7 @@ void MediaQualityAnalyzer::processEvent(uint32_t event, uint64_t paramA, uint64_
case kGetRtcpXrReportBlock:
{
uint32_t size = 0;
- uint8_t* reportBlock = new uint8_t[MAX_BLOCK_LENGTH];
+ uint8_t* reportBlock = new uint8_t[MAX_BLOCK_LENGTH]{};
if (getRtcpXrReportBlock(static_cast<int32_t>(paramA), reportBlock, size))
{
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/RtcpXrEncoder.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/RtcpXrEncoder.cpp
index d30ea331..3bc108d4 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/RtcpXrEncoder.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/RtcpXrEncoder.cpp
@@ -196,7 +196,8 @@ bool RtcpXrEncoder::createRtcpXrReport(const uint32_t rtcpXrReport, std::list<Rt
IMLOGD_PACKET2(IM_PACKET_LOG_RTCP, "[createRtcpXrReport] rtcpXrReport[%d], size[%d]",
rtcpXrReport, size);
- return true;
+
+ return (size > 0);
}
tLossReport* RtcpXrEncoder::createLossAnalysisReport(std::list<RtpPacket*>* packets,
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/android/ImsMediaAudioSource.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/android/ImsMediaAudioSource.cpp
index 348cd0a3..9117e0ad 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/android/ImsMediaAudioSource.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/android/ImsMediaAudioSource.cpp
@@ -49,6 +49,7 @@ ImsMediaAudioSource::ImsMediaAudioSource()
mEvsBitRate = 0;
mEvsChAwOffset = 0;
mIsEvsInitialized = false;
+ mMediaDirection = 0;
}
ImsMediaAudioSource::~ImsMediaAudioSource() {}
@@ -98,6 +99,11 @@ void ImsMediaAudioSource::SetEvsBandwidth(int32_t evsBandwidth)
mEvsBandwidth = (kEvsBandwidth)evsBandwidth;
}
+void ImsMediaAudioSource::SetMediaDirection(int32_t direction)
+{
+ mMediaDirection = direction;
+}
+
bool ImsMediaAudioSource::Start()
{
char kMimeType[128] = {'\0'};
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/android/include/ImsMediaAudioSource.h b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/android/include/ImsMediaAudioSource.h
index cd484db7..63ed1ad7 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/android/include/ImsMediaAudioSource.h
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/android/include/ImsMediaAudioSource.h
@@ -95,6 +95,13 @@ public:
void SetEvsChAwOffset(int32_t offset);
/**
+ * @brief Sets audio media direction of the RTP session
+ *
+ * @param direction can be NO_FLOW, SEND_ONLY, RECEIVE_ONLY, SEND_RECEIVE, INACTIVE
+ */
+ void SetMediaDirection(int32_t direction);
+
+ /**
* @brief Starts aaudio and ndk audio codec to get the audio frame and encode the audio frames
* with given configuration
*
@@ -141,6 +148,7 @@ private:
int32_t mEvsChAwOffset;
ImsMediaCondition mConditionExit;
bool mIsEvsInitialized;
+ int32_t mMediaDirection;
};
#endif
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/AudioRtpPayloadEncoderNode.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/AudioRtpPayloadEncoderNode.cpp
index 547f65ef..028eba2d 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/AudioRtpPayloadEncoderNode.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/AudioRtpPayloadEncoderNode.cpp
@@ -280,9 +280,6 @@ void AudioRtpPayloadEncoderNode::EncodePayloadEvs(
kRtpPyaloadHeaderMode eEVSPayloadFormat = kRtpPyaloadHeaderModeEvsHeaderFull;
kEvsCodecMode kEvsCodecMode;
- // Converting bits to bytes.
- nDataSize /= 8;
-
// 0111 1111 is no request.
uint32_t nEVSBW = 0x07;
uint32_t nEVSBR = 0x0f;
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 <ImsMediaDefine.h>
-#include <ImsMediaTrace.h>
-#include <DtmfSenderNode.h>
-#include <ImsMediaTimer.h>
-#include <AudioConfig.h>
-
-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<AudioConfig*>(config);
-
- if (pConfig != nullptr)
- {
- mPtime = pConfig->getPtimeMillis();
- }
-}
-
-bool DtmfSenderNode::IsSameConfig(void* config)
-{
- if (config == nullptr)
- {
- return true;
- }
-
- AudioConfig* pConfig = reinterpret_cast<AudioConfig*>(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/audio/nodes/IAudioSourceNode.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/IAudioSourceNode.cpp
index 43f09cb7..9e0fe4e0 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/IAudioSourceNode.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/nodes/IAudioSourceNode.cpp
@@ -32,6 +32,7 @@ IAudioSourceNode::IAudioSourceNode(BaseSessionCallback* callback) :
mCodecMode = 0;
mRunningCodecMode = 0;
mFirstFrame = false;
+ mMediaDirection = 0;
}
IAudioSourceNode::~IAudioSourceNode() {}
@@ -52,6 +53,7 @@ ImsMediaResult IAudioSourceNode::Start()
mRunningCodecMode = ImsMediaAudioUtil::GetMaximumAmrMode(mCodecMode);
mAudioSource->SetPtime(mPtime);
mAudioSource->SetSamplingRate(mSamplingRate * 1000);
+ mAudioSource->SetMediaDirection(mMediaDirection);
if (mCodecType == kAudioCodecEvs)
{
@@ -122,6 +124,7 @@ void IAudioSourceNode::SetConfig(void* config)
mEvsChAwOffset = pConfig->getEvsParams().getChannelAwareMode();
}
+ mMediaDirection = pConfig->getMediaDirection();
mSamplingRate = pConfig->getSamplingRateKHz();
mPtime = pConfig->getPtimeMillis();
}
@@ -140,7 +143,8 @@ bool IAudioSourceNode::IsSameConfig(void* config)
if (mCodecType == kAudioCodecAmr || mCodecType == kAudioCodecAmrWb)
{
return (mCodecMode == pConfig->getAmrParams().getAmrMode() &&
- mSamplingRate == pConfig->getSamplingRateKHz());
+ mSamplingRate == pConfig->getSamplingRateKHz() &&
+ mMediaDirection == pConfig->getMediaDirection());
}
else if (mCodecType == kAudioCodecEvs)
{
@@ -149,7 +153,8 @@ bool IAudioSourceNode::IsSameConfig(void* config)
ImsMediaAudioUtil::FindMaxEvsBandwidthFromRange(
pConfig->getEvsParams().getEvsBandwidth()) &&
mEvsChAwOffset == pConfig->getEvsParams().getChannelAwareMode() &&
- mSamplingRate == pConfig->getSamplingRateKHz());
+ mSamplingRate == pConfig->getSamplingRateKHz() &&
+ mMediaDirection == pConfig->getMediaDirection());
}
}
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/ImsMediaDefine.h b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/ImsMediaDefine.h
index 74699708..9006f64d 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/ImsMediaDefine.h
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/ImsMediaDefine.h
@@ -447,7 +447,11 @@ enum SessionState
{
/** The state that the session is created but graph is not created */
kSessionStateOpened,
- /** The state that the session is created and the Rtp StreamGraphs are running */
+ /** The state that the session is created and the TX rtp StreamGraphs are running */
+ kSessionStateSending,
+ /** The state that the session is created and the RX rtp StreamGraphs are running */
+ kSessionStateReceiving,
+ /** The state that the session is created and the both TX and Rx rtp StreamGraphs are running */
kSessionStateActive,
/** The state that the session is created and the Rtp StreamGraphs is not running */
kSessionStateSuspended,
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioSession.h b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioSession.h
index ce3bd47e..10d8b916 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioSession.h
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioSession.h
@@ -95,6 +95,14 @@ public:
*/
bool IsGraphAlreadyExist(RtpConfig* config);
+ /**
+ * @brief Get graph list size with repective stream type
+ *
+ * @param type The graph type to fetch
+ * @return uint32_t The size of list
+ */
+ uint32_t getGraphSize(ImsMediaStreamType type);
+
private:
std::list<AudioStreamGraphRtpTx*> mListGraphRtpTx;
std::list<AudioStreamGraphRtpRx*> mListGraphRtpRx;
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraph.h b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraph.h
index 203ea682..211b981d 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraph.h
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraph.h
@@ -20,6 +20,7 @@
#include <ImsMediaDefine.h>
#include <BaseStreamGraph.h>
#include <AudioConfig.h>
+#include <algorithm> // std::find_if
class AudioStreamGraph : public BaseStreamGraph
{
@@ -49,6 +50,13 @@ public:
mConfig->getRemotePort() == config->getRemotePort());
}
+ template <class T1, class T2>
+ static T1* findGraph(std::list<T1*> list, T2 func)
+ {
+ typename std::list<T1*>::iterator iter = std::find_if(list.begin(), list.end(), func);
+ return iter == list.end() ? nullptr : *iter;
+ }
+
protected:
AudioConfig* mConfig;
};
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraphRtpRx.h b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraphRtpRx.h
index cfc9e55f..78e80a82 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraphRtpRx.h
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/AudioStreamGraphRtpRx.h
@@ -27,6 +27,7 @@ public:
virtual ~AudioStreamGraphRtpRx();
virtual ImsMediaResult create(RtpConfig* config);
virtual ImsMediaResult update(RtpConfig* config);
+ virtual ImsMediaResult start();
};
#endif \ No newline at end of file
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..753774f1 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
@@ -27,13 +27,14 @@ public:
virtual ~AudioStreamGraphRtpTx();
virtual ImsMediaResult create(RtpConfig* config);
virtual ImsMediaResult update(RtpConfig* config);
+ virtual ImsMediaResult start();
/**
* @brief Create a graph for send dtmf digit to network
*
* @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 <ImsMediaDefine.h>
-#include <BaseNode.h>
-
-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/audio/nodes/IAudioSourceNode.h b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/nodes/IAudioSourceNode.h
index e96ac672..794e655e 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/nodes/IAudioSourceNode.h
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/include/audio/nodes/IAudioSourceNode.h
@@ -66,6 +66,7 @@ public:
kEvsBandwidth mEvsBandwidth;
int8_t mSamplingRate;
int8_t mEvsChAwOffset;
+ int32_t mMediaDirection;
};
#endif
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<NODE_ID_PAIR> 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)
{
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaCamera.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaCamera.cpp
index d2fa1e8b..36a4f1eb 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaCamera.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaCamera.cpp
@@ -725,12 +725,11 @@ void ImsMediaCamera::EnumerateCamera()
bool ImsMediaCamera::GetSensorOrientation(const int cameraId, int32_t* facing, int32_t* angle)
{
- if (!mManager)
+ if (!mManager || facing == nullptr || angle == nullptr)
{
return false;
}
- camera_status_t status;
ACameraMetadata* metadataObj;
uint32_t idx = 0;
@@ -739,8 +738,8 @@ bool ImsMediaCamera::GetSensorOrientation(const int cameraId, int32_t* facing, i
{
if (idx == cameraId)
{
- status = ACameraManager_getCameraCharacteristics(
- mManager, gCameraIds[(it->second).mId].mId.c_str(), &metadataObj);
+ camera_status_t status = ACameraManager_getCameraCharacteristics(
+ mManager, (it->second).mId.c_str(), &metadataObj);
if (status == ACAMERA_OK)
{
ACameraMetadata_const_entry face, orientation;
@@ -748,11 +747,10 @@ bool ImsMediaCamera::GetSensorOrientation(const int cameraId, int32_t* facing, i
mCameraFacing = static_cast<int32_t>(face.data.u8[0]);
ACameraMetadata_getConstEntry(
metadataObj, ACAMERA_SENSOR_ORIENTATION, &orientation);
- ACameraMetadata_free(metadataObj);
mCameraOrientation = orientation.data.i32[0];
-
mCameraFacing == 0 ? * facing = kCameraFacingFront : * facing = kCameraFacingRear;
*angle = mCameraOrientation;
+ ACameraMetadata_free(metadataObj);
return true;
}
}
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaVideoSource.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaVideoSource.cpp
index ce4bc83d..c93d99a4 100644
--- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaVideoSource.cpp
+++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/android/ImsMediaVideoSource.cpp
@@ -334,7 +334,11 @@ void ImsMediaVideoSource::Stop()
if (mCodec != nullptr)
{
- AMediaCodec_signalEndOfInputStream(mCodec);
+ if (mRecordingSurface != nullptr)
+ {
+ AMediaCodec_signalEndOfInputStream(mCodec);
+ }
+
AMediaCodec_stop(mCodec);
if (mRecordingSurface != nullptr)
@@ -511,21 +515,16 @@ void ImsMediaVideoSource::processOutputBuffer()
timeInterval = 1000 / mFramerate;
}
- IMLOGD2("[processOutputBuffer] interval[%d] mCameraId[%d]", timeInterval, mCameraId);
+ IMLOGD2("[processOutputBuffer] interval[%d] CameraId[%d]", timeInterval, mCameraId);
for (;;)
{
- uint32_t nCurrTime;
- mMutex.lock();
-
- if (mStopped)
+ if (IsStopped())
{
IMLOGD0("[processOutputBuffer] terminated");
- mMutex.unlock();
break;
}
- mMutex.unlock();
if (mVideoMode == kVideoModePauseImage)
{
EncodePauseImage();
@@ -545,6 +544,11 @@ void ImsMediaVideoSource::processOutputBuffer()
size_t buffCapacity;
uint8_t* buf = AMediaCodec_getOutputBuffer(mCodec, index, &buffCapacity);
+ if (IsStopped())
+ {
+ break;
+ }
+
if (buf != nullptr && buffCapacity > 0)
{
if (mListener != nullptr)
@@ -553,16 +557,13 @@ void ImsMediaVideoSource::processOutputBuffer()
buf + info.offset, info.size, info.presentationTimeUs, info.flags);
}
}
- }
- if (!IsStopped())
- {
AMediaCodec_releaseOutputBuffer(mCodec, index, false);
}
}
else if (index == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED)
{
- IMLOGD0("[processOutputBuffer] Encoder output buffer changed");
+ IMLOGI0("[processOutputBuffer] Encoder output buffer changed");
}
else if (index == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED)
{
@@ -572,7 +573,7 @@ void ImsMediaVideoSource::processOutputBuffer()
}
mFormat = AMediaCodec_getOutputFormat(mCodec);
- IMLOGD1("[processOutputBuffer] Encoder format changed, format[%s]",
+ IMLOGI1("[processOutputBuffer] Encoder format changed, format[%s]",
AMediaFormat_toString(mFormat));
}
else if (index == AMEDIACODEC_INFO_TRY_AGAIN_LATER)
@@ -581,11 +582,11 @@ void ImsMediaVideoSource::processOutputBuffer()
}
else
{
- IMLOGD1("[processOutputBuffer] unexpected index[%d]", index);
+ IMLOGI1("[processOutputBuffer] unexpected index[%d]", index);
}
nextTime += timeInterval;
- nCurrTime = ImsMediaTimer::GetTimeInMilliSeconds();
+ uint32_t nCurrTime = ImsMediaTimer::GetTimeInMilliSeconds();
if (nextTime > nCurrTime)
{
diff --git a/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioSessionTest.cpp b/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioSessionTest.cpp
new file mode 100644
index 00000000..bd4a6010
--- /dev/null
+++ b/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/audio/AudioSessionTest.cpp
@@ -0,0 +1,337 @@
+/**
+ * Copyright (C) 2023 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 <gtest/gtest.h>
+#include <ImsMediaNetworkUtil.h>
+#include <AudioConfig.h>
+#include <AudioSession.h>
+
+using namespace android::telephony::imsmedia;
+
+// RtpConfig
+const int32_t kMediaDirection = RtpConfig::MEDIA_DIRECTION_SEND_RECEIVE;
+const android::String8 kRemoteAddress("127.0.0.1");
+const int32_t kRemotePort = 10000;
+const int8_t kDscp = 0;
+const int8_t kRxPayload = 96;
+const int8_t kTxPayload = 96;
+const int8_t kSamplingRate = 16;
+
+// RtcpConfig
+const android::String8 kCanonicalName("name");
+const int32_t kTransmitPort = 1001;
+const int32_t kIntervalSec = 5;
+const int32_t kRtcpXrBlockTypes = RtcpConfig::FLAG_RTCPXR_STATISTICS_SUMMARY_REPORT_BLOCK |
+ RtcpConfig::FLAG_RTCPXR_VOIP_METRICS_REPORT_BLOCK;
+
+// AudioConfig
+const int8_t kPTimeMillis = 20;
+const int32_t kMaxPtimeMillis = 100;
+const bool kDtxEnabled = true;
+const int32_t kCodecType = AudioConfig::CODEC_AMR_WB;
+const int8_t kDtmfTxPayloadTypeNumber = 100;
+const int8_t kDtmfRxPayloadTypeNumber = 101;
+const int8_t kDtmfsamplingRateKHz = 16;
+
+// AmrParam
+const int32_t kAmrMode = 8;
+const bool kOctetAligned = false;
+const int32_t kMaxRedundancyMillis = 240;
+
+// EvsParam
+const int32_t kEvsBandwidth = EvsParams::EVS_BAND_NONE;
+const int32_t kEvsMode = 8;
+const int8_t kChannelAwareMode = 3;
+const bool kUseHeaderFullOnly = false;
+const int8_t kcodecModeRequest = 15;
+
+class AudioSessionTest : public ::testing::Test
+{
+public:
+ AudioSession* session;
+ AudioConfig config;
+ RtcpConfig rtcp;
+ AmrParams amr;
+ EvsParams evs;
+ int socketRtpFd;
+ int socketRtcpFd;
+
+ AudioSessionTest()
+ {
+ session = nullptr;
+ socketRtpFd = -1;
+ socketRtcpFd = -1;
+ }
+ ~AudioSessionTest() {}
+
+protected:
+ virtual void SetUp() override
+ {
+ rtcp.setCanonicalName(kCanonicalName);
+ rtcp.setTransmitPort(kTransmitPort);
+ rtcp.setIntervalSec(kIntervalSec);
+ rtcp.setRtcpXrBlockTypes(kRtcpXrBlockTypes);
+
+ amr.setAmrMode(kAmrMode);
+ amr.setOctetAligned(kOctetAligned);
+ amr.setMaxRedundancyMillis(kMaxRedundancyMillis);
+
+ evs.setEvsBandwidth(kEvsBandwidth);
+ evs.setEvsMode(kEvsMode);
+ evs.setChannelAwareMode(kChannelAwareMode);
+ evs.setUseHeaderFullOnly(kUseHeaderFullOnly);
+ evs.setCodecModeRequest(kcodecModeRequest);
+
+ config.setMediaDirection(kMediaDirection);
+ config.setRemoteAddress(kRemoteAddress);
+ config.setRemotePort(kRemotePort);
+ config.setRtcpConfig(rtcp);
+ config.setDscp(kDscp);
+ config.setRxPayloadTypeNumber(kRxPayload);
+ config.setTxPayloadTypeNumber(kTxPayload);
+ config.setSamplingRateKHz(kSamplingRate);
+ config.setPtimeMillis(kPTimeMillis);
+ config.setMaxPtimeMillis(kMaxPtimeMillis);
+ config.setDtxEnabled(kDtxEnabled);
+ config.setCodecType(kCodecType);
+ config.setTxDtmfPayloadTypeNumber(kDtmfTxPayloadTypeNumber);
+ config.setRxDtmfPayloadTypeNumber(kDtmfRxPayloadTypeNumber);
+ config.setDtmfsamplingRateKHz(kDtmfsamplingRateKHz);
+ config.setAmrParams(amr);
+ config.setEvsParams(evs);
+
+ session = new AudioSession();
+ const char testIp[] = "127.0.0.1";
+ unsigned int testPortRtp = 30000;
+ socketRtpFd = ImsMediaNetworkUtil::openSocket(testIp, testPortRtp, AF_INET);
+ EXPECT_NE(socketRtpFd, -1);
+ unsigned int testPortRtcp = 30001;
+ socketRtcpFd = ImsMediaNetworkUtil::openSocket(testIp, testPortRtcp, AF_INET);
+ EXPECT_NE(socketRtcpFd, -1);
+ }
+
+ virtual void TearDown() override
+ {
+ if (session != nullptr)
+ {
+ delete session;
+ }
+
+ if (socketRtpFd != -1)
+ {
+ ImsMediaNetworkUtil::closeSocket(socketRtpFd);
+ }
+
+ if (socketRtcpFd != -1)
+ {
+ ImsMediaNetworkUtil::closeSocket(socketRtcpFd);
+ }
+ }
+};
+
+TEST_F(AudioSessionTest, testLocalEndpoint)
+{
+ EXPECT_EQ(session->getState(), kSessionStateOpened);
+ EXPECT_EQ(session->getLocalRtpFd(), -1);
+ EXPECT_EQ(session->getLocalRtcpFd(), -1);
+
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ EXPECT_EQ(session->getLocalRtpFd(), socketRtpFd);
+ EXPECT_EQ(session->getLocalRtcpFd(), socketRtcpFd);
+}
+
+TEST_F(AudioSessionTest, testStartGraphFail)
+{
+ EXPECT_EQ(session->startGraph(nullptr), RESULT_INVALID_PARAM);
+ EXPECT_EQ(session->getState(), kSessionStateOpened);
+
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ config.setRemoteAddress(android::String8(""));
+ EXPECT_EQ(session->startGraph(&config), RESULT_INVALID_PARAM);
+ EXPECT_EQ(session->getState(), kSessionStateOpened);
+}
+
+TEST_F(AudioSessionTest, testStartGraphAndUpdate)
+{
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+
+ EXPECT_TRUE(session->IsGraphAlreadyExist(&config));
+
+ // normal update
+ config.setTxPayloadTypeNumber(120);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+
+ // create one more graph
+ config.setRemotePort(20000);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 2);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 2);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 2);
+
+ config.setRemotePort(30000);
+ EXPECT_FALSE(session->IsGraphAlreadyExist(&config));
+}
+
+TEST_F(AudioSessionTest, testStartGraphSendOnly)
+{
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ config.setMediaDirection(RtpConfig::MEDIA_DIRECTION_SEND_ONLY);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateSending);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+}
+
+TEST_F(AudioSessionTest, testStartGraphReceiveOnly)
+{
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ config.setMediaDirection(RtpConfig::MEDIA_DIRECTION_RECEIVE_ONLY);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateReceiving);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+}
+
+TEST_F(AudioSessionTest, testStartGraphInactive)
+{
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ config.setMediaDirection(RtpConfig::MEDIA_DIRECTION_INACTIVE);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateSuspended);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+}
+
+TEST_F(AudioSessionTest, testStartAndHoldResumeWithSameRemoteAddress)
+{
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+
+ config.setMediaDirection(RtpConfig::MEDIA_DIRECTION_INACTIVE);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateSuspended);
+
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+}
+
+TEST_F(AudioSessionTest, testStartAndHoldResumeWithDifferentRemoteAddress)
+{
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+
+ config.setRemotePort(20000);
+ config.setMediaDirection(RtpConfig::MEDIA_DIRECTION_INACTIVE);
+ EXPECT_EQ(session->addGraph(&config, false), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateSuspended);
+
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+
+ config.setRemotePort(30000);
+ config.setMediaDirection(RtpConfig::MEDIA_DIRECTION_SEND_RECEIVE);
+ EXPECT_EQ(session->addGraph(&config, false), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+}
+
+TEST_F(AudioSessionTest, testAddGraphWithoutStartGraph)
+{
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ config.setMediaDirection(RtpConfig::MEDIA_DIRECTION_INACTIVE);
+ EXPECT_EQ(session->addGraph(&config, false), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateSuspended);
+
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+
+ config.setRemotePort(20000);
+ config.setMediaDirection(RtpConfig::MEDIA_DIRECTION_SEND_ONLY);
+ EXPECT_EQ(session->addGraph(&config, false), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateSending);
+
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+
+ config.setRemotePort(30000);
+ config.setMediaDirection(RtpConfig::MEDIA_DIRECTION_RECEIVE_ONLY);
+ EXPECT_EQ(session->addGraph(&config, true), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateReceiving);
+
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 2);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 2);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 2);
+}
+
+TEST_F(AudioSessionTest, testStartAddDeleteConfirmGraph)
+{
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+
+ config.setRemotePort(20000);
+ EXPECT_EQ(session->addGraph(&config, true), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 2);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 2);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 2);
+
+ EXPECT_EQ(session->confirmGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+}
+
+TEST_F(AudioSessionTest, testStartAndAddWithRtcpOff)
+{
+ session->setLocalEndPoint(socketRtpFd, socketRtcpFd);
+ EXPECT_EQ(session->startGraph(&config), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+
+ config.setRemotePort(20000);
+ EXPECT_EQ(session->addGraph(&config, false), RESULT_SUCCESS);
+ EXPECT_EQ(session->getState(), kSessionStateActive);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpTx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtpRx), 1);
+ EXPECT_EQ(session->getGraphSize(kStreamRtcp), 1);
+} \ No newline at end of file
diff --git a/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoStreamGraphRtpTxTest.cpp b/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoStreamGraphRtpTxTest.cpp
index 281410e9..332041c4 100644
--- a/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoStreamGraphRtpTxTest.cpp
+++ b/tests/native/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoStreamGraphRtpTxTest.cpp
@@ -123,13 +123,6 @@ protected:
1, &previewReader),
AMEDIA_OK);
AImageReader_getWindow(previewReader, &previewSurface);
-
- /*
- * TODO: Below line will skip all test under this class, need to remove
- * to include it in atets
- */
-
- GTEST_SKIP();
}
virtual void TearDown() override