WOmxNode.cpp revision 8a21c0191f974a0b9cbd5818052e2655e0aaa306
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 17517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <IOMX.h> 18517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <OMXNodeInstance.h> 19517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include "WOmxNode.h" 20517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include "WOmxBufferSource.h" 21517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include "Conversion.h" 22517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 23517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <algorithm> 24517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 25517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace android { 26517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace hardware { 27517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace media { 28517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace omx { 29517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace V1_0 { 30517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace implementation { 31517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 32517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::Void; 33517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 34517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// LWOmxNode 35517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaLWOmxNode::LWOmxNode(sp<IOmxNode> const& base) : mBase(base) { 36517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 37517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 38517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::freeNode() { 39517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatusT(mBase->freeNode()); 40517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 41517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 42517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::sendCommand( 43517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_COMMANDTYPE cmd, OMX_S32 param) { 44517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatusT(mBase->sendCommand( 45517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toRawCommandType(cmd), param)); 46517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 47517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 48517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::getParameter( 49517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_INDEXTYPE index, void *params, size_t size) { 50517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa hidl_vec<uint8_t> tParams = inHidlBytes(params, size); 51517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t fnStatus; 52517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t transStatus = toStatusT(mBase->getParameter( 53517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toRawIndexType(index), 54517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa tParams, 55517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa [&fnStatus, params, size]( 56517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status, hidl_vec<uint8_t> const& outParams) { 57517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa fnStatus = toStatusT(status); 58517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa std::copy( 59517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa outParams.data(), 60517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa outParams.data() + outParams.size(), 61517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa static_cast<uint8_t*>(params)); 62517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa })); 63517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return transStatus == NO_ERROR ? fnStatus : transStatus; 64517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 65517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 66517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::setParameter( 67517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_INDEXTYPE index, const void *params, size_t size) { 68517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa hidl_vec<uint8_t> tParams = inHidlBytes(params, size); 69517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatusT(mBase->setParameter( 70517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toRawIndexType(index), tParams)); 71517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 72517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 73517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::getConfig( 74517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_INDEXTYPE index, void *params, size_t size) { 75517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa hidl_vec<uint8_t> tParams = inHidlBytes(params, size); 76517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t fnStatus; 77517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t transStatus = toStatusT(mBase->getConfig( 78517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toRawIndexType(index), 79517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa tParams, 80517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa [&fnStatus, params, size]( 81517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status, hidl_vec<uint8_t> const& outParams) { 82517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa fnStatus = toStatusT(status); 83517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa std::copy( 84517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa outParams.data(), 85517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa outParams.data() + size, 86517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa static_cast<uint8_t*>(params)); 87517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa })); 88517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return transStatus == NO_ERROR ? fnStatus : transStatus; 89517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 90517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 91517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::setConfig( 92517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_INDEXTYPE index, const void *params, size_t size) { 93517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa hidl_vec<uint8_t> tParams = inHidlBytes(params, size); 94517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatusT(mBase->setConfig(toRawIndexType(index), tParams)); 95517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 96517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 97517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::setPortMode( 98517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 port_index, IOMX::PortMode mode) { 99517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatusT(mBase->setPortMode(port_index, toHardwarePortMode(mode))); 100517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 101517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 102517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::prepareForAdaptivePlayback( 103517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 portIndex, OMX_BOOL enable, 104517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) { 105517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatusT(mBase->prepareForAdaptivePlayback( 106517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa portIndex, toRawBool(enable), maxFrameWidth, maxFrameHeight)); 107517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 108517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 109517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::configureVideoTunnelMode( 110517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 portIndex, OMX_BOOL tunneled, 111517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 audioHwSync, native_handle_t **sidebandHandle) { 112517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t fnStatus; 113517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t transStatus = toStatusT(mBase->configureVideoTunnelMode( 114517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa portIndex, 115517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toRawBool(tunneled), 116517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa audioHwSync, 117517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa [&fnStatus, sidebandHandle]( 118517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status, hidl_handle const& outSidebandHandle) { 119517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa fnStatus = toStatusT(status); 120f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa *sidebandHandle = outSidebandHandle == nullptr ? 121f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa nullptr : native_handle_clone(outSidebandHandle); 122517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa })); 123517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return transStatus == NO_ERROR ? fnStatus : transStatus; 124517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 125517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 126517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::getGraphicBufferUsage( 127517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 portIndex, OMX_U32* usage) { 128517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t fnStatus; 129517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t transStatus = toStatusT(mBase->getGraphicBufferUsage( 130517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa portIndex, 131517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa [&fnStatus, usage]( 132517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status, uint32_t outUsage) { 133517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa fnStatus = toStatusT(status); 134517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *usage = outUsage; 135517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa })); 136517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return transStatus == NO_ERROR ? fnStatus : transStatus; 137517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 138517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 139517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::setInputSurface( 140517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa const sp<IOMXBufferSource> &bufferSource) { 141517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatusT(mBase->setInputSurface( 142517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa new TWOmxBufferSource(bufferSource))); 143517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 144517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 145517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::allocateSecureBuffer( 146517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 portIndex, size_t size, buffer_id *buffer, 147517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa void **buffer_data, sp<NativeHandle> *native_handle) { 148517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *buffer_data = nullptr; 149517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t fnStatus; 150517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t transStatus = toStatusT(mBase->allocateSecureBuffer( 151517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa portIndex, 152517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa static_cast<uint64_t>(size), 153517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa [&fnStatus, buffer, buffer_data, native_handle]( 154517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status, 155517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t outBuffer, 156517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa hidl_handle const& outNativeHandle) { 157517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa fnStatus = toStatusT(status); 158517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *buffer = outBuffer; 159517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *native_handle = NativeHandle::create( 160517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa native_handle_clone(outNativeHandle), true); 161517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa })); 162517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return transStatus == NO_ERROR ? fnStatus : transStatus; 163517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 164517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 165517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::useBuffer( 166517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 portIndex, const OMXBuffer &omxBuffer, buffer_id *buffer) { 167517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa CodecBuffer codecBuffer; 168517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa if (!wrapAs(&codecBuffer, omxBuffer)) { 169517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return BAD_VALUE; 170517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa } 171517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t fnStatus; 172517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t transStatus = toStatusT(mBase->useBuffer( 173517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa portIndex, 174517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa codecBuffer, 175517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa [&fnStatus, buffer](Status status, uint32_t outBuffer) { 176517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa fnStatus = toStatusT(status); 177517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *buffer = outBuffer; 178517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa })); 179517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return transStatus == NO_ERROR ? fnStatus : transStatus; 180517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 181517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 182517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::freeBuffer( 183517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 portIndex, buffer_id buffer) { 184517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatusT(mBase->freeBuffer(portIndex, buffer)); 185517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 186517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 187517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::fillBuffer( 188517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa buffer_id buffer, const OMXBuffer &omxBuffer, int fenceFd) { 189517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa CodecBuffer codecBuffer; 190517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa if (!wrapAs(&codecBuffer, omxBuffer)) { 191517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return BAD_VALUE; 192517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa } 193517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa native_handle_t* fenceNh = native_handle_create_from_fd(fenceFd); 194517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa if (!fenceNh) { 195517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return NO_MEMORY; 196517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa } 197517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t status = toStatusT(mBase->fillBuffer( 198517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa buffer, codecBuffer, fenceNh)); 1998a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa native_handle_close(fenceNh); 200517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa native_handle_delete(fenceNh); 201517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return status; 202517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 203517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 204517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::emptyBuffer( 205517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa buffer_id buffer, const OMXBuffer &omxBuffer, 206517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { 207517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa CodecBuffer codecBuffer; 208517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa if (!wrapAs(&codecBuffer, omxBuffer)) { 209517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return BAD_VALUE; 210517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa } 211517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa native_handle_t* fenceNh = native_handle_create_from_fd(fenceFd); 212517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa if (!fenceNh) { 213517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return NO_MEMORY; 214517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa } 215517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t status = toStatusT(mBase->emptyBuffer( 216517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa buffer, 217517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa codecBuffer, 218517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa flags, 219517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toRawTicks(timestamp), 220517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa fenceNh)); 2218a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa native_handle_close(fenceNh); 222517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa native_handle_delete(fenceNh); 223517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return status; 224517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 225517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::getExtensionIndex( 226517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa const char *parameter_name, 227517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_INDEXTYPE *index) { 228517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t fnStatus; 229517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t transStatus = toStatusT(mBase->getExtensionIndex( 230517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa hidl_string(parameter_name), 231517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa [&fnStatus, index](Status status, uint32_t outIndex) { 232517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa fnStatus = toStatusT(status); 233517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *index = toEnumIndexType(outIndex); 234517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa })); 235517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return transStatus == NO_ERROR ? fnStatus : transStatus; 236517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 237517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 238517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasastatus_t LWOmxNode::dispatchMessage(const omx_message &lMsg) { 239517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Message tMsg; 240517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa native_handle_t* nh; 241517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa if (!wrapAs(&tMsg, &nh, lMsg)) { 242517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return NO_MEMORY; 243517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa } 244517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa status_t status = toStatusT(mBase->dispatchMessage(tMsg)); 2458a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa native_handle_close(nh); 246517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa native_handle_delete(nh); 247517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return status; 248517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 249517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 250517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// TODO: this is temporary, will be removed when quirks move to OMX side. 251f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasastatus_t LWOmxNode::setQuirks(OMX_U32 quirks) { 252f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return toStatusT(mBase->setQuirks(static_cast<uint32_t>(quirks)));; 253517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 254517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 255517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa::android::IBinder* LWOmxNode::onAsBinder() { 256517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return nullptr; 257517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 258517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 259517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// TWOmxNode 260517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaTWOmxNode::TWOmxNode(sp<IOMXNode> const& base) : mBase(base) { 261517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 262517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 263517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::freeNode() { 264517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->freeNode()); 265517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 266517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 267517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::sendCommand(uint32_t cmd, int32_t param) { 268517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->sendCommand(toEnumCommandType(cmd), param)); 269517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 270517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 271517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<void> TWOmxNode::getParameter( 272517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t index, hidl_vec<uint8_t> const& inParams, 273517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa getParameter_cb _hidl_cb) { 274517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa hidl_vec<uint8_t> params(inParams); 275517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status = toStatus(mBase->getParameter( 276517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toEnumIndexType(index), 277517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa static_cast<void*>(params.data()), 278517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa params.size())); 279517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa _hidl_cb(status, params); 280517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Void(); 281517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 282517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 283517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::setParameter( 284517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t index, hidl_vec<uint8_t> const& params) { 285517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->setParameter( 286517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toEnumIndexType(index), 287517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa static_cast<void const*>(params.data()), 288517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa params.size())); 289517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 290517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 291517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<void> TWOmxNode::getConfig( 292517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t index, const hidl_vec<uint8_t>& inConfig, 293517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa getConfig_cb _hidl_cb) { 294517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa hidl_vec<uint8_t> config(inConfig); 295517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status = toStatus(mBase->getConfig( 296517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toEnumIndexType(index), 297517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa static_cast<void*>(config.data()), 298517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa config.size())); 299517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa _hidl_cb(status, config); 300517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Void(); 301517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 302517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 303517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::setConfig( 304517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t index, const hidl_vec<uint8_t>& config) { 305517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->setConfig( 306517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toEnumIndexType(index), 307517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa static_cast<void const*>(config.data()), 308517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa config.size())); 309517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 310517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 311517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::setPortMode(uint32_t portIndex, PortMode mode) { 312517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->setPortMode(portIndex, toIOMXPortMode(mode))); 313517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 314517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 315517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::prepareForAdaptivePlayback( 316517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t portIndex, bool enable, 317517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t maxFrameWidth, uint32_t maxFrameHeight) { 318517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->prepareForAdaptivePlayback( 319517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa portIndex, 320517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toEnumBool(enable), 321517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa maxFrameWidth, 322517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa maxFrameHeight)); 323517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 324517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 325517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<void> TWOmxNode::configureVideoTunnelMode( 326517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t portIndex, bool tunneled, uint32_t audioHwSync, 327517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa configureVideoTunnelMode_cb _hidl_cb) { 328f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa native_handle_t* sidebandHandle = nullptr; 329517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status = toStatus(mBase->configureVideoTunnelMode( 330517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa portIndex, 331517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toEnumBool(tunneled), 332517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa audioHwSync, 333517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa &sidebandHandle)); 334517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa _hidl_cb(status, hidl_handle(sidebandHandle)); 335517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Void(); 336517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 337517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 338517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<void> TWOmxNode::getGraphicBufferUsage( 339517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t portIndex, getGraphicBufferUsage_cb _hidl_cb) { 340517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_U32 usage; 341517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status = toStatus(mBase->getGraphicBufferUsage( 342517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa portIndex, &usage)); 343517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa _hidl_cb(status, usage); 344517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Void(); 345517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 346517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 347517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::setInputSurface( 348517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa const sp<IOmxBufferSource>& bufferSource) { 349517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->setInputSurface(new LWOmxBufferSource( 350517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa bufferSource))); 351517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 352517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 353517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<void> TWOmxNode::allocateSecureBuffer( 354517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t portIndex, uint64_t size, 355517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa allocateSecureBuffer_cb _hidl_cb) { 356517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa IOMX::buffer_id buffer; 357517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa void* bufferData; 358517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa sp<NativeHandle> nativeHandle; 359517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status = toStatus(mBase->allocateSecureBuffer( 360517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa portIndex, 361517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa static_cast<size_t>(size), 362517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa &buffer, 363517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa &bufferData, 364517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa &nativeHandle)); 365517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa _hidl_cb(status, buffer, nativeHandle->handle()); 366517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Void(); 367517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 368517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 369517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<void> TWOmxNode::useBuffer( 370517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t portIndex, const CodecBuffer& codecBuffer, 371517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa useBuffer_cb _hidl_cb) { 372517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa IOMX::buffer_id buffer; 373517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMXBuffer omxBuffer; 374517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa if (!convertTo(&omxBuffer, codecBuffer)) { 375517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa _hidl_cb(Status::BAD_VALUE, 0); 376517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Void(); 377517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa } 378517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status = toStatus(mBase->useBuffer( 379517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa portIndex, omxBuffer, &buffer)); 380517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa _hidl_cb(status, buffer); 381517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Void(); 382517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 383517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 384517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::freeBuffer(uint32_t portIndex, uint32_t buffer) { 385517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->freeBuffer(portIndex, buffer)); 386517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 387517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 388517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::fillBuffer( 389517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t buffer, const CodecBuffer& codecBuffer, 390517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa const hidl_handle& fence) { 391517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMXBuffer omxBuffer; 392517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa if (!convertTo(&omxBuffer, codecBuffer)) { 393517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Status::BAD_VALUE; 394517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa } 395517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->fillBuffer( 396517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa buffer, 397517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa omxBuffer, 3988a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa dup(native_handle_read_fd(fence)))); 399517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 400517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 401517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::emptyBuffer( 402517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint32_t buffer, const CodecBuffer& codecBuffer, uint32_t flags, 403517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa uint64_t timestampUs, const hidl_handle& fence) { 404517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMXBuffer omxBuffer; 405517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa if (!convertTo(&omxBuffer, codecBuffer)) { 406517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Status::BAD_VALUE; 407517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa } 408517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->emptyBuffer( 409517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa buffer, 410517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa omxBuffer, 411517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa flags, 412517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa toOMXTicks(timestampUs), 4138a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa dup(native_handle_read_fd(fence)))); 414517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 415517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 416517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<void> TWOmxNode::getExtensionIndex( 417517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa const hidl_string& parameterName, 418517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa getExtensionIndex_cb _hidl_cb) { 419517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa OMX_INDEXTYPE index; 420517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa Status status = toStatus(mBase->getExtensionIndex( 421517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa parameterName, &index)); 422517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa _hidl_cb(status, toRawIndexType(index)); 423517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Void(); 424517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 425517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 426517b0e090680e378f056677201426ed9dc325c65Pawin VongmasaReturn<Status> TWOmxNode::dispatchMessage(const Message& tMsg) { 427517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa omx_message lMsg; 4288a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa if (!convertTo(&lMsg, tMsg)) { 429517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return Status::BAD_VALUE; 430517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa } 431517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa return toStatus(mBase->dispatchMessage(lMsg)); 432517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} 433517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 434f62ea8018813951e8f6a182880cadb3217e4ce37Pawin VongmasaReturn<void> TWOmxNode::setQuirks(uint32_t quirks) { 435f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa mBase->setQuirks(static_cast<OMX_U32>(quirks)); 436f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa return Void(); 437f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa} 438517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa 439517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace implementation 440517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace V1_0 441517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace omx 442517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace media 443517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace hardware 444517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa} // namespace android 445