diff options
author | Andreas Huber <andih@google.com> | 2012-09-28 10:23:51 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-09-28 10:23:51 -0700 |
commit | 96fc6cc65ca93009a759a3a874b82a35771b9714 (patch) | |
tree | 8084454da63f974ef6ccfe29e5e3760184ec185b /media/libstagefright/wifi-display/source/Converter.cpp | |
parent | de799a74064a363d26f4c1bbc5a59d1b7127f49f (diff) | |
download | frameworks_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.cpp | 105 |
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(); } |