VT: SFR: bind socket to specific network.
This will call an API of android_setsocknetwork().
"rtp-param-set-socket-network" is added to update routing table
from media engine of android.
RTP/RTCP sockets will be bound to the networkhandle provided
through the above parameter.
This patch is effected only for Tx(StagefrightRecorder) session.
Rx(NuPlayer) is not implemented yet.
Bug: 121230209
Change-Id: I5443e2071906576783db995421f997af5bc84424
Signed-off-by: Byeongjo Park <bjo.park@samsung.com>
diff --git a/media/libmediaplayerservice/Android.bp b/media/libmediaplayerservice/Android.bp
index 5301f5c..902d846 100644
--- a/media/libmediaplayerservice/Android.bp
+++ b/media/libmediaplayerservice/Android.bp
@@ -16,6 +16,8 @@
"android.hardware.media.c2@1.0",
"android.hardware.media.omx@1.0",
"libbase",
+ "libandroid",
+ "libandroid_net",
"libaudioclient",
"libbinder",
"libcamera_client",
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index fb01206..dd7a503 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -119,6 +119,7 @@
mVideoSource(VIDEO_SOURCE_LIST_END),
mRTPCVOExtMap(-1),
mRTPCVODegrees(0),
+ mRTPSockNetwork(0),
mLastSeqNo(0),
mStarted(false),
mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
@@ -874,6 +875,16 @@
return OK;
}
+status_t StagefrightRecorder::setSocketNetwork(int64_t networkHandle) {
+ ALOGV("setSocketNetwork: %llu", (unsigned long long) networkHandle);
+
+ mRTPSockNetwork = networkHandle;
+ if (mStarted && mOutputFormat == OUTPUT_FORMAT_RTP_AVP) {
+ mWriter->updateSocketNetwork(mRTPSockNetwork);
+ }
+ return OK;
+}
+
status_t StagefrightRecorder::requestIDRFrame() {
status_t ret = BAD_VALUE;
if (mVideoEncoderSource != NULL) {
@@ -1035,6 +1046,11 @@
}
} else if (key == "video-param-request-i-frame") {
return requestIDRFrame();
+ } else if (key == "rtp-param-set-socket-network") {
+ int64_t networkHandle;
+ if (safe_strtoi64(value.string(), &networkHandle)) {
+ return setSocketNetwork(networkHandle);
+ }
} else {
ALOGE("setParameter: failed to find key %s", key.string());
}
@@ -1203,6 +1219,7 @@
meta->setInt64(kKeyTime, startTimeUs);
meta->setInt32(kKeySelfID, mSelfID);
meta->setInt32(kKeyPayloadType, mPayloadType);
+ meta->setInt64(kKeySocketNetwork, mRTPSockNetwork);
if (mRTPCVOExtMap > 0) {
meta->setInt32(kKeyRtpExtMap, mRTPCVOExtMap);
meta->setInt32(kKeyRtpCvoDegrees, mRTPCVODegrees);
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index 02300a0..d68f7de 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -148,6 +148,7 @@
int32_t mPayloadType;
int32_t mRTPCVOExtMap;
int32_t mRTPCVODegrees;
+ int64_t mRTPSockNetwork;
uint32_t mLastSeqNo;
int64_t mDurationRecordedUs;
@@ -240,6 +241,7 @@
status_t setParamPayloadType(int32_t payloadType);
status_t setRTPCVOExtMap(int32_t extmap);
status_t setRTPCVODegrees(int32_t cvoDegrees);
+ status_t setSocketNetwork(int64_t networkHandle);
status_t requestIDRFrame();
void clipVideoBitRate();
void clipVideoFrameRate();