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