VT: Recorder gets payload type value from param
Removes hardcoded payload type in ARTPWriter.
A payload type will be assigned dynamically by an
upper layer as per SDP negotation.
Merged-in: I7c6f244c753c84a7954261b1c37292083ab5996a
Change-Id: I7c6f244c753c84a7954261b1c37292083ab5996a
Signed-off-by: Somraj Mani <som.mani@samsung.com>
Signed-off-by: Kim Sungyeon <sy85.kim@samsung.com>
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 1282287..31238bc 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -825,6 +825,13 @@
return OK;
}
+status_t StagefrightRecorder::setParamPayloadType(int32_t payloadType) {
+ ALOGV("setParamPayloadType: %x", payloadType);
+
+ mPayloadType = payloadType;
+ return OK;
+}
+
status_t StagefrightRecorder::setParameter(
const String8 &key, const String8 &value) {
ALOGV("setParameter: key (%s) => value (%s)", key.string(), value.string());
@@ -954,6 +961,11 @@
selfID = static_cast<int32_t>(temp);
return setParamSelfID(selfID);
}
+ } else if (key == "rtp-param-payload-type") {
+ int32_t payloadType;
+ if (safe_strtoi32(value.string(), &payloadType)) {
+ return setParamPayloadType(payloadType);
+ }
} else {
ALOGE("setParameter: failed to find key %s", key.string());
}
@@ -1121,6 +1133,7 @@
int64_t startTimeUs = systemTime() / 1000;
meta->setInt64(kKeyTime, startTimeUs);
meta->setInt32(kKeySelfID, mSelfID);
+ meta->setInt32(kKeyPayloadType, mPayloadType);
status = mWriter->start(meta.get());
break;
}
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index 2d3070e..99b0584 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -143,6 +143,7 @@
int32_t mLocalPort;
int32_t mRemotePort;
int32_t mSelfID;
+ int32_t mPayloadType;
int64_t mDurationRecordedUs;
int64_t mStartedRecordingUs;
@@ -229,6 +230,7 @@
status_t setParamRtpRemoteIp(const String8 &remoteIp);
status_t setParamRtpRemotePort(int32_t remotePort);
status_t setParamSelfID(int32_t selfID);
+ status_t setParamPayloadType(int32_t payloadType);
void clipVideoBitRate();
void clipVideoFrameRate();
void clipVideoFrameWidth();
diff --git a/media/libstagefright/include/media/stagefright/MetaDataBase.h b/media/libstagefright/include/media/stagefright/MetaDataBase.h
index f761db4..53079cf 100644
--- a/media/libstagefright/include/media/stagefright/MetaDataBase.h
+++ b/media/libstagefright/include/media/stagefright/MetaDataBase.h
@@ -250,6 +250,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.
+ kKeyPayloadType = 'pTyp', // int32_t, SDP negotiated payload type.
};
enum {
diff --git a/media/libstagefright/rtsp/ARTPWriter.cpp b/media/libstagefright/rtsp/ARTPWriter.cpp
index 5441d34..5a12b2b 100644
--- a/media/libstagefright/rtsp/ARTPWriter.cpp
+++ b/media/libstagefright/rtsp/ARTPWriter.cpp
@@ -206,6 +206,13 @@
if(params->findInt32(kKeySelfID, &selfID))
mSourceID = selfID;
+ if (mPayloadType == 0)
+ mPayloadType = PT;
+
+ int32_t payloadType = 0;
+ if(params->findInt32(kKeyPayloadType, &payloadType))
+ mPayloadType = payloadType;
+
mMode = INVALID;
if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) {
mMode = H264;
@@ -760,7 +767,7 @@
// The data fits into a single packet
uint8_t *data = buffer->data();
data[0] = 0x80;
- data[1] = (1 << 7) | PT; // M-bit
+ data[1] = (1 << 7) | mPayloadType; // M-bit
data[2] = (mSeqNo >> 8) & 0xff;
data[3] = mSeqNo & 0xff;
data[4] = rtpTime >> 24;
@@ -802,7 +809,7 @@
uint8_t *data = buffer->data();
data[0] = 0x80;
- data[1] = (lastPacket ? (1 << 7) : 0x00) | PT; // M-bit
+ data[1] = (lastPacket ? (1 << 7) : 0x00) | mPayloadType; // M-bit
data[2] = (mSeqNo >> 8) & 0xff;
data[3] = mSeqNo & 0xff;
data[4] = rtpTime >> 24;
@@ -892,9 +899,9 @@
uint8_t *data = buffer->data();
data[0] = 0x80;
if (isSpsPps)
- data[1] = PT; // Marker bit should not be set in case of sps/pps
+ data[1] = mPayloadType; // Marker bit should not be set in case of sps/pps
else
- data[1] = (1 << 7) | PT;
+ data[1] = (1 << 7) | mPayloadType;
data[2] = (mSeqNo >> 8) & 0xff;
data[3] = mSeqNo & 0xff;
data[4] = rtpTime >> 24;
@@ -935,7 +942,7 @@
uint8_t *data = buffer->data();
data[0] = 0x80;
- data[1] = (lastPacket ? (1 << 7) : 0x00) | PT; // M-bit
+ data[1] = (lastPacket ? (1 << 7) : 0x00) | mPayloadType; // M-bit
data[2] = (mSeqNo >> 8) & 0xff;
data[3] = mSeqNo & 0xff;
data[4] = rtpTime >> 24;
@@ -1006,7 +1013,7 @@
uint8_t *data = buffer->data();
data[0] = 0x80;
- data[1] = (lastPacket ? 0x80 : 0x00) | PT; // M-bit
+ data[1] = (lastPacket ? 0x80 : 0x00) | mPayloadType; // M-bit
data[2] = (mSeqNo >> 8) & 0xff;
data[3] = mSeqNo & 0xff;
data[4] = rtpTime >> 24;
@@ -1088,7 +1095,7 @@
// The data fits into a single packet
uint8_t *data = buffer->data();
data[0] = 0x80;
- data[1] = PT;
+ data[1] = mPayloadType;
if (mNumRTPSent == 0) {
// Signal start of talk-spurt.
data[1] |= 0x80; // M-bit
diff --git a/media/libstagefright/rtsp/ARTPWriter.h b/media/libstagefright/rtsp/ARTPWriter.h
index 46df94b..c2268e0 100644
--- a/media/libstagefright/rtsp/ARTPWriter.h
+++ b/media/libstagefright/rtsp/ARTPWriter.h
@@ -95,6 +95,7 @@
MediaBufferBase *mPPSBuf;
uint32_t mSourceID;
+ uint32_t mPayloadType;
uint32_t mSeqNo;
uint32_t mRTPTimeBase;
uint32_t mNumRTPSent;