VT: Player/Recoder gets its SSRC ID from param
UE should have its own SSRC ID when exchange RTP packet.
It is UE level id so Rx/Tx should have same ID.
Recorder/Player are implemented separately and didn't have any method to sync the ID.
So upper Java Layer would send unique ID as param.
Merged-in: I11248eada31f50d278ab299f57ee42d9a3ce79be
Change-Id: I11248eada31f50d278ab299f57ee42d9a3ce79be
Signed-off-by: Kim Sungyeon <sy85.kim@samsung.com>
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 56584b9..1282287 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -818,6 +818,13 @@
return OK;
}
+status_t StagefrightRecorder::setParamSelfID(int32_t selfID) {
+ ALOGV("setParamSelfID: %x", selfID);
+
+ mSelfID = selfID;
+ return OK;
+}
+
status_t StagefrightRecorder::setParameter(
const String8 &key, const String8 &value) {
ALOGV("setParameter: key (%s) => value (%s)", key.string(), value.string());
@@ -940,6 +947,13 @@
if (safe_strtoi32(value.string(), &remotePort)) {
return setParamRtpRemotePort(remotePort);
}
+ } else if (key == "rtp-param-self-id") {
+ int32_t selfID;
+ int64_t temp;
+ if (safe_strtoi64(value.string(), &temp)) {
+ selfID = static_cast<int32_t>(temp);
+ return setParamSelfID(selfID);
+ }
} else {
ALOGE("setParameter: failed to find key %s", key.string());
}
@@ -1106,6 +1120,7 @@
sp<MetaData> meta = new MetaData;
int64_t startTimeUs = systemTime() / 1000;
meta->setInt64(kKeyTime, startTimeUs);
+ meta->setInt32(kKeySelfID, mSelfID);
status = mWriter->start(meta.get());
break;
}
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index 5f02e00..2d3070e 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -142,6 +142,7 @@
String8 mRemoteIp;
int32_t mLocalPort;
int32_t mRemotePort;
+ int32_t mSelfID;
int64_t mDurationRecordedUs;
int64_t mStartedRecordingUs;
@@ -227,6 +228,7 @@
status_t setParamRtpLocalPort(int32_t localPort);
status_t setParamRtpRemoteIp(const String8 &remoteIp);
status_t setParamRtpRemotePort(int32_t remotePort);
+ status_t setParamSelfID(int32_t selfID);
void clipVideoBitRate();
void clipVideoFrameRate();
void clipVideoFrameWidth();
diff --git a/media/libmediaplayerservice/nuplayer/RTPSource.cpp b/media/libmediaplayerservice/nuplayer/RTPSource.cpp
index 9bb4cb7..4b1b164 100644
--- a/media/libmediaplayerservice/nuplayer/RTPSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/RTPSource.cpp
@@ -109,6 +109,7 @@
notify->setSize("trackIndex", i);
// 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);
info->mRTPSocket = sockRtp;
info->mRTCPSocket = sockRtcp;
@@ -662,6 +663,8 @@
} else if (key == "rtp-param-rtp-timeout") {
} else if (key == "rtp-param-rtcp-timeout") {
} else if (key == "rtp-param-time-scale") {
+ } else if (key == "rtp-param-self-id") {
+ info->mSelfID = atoi(value);
}
return OK;
diff --git a/media/libmediaplayerservice/nuplayer/RTPSource.h b/media/libmediaplayerservice/nuplayer/RTPSource.h
index 6c618ec..e3df2a4 100644
--- a/media/libmediaplayerservice/nuplayer/RTPSource.h
+++ b/media/libmediaplayerservice/nuplayer/RTPSource.h
@@ -112,6 +112,9 @@
int32_t mTimeScale;
int32_t mAS;
+ /* Unique ID indicates itself */
+ uint32_t mSelfID;
+
/* a copy of TrackInfo in RTSPSource */
sp<AnotherPacketSource> mSource;
uint32_t mRTPTime;
diff --git a/media/libstagefright/include/media/stagefright/MetaDataBase.h b/media/libstagefright/include/media/stagefright/MetaDataBase.h
index d455093..f761db4 100644
--- a/media/libstagefright/include/media/stagefright/MetaDataBase.h
+++ b/media/libstagefright/include/media/stagefright/MetaDataBase.h
@@ -249,6 +249,7 @@
kKeyEmptyTrackMalFormed = 'nemt', // bool (int32_t)
kKeySps = 'sSps', // int32_t, indicates that a buffer is sps.
kKeyPps = 'sPps', // int32_t, indicates that a buffer is pps.
+ kKeySelfID = 'sfid', // int32_t, source ID to identify itself on RTP protocol.
};
enum {
diff --git a/media/libstagefright/rtsp/ARTPConnection.cpp b/media/libstagefright/rtsp/ARTPConnection.cpp
index 06a9242..2bedc9a 100644
--- a/media/libstagefright/rtsp/ARTPConnection.cpp
+++ b/media/libstagefright/rtsp/ARTPConnection.cpp
@@ -874,6 +874,7 @@
source = new ARTPSource(
srcId, info->mSessionDesc, info->mIndex, info->mNotifyMsg);
+ source->setSelfID(mSelfID);
info->mSources.add(srcId, source);
} else {
source = info->mSources.valueAt(index);
@@ -889,6 +890,10 @@
msg->post();
}
+void ARTPConnection::setSelfID(const uint32_t selfID) {
+ mSelfID = selfID;
+}
+
void ARTPConnection::onInjectPacket(const sp<AMessage> &msg) {
int32_t index;
CHECK(msg->findInt32("index", &index));
diff --git a/media/libstagefright/rtsp/ARTPConnection.h b/media/libstagefright/rtsp/ARTPConnection.h
index f6c14b2..287430e 100644
--- a/media/libstagefright/rtsp/ARTPConnection.h
+++ b/media/libstagefright/rtsp/ARTPConnection.h
@@ -44,6 +44,8 @@
void injectPacket(int index, const sp<ABuffer> &buffer);
+ void setSelfID(const uint32_t selfID);
+
// Creates a pair of UDP datagram sockets bound to adjacent ports
// (the rtpSocket is bound to an even port, the rtcpSocket to the
// next higher port).
@@ -79,6 +81,8 @@
bool mPollEventPending;
int64_t mLastReceiverReportTimeUs;
+ int32_t mSelfID;
+
void onAddStream(const sp<AMessage> &msg);
void onRemoveStream(const sp<AMessage> &msg);
void onPollStreams();
diff --git a/media/libstagefright/rtsp/ARTPSource.cpp b/media/libstagefright/rtsp/ARTPSource.cpp
index e271ac1..c39b4c2 100644
--- a/media/libstagefright/rtsp/ARTPSource.cpp
+++ b/media/libstagefright/rtsp/ARTPSource.cpp
@@ -36,7 +36,7 @@
namespace android {
-static const uint32_t kSourceID = 0xdeadbeef;
+static uint32_t kSourceID = 0xdeadbeef;
ARTPSource::ARTPSource(
uint32_t id,
@@ -321,6 +321,10 @@
buffer->setRange(buffer->offset(), buffer->size() + 32);
}
+void ARTPSource::setSelfID(const uint32_t selfID) {
+ kSourceID = selfID;
+}
+
void ARTPSource::noticeAbandonBuffer(int cnt) {
mNumBuffersReceived -= cnt;
}
diff --git a/media/libstagefright/rtsp/ARTPSource.h b/media/libstagefright/rtsp/ARTPSource.h
index 12de18d..40f08f4 100644
--- a/media/libstagefright/rtsp/ARTPSource.h
+++ b/media/libstagefright/rtsp/ARTPSource.h
@@ -45,6 +45,7 @@
void addReceiverReport(const sp<ABuffer> &buffer);
void addFIR(const sp<ABuffer> &buffer);
+ void setSelfID(const uint32_t selfID);
void noticeAbandonBuffer(int cnt=1);
diff --git a/media/libstagefright/rtsp/ARTPWriter.cpp b/media/libstagefright/rtsp/ARTPWriter.cpp
index 65c8189..5441d34 100644
--- a/media/libstagefright/rtsp/ARTPWriter.cpp
+++ b/media/libstagefright/rtsp/ARTPWriter.cpp
@@ -182,14 +182,15 @@
return (mFlags & kFlagEOS) != 0;
}
-status_t ARTPWriter::start(MetaData * /* params */) {
+status_t ARTPWriter::start(MetaData * params) {
Mutex::Autolock autoLock(mLock);
if (mFlags & kFlagStarted) {
return INVALID_OPERATION;
}
mFlags &= ~kFlagEOS;
- mSourceID = rand();
+ if (mSourceID == 0)
+ mSourceID = rand();
mSeqNo = UniformRand(65536);
mRTPTimeBase = 0;
mNumRTPSent = 0;
@@ -201,6 +202,10 @@
const char *mime;
CHECK(mSource->getFormat()->findCString(kKeyMIMEType, &mime));
+ int32_t selfID = 0;
+ if(params->findInt32(kKeySelfID, &selfID))
+ mSourceID = selfID;
+
mMode = INVALID;
if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
mMode = H264;