summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2009-12-04 12:52:40 -0800
committerAndreas Huber <andih@google.com>2009-12-04 12:52:40 -0800
commitf0fb96c352f30b812a4903a1d783a715e1e817bd (patch)
treebf0573cd7eb7789a512c51f21c854c4e8b7fa017 /media
parentadf7d77752b3dbd47badc8819aa2674860d6ccba (diff)
downloadframeworks_av-f0fb96c352f30b812a4903a1d783a715e1e817bd.zip
frameworks_av-f0fb96c352f30b812a4903a1d783a715e1e817bd.tar.gz
frameworks_av-f0fb96c352f30b812a4903a1d783a715e1e817bd.tar.bz2
Enable proper cleanup of OMX nodes managed through stagefright.
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/include/OMXNodeInstance.h5
-rw-r--r--media/libstagefright/omx/OMX.cpp4
-rw-r--r--media/libstagefright/omx/OMXMaster.cpp31
-rw-r--r--media/libstagefright/omx/OMXMaster.h5
-rw-r--r--media/libstagefright/omx/OMXNodeInstance.cpp12
-rw-r--r--media/libstagefright/omx/OMXPVCodecsPlugin.cpp14
-rw-r--r--media/libstagefright/omx/OMXPVCodecsPlugin.h3
-rw-r--r--media/libstagefright/omx/OMXSoftwareCodecsPlugin.cpp5
-rw-r--r--media/libstagefright/omx/OMXSoftwareCodecsPlugin.h3
9 files changed, 62 insertions, 20 deletions
diff --git a/media/libstagefright/include/OMXNodeInstance.h b/media/libstagefright/include/OMXNodeInstance.h
index 09a8816..19d3940 100644
--- a/media/libstagefright/include/OMXNodeInstance.h
+++ b/media/libstagefright/include/OMXNodeInstance.h
@@ -26,6 +26,7 @@
namespace android {
class IOMXObserver;
+struct OMXMaster;
struct OMXNodeInstance {
OMXNodeInstance(
@@ -37,7 +38,7 @@ struct OMXNodeInstance {
sp<IOMXObserver> observer();
OMX::node_id nodeID();
- status_t freeNode();
+ status_t freeNode(OMXMaster *master);
status_t sendCommand(OMX_COMMANDTYPE cmd, OMX_S32 param);
status_t getParameter(OMX_INDEXTYPE index, void *params, size_t size);
@@ -72,7 +73,7 @@ struct OMXNodeInstance {
const char *parameterName, OMX_INDEXTYPE *index);
void onMessage(const omx_message &msg);
- void onObserverDied();
+ void onObserverDied(OMXMaster *master);
void onGetHandleFailed();
static OMX_CALLBACKTYPE kCallbacks;
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index 9f93c31..61be8f7 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -205,7 +205,7 @@ void OMX::binderDied(const wp<IBinder> &the_late_who) {
invalidateNodeID_l(instance->nodeID());
}
- instance->onObserverDied();
+ instance->onObserverDied(mMaster);
}
status_t OMX::listNodes(List<String8> *list) {
@@ -262,7 +262,7 @@ status_t OMX::freeNode(node_id node) {
mLiveNodes.removeItemsAt(index);
instance->observer()->asBinder()->unlinkToDeath(this);
- return instance->freeNode();
+ return instance->freeNode(mMaster);
}
status_t OMX::sendCommand(
diff --git a/media/libstagefright/omx/OMXMaster.cpp b/media/libstagefright/omx/OMXMaster.cpp
index 838a9f7..12302f3 100644
--- a/media/libstagefright/omx/OMXMaster.cpp
+++ b/media/libstagefright/omx/OMXMaster.cpp
@@ -60,7 +60,9 @@ void OMXMaster::addVendorPlugin() {
(CreateOMXPluginFunc)dlsym(
mVendorLibHandle, "_ZN7android15createOMXPluginEv");
- addPlugin((*createOMXPlugin)());
+ if (createOMXPlugin) {
+ addPlugin((*createOMXPlugin)());
+ }
}
void OMXMaster::addPlugin(OMXPluginBase *plugin) {
@@ -118,7 +120,32 @@ OMX_ERRORTYPE OMXMaster::makeComponentInstance(
}
OMXPluginBase *plugin = mPluginByComponentName.valueAt(index);
- return plugin->makeComponentInstance(name, callbacks, appData, component);
+ OMX_ERRORTYPE err =
+ plugin->makeComponentInstance(name, callbacks, appData, component);
+
+ if (err != OMX_ErrorNone) {
+ return err;
+ }
+
+ mPluginByInstance.add(*component, plugin);
+
+ return err;
+}
+
+OMX_ERRORTYPE OMXMaster::destroyComponentInstance(
+ OMX_COMPONENTTYPE *component) {
+ Mutex::Autolock autoLock(mLock);
+
+ ssize_t index = mPluginByInstance.indexOfKey(component);
+
+ if (index < 0) {
+ return OMX_ErrorBadParameter;
+ }
+
+ OMXPluginBase *plugin = mPluginByInstance.valueAt(index);
+ mPluginByInstance.removeItemsAt(index);
+
+ return plugin->destroyComponentInstance(component);
}
OMX_ERRORTYPE OMXMaster::enumerateComponents(
diff --git a/media/libstagefright/omx/OMXMaster.h b/media/libstagefright/omx/OMXMaster.h
index 63cd664..e944c4a 100644
--- a/media/libstagefright/omx/OMXMaster.h
+++ b/media/libstagefright/omx/OMXMaster.h
@@ -37,6 +37,9 @@ struct OMXMaster : public OMXPluginBase {
OMX_PTR appData,
OMX_COMPONENTTYPE **component);
+ virtual OMX_ERRORTYPE destroyComponentInstance(
+ OMX_COMPONENTTYPE *component);
+
virtual OMX_ERRORTYPE enumerateComponents(
OMX_STRING name,
size_t size,
@@ -46,6 +49,8 @@ private:
Mutex mLock;
List<OMXPluginBase *> mPlugins;
KeyedVector<String8, OMXPluginBase *> mPluginByComponentName;
+ KeyedVector<OMX_COMPONENTTYPE *, OMXPluginBase *> mPluginByInstance;
+
void *mVendorLibHandle;
void addVendorPlugin();
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 099139a..288710e 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -19,6 +19,7 @@
#include <utils/Log.h>
#include "../include/OMXNodeInstance.h"
+#include "OMXMaster.h"
#include <OMX_Component.h>
@@ -106,7 +107,7 @@ static status_t StatusFromOMXError(OMX_ERRORTYPE err) {
return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR;
}
-status_t OMXNodeInstance::freeNode() {
+status_t OMXNodeInstance::freeNode(OMXMaster *master) {
// Transition the node from its current state all the way down
// to "Loaded".
// This ensures that all active buffers are properly freed even
@@ -157,8 +158,9 @@ status_t OMXNodeInstance::freeNode() {
break;
}
- OMX_ERRORTYPE err =
- (*static_cast<OMX_COMPONENTTYPE *>(mHandle)->ComponentDeInit)(mHandle);
+ OMX_ERRORTYPE err = master->destroyComponentInstance(
+ static_cast<OMX_COMPONENTTYPE *>(mHandle));
+
mHandle = NULL;
if (err != OMX_ErrorNone) {
@@ -384,11 +386,11 @@ void OMXNodeInstance::onMessage(const omx_message &msg) {
mObserver->onMessage(msg);
}
-void OMXNodeInstance::onObserverDied() {
+void OMXNodeInstance::onObserverDied(OMXMaster *master) {
LOGE("!!! Observer died. Quickly, do something, ... anything...");
// Try to force shutdown of the node and hope for the best.
- freeNode();
+ freeNode(master);
}
void OMXNodeInstance::onGetHandleFailed() {
diff --git a/media/libstagefright/omx/OMXPVCodecsPlugin.cpp b/media/libstagefright/omx/OMXPVCodecsPlugin.cpp
index 3957901..2bd8094 100644
--- a/media/libstagefright/omx/OMXPVCodecsPlugin.cpp
+++ b/media/libstagefright/omx/OMXPVCodecsPlugin.cpp
@@ -35,20 +35,16 @@ OMX_ERRORTYPE OMXPVCodecsPlugin::makeComponentInstance(
const OMX_CALLBACKTYPE *callbacks,
OMX_PTR appData,
OMX_COMPONENTTYPE **component) {
- OMX_ERRORTYPE err = OMX_MasterGetHandle(
+ return OMX_MasterGetHandle(
reinterpret_cast<OMX_HANDLETYPE *>(component),
const_cast<char *>(name),
appData,
const_cast<OMX_CALLBACKTYPE *>(callbacks));
+}
- if (err != OMX_ErrorNone) {
- return err;
- }
-
- // PV is not even filling this in...
- (*component)->ComponentDeInit = &OMX_MasterFreeHandle;
-
- return OMX_ErrorNone;
+OMX_ERRORTYPE OMXPVCodecsPlugin::destroyComponentInstance(
+ OMX_COMPONENTTYPE *component) {
+ return OMX_MasterFreeHandle(component);
}
OMX_ERRORTYPE OMXPVCodecsPlugin::enumerateComponents(
diff --git a/media/libstagefright/omx/OMXPVCodecsPlugin.h b/media/libstagefright/omx/OMXPVCodecsPlugin.h
index 55ca87a..f32eede 100644
--- a/media/libstagefright/omx/OMXPVCodecsPlugin.h
+++ b/media/libstagefright/omx/OMXPVCodecsPlugin.h
@@ -32,6 +32,9 @@ struct OMXPVCodecsPlugin : public OMXPluginBase {
OMX_PTR appData,
OMX_COMPONENTTYPE **component);
+ virtual OMX_ERRORTYPE destroyComponentInstance(
+ OMX_COMPONENTTYPE *component);
+
virtual OMX_ERRORTYPE enumerateComponents(
OMX_STRING name,
size_t size,
diff --git a/media/libstagefright/omx/OMXSoftwareCodecsPlugin.cpp b/media/libstagefright/omx/OMXSoftwareCodecsPlugin.cpp
index 22f58cc..45610df 100644
--- a/media/libstagefright/omx/OMXSoftwareCodecsPlugin.cpp
+++ b/media/libstagefright/omx/OMXSoftwareCodecsPlugin.cpp
@@ -63,6 +63,11 @@ OMX_ERRORTYPE OMXSoftwareCodecsPlugin::makeComponentInstance(
return OMX_ErrorInvalidComponentName;
}
+OMX_ERRORTYPE OMXSoftwareCodecsPlugin::destroyComponentInstance(
+ OMX_COMPONENTTYPE *component) {
+ return (*component->ComponentDeInit)(component);
+}
+
OMX_ERRORTYPE OMXSoftwareCodecsPlugin::enumerateComponents(
OMX_STRING name,
size_t size,
diff --git a/media/libstagefright/omx/OMXSoftwareCodecsPlugin.h b/media/libstagefright/omx/OMXSoftwareCodecsPlugin.h
index dcb5b19..5beeb26 100644
--- a/media/libstagefright/omx/OMXSoftwareCodecsPlugin.h
+++ b/media/libstagefright/omx/OMXSoftwareCodecsPlugin.h
@@ -31,6 +31,9 @@ struct OMXSoftwareCodecsPlugin : public OMXPluginBase {
OMX_PTR appData,
OMX_COMPONENTTYPE **component);
+ virtual OMX_ERRORTYPE destroyComponentInstance(
+ OMX_COMPONENTTYPE *component);
+
virtual OMX_ERRORTYPE enumerateComponents(
OMX_STRING name,
size_t size,