blob: 6c92b5277f1737c874b59ab76e136170292f3738 [file] [log] [blame]
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -08001/*
2 * Copyright 2016, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Pawin Vongmasa0d3a5ed2017-02-22 03:19:35 -080017#include <algorithm>
18
Pawin Vongmasaac7d4122017-03-01 05:48:42 -080019#include <media/omx/1.0/WOmxNode.h>
20#include <media/omx/1.0/WOmxBufferSource.h>
21#include <media/omx/1.0/Conversion.h>
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -080022
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -080023namespace android {
24namespace hardware {
25namespace media {
26namespace omx {
27namespace V1_0 {
28namespace utils {
29
30using ::android::hardware::Void;
31
32// LWOmxNode
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -080033status_t LWOmxNode::freeNode() {
34 return toStatusT(mBase->freeNode());
35}
36
37status_t LWOmxNode::sendCommand(
38 OMX_COMMANDTYPE cmd, OMX_S32 param) {
39 return toStatusT(mBase->sendCommand(
40 toRawCommandType(cmd), param));
41}
42
43status_t LWOmxNode::getParameter(
44 OMX_INDEXTYPE index, void *params, size_t size) {
45 hidl_vec<uint8_t> tParams = inHidlBytes(params, size);
46 status_t fnStatus;
47 status_t transStatus = toStatusT(mBase->getParameter(
48 toRawIndexType(index),
49 tParams,
50 [&fnStatus, params, size](
51 Status status, hidl_vec<uint8_t> const& outParams) {
52 fnStatus = toStatusT(status);
53 std::copy(
54 outParams.data(),
55 outParams.data() + outParams.size(),
56 static_cast<uint8_t*>(params));
57 }));
58 return transStatus == NO_ERROR ? fnStatus : transStatus;
59}
60
61status_t LWOmxNode::setParameter(
62 OMX_INDEXTYPE index, const void *params, size_t size) {
63 hidl_vec<uint8_t> tParams = inHidlBytes(params, size);
64 return toStatusT(mBase->setParameter(
65 toRawIndexType(index), tParams));
66}
67
68status_t LWOmxNode::getConfig(
69 OMX_INDEXTYPE index, void *params, size_t size) {
70 hidl_vec<uint8_t> tParams = inHidlBytes(params, size);
71 status_t fnStatus;
72 status_t transStatus = toStatusT(mBase->getConfig(
73 toRawIndexType(index),
74 tParams,
75 [&fnStatus, params, size](
76 Status status, hidl_vec<uint8_t> const& outParams) {
77 fnStatus = toStatusT(status);
78 std::copy(
79 outParams.data(),
80 outParams.data() + size,
81 static_cast<uint8_t*>(params));
82 }));
83 return transStatus == NO_ERROR ? fnStatus : transStatus;
84}
85
86status_t LWOmxNode::setConfig(
87 OMX_INDEXTYPE index, const void *params, size_t size) {
88 hidl_vec<uint8_t> tParams = inHidlBytes(params, size);
89 return toStatusT(mBase->setConfig(toRawIndexType(index), tParams));
90}
91
92status_t LWOmxNode::setPortMode(
93 OMX_U32 port_index, IOMX::PortMode mode) {
94 return toStatusT(mBase->setPortMode(port_index, toHardwarePortMode(mode)));
95}
96
97status_t LWOmxNode::prepareForAdaptivePlayback(
98 OMX_U32 portIndex, OMX_BOOL enable,
99 OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) {
100 return toStatusT(mBase->prepareForAdaptivePlayback(
101 portIndex, toRawBool(enable), maxFrameWidth, maxFrameHeight));
102}
103
104status_t LWOmxNode::configureVideoTunnelMode(
105 OMX_U32 portIndex, OMX_BOOL tunneled,
106 OMX_U32 audioHwSync, native_handle_t **sidebandHandle) {
107 status_t fnStatus;
108 status_t transStatus = toStatusT(mBase->configureVideoTunnelMode(
109 portIndex,
110 toRawBool(tunneled),
111 audioHwSync,
112 [&fnStatus, sidebandHandle](
113 Status status, hidl_handle const& outSidebandHandle) {
114 fnStatus = toStatusT(status);
115 *sidebandHandle = outSidebandHandle == nullptr ?
116 nullptr : native_handle_clone(outSidebandHandle);
117 }));
118 return transStatus == NO_ERROR ? fnStatus : transStatus;
119}
120
121status_t LWOmxNode::getGraphicBufferUsage(
122 OMX_U32 portIndex, OMX_U32* usage) {
123 status_t fnStatus;
124 status_t transStatus = toStatusT(mBase->getGraphicBufferUsage(
125 portIndex,
126 [&fnStatus, usage](
127 Status status, uint32_t outUsage) {
128 fnStatus = toStatusT(status);
129 *usage = outUsage;
130 }));
131 return transStatus == NO_ERROR ? fnStatus : transStatus;
132}
133
134status_t LWOmxNode::setInputSurface(
135 const sp<IOMXBufferSource> &bufferSource) {
136 return toStatusT(mBase->setInputSurface(
137 new TWOmxBufferSource(bufferSource)));
138}
139
140status_t LWOmxNode::allocateSecureBuffer(
141 OMX_U32 portIndex, size_t size, buffer_id *buffer,
142 void **buffer_data, sp<NativeHandle> *native_handle) {
143 *buffer_data = nullptr;
144 status_t fnStatus;
145 status_t transStatus = toStatusT(mBase->allocateSecureBuffer(
146 portIndex,
147 static_cast<uint64_t>(size),
148 [&fnStatus, buffer, buffer_data, native_handle](
149 Status status,
150 uint32_t outBuffer,
151 hidl_handle const& outNativeHandle) {
152 fnStatus = toStatusT(status);
153 *buffer = outBuffer;
154 *native_handle = NativeHandle::create(
155 native_handle_clone(outNativeHandle), true);
156 }));
157 return transStatus == NO_ERROR ? fnStatus : transStatus;
158}
159
160status_t LWOmxNode::useBuffer(
161 OMX_U32 portIndex, const OMXBuffer &omxBuffer, buffer_id *buffer) {
162 CodecBuffer codecBuffer;
163 if (!wrapAs(&codecBuffer, omxBuffer)) {
164 return BAD_VALUE;
165 }
166 status_t fnStatus;
167 status_t transStatus = toStatusT(mBase->useBuffer(
168 portIndex,
169 codecBuffer,
170 [&fnStatus, buffer](Status status, uint32_t outBuffer) {
171 fnStatus = toStatusT(status);
172 *buffer = outBuffer;
173 }));
174 return transStatus == NO_ERROR ? fnStatus : transStatus;
175}
176
177status_t LWOmxNode::freeBuffer(
178 OMX_U32 portIndex, buffer_id buffer) {
179 return toStatusT(mBase->freeBuffer(portIndex, buffer));
180}
181
182status_t LWOmxNode::fillBuffer(
183 buffer_id buffer, const OMXBuffer &omxBuffer, int fenceFd) {
184 CodecBuffer codecBuffer;
185 if (!wrapAs(&codecBuffer, omxBuffer)) {
186 return BAD_VALUE;
187 }
188 native_handle_t* fenceNh = native_handle_create_from_fd(fenceFd);
189 if (!fenceNh) {
190 return NO_MEMORY;
191 }
192 status_t status = toStatusT(mBase->fillBuffer(
193 buffer, codecBuffer, fenceNh));
Pawin Vongmasa8a21c012016-12-27 04:30:54 +0700194 native_handle_close(fenceNh);
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -0800195 native_handle_delete(fenceNh);
196 return status;
197}
198
199status_t LWOmxNode::emptyBuffer(
200 buffer_id buffer, const OMXBuffer &omxBuffer,
201 OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) {
202 CodecBuffer codecBuffer;
203 if (!wrapAs(&codecBuffer, omxBuffer)) {
204 return BAD_VALUE;
205 }
206 native_handle_t* fenceNh = native_handle_create_from_fd(fenceFd);
207 if (!fenceNh) {
208 return NO_MEMORY;
209 }
210 status_t status = toStatusT(mBase->emptyBuffer(
211 buffer,
212 codecBuffer,
213 flags,
214 toRawTicks(timestamp),
215 fenceNh));
Pawin Vongmasa8a21c012016-12-27 04:30:54 +0700216 native_handle_close(fenceNh);
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -0800217 native_handle_delete(fenceNh);
218 return status;
219}
220status_t LWOmxNode::getExtensionIndex(
221 const char *parameter_name,
222 OMX_INDEXTYPE *index) {
223 status_t fnStatus;
224 status_t transStatus = toStatusT(mBase->getExtensionIndex(
225 hidl_string(parameter_name),
226 [&fnStatus, index](Status status, uint32_t outIndex) {
227 fnStatus = toStatusT(status);
228 *index = toEnumIndexType(outIndex);
229 }));
230 return transStatus == NO_ERROR ? fnStatus : transStatus;
231}
232
233status_t LWOmxNode::dispatchMessage(const omx_message &lMsg) {
234 Message tMsg;
235 native_handle_t* nh;
236 if (!wrapAs(&tMsg, &nh, lMsg)) {
237 return NO_MEMORY;
238 }
239 status_t status = toStatusT(mBase->dispatchMessage(tMsg));
Pawin Vongmasa8a21c012016-12-27 04:30:54 +0700240 native_handle_close(nh);
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -0800241 native_handle_delete(nh);
242 return status;
243}
244
245// TODO: this is temporary, will be removed when quirks move to OMX side.
246status_t LWOmxNode::setQuirks(OMX_U32 quirks) {
247 return toStatusT(mBase->setQuirks(static_cast<uint32_t>(quirks)));;
248}
249
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -0800250// TWOmxNode
251TWOmxNode::TWOmxNode(sp<IOMXNode> const& base) : mBase(base) {
252}
253
254Return<Status> TWOmxNode::freeNode() {
255 return toStatus(mBase->freeNode());
256}
257
258Return<Status> TWOmxNode::sendCommand(uint32_t cmd, int32_t param) {
259 return toStatus(mBase->sendCommand(toEnumCommandType(cmd), param));
260}
261
262Return<void> TWOmxNode::getParameter(
263 uint32_t index, hidl_vec<uint8_t> const& inParams,
264 getParameter_cb _hidl_cb) {
265 hidl_vec<uint8_t> params(inParams);
266 Status status = toStatus(mBase->getParameter(
267 toEnumIndexType(index),
268 static_cast<void*>(params.data()),
269 params.size()));
270 _hidl_cb(status, params);
271 return Void();
272}
273
274Return<Status> TWOmxNode::setParameter(
Pawin Vongmasa8ff40182017-02-07 02:22:34 -0800275 uint32_t index, hidl_vec<uint8_t> const& inParams) {
276 hidl_vec<uint8_t> params(inParams);
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -0800277 return toStatus(mBase->setParameter(
278 toEnumIndexType(index),
279 static_cast<void const*>(params.data()),
280 params.size()));
281}
282
283Return<void> TWOmxNode::getConfig(
284 uint32_t index, const hidl_vec<uint8_t>& inConfig,
285 getConfig_cb _hidl_cb) {
286 hidl_vec<uint8_t> config(inConfig);
287 Status status = toStatus(mBase->getConfig(
288 toEnumIndexType(index),
289 static_cast<void*>(config.data()),
290 config.size()));
291 _hidl_cb(status, config);
292 return Void();
293}
294
295Return<Status> TWOmxNode::setConfig(
Pawin Vongmasa8ff40182017-02-07 02:22:34 -0800296 uint32_t index, const hidl_vec<uint8_t>& inConfig) {
297 hidl_vec<uint8_t> config(inConfig);
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -0800298 return toStatus(mBase->setConfig(
299 toEnumIndexType(index),
300 static_cast<void const*>(config.data()),
301 config.size()));
302}
303
304Return<Status> TWOmxNode::setPortMode(uint32_t portIndex, PortMode mode) {
305 return toStatus(mBase->setPortMode(portIndex, toIOMXPortMode(mode)));
306}
307
308Return<Status> TWOmxNode::prepareForAdaptivePlayback(
309 uint32_t portIndex, bool enable,
310 uint32_t maxFrameWidth, uint32_t maxFrameHeight) {
311 return toStatus(mBase->prepareForAdaptivePlayback(
312 portIndex,
313 toEnumBool(enable),
314 maxFrameWidth,
315 maxFrameHeight));
316}
317
318Return<void> TWOmxNode::configureVideoTunnelMode(
319 uint32_t portIndex, bool tunneled, uint32_t audioHwSync,
320 configureVideoTunnelMode_cb _hidl_cb) {
321 native_handle_t* sidebandHandle = nullptr;
322 Status status = toStatus(mBase->configureVideoTunnelMode(
323 portIndex,
324 toEnumBool(tunneled),
325 audioHwSync,
326 &sidebandHandle));
327 _hidl_cb(status, hidl_handle(sidebandHandle));
328 return Void();
329}
330
331Return<void> TWOmxNode::getGraphicBufferUsage(
332 uint32_t portIndex, getGraphicBufferUsage_cb _hidl_cb) {
333 OMX_U32 usage;
334 Status status = toStatus(mBase->getGraphicBufferUsage(
335 portIndex, &usage));
336 _hidl_cb(status, usage);
337 return Void();
338}
339
340Return<Status> TWOmxNode::setInputSurface(
341 const sp<IOmxBufferSource>& bufferSource) {
342 return toStatus(mBase->setInputSurface(new LWOmxBufferSource(
343 bufferSource)));
344}
345
346Return<void> TWOmxNode::allocateSecureBuffer(
347 uint32_t portIndex, uint64_t size,
348 allocateSecureBuffer_cb _hidl_cb) {
349 IOMX::buffer_id buffer;
350 void* bufferData;
351 sp<NativeHandle> nativeHandle;
352 Status status = toStatus(mBase->allocateSecureBuffer(
353 portIndex,
354 static_cast<size_t>(size),
355 &buffer,
356 &bufferData,
357 &nativeHandle));
358 _hidl_cb(status, buffer, nativeHandle->handle());
359 return Void();
360}
361
362Return<void> TWOmxNode::useBuffer(
363 uint32_t portIndex, const CodecBuffer& codecBuffer,
364 useBuffer_cb _hidl_cb) {
365 IOMX::buffer_id buffer;
366 OMXBuffer omxBuffer;
367 if (!convertTo(&omxBuffer, codecBuffer)) {
368 _hidl_cb(Status::BAD_VALUE, 0);
369 return Void();
370 }
371 Status status = toStatus(mBase->useBuffer(
372 portIndex, omxBuffer, &buffer));
373 _hidl_cb(status, buffer);
374 return Void();
375}
376
377Return<Status> TWOmxNode::freeBuffer(uint32_t portIndex, uint32_t buffer) {
378 return toStatus(mBase->freeBuffer(portIndex, buffer));
379}
380
381Return<Status> TWOmxNode::fillBuffer(
382 uint32_t buffer, const CodecBuffer& codecBuffer,
383 const hidl_handle& fence) {
384 OMXBuffer omxBuffer;
385 if (!convertTo(&omxBuffer, codecBuffer)) {
386 return Status::BAD_VALUE;
387 }
388 return toStatus(mBase->fillBuffer(
389 buffer,
390 omxBuffer,
Pawin Vongmasa8a21c012016-12-27 04:30:54 +0700391 dup(native_handle_read_fd(fence))));
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -0800392}
393
394Return<Status> TWOmxNode::emptyBuffer(
395 uint32_t buffer, const CodecBuffer& codecBuffer, uint32_t flags,
396 uint64_t timestampUs, const hidl_handle& fence) {
397 OMXBuffer omxBuffer;
398 if (!convertTo(&omxBuffer, codecBuffer)) {
399 return Status::BAD_VALUE;
400 }
401 return toStatus(mBase->emptyBuffer(
402 buffer,
403 omxBuffer,
404 flags,
405 toOMXTicks(timestampUs),
Pawin Vongmasa8a21c012016-12-27 04:30:54 +0700406 dup(native_handle_read_fd(fence))));
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -0800407}
408
409Return<void> TWOmxNode::getExtensionIndex(
410 const hidl_string& parameterName,
411 getExtensionIndex_cb _hidl_cb) {
412 OMX_INDEXTYPE index;
413 Status status = toStatus(mBase->getExtensionIndex(
Scott Randolphc1d17712017-04-03 14:03:00 -0700414 parameterName.c_str(), &index));
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -0800415 _hidl_cb(status, toRawIndexType(index));
416 return Void();
417}
418
419Return<Status> TWOmxNode::dispatchMessage(const Message& tMsg) {
420 omx_message lMsg;
Pawin Vongmasa8a21c012016-12-27 04:30:54 +0700421 if (!convertTo(&lMsg, tMsg)) {
Pawin Vongmasaeeac97b2017-01-18 05:03:07 -0800422 return Status::BAD_VALUE;
423 }
424 return toStatus(mBase->dispatchMessage(lMsg));
425}
426
427Return<void> TWOmxNode::setQuirks(uint32_t quirks) {
428 mBase->setQuirks(static_cast<OMX_U32>(quirks));
429 return Void();
430}
431
432} // namespace utils
433} // namespace V1_0
434} // namespace omx
435} // namespace media
436} // namespace hardware
437} // namespace android