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#ifndef ANDROID_HARDWARE_MEDIA_OMX_V1_0__CONVERSION_H
18517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#define ANDROID_HARDWARE_MEDIA_OMX_V1_0__CONVERSION_H
19517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
200d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa#include <vector>
210d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa#include <list>
220d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa
230d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa#include <unistd.h>
240d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa
25517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <hidl/MQDescriptor.h>
26f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <hidl/Status.h>
27f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <hidlmemory/mapping.h>
28517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
29f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <binder/Binder.h>
30f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <binder/Status.h>
31f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa#include <ui/FenceTime.h>
32517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <cutils/native_handle.h>
33517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
3404563aafa0debc95d50951ca944abf37ef2777cePawin Vongmasa#include <ui/GraphicBuffer.h>
35ac7d4125516299b8a3e6f2b25822a692bdd96311Pawin Vongmasa#include <media/OMXFenceParcelable.h>
360d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa#include <media/OMXBuffer.h>
37ac7d4125516299b8a3e6f2b25822a692bdd96311Pawin Vongmasa#include <media/hardware/VideoAPI.h>
38517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
390d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa#include <android/hidl/memory/1.0/IMemory.h>
40517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <android/hardware/media/omx/1.0/types.h>
41517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <android/hardware/media/omx/1.0/IOmx.h>
42517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <android/hardware/media/omx/1.0/IOmxNode.h>
43517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <android/hardware/media/omx/1.0/IOmxBufferSource.h>
44517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <android/hardware/media/omx/1.0/IOmxObserver.h>
45517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#include <android/hardware/media/omx/1.0/IGraphicBufferSource.h>
46517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
470d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa#include <android/IGraphicBufferSource.h>
480d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa#include <android/IOMXBufferSource.h>
490d3a5edf232916e81adbc46fc0f4a1753166b066Pawin Vongmasa
50517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace android {
51517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace hardware {
52517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace media {
53517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace omx {
54517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasanamespace V1_0 {
55eeac97b18ca5c939bf2ac59334d36d54f705af3dPawin Vongmasanamespace utils {
56517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
57517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::hidl_array;
58517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::hidl_string;
59517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::hidl_vec;
60f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasausing ::android::hardware::hidl_handle;
61517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::Return;
62517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::Void;
63517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::sp;
64517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
65517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::String8;
66517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::OMXFenceParcelable;
67517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
68517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::media::omx::V1_0::Message;
69517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::omx_message;
70517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
71517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::media::omx::V1_0::ColorAspects;
72f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasausing ::android::hardware::media::V1_0::Rect;
73f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasausing ::android::hardware::media::V1_0::Region;
74517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
75517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::graphics::common::V1_0::Dataspace;
76517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
77517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::graphics::common::V1_0::PixelFormat;
78517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
79517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::OMXBuffer;
80517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
81f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasausing ::android::hardware::media::V1_0::AnwBuffer;
82f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasausing ::android::GraphicBuffer;
83f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa
84517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::media::omx::V1_0::IOmx;
85517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::IOMX;
86517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
87517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::media::omx::V1_0::IOmxNode;
88517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::IOMXNode;
89517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
90517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::media::omx::V1_0::IOmxObserver;
91517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::IOMXObserver;
92517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
93517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::hardware::media::omx::V1_0::IOmxBufferSource;
94517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasausing ::android::IOMXBufferSource;
95517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
96517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// native_handle_t helper functions.
97517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
98517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
99517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Take an fd and create a native handle containing only the given fd.
100517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * The created handle will need to be deleted manually with
101517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `native_handle_delete()`.
102517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
103517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] fd The source file descriptor (of type `int`).
104517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The create `native_handle_t*` that contains the given \p fd. If the
105517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * supplied \p fd is negative, the created native handle will contain no file
106517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * descriptors.
107517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
108517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * If the native handle cannot be created, the return value will be
109517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `nullptr`.
110517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
111517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * This function does not duplicate the file descriptor.
112517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
113517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline native_handle_t* native_handle_create_from_fd(int fd) {
114517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    if (fd < 0) {
115517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        return native_handle_create(0, 0);
116517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
117517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    native_handle_t* nh = native_handle_create(1, 0);
118517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    if (nh == nullptr) {
119517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        return nullptr;
120517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
121517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    nh->data[0] = fd;
122517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return nh;
123517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
124517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
125517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
126517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Extract a file descriptor from a native handle.
127517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
128517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] nh The source `native_handle_t*`.
129517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] index The index of the file descriptor in \p nh to read from. This
130517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * input has the default value of `0`.
131517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The `index`-th file descriptor in \p nh. If \p nh does not have
132517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * enough file descriptors, the returned value will be `-1`.
133517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
134517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * This function does not duplicate the file descriptor.
135517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
136517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline int native_handle_read_fd(native_handle_t const* nh, int index = 0) {
137517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return ((nh == nullptr) || (nh->numFds == 0) ||
138517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            (nh->numFds <= index) || (index < 0)) ?
139517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            -1 : nh->data[index];
140517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
141517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
142517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
143517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * Conversion functions
144517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * ====================
145517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
146517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * There are two main directions of conversion:
147517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * - `inTargetType(...)`: Create a wrapper whose lifetime depends on the
148517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *   input. The wrapper has type `TargetType`.
149517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * - `toTargetType(...)`: Create a standalone object of type `TargetType` that
150517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *   corresponds to the input. The lifetime of the output does not depend on the
151517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *   lifetime of the input.
152517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * - `wrapIn(TargetType*, ...)`: Same as `inTargetType()`, but for `TargetType`
153517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *   that cannot be copied and/or moved efficiently, or when there are multiple
154517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *   output arguments.
155517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * - `convertTo(TargetType*, ...)`: Same as `toTargetType()`, but for
156517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *   `TargetType` that cannot be copied and/or moved efficiently, or when there
157517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *   are multiple output arguments.
158517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
159517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `wrapIn()` and `convertTo()` functions will take output arguments before
160517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * input arguments. Some of these functions might return a value to indicate
161517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * success or error.
162517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
163517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * In converting or wrapping something as a Treble type that contains a
164517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `hidl_handle`, `native_handle_t*` will need to be created and returned as
165517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * an additional output argument, hence only `wrapIn()` or `convertTo()` would
166517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * be available. The caller must call `native_handle_delete()` to deallocate the
167517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * returned native handle when it is no longer needed.
168517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
169517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * For types that contain file descriptors, `inTargetType()` and `wrapAs()` do
170517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * not perform duplication of file descriptors, while `toTargetType()` and
171517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `convertTo()` do.
172517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
173517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
174517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
175e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland * \brief Convert `Return<void>` to `binder::Status`.
176517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
177e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland * \param[in] t The source `Return<void>`.
178517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The corresponding `binder::Status`.
179517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
180e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland// convert: Return<void> -> ::android::binder::Status
181517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline ::android::binder::Status toBinderStatus(
182e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland        Return<void> const& t) {
183517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return ::android::binder::Status::fromExceptionCode(
184e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland            t.isOk() ? OK : UNKNOWN_ERROR,
185e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland            t.description().c_str());
186517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
187517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
188517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
189d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih * \brief Convert `Return<Status>` to `binder::Status`.
190d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih *
191d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih * \param[in] t The source `Return<Status>`.
192d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih * \return The corresponding `binder::Status`.
193d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih */
194d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih// convert: Return<Status> -> ::android::binder::Status
195d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shihinline ::android::binder::Status toBinderStatus(
196d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih        Return<Status> const& t) {
197d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih    return ::android::binder::Status::fromStatusT(
198d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih            t.isOk() ? static_cast<status_t>(static_cast<Status>(t)) : UNKNOWN_ERROR);
199d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih}
200d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih
201d095e65c8c125c555046c60539a0f7abf0ccf271Robert Shih/**
202517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `Return<Status>` to `status_t`. This is for legacy binder
203517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * calls.
204517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
205517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `Return<Status>`.
206517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The corresponding `status_t`.
207517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
208517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * This function first check if \p t has a transport error. If it does, then the
209517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * return value is the transport error code. Otherwise, the return value is
210517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * converted from `Status` contained inside \p t.
211517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
212517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * Note:
213517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * - This `Status` is omx-specific. It is defined in `types.hal`.
214517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * - The name of this function is not `convert`.
215517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
216517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: Status -> status_t
217517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline status_t toStatusT(Return<Status> const& t) {
218e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland    return t.isOk() ? static_cast<status_t>(static_cast<Status>(t)) : UNKNOWN_ERROR;
219517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
220517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
221517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
222517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `Return<void>` to `status_t`. This is for legacy binder calls.
223517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
224517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `Return<void>`.
225517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The corresponding `status_t`.
226517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
227517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: Return<void> -> status_t
228517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline status_t toStatusT(Return<void> const& t) {
229e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland    return t.isOk() ? OK : UNKNOWN_ERROR;
230517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
231517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
232517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
233517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `Status` to `status_t`. This is for legacy binder calls.
234517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
235517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `Status`.
236517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return the corresponding `status_t`.
237517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
238517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: Status -> status_t
239517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline status_t toStatusT(Status const& t) {
240517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<status_t>(t);
241517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
242517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
243517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
244517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `status_t` to `Status`.
245517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
246517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `status_t`.
247517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The corresponding `Status`.
248517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
249517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: status_t -> Status
250517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline Status toStatus(status_t l) {
251517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<Status>(l);
252517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
253517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
254517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
255517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Wrap `native_handle_t*` in `hidl_handle`.
256517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
257517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] nh The source `native_handle_t*`.
258517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The `hidl_handle` that points to \p nh.
259517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
260517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// wrap: native_handle_t* -> hidl_handle
261517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline hidl_handle inHidlHandle(native_handle_t const* nh) {
262517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return hidl_handle(nh);
263517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
264517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
265517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
266517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Wrap an `omx_message` and construct the corresponding `Message`.
267517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
268517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] t The wrapper of type `Message`.
269517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] nh The native_handle_t referred to by `t->fence`.
270517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `omx_message`.
271517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return `true` if the wrapping is successful; `false` otherwise.
272517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
273517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * Upon success, \p nh will be created to hold the file descriptor stored in
274517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `l.fenceFd`, and `t->fence` will point to \p nh. \p nh will need to be
275517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * destroyed manually by `native_handle_delete()` when \p t is no longer needed.
276517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
277517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * Upon failure, \p nh will not be created and will not need to be deleted. \p t
278517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * will be invalid.
279517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
280517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// wrap, omx_message -> Message, native_handle_t*
281517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline bool wrapAs(Message* t, native_handle_t** nh, omx_message const& l) {
282517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    *nh = native_handle_create_from_fd(l.fenceFd);
283517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    if (!*nh) {
284517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        return false;
285517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
2868ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa    t->fence = *nh;
287517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    switch (l.type) {
288517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case omx_message::EVENT:
289517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->type = Message::Type::EVENT;
2908a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa            t->data.eventData.event = uint32_t(l.u.event_data.event);
291517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->data.eventData.data1 = l.u.event_data.data1;
292517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->data.eventData.data2 = l.u.event_data.data2;
293517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->data.eventData.data3 = l.u.event_data.data3;
294517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->data.eventData.data4 = l.u.event_data.data4;
295517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            break;
296517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case omx_message::EMPTY_BUFFER_DONE:
297517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->type = Message::Type::EMPTY_BUFFER_DONE;
298517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->data.bufferData.buffer = l.u.buffer_data.buffer;
299517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            break;
300517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case omx_message::FILL_BUFFER_DONE:
301517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->type = Message::Type::FILL_BUFFER_DONE;
302517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->data.extendedBufferData.buffer = l.u.extended_buffer_data.buffer;
303f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            t->data.extendedBufferData.rangeOffset =
304f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                    l.u.extended_buffer_data.range_offset;
305f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            t->data.extendedBufferData.rangeLength =
306f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                    l.u.extended_buffer_data.range_length;
307517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->data.extendedBufferData.flags = l.u.extended_buffer_data.flags;
308f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            t->data.extendedBufferData.timestampUs =
309f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                    l.u.extended_buffer_data.timestamp;
310517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            break;
311517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case omx_message::FRAME_RENDERED:
312517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->type = Message::Type::FRAME_RENDERED;
313517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->data.renderData.timestampUs = l.u.render_data.timestamp;
314517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->data.renderData.systemTimeNs = l.u.render_data.nanoTime;
315517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            break;
316517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        default:
317517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            native_handle_delete(*nh);
318517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return false;
319517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
320517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return true;
321517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
322517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
323517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
324517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Wrap a `Message` inside an `omx_message`.
325517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
326517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] l The wrapper of type `omx_message`.
327517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `Message`.
328517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return `true` if the wrapping is successful; `false` otherwise.
329517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
330517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// wrap: Message -> omx_message
331517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline bool wrapAs(omx_message* l, Message const& t) {
332517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    l->fenceFd = native_handle_read_fd(t.fence);
333517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    switch (t.type) {
334517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case Message::Type::EVENT:
335517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->type = omx_message::EVENT;
3368a21c0191f974a0b9cbd5818052e2655e0aaa306Pawin Vongmasa            l->u.event_data.event = OMX_EVENTTYPE(t.data.eventData.event);
337517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->u.event_data.data1 = t.data.eventData.data1;
338517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->u.event_data.data2 = t.data.eventData.data2;
339517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->u.event_data.data3 = t.data.eventData.data3;
340517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->u.event_data.data4 = t.data.eventData.data4;
341517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            break;
342517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case Message::Type::EMPTY_BUFFER_DONE:
343517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->type = omx_message::EMPTY_BUFFER_DONE;
344517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->u.buffer_data.buffer = t.data.bufferData.buffer;
345517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            break;
346517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case Message::Type::FILL_BUFFER_DONE:
347517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->type = omx_message::FILL_BUFFER_DONE;
348517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->u.extended_buffer_data.buffer = t.data.extendedBufferData.buffer;
349f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            l->u.extended_buffer_data.range_offset =
350f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                    t.data.extendedBufferData.rangeOffset;
351f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            l->u.extended_buffer_data.range_length =
352f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                    t.data.extendedBufferData.rangeLength;
353517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->u.extended_buffer_data.flags = t.data.extendedBufferData.flags;
354f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            l->u.extended_buffer_data.timestamp =
355f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                    t.data.extendedBufferData.timestampUs;
356517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            break;
357517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case Message::Type::FRAME_RENDERED:
358517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->type = omx_message::FRAME_RENDERED;
359517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->u.render_data.timestamp = t.data.renderData.timestampUs;
360517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            l->u.render_data.nanoTime = t.data.renderData.systemTimeNs;
361517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            break;
362517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        default:
363517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return false;
364517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
365517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return true;
366517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
367517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
368517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
369517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Similar to `wrapTo(omx_message*, Message const&)`, but the output will
370517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * have an extended lifetime.
371517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
372517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] l The output `omx_message`.
373517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `Message`.
374517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return `true` if the conversion is successful; `false` otherwise.
375517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
376f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * This function calls `wrapto()`, then attempts to duplicate the file
377f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * descriptor for the fence if it is not `-1`. If duplication fails, `false`
378f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * will be returned.
379517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
380517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: Message -> omx_message
381517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline bool convertTo(omx_message* l, Message const& t) {
382517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    if (!wrapAs(l, t)) {
383517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        return false;
384517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
385517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    if (l->fenceFd == -1) {
386517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        return true;
387517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
388517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    l->fenceFd = dup(l->fenceFd);
389517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return l->fenceFd != -1;
390517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
391517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
392517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
393517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Wrap an `OMXFenceParcelable` inside a `hidl_handle`.
394517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
395517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] t The wrapper of type `hidl_handle`.
396517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] nh The native handle created to hold the file descriptor inside
397517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \p l.
398517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `OMXFenceParcelable`, which essentially contains one
399517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * file descriptor.
400517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return `true` if \p t and \p nh are successfully created to wrap around \p
401517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * l; `false` otherwise.
402517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
403517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * On success, \p nh needs to be deleted by the caller with
404517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `native_handle_delete()` after \p t and \p nh are no longer needed.
405517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
406517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * On failure, \p nh will not need to be deleted, and \p t will hold an invalid
407517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * value.
408517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
409517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// wrap: OMXFenceParcelable -> hidl_handle, native_handle_t*
410517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline bool wrapAs(hidl_handle* t, native_handle_t** nh,
411517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        OMXFenceParcelable const& l) {
412517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    *nh = native_handle_create_from_fd(l.get());
413517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    if (!*nh) {
414517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        return false;
415517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
416517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    *t = *nh;
417517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return true;
418517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
419517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
420517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
421517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Wrap a `hidl_handle` inside an `OMXFenceParcelable`.
422517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
423517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] l The wrapper of type `OMXFenceParcelable`.
424517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `hidl_handle`.
425517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
426517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// wrap: hidl_handle -> OMXFenceParcelable
427517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline void wrapAs(OMXFenceParcelable* l, hidl_handle const& t) {
428517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    l->mFenceFd = native_handle_read_fd(t);
429517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
430517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
431517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
432517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert a `hidl_handle` to `OMXFenceParcelable`. If `hidl_handle`
433517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * contains file descriptors, the first file descriptor will be duplicated and
434517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * stored in the output `OMXFenceParcelable`.
435517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
436517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] l The output `OMXFenceParcelable`.
437517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The input `hidl_handle`.
438517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return `false` if \p t contains a valid file descriptor but duplication
439517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * fails; `true` otherwise.
440517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
441517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: hidl_handle -> OMXFenceParcelable
442517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline bool convertTo(OMXFenceParcelable* l, hidl_handle const& t) {
443517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    int fd = native_handle_read_fd(t);
444517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    if (fd != -1) {
445517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        fd = dup(fd);
446517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        if (fd == -1) {
447517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return false;
448517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
449517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
450517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    l->mFenceFd = fd;
451517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return true;
452517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
453517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
454517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
455517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `::android::ColorAspects` to `ColorAspects`.
456517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
457517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `::android::ColorAspects`.
458517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The corresponding `ColorAspects`.
459517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
460517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: ::android::ColorAspects -> ColorAspects
461517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline ColorAspects toHardwareColorAspects(::android::ColorAspects const& l) {
462517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return ColorAspects{
463517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<ColorAspects::Range>(l.mRange),
464517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<ColorAspects::Primaries>(l.mPrimaries),
465517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<ColorAspects::Transfer>(l.mTransfer),
466517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<ColorAspects::MatrixCoeffs>(l.mMatrixCoeffs)};
467517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
468517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
469517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
470517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `int32_t` to `ColorAspects`.
471517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
472517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `int32_t`.
473517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The corresponding `ColorAspects`.
474517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
475517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: int32_t -> ColorAspects
476517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline ColorAspects toHardwareColorAspects(int32_t l) {
477517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return ColorAspects{
478517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<ColorAspects::Range>((l >> 24) & 0xFF),
479517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<ColorAspects::Primaries>((l >> 16) & 0xFF),
480517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<ColorAspects::Transfer>(l & 0xFF),
481517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<ColorAspects::MatrixCoeffs>((l >> 8) & 0xFF)};
482517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
483517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
484517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
485517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `ColorAspects` to `::android::ColorAspects`.
486517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
487517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `ColorAspects`.
488517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The corresponding `::android::ColorAspects`.
489517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
490517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: ColorAspects -> ::android::ColorAspects
491517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline int32_t toCompactColorAspects(ColorAspects const& t) {
492517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<int32_t>(
493517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            (static_cast<uint32_t>(t.range) << 24) |
494517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            (static_cast<uint32_t>(t.primaries) << 16) |
495517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            (static_cast<uint32_t>(t.transfer)) |
496517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            (static_cast<uint32_t>(t.matrixCoeffs) << 8));
497517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
498517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
499517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
500517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `int32_t` to `Dataspace`.
501517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
502517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `int32_t`.
503517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \result The corresponding `Dataspace`.
504517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
505517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: int32_t -> Dataspace
506517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline Dataspace toHardwareDataspace(int32_t l) {
507517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<Dataspace>(l);
508517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
509517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
510517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
511517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `Dataspace` to `int32_t`.
512517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
513517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `Dataspace`.
514517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \result The corresponding `int32_t`.
515517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
516517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: Dataspace -> int32_t
517517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline int32_t toRawDataspace(Dataspace const& t) {
518517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<int32_t>(t);
519517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
520517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
521517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
522517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Wrap an opaque buffer inside a `hidl_vec<uint8_t>`.
523517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
524517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The pointer to the beginning of the opaque buffer.
525517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] size The size of the buffer.
526517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return A `hidl_vec<uint8_t>` that points to the buffer.
527517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
528517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// wrap: void*, size_t -> hidl_vec<uint8_t>
529517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline hidl_vec<uint8_t> inHidlBytes(void const* l, size_t size) {
530517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    hidl_vec<uint8_t> t;
531517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    t.setToExternal(static_cast<uint8_t*>(const_cast<void*>(l)), size, false);
532517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return t;
533517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
534517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
535517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
536517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Create a `hidl_vec<uint8_t>` that is a copy of an opaque buffer.
537517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
538517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The pointer to the beginning of the opaque buffer.
539517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] size The size of the buffer.
540517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return A `hidl_vec<uint8_t>` that is a copy of the input buffer.
541517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
542517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: void*, size_t -> hidl_vec<uint8_t>
543517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline hidl_vec<uint8_t> toHidlBytes(void const* l, size_t size) {
544517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    hidl_vec<uint8_t> t;
545517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    t.resize(size);
546517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    uint8_t const* src = static_cast<uint8_t const*>(l);
547517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    std::copy(src, src + size, t.data());
548517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return t;
549517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
550517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
551517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
5529c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa * \brief Wrap `GraphicBuffer` in `AnwBuffer`.
5539c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa *
5549c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa * \param[out] t The wrapper of type `AnwBuffer`.
5559c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa * \param[in] l The source `GraphicBuffer`.
5569c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa */
5579c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa// wrap: GraphicBuffer -> AnwBuffer
5589c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasainline void wrapAs(AnwBuffer* t, GraphicBuffer const& l) {
5599c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    t->attr.width = l.getWidth();
5609c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    t->attr.height = l.getHeight();
5619c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    t->attr.stride = l.getStride();
5629c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    t->attr.format = static_cast<PixelFormat>(l.getPixelFormat());
5639c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    t->attr.layerCount = l.getLayerCount();
5649c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    t->attr.usage = l.getUsage();
5659c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    t->attr.id = l.getId();
5669c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    t->attr.generationNumber = l.getGenerationNumber();
5679c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    t->nativeHandle = hidl_handle(l.handle);
5689c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa}
5699c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
5709c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa/**
5719c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa * \brief Convert `AnwBuffer` to `GraphicBuffer`.
5729c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa *
5739c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa * \param[out] l The destination `GraphicBuffer`.
5749c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa * \param[in] t The source `AnwBuffer`.
5759c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa *
5769c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa * This function will duplicate all file descriptors in \p t.
5779c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa */
5789c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa// convert: AnwBuffer -> GraphicBuffer
5799c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa// Ref: frameworks/native/libs/ui/GraphicBuffer.cpp: GraphicBuffer::flatten
5809c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasainline bool convertTo(GraphicBuffer* l, AnwBuffer const& t) {
5819c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    native_handle_t* handle = t.nativeHandle == nullptr ?
5829c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            nullptr : native_handle_clone(t.nativeHandle);
5839c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
5849c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    size_t const numInts = 12 + (handle ? handle->numInts : 0);
5859c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    int32_t* ints = new int32_t[numInts];
5869c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
5879c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    size_t numFds = static_cast<size_t>(handle ? handle->numFds : 0);
5889c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    int* fds = new int[numFds];
5899c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
5909c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[0] = 'GBFR';
5919c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[1] = static_cast<int32_t>(t.attr.width);
5929c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[2] = static_cast<int32_t>(t.attr.height);
5939c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[3] = static_cast<int32_t>(t.attr.stride);
5949c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[4] = static_cast<int32_t>(t.attr.format);
5959c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[5] = static_cast<int32_t>(t.attr.layerCount);
5969c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[6] = static_cast<int32_t>(t.attr.usage);
5979c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[7] = static_cast<int32_t>(t.attr.id >> 32);
5989c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[8] = static_cast<int32_t>(t.attr.id & 0xFFFFFFFF);
5999c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[9] = static_cast<int32_t>(t.attr.generationNumber);
6009c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[10] = 0;
6019c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ints[11] = 0;
6029c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    if (handle) {
6039c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        ints[10] = static_cast<int32_t>(handle->numFds);
6049c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        ints[11] = static_cast<int32_t>(handle->numInts);
6059c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        int* intsStart = handle->data + handle->numFds;
6069c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        std::copy(handle->data, intsStart, fds);
6079c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        std::copy(intsStart, intsStart + handle->numInts, &ints[12]);
6089c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    }
6099c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
6109c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    void const* constBuffer = static_cast<void const*>(ints);
6119c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    size_t size = numInts * sizeof(int32_t);
6129c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    int const* constFds = static_cast<int const*>(fds);
6139c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    status_t status = l->unflatten(constBuffer, size, constFds, numFds);
6149c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
6159c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    delete [] fds;
6169c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    delete [] ints;
6179c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    native_handle_delete(handle);
6189c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    return status == NO_ERROR;
6199c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa}
6209c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
6219c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa/**
622517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Wrap `OMXBuffer` in `CodecBuffer`.
623517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
624517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] t The wrapper of type `CodecBuffer`.
625517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `OMXBuffer`.
626517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return `true` if the wrapping is successful; `false` otherwise.
627517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
628517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// wrap: OMXBuffer -> CodecBuffer
629517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline bool wrapAs(CodecBuffer* t, OMXBuffer const& l) {
630f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa    t->sharedMemory = hidl_memory();
6319c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    t->nativeHandle = hidl_handle();
632517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    switch (l.mBufferType) {
633517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case OMXBuffer::kBufferTypeInvalid: {
634517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->type = CodecBuffer::Type::INVALID;
635517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return true;
636517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
637517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case OMXBuffer::kBufferTypePreset: {
638517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->type = CodecBuffer::Type::PRESET;
639517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->attr.preset.rangeLength = static_cast<uint32_t>(l.mRangeLength);
640f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            t->attr.preset.rangeOffset = static_cast<uint32_t>(l.mRangeOffset);
641517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return true;
642517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
643f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        case OMXBuffer::kBufferTypeHidlMemory: {
644517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->type = CodecBuffer::Type::SHARED_MEM;
645f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            t->sharedMemory = l.mHidlMemory;
646f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            return true;
647f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        }
648f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa        case OMXBuffer::kBufferTypeSharedMem: {
649f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            // This is not supported.
650517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return false;
651517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
652517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case OMXBuffer::kBufferTypeANWBuffer: {
653517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->type = CodecBuffer::Type::ANW_BUFFER;
6548ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa            if (l.mGraphicBuffer == nullptr) {
6558ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa                t->attr.anwBuffer.width = 0;
6568ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa                t->attr.anwBuffer.height = 0;
6578ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa                t->attr.anwBuffer.stride = 0;
6588ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa                t->attr.anwBuffer.format = static_cast<PixelFormat>(1);
6598ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa                t->attr.anwBuffer.layerCount = 0;
6608ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa                t->attr.anwBuffer.usage = 0;
6618ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa                return true;
6628ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa            }
663517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->attr.anwBuffer.width = l.mGraphicBuffer->getWidth();
664517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->attr.anwBuffer.height = l.mGraphicBuffer->getHeight();
665517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->attr.anwBuffer.stride = l.mGraphicBuffer->getStride();
666f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            t->attr.anwBuffer.format = static_cast<PixelFormat>(
667f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                    l.mGraphicBuffer->getPixelFormat());
668517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->attr.anwBuffer.layerCount = l.mGraphicBuffer->getLayerCount();
669517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->attr.anwBuffer.usage = l.mGraphicBuffer->getUsage();
6709c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            t->nativeHandle = l.mGraphicBuffer->handle;
671517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return true;
672517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
673517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case OMXBuffer::kBufferTypeNativeHandle: {
674517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            t->type = CodecBuffer::Type::NATIVE_HANDLE;
6759c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            t->nativeHandle = l.mNativeHandle->handle();
676517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return true;
677517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
678517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
679517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return false;
680517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
681517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
682517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
683517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `CodecBuffer` to `OMXBuffer`.
684517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
685517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] l The destination `OMXBuffer`.
686517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `CodecBuffer`.
687517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return `true` if successful; `false` otherwise.
688517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
689517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: CodecBuffer -> OMXBuffer
690517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline bool convertTo(OMXBuffer* l, CodecBuffer const& t) {
691517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    switch (t.type) {
692517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case CodecBuffer::Type::INVALID: {
693517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            *l = OMXBuffer();
694517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return true;
695517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
696517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case CodecBuffer::Type::PRESET: {
697f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            *l = OMXBuffer(
698f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                    t.attr.preset.rangeOffset,
699f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa                    t.attr.preset.rangeLength);
700517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return true;
701517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
702517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case CodecBuffer::Type::SHARED_MEM: {
703f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            *l = OMXBuffer(t.sharedMemory);
704f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa            return true;
705517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
706517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case CodecBuffer::Type::ANW_BUFFER: {
7078ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa            if (t.nativeHandle.getNativeHandle() == nullptr) {
7088ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa                *l = OMXBuffer(sp<GraphicBuffer>(nullptr));
7098ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa                return true;
7108ff40189817e95c7a56e347398d20e60d7534ee6Pawin Vongmasa            }
7119c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            AnwBuffer anwBuffer;
7129c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            anwBuffer.nativeHandle = t.nativeHandle;
7139c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            anwBuffer.attr = t.attr.anwBuffer;
7149c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            sp<GraphicBuffer> graphicBuffer = new GraphicBuffer();
7159c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            if (!convertTo(graphicBuffer.get(), anwBuffer)) {
7169c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa                return false;
7179c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            }
7189c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            *l = OMXBuffer(graphicBuffer);
719517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return true;
720517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
721517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        case CodecBuffer::Type::NATIVE_HANDLE: {
722517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            *l = OMXBuffer(NativeHandle::create(
723517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa                    native_handle_clone(t.nativeHandle), true));
724517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            return true;
725517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        }
726517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
727517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return false;
728517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
729517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
730517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
731517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `IOMX::ComponentInfo` to `IOmx::ComponentInfo`.
732517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
733517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] t The destination `IOmx::ComponentInfo`.
734517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `IOMX::ComponentInfo`.
735517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
736517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: IOMX::ComponentInfo -> IOmx::ComponentInfo
737517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline bool convertTo(IOmx::ComponentInfo* t, IOMX::ComponentInfo const& l) {
738517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    t->mName = l.mName.string();
739517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    t->mRoles.resize(l.mRoles.size());
740517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    size_t i = 0;
741517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    for (auto& role : l.mRoles) {
742517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        t->mRoles[i++] = role.string();
743517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
744517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return true;
745517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
746517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
747517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
748517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `IOmx::ComponentInfo` to `IOMX::ComponentInfo`.
749517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
750517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[out] l The destination `IOMX::ComponentInfo`.
751517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `IOmx::ComponentInfo`.
752517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
753517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: IOmx::ComponentInfo -> IOMX::ComponentInfo
754517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline bool convertTo(IOMX::ComponentInfo* l, IOmx::ComponentInfo const& t) {
755517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    l->mName = t.mName.c_str();
756517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    l->mRoles.clear();
757517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    for (size_t i = 0; i < t.mRoles.size(); ++i) {
758517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa        l->mRoles.push_back(String8(t.mRoles[i].c_str()));
759517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    }
760517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return true;
761517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
762517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
763517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
764517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `OMX_BOOL` to `bool`.
765517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
766517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `OMX_BOOL`.
767517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The destination `bool`.
768517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
769517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: OMX_BOOL -> bool
770517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline bool toRawBool(OMX_BOOL l) {
771517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return l == OMX_FALSE ? false : true;
772517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
773517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
774517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
775517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `bool` to `OMX_BOOL`.
776517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
777517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `bool`.
778517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The destination `OMX_BOOL`.
779517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
780517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: bool -> OMX_BOOL
781517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline OMX_BOOL toEnumBool(bool t) {
782517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return t ? OMX_TRUE : OMX_FALSE;
783517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
784517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
785517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
786517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `OMX_COMMANDTYPE` to `uint32_t`.
787517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
788517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `OMX_COMMANDTYPE`.
789517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The underlying value of type `uint32_t`.
790517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
791517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `OMX_COMMANDTYPE` is an enum type whose underlying type is `uint32_t`.
792517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
793517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: OMX_COMMANDTYPE -> uint32_t
794517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline uint32_t toRawCommandType(OMX_COMMANDTYPE l) {
795517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<uint32_t>(l);
796517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
797517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
798517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
799517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `uint32_t` to `OMX_COMMANDTYPE`.
800517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
801517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `uint32_t`.
802517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The corresponding enum value of type `OMX_COMMANDTYPE`.
803517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
804517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `OMX_COMMANDTYPE` is an enum type whose underlying type is `uint32_t`.
805517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
806517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: uint32_t -> OMX_COMMANDTYPE
807517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline OMX_COMMANDTYPE toEnumCommandType(uint32_t t) {
808517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<OMX_COMMANDTYPE>(t);
809517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
810517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
811517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
812517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `OMX_INDEXTYPE` to `uint32_t`.
813517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
814517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `OMX_INDEXTYPE`.
815517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The underlying value of type `uint32_t`.
816517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
817517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `OMX_INDEXTYPE` is an enum type whose underlying type is `uint32_t`.
818517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
819517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: OMX_INDEXTYPE -> uint32_t
820517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline uint32_t toRawIndexType(OMX_INDEXTYPE l) {
821517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<uint32_t>(l);
822517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
823517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
824517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
825517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `uint32_t` to `OMX_INDEXTYPE`.
826517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
827517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `uint32_t`.
828517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The corresponding enum value of type `OMX_INDEXTYPE`.
829517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
830517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * `OMX_INDEXTYPE` is an enum type whose underlying type is `uint32_t`.
831517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
832517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: uint32_t -> OMX_INDEXTYPE
833517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline OMX_INDEXTYPE toEnumIndexType(uint32_t t) {
834517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<OMX_INDEXTYPE>(t);
835517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
836517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
837517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
838517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `IOMX::PortMode` to `PortMode`.
839517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
840517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `IOMX::PortMode`.
841517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The destination `PortMode`.
842517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
843517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: IOMX::PortMode -> PortMode
844517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline PortMode toHardwarePortMode(IOMX::PortMode l) {
845517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<PortMode>(l);
846517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
847517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
848517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
849517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `PortMode` to `IOMX::PortMode`.
850517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
851517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] t The source `PortMode`.
852517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The destination `IOMX::PortMode`.
853517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
854517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: PortMode -> IOMX::PortMode
855517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline IOMX::PortMode toIOMXPortMode(PortMode t) {
856517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<IOMX::PortMode>(t);
857517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
858517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
859517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
860517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \brief Convert `OMX_TICKS` to `uint64_t`.
861517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
862517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `OMX_TICKS`.
863517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The destination `uint64_t`.
864517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
865517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: OMX_TICKS -> uint64_t
866517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline uint64_t toRawTicks(OMX_TICKS l) {
867517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#ifndef OMX_SKIP64BIT
868517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<uint64_t>(l);
869517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#else
870517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<uint64_t>(l.nLowPart) |
871517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<uint64_t>(l.nHighPart << 32);
872517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#endif
873517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
874517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
875517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa/**
876f62ea8018813951e8f6a182880cadb3217e4ce37Pawin Vongmasa * \brief Convert `uint64_t` to `OMX_TICKS`.
877517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa *
878517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \param[in] l The source `uint64_t`.
879517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa * \return The destination `OMX_TICKS`.
880517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa */
881517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa// convert: uint64_t -> OMX_TICKS
882517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasainline OMX_TICKS toOMXTicks(uint64_t t) {
883517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#ifndef OMX_SKIP64BIT
884517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return static_cast<OMX_TICKS>(t);
885517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#else
886517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa    return OMX_TICKS{
887517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<uint32_t>(t & 0xFFFFFFFF),
888517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa            static_cast<uint32_t>(t >> 32)};
889517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#endif
890517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}
891517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
892eeac97b18ca5c939bf2ac59334d36d54f705af3dPawin Vongmasa}  // namespace utils
893517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}  // namespace V1_0
894517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}  // namespace omx
895517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}  // namespace media
896517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}  // namespace hardware
897517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa}  // namespace android
898517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa
899517b0e090680e378f056677201426ed9dc325c65Pawin Vongmasa#endif  // ANDROID_HARDWARE_MEDIA_OMX_V1_0__CONVERSION_H
900