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