Omx.cpp revision 383f61d9eec276b668bc1853a25c6574582e2547
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>
220d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa#include <OMX_Core.h>
23f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <OMX_AsString.h>
240d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa
2504563aafa0debc95d50951ca944abf37ef2777cePawin Vongmasa#include "../OMXUtils.h"
2604563aafa0debc95d50951ca944abf37ef2777cePawin Vongmasa#include "../OMXMaster.h"
2704563aafa0debc95d50951ca944abf37ef2777cePawin Vongmasa#include "../GraphicBufferSource.h"
28f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
29f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include "WOmxNode.h"
30f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include "WOmxObserver.h"
3104563aafa0debc95d50951ca944abf37ef2777cePawin Vongmasa#include "WGraphicBufferProducer.h"
32f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include "WGraphicBufferSource.h"
33f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include "Conversion.h"
3476307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa
350d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa#include "Omx.h"
360d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa
3776307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace android {
3876307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace hardware {
3976307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace media {
4076307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace omx {
4176307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace V1_0 {
4276307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasanamespace implementation {
4376307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa
44f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasaconstexpr size_t kMaxNodeInstances = (1 << 16);
45f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin VongmasaOmx::Omx() :
476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa    mMaster(new OMXMaster()),
486ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa    mParser() {
49f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa}
50f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
51f62ea8018813951e8f6a182880cadb3217e4ce37Pawin VongmasaOmx::~Omx() {
52f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    delete mMaster;
53f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa}
54f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
5576307481cf727f17add7e15527136f2402bd80a5Pawin VongmasaReturn<void> Omx::listNodes(listNodes_cb _hidl_cb) {
56f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    std::list<::android::IOMX::ComponentInfo> list;
57f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    char componentName[256];
58f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    for (OMX_U32 index = 0;
59f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            mMaster->enumerateComponents(
60f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            componentName, sizeof(componentName), index) == OMX_ErrorNone;
61f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            ++index) {
62f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        list.push_back(::android::IOMX::ComponentInfo());
63f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        ::android::IOMX::ComponentInfo& info = list.back();
64f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        info.mName = componentName;
65f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        ::android::Vector<::android::String8> roles;
66f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        OMX_ERRORTYPE err =
67f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                mMaster->getRolesOfComponent(componentName, &roles);
68f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        if (err == OMX_ErrorNone) {
69f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            for (OMX_U32 i = 0; i < roles.size(); ++i) {
70f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                info.mRoles.push_back(roles[i]);
71f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            }
72f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        }
73f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
74f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
75f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    hidl_vec<ComponentInfo> tList;
76f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    tList.resize(list.size());
77f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    size_t i = 0;
78f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    for (auto const& info : list) {
79f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        convertTo(&(tList[i++]), info);
80f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
81f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    _hidl_cb(toStatus(OK), tList);
82f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    return Void();
83f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa}
84f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
85f62ea8018813951e8f6a182880cadb3217e4ce37Pawin VongmasaReturn<void> Omx::allocateNode(
86f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        const hidl_string& name,
87f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        const sp<IOmxObserver>& observer,
88f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        allocateNode_cb _hidl_cb) {
89f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
90f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    using ::android::IOMXNode;
91f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    using ::android::IOMXObserver;
92f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
93383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa    sp<OMXNodeInstance> instance;
94383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa    {
95383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        Mutex::Autolock autoLock(mLock);
96383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        if (mLiveNodes.size() == kMaxNodeInstances) {
97383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa            _hidl_cb(toStatus(NO_MEMORY), nullptr);
98383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa            return Void();
99383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        }
100f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
101383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        instance = new OMXNodeInstance(
102383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                this, new LWOmxObserver(observer), name.c_str());
103383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa
104383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        OMX_COMPONENTTYPE *handle;
105383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        OMX_ERRORTYPE err = mMaster->makeComponentInstance(
106383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                name.c_str(), &OMXNodeInstance::kCallbacks,
107383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                instance.get(), &handle);
108383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa
109383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        if (err != OMX_ErrorNone) {
110383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa            LOG(ERROR) << "Failed to allocate omx component "
111383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                    "'" << name.c_str() << "' "
112383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                    " err=" << asString(err) <<
113383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                    "(0x" << std::hex << unsigned(err) << ")";
114383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa            _hidl_cb(toStatus(StatusFromOMXError(err)), nullptr);
115383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa            return Void();
116383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        }
117383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        instance->setHandle(handle);
118383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        std::vector<AString> quirkVector;
119383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        if (mParser.getQuirks(name.c_str(), &quirkVector) == OK) {
120383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa            uint32_t quirks = 0;
121383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa            for (const AString quirk : quirkVector) {
122383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                if (quirk == "requires-allocate-on-input-ports") {
123383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                    quirks |= kRequiresAllocateBufferOnInputPorts;
124383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                }
125383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                if (quirk == "requires-allocate-on-output-ports") {
126383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                    quirks |= kRequiresAllocateBufferOnOutputPorts;
127383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa                }
1286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa            }
129383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa            instance->setQuirks(quirks);
1306ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa        }
131f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
132383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        mLiveNodes.add(observer.get(), instance);
133383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa        mNode2Observer.add(instance.get(), observer.get());
134383f61d9eec276b668bc1853a25c6574582e2547Pawin Vongmasa    }
135f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    observer->linkToDeath(this, 0);
136f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
137f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    _hidl_cb(toStatus(OK), new TWOmxNode(instance));
13876307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa    return Void();
13976307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}
14076307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa
141f62ea8018813951e8f6a182880cadb3217e4ce37Pawin VongmasaReturn<void> Omx::createInputSurface(createInputSurface_cb _hidl_cb) {
142f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    sp<::android::IGraphicBufferProducer> bufferProducer;
143f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
144f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    sp<GraphicBufferSource> graphicBufferSource = new GraphicBufferSource();
145f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    status_t err = graphicBufferSource->initCheck();
146f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    if (err != OK) {
147223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa        LOG(ERROR) << "Failed to create persistent input surface: "
148223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa                << strerror(-err) << " "
149223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa                "(" << int(err) << ")";
150f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        _hidl_cb(toStatus(err), nullptr, nullptr);
151f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        return Void();
152f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
153f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    bufferProducer = graphicBufferSource->getIGraphicBufferProducer();
154f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
155f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    _hidl_cb(toStatus(OK),
15604563aafa0debc95d50951ca944abf37ef2777cePawin Vongmasa            new TWGraphicBufferProducer(bufferProducer),
157d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih            new TWGraphicBufferSource(graphicBufferSource));
15876307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa    return Void();
15976307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}
16076307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa
161f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasavoid Omx::serviceDied(uint64_t /* cookie */, wp<IBase> const& who) {
162f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    sp<OMXNodeInstance> instance;
163f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    {
164f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        Mutex::Autolock autoLock(mLock);
165f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
166f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        ssize_t index = mLiveNodes.indexOfKey(who);
167f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
168f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        if (index < 0) {
169223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa            LOG(ERROR) << "b/27597103, nonexistent observer on serviceDied";
170f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            android_errorWriteLog(0x534e4554, "27597103");
171f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            return;
172f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        }
173f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
174f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        instance = mLiveNodes.editValueAt(index);
175f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        mLiveNodes.removeItemsAt(index);
176f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        mNode2Observer.removeItem(instance.get());
177f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
178f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    instance->onObserverDied();
179f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa}
180f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
181f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasastatus_t Omx::freeNode(sp<OMXNodeInstance> const& instance) {
182f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    if (instance == NULL) {
183f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        return OK;
184f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
185f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
186f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    {
187f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        Mutex::Autolock autoLock(mLock);
188f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        ssize_t observerIndex = mNode2Observer.indexOfKey(instance.get());
189990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan        if (observerIndex >= 0) {
190990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan            wp<IBase> observer = mNode2Observer.valueAt(observerIndex);
191990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan            ssize_t nodeIndex = mLiveNodes.indexOfKey(observer);
192990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan            if (nodeIndex >= 0) {
193990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                mNode2Observer.removeItemsAt(observerIndex);
194990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                mLiveNodes.removeItemsAt(nodeIndex);
195990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                sp<IBase> sObserver = observer.promote();
196990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                if (sObserver != nullptr) {
197990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                    sObserver->unlinkToDeath(this);
198990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                }
199990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan            } else {
200990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                LOG(WARNING) << "Inconsistent observer record";
201990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan            }
202f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        }
203f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
204f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
205f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    OMX_ERRORTYPE err = OMX_ErrorNone;
206f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    if (instance->handle() != NULL) {
207f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        err = mMaster->destroyComponentInstance(
208f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                static_cast<OMX_COMPONENTTYPE*>(instance->handle()));
209f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
210f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    return StatusFromOMXError(err);
211f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa}
21276307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa
213517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// Methods from ::android::hidl::base::V1_0::IBase follow.
214517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
21576307481cf727f17add7e15527136f2402bd80a5Pawin VongmasaIOmx* HIDL_FETCH_IOmx(const char* /* name */) {
21676307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa    return new Omx();
21776307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}
21876307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa
219517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}  // namespace implementation
22076307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}  // namespace V1_0
22176307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}  // namespace omx
22276307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}  // namespace media
22376307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}  // namespace hardware
22476307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}  // namespace android
225