diff options
Diffstat (limited to 'service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video')
5 files changed, 48 insertions, 10 deletions
diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoManager.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoManager.cpp index 9d98be37..a52db04a 100644 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoManager.cpp +++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoManager.cpp @@ -407,12 +407,7 @@ void VideoManager::ResponseHandler::processEvent( // TODO : add implementation break; case kVideoMediaInactivityInd: - parcel.writeInt32(event); - parcel.writeInt32(static_cast<int>(paramA)); // type - parcel.writeInt32(static_cast<int>(paramB)); // duration - VideoManager::getInstance()->sendResponse(sessionId, parcel); - break; - case kVideoPacketLossInd: + case kVideoBitrateInd: parcel.writeInt32(event); parcel.writeInt32(static_cast<int>(paramA)); VideoManager::getInstance()->sendResponse(sessionId, parcel); diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoSession.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoSession.cpp index 074e37cf..ba43d0a0 100644 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoSession.cpp +++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoSession.cpp @@ -106,6 +106,7 @@ ImsMediaResult VideoSession::startGraph(RtpConfig* config) if (mGraphRtpTx != nullptr) { + mGraphRtpTx->setMediaQualityThreshold(&mThreshold); ret = mGraphRtpTx->update(config); if (ret != RESULT_SUCCESS) @@ -135,6 +136,7 @@ ImsMediaResult VideoSession::startGraph(RtpConfig* config) if (pConfig->getMediaDirection() == RtpConfig::MEDIA_DIRECTION_SEND_ONLY || pConfig->getMediaDirection() == RtpConfig::MEDIA_DIRECTION_SEND_RECEIVE) { + mGraphRtpTx->setMediaQualityThreshold(&mThreshold); ret = mGraphRtpTx->start(); } } @@ -265,6 +267,10 @@ void VideoSession::onEvent(int32_t type, uint64_t param1, uint64_t param2) ImsMediaEventHandler::SendEvent( "VIDEO_RESPONSE_EVENT", kVideoDataUsageInd, mSessionId, param1, param2); break; + case kImsMediaEventNotifyVideoLowestBitrate: + ImsMediaEventHandler::SendEvent( + "VIDEO_RESPONSE_EVENT", kVideoBitrateInd, mSessionId, param1, param2); + break; case kRequestVideoCvoUpdate: case kRequestVideoBitrateChange: case kRequestVideoIdrFrame: diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoStreamGraphRtpTx.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoStreamGraphRtpTx.cpp index 71a6f050..bc7c7dd0 100644 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoStreamGraphRtpTx.cpp +++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/VideoStreamGraphRtpTx.cpp @@ -234,6 +234,23 @@ ImsMediaResult VideoStreamGraphRtpTx::start() return RESULT_SUCCESS; } +bool VideoStreamGraphRtpTx::setMediaQualityThreshold(MediaQualityThreshold* threshold) +{ + if (threshold != nullptr) + { + BaseNode* node = findNode(kNodeIdVideoSource); + + if (node != nullptr) + { + IVideoSourceNode* source = reinterpret_cast<IVideoSourceNode*>(node); + source->SetBitrateThreshold(threshold->getVideoBitrateBps()); + return true; + } + } + + return false; +} + void VideoStreamGraphRtpTx::setSurface(ANativeWindow* surface) { IMLOGI1("[setSurface] state[%d]", mGraphState); 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 591b6d05..38b71771 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 @@ -448,14 +448,14 @@ void ImsMediaVideoSource::onCameraFrame(AImage* pImage) processOutputBuffer(); } -void ImsMediaVideoSource::changeBitrate(const uint32_t bitrate) +bool ImsMediaVideoSource::changeBitrate(const uint32_t bitrate) { IMLOGD1("[changeBitrate] bitrate[%d]", bitrate); std::lock_guard<std::mutex> guard(mMutex); if (mStopped) { - return; + return false; } AMediaFormat* params = AMediaFormat_new(); @@ -465,7 +465,10 @@ void ImsMediaVideoSource::changeBitrate(const uint32_t bitrate) if (status != AMEDIA_OK) { IMLOGE1("[changeBitrate] error[%d]", status); + return false; } + + return true; } void ImsMediaVideoSource::requestIdrFrame() diff --git a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/nodes/IVideoSourceNode.cpp b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/nodes/IVideoSourceNode.cpp index a54dc377..c95f6240 100644 --- a/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/nodes/IVideoSourceNode.cpp +++ b/service/src/com/android/telephony/imsmedia/lib/libimsmedia/core/video/nodes/IVideoSourceNode.cpp @@ -45,6 +45,8 @@ IVideoSourceNode::IVideoSourceNode(BaseSessionCallback* callback) : mImagePath = ""; mDeviceOrientation = 0; mWindow = nullptr; + mMinBitrateThreshold = 0; + mBitrateNotified = false; } IVideoSourceNode::~IVideoSourceNode() {} @@ -83,12 +85,13 @@ ImsMediaResult IVideoSourceNode::Start() mVideoSource->SetSurface(mWindow); - if (mVideoSource->Start() == false) + if (!mVideoSource->Start()) { return RESULT_NOT_READY; } mVideoSource->SetDeviceOrientation(mDeviceOrientation); + mBitrateNotified = false; } mNodeState = kNodeStateRunning; @@ -275,6 +278,12 @@ void IVideoSourceNode::OnUplinkEvent( } } +void IVideoSourceNode::SetBitrateThreshold(int32_t bitrate) +{ + IMLOGD1("[SetBitrateThreshold] bitrate[%d]", bitrate); + mMinBitrateThreshold = bitrate; +} + void IVideoSourceNode::OnEvent(int32_t type, int32_t param1, int32_t param2) { IMLOGD3("[OnEvent] type[%d], param1[%d], param2[%d]", type, param1, param2); @@ -296,7 +305,15 @@ void IVideoSourceNode::OnEvent(int32_t type, int32_t param1, int32_t param2) case kRequestVideoBitrateChange: if (mVideoSource != nullptr) { - mVideoSource->changeBitrate(param1); + if (mVideoSource->changeBitrate(param1)) + { + if (mMinBitrateThreshold != 0 && param1 <= mMinBitrateThreshold && + mCallback != nullptr && !mBitrateNotified) + { + mCallback->SendEvent(kImsMediaEventNotifyVideoLowestBitrate, param1); + mBitrateNotified = true; + } + } } break; case kRequestVideoIdrFrame: |