1f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa/* 2f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * Copyright 2016, The Android Open Source Project 3f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * 4f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * Licensed under the Apache License, Version 2.0 (the "License"); 5f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * you may not use this file except in compliance with the License. 6f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * You may obtain a copy of the License at 7f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * 8f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * http://www.apache.org/licenses/LICENSE-2.0 9f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * 10f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * Unless required by applicable law or agreed to in writing, software 11f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * distributed under the License is distributed on an "AS IS" BASIS, 12f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * See the License for the specific language governing permissions and 14f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * limitations under the License. 15f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa */ 16f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 17223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa#include <ios> 18f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <list> 19f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 20223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa#include <android-base/logging.h> 21f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <gui/IGraphicBufferProducer.h> 22255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/openmax/OMX_Core.h> 23255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/openmax/OMX_AsString.h> 240d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa 25255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/OMXUtils.h> 26255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/OMXMaster.h> 272860573684ebaf514827cc1b5b144deb194eb8f6Wonsik Kim#include <media/stagefright/omx/OmxGraphicBufferSource.h> 28f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 29255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/1.0/WOmxNode.h> 30255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/1.0/WOmxObserver.h> 31255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/1.0/WGraphicBufferProducer.h> 32255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/1.0/WGraphicBufferSource.h> 33255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/1.0/Conversion.h> 34255735a38b9d5c3755c7b819bdc8fdaf4357d860Pawin Vongmasa#include <media/stagefright/omx/1.0/Omx.h> 350d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa 3676307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace android { 3776307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace hardware { 3876307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace media { 3976307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace omx { 4076307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace V1_0 { 4176307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace implementation { 4276307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa 43f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasaconstexpr size_t kMaxNodeInstances = (1 << 16); 44f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 456ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin VongmasaOmx::Omx() : 466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mMaster(new OMXMaster()), 476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mParser() { 48f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa} 49f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 50f62ea8018813951e8f6a182880cadb3217e4ce37Pawin VongmasaOmx::~Omx() { 51f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa delete mMaster; 52f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa} 53f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 5476307481cf727f17add7e15527136f2402bd80a5Pawin VongmasaReturn<void> Omx::listNodes(listNodes_cb _hidl_cb) { 55f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa std::list<::android::IOMX::ComponentInfo> list; 56f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa char componentName[256]; 57f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa for (OMX_U32 index = 0; 58f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mMaster->enumerateComponents( 59f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa componentName, sizeof(componentName), index) == OMX_ErrorNone; 60f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa ++index) { 61f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa list.push_back(::android::IOMX::ComponentInfo()); 62f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa ::android::IOMX::ComponentInfo& info = list.back(); 63f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa info.mName = componentName; 64f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa ::android::Vector<::android::String8> roles; 65f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa OMX_ERRORTYPE err = 66f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mMaster->getRolesOfComponent(componentName, &roles); 67f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (err == OMX_ErrorNone) { 68f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa for (OMX_U32 i = 0; i < roles.size(); ++i) { 69f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa info.mRoles.push_back(roles[i]); 70f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 71f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 72f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 73f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 74f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa hidl_vec<ComponentInfo> tList; 75f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa tList.resize(list.size()); 76f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa size_t i = 0; 77f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa for (auto const& info : list) { 78f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa convertTo(&(tList[i++]), info); 79f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 80f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa _hidl_cb(toStatus(OK), tList); 81f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return Void(); 82f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa} 83f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 84f62ea8018813951e8f6a182880cadb3217e4ce37Pawin VongmasaReturn<void> Omx::allocateNode( 85f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa const hidl_string& name, 86f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa const sp<IOmxObserver>& observer, 87f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa allocateNode_cb _hidl_cb) { 88f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 89f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa using ::android::IOMXNode; 90f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa using ::android::IOMXObserver; 91f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 92383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa sp<OMXNodeInstance> instance; 93383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa { 94383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa Mutex::Autolock autoLock(mLock); 95383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa if (mLiveNodes.size() == kMaxNodeInstances) { 96383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa _hidl_cb(toStatus(NO_MEMORY), nullptr); 97383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa return Void(); 98383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa } 99f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 100383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa instance = new OMXNodeInstance( 101383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa this, new LWOmxObserver(observer), name.c_str()); 102383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa 103383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa OMX_COMPONENTTYPE *handle; 104383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa OMX_ERRORTYPE err = mMaster->makeComponentInstance( 105383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa name.c_str(), &OMXNodeInstance::kCallbacks, 106383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa instance.get(), &handle); 107383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa 108383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa if (err != OMX_ErrorNone) { 109383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa LOG(ERROR) << "Failed to allocate omx component " 110383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa "'" << name.c_str() << "' " 111383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa " err=" << asString(err) << 112383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa "(0x" << std::hex << unsigned(err) << ")"; 113383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa _hidl_cb(toStatus(StatusFromOMXError(err)), nullptr); 114383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa return Void(); 115383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa } 116383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa instance->setHandle(handle); 117fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa 118fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa // Find quirks from mParser 119fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa const auto& codec = mParser.getCodecMap().find(name.c_str()); 120fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa if (codec == mParser.getCodecMap().cend()) { 121fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa LOG(WARNING) << "Failed to obtain quirks for omx component " 122fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa "'" << name.c_str() << "' " 123fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa "from XML files"; 124fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa } else { 125383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa uint32_t quirks = 0; 126fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa for (const auto& quirk : codec->second.quirkSet) { 127383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa if (quirk == "requires-allocate-on-input-ports") { 128fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa quirks |= OMXNodeInstance:: 129fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa kRequiresAllocateBufferOnInputPorts; 130383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa } 131383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa if (quirk == "requires-allocate-on-output-ports") { 132fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa quirks |= OMXNodeInstance:: 133fbe70ae7f251d159ed83ab61587a88003f20d44bPawin Vongmasa kRequiresAllocateBufferOnOutputPorts; 134383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa } 1356ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 136383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa instance->setQuirks(quirks); 1376ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 138f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 139383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa mLiveNodes.add(observer.get(), instance); 140383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa mNode2Observer.add(instance.get(), observer.get()); 141383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa } 142f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa observer->linkToDeath(this, 0); 143f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 144f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa _hidl_cb(toStatus(OK), new TWOmxNode(instance)); 14576307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa return Void(); 14676307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa} 14776307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa 148f62ea8018813951e8f6a182880cadb3217e4ce37Pawin VongmasaReturn<void> Omx::createInputSurface(createInputSurface_cb _hidl_cb) { 149f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa sp<::android::IGraphicBufferProducer> bufferProducer; 150f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 1512860573684ebaf514827cc1b5b144deb194eb8f6Wonsik Kim sp<OmxGraphicBufferSource> graphicBufferSource = new OmxGraphicBufferSource(); 152f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa status_t err = graphicBufferSource->initCheck(); 153f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (err != OK) { 154223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa LOG(ERROR) << "Failed to create persistent input surface: " 155223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa << strerror(-err) << " " 156223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa "(" << int(err) << ")"; 157f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa _hidl_cb(toStatus(err), nullptr, nullptr); 158f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return Void(); 159f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 160f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa bufferProducer = graphicBufferSource->getIGraphicBufferProducer(); 161f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 162f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa _hidl_cb(toStatus(OK), 16304563aafa0debc95d50951ca944abf37ef2777cePawin Vongmasa new TWGraphicBufferProducer(bufferProducer), 164d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih new TWGraphicBufferSource(graphicBufferSource)); 16576307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa return Void(); 16676307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa} 16776307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa 168f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasavoid Omx::serviceDied(uint64_t /* cookie */, wp<IBase> const& who) { 169f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa sp<OMXNodeInstance> instance; 170f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa { 171f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa Mutex::Autolock autoLock(mLock); 172f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 173f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa ssize_t index = mLiveNodes.indexOfKey(who); 174f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 175f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (index < 0) { 176223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa LOG(ERROR) << "b/27597103, nonexistent observer on serviceDied"; 177f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa android_errorWriteLog(0x534e4554, "27597103"); 178f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return; 179f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 180f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 181f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa instance = mLiveNodes.editValueAt(index); 182f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mLiveNodes.removeItemsAt(index); 183f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mNode2Observer.removeItem(instance.get()); 184f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 185f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa instance->onObserverDied(); 186f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa} 187f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 188f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasastatus_t Omx::freeNode(sp<OMXNodeInstance> const& instance) { 189f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (instance == NULL) { 190f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return OK; 191f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 192f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 193f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa { 194f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa Mutex::Autolock autoLock(mLock); 195f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa ssize_t observerIndex = mNode2Observer.indexOfKey(instance.get()); 196990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan if (observerIndex >= 0) { 197990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan wp<IBase> observer = mNode2Observer.valueAt(observerIndex); 198990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan ssize_t nodeIndex = mLiveNodes.indexOfKey(observer); 199990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan if (nodeIndex >= 0) { 200990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan mNode2Observer.removeItemsAt(observerIndex); 201990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan mLiveNodes.removeItemsAt(nodeIndex); 202990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan sp<IBase> sObserver = observer.promote(); 203990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan if (sObserver != nullptr) { 204990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan sObserver->unlinkToDeath(this); 205990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan } 206990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan } else { 207990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan LOG(WARNING) << "Inconsistent observer record"; 208990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan } 209f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 210f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 211f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa 212f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa OMX_ERRORTYPE err = OMX_ErrorNone; 213f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa if (instance->handle() != NULL) { 214f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa err = mMaster->destroyComponentInstance( 215f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa static_cast<OMX_COMPONENTTYPE*>(instance->handle())); 216f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa } 217f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return StatusFromOMXError(err); 218f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa} 21976307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa 220517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// Methods from ::android::hidl::base::V1_0::IBase follow. 221517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 22276307481cf727f17add7e15527136f2402bd80a5Pawin VongmasaIOmx* HIDL_FETCH_IOmx(const char* /* name */) { 22376307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa return new Omx(); 22476307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa} 22576307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa 226517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace implementation 22776307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa} // namespace V1_0 22876307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa} // namespace omx 22976307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa} // namespace media 23076307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa} // namespace hardware 23176307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa} // namespace android 232