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.
Bug: 121230209
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 981109e..048cc11 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -815,6 +815,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());
@@ -937,6 +944,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());
}
@@ -1103,6 +1117,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 8ee6598..1aafda7 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 c9084f0..121e3fd 100644
--- a/media/libstagefright/include/media/stagefright/MetaDataBase.h
+++ b/media/libstagefright/include/media/stagefright/MetaDataBase.h
@@ -244,6 +244,7 @@
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 1b08608..c8c7d68 100644
--- a/media/libstagefright/rtsp/ARTPConnection.cpp
+++ b/media/libstagefright/rtsp/ARTPConnection.cpp
@@ -867,6 +867,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);
@@ -882,6 +883,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 697e02c..eef26ac 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,
@@ -315,6 +315,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;