Omx.cpp revision 990bc6dec9e62f1fb529a3f552aaaf7478f84756
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
93f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    Mutex::Autolock autoLock(mLock);
94f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    if (mLiveNodes.size() == kMaxNodeInstances) {
95f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        _hidl_cb(toStatus(NO_MEMORY), nullptr);
96f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        return Void();
97f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
98f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
99f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    sp<OMXNodeInstance> instance = new OMXNodeInstance(
100c1d17710bde127ad6c4533490b27effb3016f1b4Scott Randolph            this, new LWOmxObserver(observer), name.c_str());
101f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
102f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    OMX_COMPONENTTYPE *handle;
103f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    OMX_ERRORTYPE err = mMaster->makeComponentInstance(
104c1d17710bde127ad6c4533490b27effb3016f1b4Scott Randolph            name.c_str(), &OMXNodeInstance::kCallbacks,
105f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            instance.get(), &handle);
106f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
107f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    if (err != OMX_ErrorNone) {
108223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa        LOG(ERROR) << "Failed to allocate omx component "
109223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa                "'" << name.c_str() << "' "
110223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa                " err=" << asString(err) <<
111223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa                "(0x" << std::hex << unsigned(err) << ")";
112f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        _hidl_cb(toStatus(StatusFromOMXError(err)), nullptr);
113f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        return Void();
114f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
115f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    instance->setHandle(handle);
1166ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa    std::vector<AString> quirkVector;
1176ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa    if (mParser.getQuirks(name.c_str(), &quirkVector) == OK) {
1186ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa        uint32_t quirks = 0;
1196ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa        for (const AString quirk : quirkVector) {
1206ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa            if (quirk == "requires-allocate-on-input-ports") {
1216ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa                quirks |= kRequiresAllocateBufferOnInputPorts;
1226ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa            }
1236ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa            if (quirk == "requires-allocate-on-output-ports") {
1246ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa                quirks |= kRequiresAllocateBufferOnOutputPorts;
1256ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa            }
1266ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa        }
1276ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa        instance->setQuirks(quirks);
1286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa    }
129f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
130f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    mLiveNodes.add(observer.get(), instance);
131f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    observer->linkToDeath(this, 0);
132f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    mNode2Observer.add(instance.get(), observer.get());
133f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
134f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    _hidl_cb(toStatus(OK), new TWOmxNode(instance));
13576307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa    return Void();
13676307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}
13776307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa
138f62ea8018813951e8f6a182880cadb3217e4ce37Pawin VongmasaReturn<void> Omx::createInputSurface(createInputSurface_cb _hidl_cb) {
139f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    sp<::android::IGraphicBufferProducer> bufferProducer;
140f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
141f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    sp<GraphicBufferSource> graphicBufferSource = new GraphicBufferSource();
142f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    status_t err = graphicBufferSource->initCheck();
143f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    if (err != OK) {
144223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa        LOG(ERROR) << "Failed to create persistent input surface: "
145223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa                << strerror(-err) << " "
146223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa                "(" << int(err) << ")";
147f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        _hidl_cb(toStatus(err), nullptr, nullptr);
148f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        return Void();
149f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
150f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    bufferProducer = graphicBufferSource->getIGraphicBufferProducer();
151f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
152f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    _hidl_cb(toStatus(OK),
15304563aafa0debc95d50951ca944abf37ef2777cePawin Vongmasa            new TWGraphicBufferProducer(bufferProducer),
154d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih            new TWGraphicBufferSource(graphicBufferSource));
15576307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa    return Void();
15676307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}
15776307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa
158f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasavoid Omx::serviceDied(uint64_t /* cookie */, wp<IBase> const& who) {
159f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    sp<OMXNodeInstance> instance;
160f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    {
161f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        Mutex::Autolock autoLock(mLock);
162f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
163f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        ssize_t index = mLiveNodes.indexOfKey(who);
164f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
165f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        if (index < 0) {
166223b8e36091a48b3963d2ea6fc7e304b71e26553Pawin Vongmasa            LOG(ERROR) << "b/27597103, nonexistent observer on serviceDied";
167f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            android_errorWriteLog(0x534e4554, "27597103");
168f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            return;
169f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        }
170f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
171f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        instance = mLiveNodes.editValueAt(index);
172f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        mLiveNodes.removeItemsAt(index);
173f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        mNode2Observer.removeItem(instance.get());
174f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
175f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    instance->onObserverDied();
176f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa}
177f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
178f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasastatus_t Omx::freeNode(sp<OMXNodeInstance> const& instance) {
179f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    if (instance == NULL) {
180f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        return OK;
181f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
182f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
183f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    {
184f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        Mutex::Autolock autoLock(mLock);
185f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        ssize_t observerIndex = mNode2Observer.indexOfKey(instance.get());
186990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan        if (observerIndex >= 0) {
187990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan            wp<IBase> observer = mNode2Observer.valueAt(observerIndex);
188990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan            ssize_t nodeIndex = mLiveNodes.indexOfKey(observer);
189990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan            if (nodeIndex >= 0) {
190990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                mNode2Observer.removeItemsAt(observerIndex);
191990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                mLiveNodes.removeItemsAt(nodeIndex);
192990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                sp<IBase> sObserver = observer.promote();
193990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                if (sObserver != nullptr) {
194990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                    sObserver->unlinkToDeath(this);
195990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                }
196990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan            } else {
197990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan                LOG(WARNING) << "Inconsistent observer record";
198990bc6dec9e62f1fb529a3f552aaaf7478f84756Praveen Chavan            }
199f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        }
200f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
201f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
202f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    OMX_ERRORTYPE err = OMX_ErrorNone;
203f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    if (instance->handle() != NULL) {
204f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        err = mMaster->destroyComponentInstance(
205f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                static_cast<OMX_COMPONENTTYPE*>(instance->handle()));
206f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    }
207f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    return StatusFromOMXError(err);
208f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa}
20976307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa
210517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// Methods from ::android::hidl::base::V1_0::IBase follow.
211517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
21276307481cf727f17add7e15527136f2402bd80a5Pawin VongmasaIOmx* HIDL_FETCH_IOmx(const char* /* name */) {
21376307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa    return new Omx();
21476307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}
21576307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa
216517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}  // namespace implementation
21776307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}  // namespace V1_0
21876307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}  // namespace omx
21976307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}  // namespace media
22076307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}  // namespace hardware
22176307481cf727f17add7e15527136f2402bd80a5Pawin Vongmasa}  // namespace android
222