Merge "Adds VPX encoding support for stagefright."
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h
index df1c46b..317b6f0 100644
--- a/include/media/stagefright/ACodec.h
+++ b/include/media/stagefright/ACodec.h
@@ -54,6 +54,8 @@
void signalResume();
void initiateShutdown(bool keepComponentAllocated = false);
+ void signalSetParameters(const sp<AMessage> &msg);
+
void initiateAllocateComponent(const sp<AMessage> &msg);
void initiateConfigureComponent(const sp<AMessage> &msg);
void initiateStart();
@@ -105,6 +107,7 @@
kWhatConfigureComponent = 'conf',
kWhatStart = 'star',
kWhatRequestIDRFrame = 'ridr',
+ kWhatSetParameters = 'setP',
};
enum {
@@ -270,6 +273,7 @@
status_t internalError = UNKNOWN_ERROR);
status_t requestIDRFrame();
+ status_t setParameters(const sp<AMessage> ¶ms);
DISALLOW_EVIL_CONSTRUCTORS(ACodec);
};
diff --git a/include/media/stagefright/MediaCodec.h b/include/media/stagefright/MediaCodec.h
index 88aabf6..3f0d3b3 100644
--- a/include/media/stagefright/MediaCodec.h
+++ b/include/media/stagefright/MediaCodec.h
@@ -115,6 +115,8 @@
status_t getName(AString *componentName) const;
+ status_t setParameters(const sp<AMessage> ¶ms);
+
protected:
virtual ~MediaCodec();
virtual void onMessageReceived(const sp<AMessage> &msg);
@@ -157,6 +159,7 @@
kWhatRequestIDRFrame = 'ridr',
kWhatRequestActivityNotification = 'racN',
kWhatGetName = 'getN',
+ kWhatSetParameters = 'setP',
};
enum {
@@ -230,6 +233,8 @@
void postActivityNotificationIfPossible();
+ status_t onSetParameters(const sp<AMessage> ¶ms);
+
DISALLOW_EVIL_CONSTRUCTORS(MediaCodec);
};
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 7b27843..a6cc4eb 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -374,6 +374,12 @@
msg->post();
}
+void ACodec::signalSetParameters(const sp<AMessage> ¶ms) {
+ sp<AMessage> msg = new AMessage(kWhatSetParameters, id());
+ msg->setMessage("params", params);
+ msg->post();
+}
+
void ACodec::initiateAllocateComponent(const sp<AMessage> &msg) {
msg->setWhat(kWhatAllocateComponent);
msg->setTarget(id());
@@ -3550,6 +3556,23 @@
break;
}
+ case kWhatSetParameters:
+ {
+ sp<AMessage> params;
+ CHECK(msg->findMessage("params", ¶ms));
+
+ status_t err = mCodec->setParameters(params);
+
+ sp<AMessage> reply;
+ if (msg->findMessage("reply", &reply)) {
+ reply->setInt32("err", err);
+ reply->post();
+ }
+
+ handled = true;
+ break;
+ }
+
default:
handled = BaseState::onMessageReceived(msg);
break;
@@ -3558,6 +3581,31 @@
return handled;
}
+status_t ACodec::setParameters(const sp<AMessage> ¶ms) {
+ int32_t videoBitrate;
+ if (params->findInt32("videoBitrate", &videoBitrate)) {
+ OMX_VIDEO_CONFIG_BITRATETYPE configParams;
+ InitOMXParams(&configParams);
+ configParams.nPortIndex = kPortIndexOutput;
+ configParams.nEncodeBitrate = videoBitrate;
+
+ status_t err = mOMX->setConfig(
+ mNode,
+ OMX_IndexConfigVideoBitrate,
+ &configParams,
+ sizeof(configParams));
+
+ if (err != OK) {
+ ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d",
+ videoBitrate, err);
+
+ return err;
+ }
+ }
+
+ return OK;
+}
+
bool ACodec::ExecutingState::onOMXEvent(
OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) {
switch (event) {
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index cb8a651..77aceb7 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -1203,6 +1203,23 @@
break;
}
+ case kWhatSetParameters:
+ {
+ uint32_t replyID;
+ CHECK(msg->senderAwaitsResponse(&replyID));
+
+ sp<AMessage> params;
+ CHECK(msg->findMessage("params", ¶ms));
+
+ status_t err = onSetParameters(params);
+
+ sp<AMessage> response = new AMessage;
+ response->setInt32("err", err);
+
+ response->postReply(replyID);
+ break;
+ }
+
default:
TRESPASS();
}
@@ -1556,4 +1573,18 @@
}
}
+status_t MediaCodec::setParameters(const sp<AMessage> ¶ms) {
+ sp<AMessage> msg = new AMessage(kWhatSetParameters, id());
+ msg->setMessage("params", params);
+
+ sp<AMessage> response;
+ return PostAndAwaitResponse(msg, &response);
+}
+
+status_t MediaCodec::onSetParameters(const sp<AMessage> ¶ms) {
+ mCodec->signalSetParameters(params);
+
+ return OK;
+}
+
} // namespace android
diff --git a/media/libstagefright/wifi-display/sink/RTPSink.cpp b/media/libstagefright/wifi-display/sink/RTPSink.cpp
index be54595..3c90a1e 100644
--- a/media/libstagefright/wifi-display/sink/RTPSink.cpp
+++ b/media/libstagefright/wifi-display/sink/RTPSink.cpp
@@ -250,6 +250,8 @@
: mNetSession(netSession),
mSurfaceTex(bufferProducer),
mNotify(notify),
+ mUsingTCPTransport(false),
+ mUsingTCPInterleaving(false),
mRTPPort(0),
mRTPSessionID(0),
mRTCPSessionID(0),
@@ -280,6 +282,9 @@
}
status_t RTPSink::init(bool usingTCPTransport, bool usingTCPInterleaving) {
+ mUsingTCPTransport = usingTCPTransport;
+ mUsingTCPInterleaving = usingTCPInterleaving;
+
if (usingTCPInterleaving) {
return OK;
}
@@ -717,7 +722,9 @@
mRTCPSessionID, buf->data(), buf->size());
#endif
- scheduleSendRR();
+ if (!mUsingTCPTransport) {
+ scheduleSendRR();
+ }
return OK;
}
@@ -820,6 +827,11 @@
}
void RTPSink::onPacketLost(const sp<AMessage> &msg) {
+ if (mUsingTCPTransport) {
+ ALOGW("huh? lost a packet even though using reliable transport?");
+ return;
+ }
+
uint32_t srcId;
CHECK(msg->findInt32("ssrc", (int32_t *)&srcId));
diff --git a/media/libstagefright/wifi-display/sink/RTPSink.h b/media/libstagefright/wifi-display/sink/RTPSink.h
index f9cbce9..4706c6d 100644
--- a/media/libstagefright/wifi-display/sink/RTPSink.h
+++ b/media/libstagefright/wifi-display/sink/RTPSink.h
@@ -78,6 +78,9 @@
sp<AMessage> mNotify;
KeyedVector<uint32_t, sp<Source> > mSources;
+ bool mUsingTCPTransport;
+ bool mUsingTCPInterleaving;
+
int32_t mRTPPort;
int32_t mRTPSessionID; // in TCP unicast mode these are just server
diff --git a/media/libstagefright/wifi-display/source/Converter.cpp b/media/libstagefright/wifi-display/source/Converter.cpp
index 5628dec..376b0df 100644
--- a/media/libstagefright/wifi-display/source/Converter.cpp
+++ b/media/libstagefright/wifi-display/source/Converter.cpp
@@ -54,6 +54,7 @@
,mFirstSilentFrameUs(-1ll)
,mInSilentMode(false)
#endif
+ ,mPrevVideoBitrate(-1)
{
AString mime;
CHECK(mInputFormat->findString("mime", &mime));
@@ -185,6 +186,7 @@
int32_t audioBitrate = getBitrate("media.wfd.audio-bitrate", 128000);
int32_t videoBitrate = getBitrate("media.wfd.video-bitrate", 5000000);
+ mPrevVideoBitrate = videoBitrate;
ALOGI("using audio bitrate of %d bps, video bitrate of %d bps",
audioBitrate, videoBitrate);
@@ -606,6 +608,18 @@
}
status_t Converter::doMoreWork() {
+ if (mIsVideo) {
+ int32_t videoBitrate = getBitrate("media.wfd.video-bitrate", 5000000);
+ if (videoBitrate != mPrevVideoBitrate) {
+ sp<AMessage> params = new AMessage;
+
+ params->setInt32("videoBitrate", videoBitrate);
+ mEncoder->setParameters(params);
+
+ mPrevVideoBitrate = videoBitrate;
+ }
+ }
+
status_t err;
for (;;) {
diff --git a/media/libstagefright/wifi-display/source/Converter.h b/media/libstagefright/wifi-display/source/Converter.h
index 3357d61..57802bd 100644
--- a/media/libstagefright/wifi-display/source/Converter.h
+++ b/media/libstagefright/wifi-display/source/Converter.h
@@ -100,6 +100,8 @@
sp<ABuffer> mPartialAudioAU;
+ int32_t mPrevVideoBitrate;
+
status_t initEncoder();
void releaseEncoder();
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index 662a93d..8568dfc 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -1118,7 +1118,7 @@
int initialData = ret - MTP_CONTAINER_HEADER_SIZE;
if (initialData > 0) {
- ret = write(edit->mFD, mData.getData(), initialData);
+ ret = pwrite(edit->mFD, mData.getData(), initialData, offset);
offset += initialData;
length -= initialData;
}