Merge "VT: Retain RTP sequence number between SFR stop and start"
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 8e04508..8b4e2ed 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -119,6 +119,7 @@
mVideoSource(VIDEO_SOURCE_LIST_END),
mRTPCVOExtMap(-1),
mRTPCVODegrees(0),
+ mLastSeqNo(0),
mStarted(false),
mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
mDeviceCallbackEnabled(false),
@@ -1474,7 +1475,7 @@
mVideoEncoderSource = source;
}
- mWriter = new ARTPWriter(mOutputFd, mLocalIp, mLocalPort, mRemoteIp, mRemotePort);
+ mWriter = new ARTPWriter(mOutputFd, mLocalIp, mLocalPort, mRemoteIp, mRemotePort, mLastSeqNo);
mWriter->addSource(source);
mWriter->setListener(mListener);
@@ -2274,6 +2275,7 @@
if (mWriter != NULL) {
err = mWriter->stop();
+ mLastSeqNo = mWriter->getSequenceNum();
mWriter.clear();
}
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index eb956b0..c2638cd 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -147,6 +147,7 @@
int32_t mPayloadType;
int32_t mRTPCVOExtMap;
int32_t mRTPCVODegrees;
+ uint32_t mLastSeqNo;
int64_t mDurationRecordedUs;
int64_t mStartedRecordingUs;
diff --git a/media/libstagefright/include/media/stagefright/MediaWriter.h b/media/libstagefright/include/media/stagefright/MediaWriter.h
index 07af687..21f60c1 100644
--- a/media/libstagefright/include/media/stagefright/MediaWriter.h
+++ b/media/libstagefright/include/media/stagefright/MediaWriter.h
@@ -56,6 +56,7 @@
virtual status_t setNextFd(int /*fd*/) { return INVALID_OPERATION; }
virtual void updateCVODegrees(int32_t /*cvoDegrees*/) {}
virtual void updatePayloadType(int32_t /*payloadType*/) {}
+ virtual uint32_t getSequenceNum() { return 0; }
protected:
virtual ~MediaWriter() {}
diff --git a/media/libstagefright/rtsp/ARTPWriter.cpp b/media/libstagefright/rtsp/ARTPWriter.cpp
index 77056a4..546f4cb 100644
--- a/media/libstagefright/rtsp/ARTPWriter.cpp
+++ b/media/libstagefright/rtsp/ARTPWriter.cpp
@@ -113,7 +113,7 @@
}
ARTPWriter::ARTPWriter(int fd, String8& localIp, int localPort, String8& remoteIp,
- int remotePort)
+ int remotePort, uint32_t seqNo)
: mFlags(0),
mFd(dup(fd)),
mLooper(new ALooper),
@@ -129,6 +129,8 @@
mSPSBuf = NULL;
mPPSBuf = NULL;
+ mSeqNo = seqNo;
+
#if LOG_TO_FILES
mRTPFd = open(
"/data/misc/rtpout.bin",
@@ -192,7 +194,8 @@
mFlags &= ~kFlagEOS;
if (mSourceID == 0)
mSourceID = rand();
- mSeqNo = UniformRand(65536);
+ if (mSeqNo == 0)
+ mSeqNo = UniformRand(65536);
mRTPTimeBase = 0;
mNumRTPSent = 0;
mNumRTPOctetsSent = 0;
@@ -336,7 +339,9 @@
switch (msg->what()) {
case kWhatStart:
{
- CHECK_EQ(mSource->start(), (status_t)OK);
+ sp<MetaData> meta = new MetaData();
+ meta->setInt64(kKeyTime, 10ll);
+ CHECK_EQ(mSource->start(meta.get()), (status_t)OK);
#if 0
if (mMode == H264) {
@@ -1170,6 +1175,10 @@
mPayloadType = payloadType;
}
+uint32_t ARTPWriter::getSequenceNum() {
+ return mSeqNo;
+}
+
static size_t getFrameSize(bool isWide, unsigned FT) {
static const size_t kFrameSizeNB[8] = {
95, 103, 118, 134, 148, 159, 204, 244
diff --git a/media/libstagefright/rtsp/ARTPWriter.h b/media/libstagefright/rtsp/ARTPWriter.h
index 5419cdf..4ed0812 100644
--- a/media/libstagefright/rtsp/ARTPWriter.h
+++ b/media/libstagefright/rtsp/ARTPWriter.h
@@ -37,7 +37,8 @@
struct ARTPWriter : public MediaWriter {
explicit ARTPWriter(int fd);
explicit ARTPWriter(int fd, String8& localIp, int localPort,
- String8& remoteIp, int remotePort);
+ String8& remoteIp, int remotePort,
+ uint32_t seqNo);
virtual status_t addSource(const sp<MediaSource> &source);
virtual bool reachedEOS();
@@ -46,6 +47,7 @@
virtual status_t pause();
void updateCVODegrees(int32_t cvoDegrees);
void updatePayloadType(int32_t payloadType);
+ uint32_t getSequenceNum();
virtual void onMessageReceived(const sp<AMessage> &msg);
virtual void setTMMBNInfo(uint32_t opponentID, uint32_t bitrate);