diff options
author | Andreas Huber <andih@google.com> | 2012-12-20 13:58:31 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-12-20 13:58:32 -0800 |
commit | 5533367bee43819e72f66506df752d465154cb57 (patch) | |
tree | 24e29ffb5178b8e9476ef7371017d1c5ea796e7d /media | |
parent | 4792d25c324e782ebe95adf43c49c5008f1c34e1 (diff) | |
parent | d1ac40885d1f2969347a71749eba6d275821365a (diff) | |
download | frameworks_av-5533367bee43819e72f66506df752d465154cb57.zip frameworks_av-5533367bee43819e72f66506df752d465154cb57.tar.gz frameworks_av-5533367bee43819e72f66506df752d465154cb57.tar.bz2 |
Merge "Properly release any MediaBuffer references associated with the"
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/wifi-display/source/Converter.cpp | 60 | ||||
-rw-r--r-- | media/libstagefright/wifi-display/source/Converter.h | 1 |
2 files changed, 42 insertions, 19 deletions
diff --git a/media/libstagefright/wifi-display/source/Converter.cpp b/media/libstagefright/wifi-display/source/Converter.cpp index 7a87444..5628dec 100644 --- a/media/libstagefright/wifi-display/source/Converter.cpp +++ b/media/libstagefright/wifi-display/source/Converter.cpp @@ -67,13 +67,47 @@ Converter::Converter( mInitCheck = initEncoder(); if (mInitCheck != OK) { - if (mEncoder != NULL) { - mEncoder->release(); - mEncoder.clear(); - } + releaseEncoder(); + } +} + +static void ReleaseMediaBufferReference(const sp<ABuffer> &accessUnit) { + void *mbuf; + if (accessUnit->meta()->findPointer("mediaBuffer", &mbuf) + && mbuf != NULL) { + ALOGV("releasing mbuf %p", mbuf); + + accessUnit->meta()->setPointer("mediaBuffer", NULL); + + static_cast<MediaBuffer *>(mbuf)->release(); + mbuf = NULL; } } +void Converter::releaseEncoder() { + if (mEncoder == NULL) { + return; + } + + mEncoder->release(); + mEncoder.clear(); + + while (!mInputBufferQueue.empty()) { + sp<ABuffer> accessUnit = *mInputBufferQueue.begin(); + mInputBufferQueue.erase(mInputBufferQueue.begin()); + + ReleaseMediaBufferReference(accessUnit); + } + + for (size_t i = 0; i < mEncoderInputBuffers.size(); ++i) { + sp<ABuffer> accessUnit = mEncoderInputBuffers.itemAt(i); + ReleaseMediaBufferReference(accessUnit); + } + + mEncoderInputBuffers.clear(); + mEncoderOutputBuffers.clear(); +} + Converter::~Converter() { CHECK(mEncoder == NULL); } @@ -274,16 +308,7 @@ void Converter::onMessageReceived(const sp<AMessage> &msg) { sp<ABuffer> accessUnit; CHECK(msg->findBuffer("accessUnit", &accessUnit)); - void *mbuf; - if (accessUnit->meta()->findPointer("mediaBuffer", &mbuf) - && mbuf != NULL) { - ALOGV("releasing mbuf %p", mbuf); - - accessUnit->meta()->setPointer("mediaBuffer", NULL); - - static_cast<MediaBuffer *>(mbuf)->release(); - mbuf = NULL; - } + ReleaseMediaBufferReference(accessUnit); } break; } @@ -385,12 +410,9 @@ void Converter::onMessageReceived(const sp<AMessage> &msg) { case kWhatShutdown: { - ALOGI("shutting down encoder"); + ALOGI("shutting down %s encoder", mIsVideo ? "video" : "audio"); - if (mEncoder != NULL) { - mEncoder->release(); - mEncoder.clear(); - } + releaseEncoder(); AString mime; CHECK(mInputFormat->findString("mime", &mime)); diff --git a/media/libstagefright/wifi-display/source/Converter.h b/media/libstagefright/wifi-display/source/Converter.h index 0665eea..3357d61 100644 --- a/media/libstagefright/wifi-display/source/Converter.h +++ b/media/libstagefright/wifi-display/source/Converter.h @@ -101,6 +101,7 @@ private: sp<ABuffer> mPartialAudioAU; status_t initEncoder(); + void releaseEncoder(); status_t feedEncoderInputBuffers(); |