summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/wifi-display/source/Converter.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-09-28 10:23:51 -0700
committerAndreas Huber <andih@google.com>2012-09-28 10:23:51 -0700
commit96fc6cc65ca93009a759a3a874b82a35771b9714 (patch)
tree8084454da63f974ef6ccfe29e5e3760184ec185b /media/libstagefright/wifi-display/source/Converter.cpp
parentde799a74064a363d26f4c1bbc5a59d1b7127f49f (diff)
downloadframeworks_av-96fc6cc65ca93009a759a3a874b82a35771b9714.zip
frameworks_av-96fc6cc65ca93009a759a3a874b82a35771b9714.tar.gz
frameworks_av-96fc6cc65ca93009a759a3a874b82a35771b9714.tar.bz2
Various improvements to a cleaner shutdown of the wifi display connection.
Change-Id: Id029a89939e53c2bd1d20e572d3975ec2795c239 related-to-bug: 7247918
Diffstat (limited to 'media/libstagefright/wifi-display/source/Converter.cpp')
-rw-r--r--media/libstagefright/wifi-display/source/Converter.cpp105
1 files changed, 75 insertions, 30 deletions
diff --git a/media/libstagefright/wifi-display/source/Converter.cpp b/media/libstagefright/wifi-display/source/Converter.cpp
index c6118d4..0cdff6b 100644
--- a/media/libstagefright/wifi-display/source/Converter.cpp
+++ b/media/libstagefright/wifi-display/source/Converter.cpp
@@ -20,12 +20,15 @@
#include "Converter.h"
+#include "MediaPuller.h"
+
#include <cutils/properties.h>
#include <gui/SurfaceTextureClient.h>
#include <media/ICrypto.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
+#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaCodec.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
@@ -53,14 +56,12 @@ Converter::Converter(
}
Converter::~Converter() {
- if (mEncoder != NULL) {
- mEncoder->release();
- mEncoder.clear();
- }
+ CHECK(mEncoder == NULL);
+}
- AString mime;
- CHECK(mInputFormat->findString("mime", &mime));
- ALOGI("encoder (%s) shut down.", mime.c_str());
+void Converter::shutdownAsync() {
+ ALOGV("shutdown");
+ (new AMessage(kWhatShutdown, id()))->post();
}
status_t Converter::initCheck() const {
@@ -155,16 +156,6 @@ status_t Converter::initEncoder() {
return mEncoder->getOutputBuffers(&mEncoderOutputBuffers);
}
-void Converter::feedAccessUnit(const sp<ABuffer> &accessUnit) {
- sp<AMessage> msg = new AMessage(kWhatFeedAccessUnit, id());
- msg->setBuffer("accessUnit", accessUnit);
- msg->post();
-}
-
-void Converter::signalEOS() {
- (new AMessage(kWhatInputEOS, id()))->post();
-}
-
void Converter::notifyError(status_t err) {
sp<AMessage> notify = mNotify->dup();
notify->setInt32("what", kWhatError);
@@ -174,32 +165,70 @@ void Converter::notifyError(status_t err) {
void Converter::onMessageReceived(const sp<AMessage> &msg) {
switch (msg->what()) {
- case kWhatFeedAccessUnit:
+ case kWhatMediaPullerNotify:
{
- sp<ABuffer> accessUnit;
- CHECK(msg->findBuffer("accessUnit", &accessUnit));
+ int32_t what;
+ CHECK(msg->findInt32("what", &what));
- mInputBufferQueue.push_back(accessUnit);
+ if (mEncoder == NULL) {
+ ALOGV("got msg '%s' after encoder shutdown.",
+ msg->debugString().c_str());
- feedEncoderInputBuffers();
+ if (what == MediaPuller::kWhatAccessUnit) {
+ sp<ABuffer> accessUnit;
+ CHECK(msg->findBuffer("accessUnit", &accessUnit));
- scheduleDoMoreWork();
- break;
- }
+ void *mbuf;
+ if (accessUnit->meta()->findPointer("mediaBuffer", &mbuf)
+ && mbuf != NULL) {
+ ALOGV("releasing mbuf %p", mbuf);
- case kWhatInputEOS:
- {
- mInputBufferQueue.push_back(NULL);
+ accessUnit->meta()->setPointer("mediaBuffer", NULL);
+
+ static_cast<MediaBuffer *>(mbuf)->release();
+ mbuf = NULL;
+ }
+ }
+ break;
+ }
+
+ if (what == MediaPuller::kWhatEOS) {
+ mInputBufferQueue.push_back(NULL);
+
+ feedEncoderInputBuffers();
+
+ scheduleDoMoreWork();
+ } else {
+ CHECK_EQ(what, MediaPuller::kWhatAccessUnit);
+
+ sp<ABuffer> accessUnit;
+ CHECK(msg->findBuffer("accessUnit", &accessUnit));
+
+#if 0
+ void *mbuf;
+ if (accessUnit->meta()->findPointer("mediaBuffer", &mbuf)
+ && mbuf != NULL) {
+ ALOGI("queueing mbuf %p", mbuf);
+ }
+#endif
+
+ mInputBufferQueue.push_back(accessUnit);
- feedEncoderInputBuffers();
+ feedEncoderInputBuffers();
- scheduleDoMoreWork();
+ scheduleDoMoreWork();
+ }
break;
}
case kWhatDoMoreWork:
{
mDoMoreWorkPending = false;
+
+ if (mEncoder == NULL) {
+ break;
+ }
+
status_t err = doMoreWork();
if (err != OK) {
@@ -212,6 +241,10 @@ void Converter::onMessageReceived(const sp<AMessage> &msg) {
case kWhatRequestIDRFrame:
{
+ if (mEncoder == NULL) {
+ break;
+ }
+
if (mIsVideo) {
ALOGI("requesting IDR frame");
mEncoder->requestIDRFrame();
@@ -219,6 +252,18 @@ void Converter::onMessageReceived(const sp<AMessage> &msg) {
break;
}
+ case kWhatShutdown:
+ {
+ ALOGI("shutting down encoder");
+ mEncoder->release();
+ mEncoder.clear();
+
+ AString mime;
+ CHECK(mInputFormat->findString("mime", &mime));
+ ALOGI("encoder (%s) shut down.", mime.c_str());
+ break;
+ }
+
default:
TRESPASS();
}