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