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