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