Omx.cpp revision 990bc6dec9e62f1fb529a3f552aaaf7478f84756
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2016, The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ios>
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <list>
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android-base/logging.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <gui/IGraphicBufferProducer.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <OMX_Core.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <OMX_AsString.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "../OMXUtils.h"
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "../OMXMaster.h"
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "../GraphicBufferSource.h"
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "WOmxNode.h"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "WOmxObserver.h"
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "WGraphicBufferProducer.h"
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "WGraphicBufferSource.h"
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Conversion.h"
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "Omx.h"
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace hardware {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace media {
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace omx {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace V1_0 {
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace implementation {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconstexpr size_t kMaxNodeInstances = (1 << 16);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectOmx::Omx() :
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mMaster(new OMXMaster()),
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mParser() {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectOmx::~Omx() {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete mMaster;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectReturn<void> Omx::listNodes(listNodes_cb _hidl_cb) {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    std::list<::android::IOMX::ComponentInfo> list;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    char componentName[256];
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (OMX_U32 index = 0;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMaster->enumerateComponents(
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            componentName, sizeof(componentName), index) == OMX_ErrorNone;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ++index) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        list.push_back(::android::IOMX::ComponentInfo());
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ::android::IOMX::ComponentInfo& info = list.back();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        info.mName = componentName;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ::android::Vector<::android::String8> roles;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        OMX_ERRORTYPE err =
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mMaster->getRolesOfComponent(componentName, &roles);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (err == OMX_ErrorNone) {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (OMX_U32 i = 0; i < roles.size(); ++i) {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                info.mRoles.push_back(roles[i]);
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    hidl_vec<ComponentInfo> tList;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    tList.resize(list.size());
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t i = 0;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (auto const& info : list) {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        convertTo(&(tList[i++]), info);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _hidl_cb(toStatus(OK), tList);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return Void();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectReturn<void> Omx::allocateNode(
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const hidl_string& name,
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<IOmxObserver>& observer,
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        allocateNode_cb _hidl_cb) {
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    using ::android::IOMXNode;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    using ::android::IOMXObserver;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock autoLock(mLock);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mLiveNodes.size() == kMaxNodeInstances) {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _hidl_cb(toStatus(NO_MEMORY), nullptr);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Void();
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<OMXNodeInstance> instance = new OMXNodeInstance(
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            this, new LWOmxObserver(observer), name.c_str());
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OMX_COMPONENTTYPE *handle;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OMX_ERRORTYPE err = mMaster->makeComponentInstance(
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            name.c_str(), &OMXNodeInstance::kCallbacks,
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            instance.get(), &handle);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != OMX_ErrorNone) {
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOG(ERROR) << "Failed to allocate omx component "
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "'" << name.c_str() << "' "
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " err=" << asString(err) <<
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "(0x" << std::hex << unsigned(err) << ")";
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _hidl_cb(toStatus(StatusFromOMXError(err)), nullptr);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Void();
1148fb954263dd2f918ad339045cc6d82e346515599Romain Guy    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    instance->setHandle(handle);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    std::vector<AString> quirkVector;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mParser.getQuirks(name.c_str(), &quirkVector) == OK) {
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t quirks = 0;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (const AString quirk : quirkVector) {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (quirk == "requires-allocate-on-input-ports") {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                quirks |= kRequiresAllocateBufferOnInputPorts;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (quirk == "requires-allocate-on-output-ports") {
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                quirks |= kRequiresAllocateBufferOnOutputPorts;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instance->setQuirks(quirks);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mLiveNodes.add(observer.get(), instance);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    observer->linkToDeath(this, 0);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mNode2Observer.add(instance.get(), observer.get());
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _hidl_cb(toStatus(OK), new TWOmxNode(instance));
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return Void();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectReturn<void> Omx::createInputSurface(createInputSurface_cb _hidl_cb) {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<::android::IGraphicBufferProducer> bufferProducer;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<GraphicBufferSource> graphicBufferSource = new GraphicBufferSource();
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = graphicBufferSource->initCheck();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != OK) {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOG(ERROR) << "Failed to create persistent input surface: "
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                << strerror(-err) << " "
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "(" << int(err) << ")";
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        _hidl_cb(toStatus(err), nullptr, nullptr);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Void();
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bufferProducer = graphicBufferSource->getIGraphicBufferProducer();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    _hidl_cb(toStatus(OK),
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new TWGraphicBufferProducer(bufferProducer),
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            new TWGraphicBufferSource(graphicBufferSource));
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return Void();
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Omx::serviceDied(uint64_t /* cookie */, wp<IBase> const& who) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<OMXNodeInstance> instance;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Mutex::Autolock autoLock(mLock);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t index = mLiveNodes.indexOfKey(who);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index < 0) {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOG(ERROR) << "b/27597103, nonexistent observer on serviceDied";
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            android_errorWriteLog(0x534e4554, "27597103");
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        instance = mLiveNodes.editValueAt(index);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLiveNodes.removeItemsAt(index);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNode2Observer.removeItem(instance.get());
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    instance->onObserverDied();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t Omx::freeNode(sp<OMXNodeInstance> const& instance) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (instance == NULL) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return OK;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Mutex::Autolock autoLock(mLock);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t observerIndex = mNode2Observer.indexOfKey(instance.get());
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (observerIndex >= 0) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            wp<IBase> observer = mNode2Observer.valueAt(observerIndex);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t nodeIndex = mLiveNodes.indexOfKey(observer);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (nodeIndex >= 0) {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNode2Observer.removeItemsAt(observerIndex);
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLiveNodes.removeItemsAt(nodeIndex);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sp<IBase> sObserver = observer.promote();
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (sObserver != nullptr) {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sObserver->unlinkToDeath(this);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LOG(WARNING) << "Inconsistent observer record";
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    OMX_ERRORTYPE err = OMX_ErrorNone;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (instance->handle() != NULL) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        err = mMaster->destroyComponentInstance(
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                static_cast<OMX_COMPONENTTYPE*>(instance->handle()));
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return StatusFromOMXError(err);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Methods from ::android::hidl::base::V1_0::IBase follow.
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIOmx* HIDL_FETCH_IOmx(const char* /* name */) {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return new Omx();
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}  // namespace implementation
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}  // namespace V1_0
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}  // namespace omx
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}  // namespace media
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}  // namespace hardware
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}  // namespace android
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project