VT: Added an interface to set JitterBufferTime.
Jitter buffer time can be adjusted according to packet jitter
situation. Jitter buffer time will be decided by upper layer
and then RTP Assemblers just apply a value of jitter time.
Added an interface to set video-param-jitter-buffer-time.
- Minimum jitter buffer time = 40ms.
- Maximum jitter buffer time = 3000ms.
Bug: 144795638
Bug: 165061754
Change-Id: Idc6ef462a91aab87c3f0ad46c504ebf0b89c36c4
Signed-off-by: Byeongjo Park <bjo.park@samsung.com>
diff --git a/media/libmediaplayerservice/nuplayer/RTPSource.cpp b/media/libmediaplayerservice/nuplayer/RTPSource.cpp
index a6601cd..3c3ad86 100644
--- a/media/libmediaplayerservice/nuplayer/RTPSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/RTPSource.cpp
@@ -114,6 +114,7 @@
// index(i) should be started from 1. 0 is reserved for [root]
mRTPConn->addStream(sockRtp, sockRtcp, desc, i + 1, notify, false);
mRTPConn->setSelfID(info->mSelfID);
+ mRTPConn->setJbTime((info->mJbTime <= 3000 && info->mJbTime >= 40) ? info->mJbTime : 300);
mRTPConn->setMinMaxBitrate(kMinVideoBitrate, info->mAS * 1000 /* kbps */);
info->mRTPSocket = sockRtp;
@@ -656,6 +657,7 @@
newTrackInfo.mIsAudio = isAudioKey;
mTracks.push(newTrackInfo);
info = &mTracks.editTop();
+ info->mJbTime = 300;
}
if (key == "rtp-param-mime-type") {
@@ -698,6 +700,8 @@
} else if (key == "rtp-param-set-socket-network") {
int64_t networkHandle = atoll(value);
setSocketNetwork(networkHandle);
+ } else if (key == "rtp-param-jitter-buffer-time") {
+ info->mJbTime = atoi(value);
}
return OK;
diff --git a/media/libmediaplayerservice/nuplayer/RTPSource.h b/media/libmediaplayerservice/nuplayer/RTPSource.h
index 5085a7e..e95271e 100644
--- a/media/libmediaplayerservice/nuplayer/RTPSource.h
+++ b/media/libmediaplayerservice/nuplayer/RTPSource.h
@@ -123,6 +123,8 @@
int32_t mTimeScale;
int32_t mAS;
+ /* RTP jitter buffer time in millsecond */
+ uint32_t mJbTime;
/* Unique ID indicates itself */
uint32_t mSelfID;
/* extmap:<value> for CVO will be set to here */
diff --git a/media/libstagefright/rtsp/AAVCAssembler.cpp b/media/libstagefright/rtsp/AAVCAssembler.cpp
index 0164040..af82533 100644
--- a/media/libstagefright/rtsp/AAVCAssembler.cpp
+++ b/media/libstagefright/rtsp/AAVCAssembler.cpp
@@ -59,7 +59,7 @@
int64_t playedTime = nowTime - startTime;
int32_t playedTimeRtp = source->mFirstRtpTime +
(((uint32_t)playedTime) * (source->mClockRate / 1000));
- const int32_t jitterTime = source->mClockRate / 5; // 200ms
+ const int32_t jitterTime = (int32_t)(source->mClockRate / ((float)1000 / (source->mJbTime)));
int32_t expiredTimeInJb = rtpTime + jitterTime;
bool isExpired = expiredTimeInJb <= (playedTimeRtp);
bool isTooLate200 = expiredTimeInJb < (playedTimeRtp - jitterTime);
diff --git a/media/libstagefright/rtsp/ARTPConnection.cpp b/media/libstagefright/rtsp/ARTPConnection.cpp
index 1346c9a..ccb65ca 100644
--- a/media/libstagefright/rtsp/ARTPConnection.cpp
+++ b/media/libstagefright/rtsp/ARTPConnection.cpp
@@ -78,7 +78,8 @@
: mFlags(flags),
mPollEventPending(false),
mLastReceiverReportTimeUs(-1),
- mLastBitrateReportTimeUs(-1) {
+ mLastBitrateReportTimeUs(-1),
+ mJbTime(300) {
}
ARTPConnection::~ARTPConnection() {
@@ -1013,6 +1014,7 @@
srcId, info->mSessionDesc, info->mIndex, info->mNotifyMsg);
source->setSelfID(mSelfID);
+ source->setJbTime(mJbTime > 0 ? mJbTime : 300);
source->setMinMaxBitrate(mMinBitrate, mMaxBitrate);
info->mSources.add(srcId, source);
} else {
@@ -1033,6 +1035,10 @@
mSelfID = selfID;
}
+void ARTPConnection::setJbTime(const uint32_t jbTime) {
+ mJbTime = jbTime;
+}
+
void ARTPConnection::setMinMaxBitrate(int32_t min, int32_t max) {
mMinBitrate = min;
mMaxBitrate = max;
diff --git a/media/libstagefright/rtsp/ARTPConnection.h b/media/libstagefright/rtsp/ARTPConnection.h
index 712eec5..f3ade86 100644
--- a/media/libstagefright/rtsp/ARTPConnection.h
+++ b/media/libstagefright/rtsp/ARTPConnection.h
@@ -46,6 +46,7 @@
void injectPacket(int index, const sp<ABuffer> &buffer);
void setSelfID(const uint32_t selfID);
+ void setJbTime(const uint32_t jbTime);
void setMinMaxBitrate(int32_t min, int32_t max);
// Creates a pair of UDP datagram sockets bound to adjacent ports
@@ -88,6 +89,9 @@
int32_t mMinBitrate;
int32_t mMaxBitrate;
+
+ uint32_t mJbTime;
+
int32_t mCumulativeBytes;
void onAddStream(const sp<AMessage> &msg);
diff --git a/media/libstagefright/rtsp/ARTPSource.cpp b/media/libstagefright/rtsp/ARTPSource.cpp
index bbe9d94..202e5d6 100644
--- a/media/libstagefright/rtsp/ARTPSource.cpp
+++ b/media/libstagefright/rtsp/ARTPSource.cpp
@@ -46,6 +46,7 @@
mFirstRtpTime(0),
mFirstSysTime(0),
mClockRate(0),
+ mJbTime(300), // default jitter buffer time is 300ms.
mID(id),
mHighestSeqNumber(0),
mPrevExpected(0),
@@ -373,6 +374,10 @@
kSourceID = selfID;
}
+void ARTPSource::setJbTime(const uint32_t jbTime) {
+ mJbTime = jbTime;
+}
+
void ARTPSource::setMinMaxBitrate(int32_t min, int32_t max) {
mQualManager.setMinMaxBitrate(min, max);
}
diff --git a/media/libstagefright/rtsp/ARTPSource.h b/media/libstagefright/rtsp/ARTPSource.h
index 652e753..0d92720 100644
--- a/media/libstagefright/rtsp/ARTPSource.h
+++ b/media/libstagefright/rtsp/ARTPSource.h
@@ -49,6 +49,7 @@
void addTMMBR(const sp<ABuffer> &buffer);
uint32_t getSelfID();
void setSelfID(const uint32_t selfID);
+ void setJbTime(const uint32_t jbTime);
void setMinMaxBitrate(int32_t min, int32_t max);
void setBitrateData(int32_t bitrate, int64_t time);
void setTargetBitrate();
@@ -63,6 +64,8 @@
int64_t mFirstSysTime;
int32_t mClockRate;
+ uint32_t mJbTime;
+
private:
uint32_t mID;