182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/*
282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * Copyright 2016, The Android Open Source Project
382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * Licensed under the Apache License, Version 2.0 (the "License");
582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * you may not use this file except in compliance with the License.
682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * You may obtain a copy of the License at
782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *      http://www.apache.org/licenses/LICENSE-2.0
982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
1082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * Unless required by applicable law or agreed to in writing, software
1182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * distributed under the License is distributed on an "AS IS" BASIS,
1282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * See the License for the specific language governing permissions and
1482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * limitations under the License.
1582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
1682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
17b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa#ifndef MEDIA_STAGEFRIGHT_BQHELPER_CONVERSION_H_
18b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa#define MEDIA_STAGEFRIGHT_BQHELPER_CONVERSION_H_
1982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
2082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <vector>
2182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <list>
2282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
2382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <unistd.h>
2482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
2582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <hidl/MQDescriptor.h>
2682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <hidl/Status.h>
2782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <hidlmemory/mapping.h>
2882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
2982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <binder/Binder.h>
3082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <binder/Status.h>
3182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <ui/FenceTime.h>
3282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <cutils/native_handle.h>
3382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <gui/IGraphicBufferProducer.h>
3482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
3582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <media/hardware/VideoAPI.h>
3682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
3782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <android/hidl/memory/1.0/IMemory.h>
3882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim#include <android/hardware/graphics/bufferqueue/1.0/IProducerListener.h>
3982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
4082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimnamespace android {
4182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimnamespace conversion {
4282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
4382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::hidl_array;
4482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::hidl_string;
4582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::hidl_vec;
4682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::hidl_handle;
4782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::Return;
4882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::Void;
4982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::sp;
5082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::status_t;
5182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
5282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::String8;
5382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
5482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::media::V1_0::Rect;
5582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::media::V1_0::Region;
5682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
5782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::graphics::common::V1_0::Dataspace;
5882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
5982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::graphics::common::V1_0::PixelFormat;
6082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
6182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::hardware::media::V1_0::AnwBuffer;
6282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimusing ::android::GraphicBuffer;
6382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
6482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimtypedef ::android::hardware::graphics::bufferqueue::V1_0::IGraphicBufferProducer
6582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        HGraphicBufferProducer;
6682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kimtypedef ::android::IGraphicBufferProducer
6782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        BGraphicBufferProducer;
6882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
6982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// native_handle_t helper functions.
7082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
7182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
7282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Take an fd and create a native handle containing only the given fd.
7382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * The created handle will need to be deleted manually with
7482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `native_handle_delete()`.
7582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
7682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] fd The source file descriptor (of type `int`).
7782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The create `native_handle_t*` that contains the given \p fd. If the
7882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * supplied \p fd is negative, the created native handle will contain no file
7982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * descriptors.
8082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
8182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * If the native handle cannot be created, the return value will be
8282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `nullptr`.
8382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
8482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * This function does not duplicate the file descriptor.
8582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
86b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasanative_handle_t* native_handle_create_from_fd(int fd);
8782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
8882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
8982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Extract a file descriptor from a native handle.
9082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
9182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] nh The source `native_handle_t*`.
9282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] index The index of the file descriptor in \p nh to read from. This
9382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * input has the default value of `0`.
9482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The `index`-th file descriptor in \p nh. If \p nh does not have
9582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * enough file descriptors, the returned value will be `-1`.
9682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
9782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * This function does not duplicate the file descriptor.
9882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
99b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasaint native_handle_read_fd(native_handle_t const* nh, int index = 0);
10082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
10182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
10282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * Conversion functions
10382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * ====================
10482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
10582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * There are two main directions of conversion:
10682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * - `inTargetType(...)`: Create a wrapper whose lifetime depends on the
10782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   input. The wrapper has type `TargetType`.
10882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * - `toTargetType(...)`: Create a standalone object of type `TargetType` that
10982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   corresponds to the input. The lifetime of the output does not depend on the
11082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   lifetime of the input.
11182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * - `wrapIn(TargetType*, ...)`: Same as `inTargetType()`, but for `TargetType`
11282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   that cannot be copied and/or moved efficiently, or when there are multiple
11382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   output arguments.
11482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * - `convertTo(TargetType*, ...)`: Same as `toTargetType()`, but for
11582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   `TargetType` that cannot be copied and/or moved efficiently, or when there
11682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   are multiple output arguments.
11782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
11882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `wrapIn()` and `convertTo()` functions will take output arguments before
11982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * input arguments. Some of these functions might return a value to indicate
12082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * success or error.
12182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
12282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * In converting or wrapping something as a Treble type that contains a
12382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `hidl_handle`, `native_handle_t*` will need to be created and returned as
12482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * an additional output argument, hence only `wrapIn()` or `convertTo()` would
12582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * be available. The caller must call `native_handle_delete()` to deallocate the
12682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * returned native handle when it is no longer needed.
12782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
12882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * For types that contain file descriptors, `inTargetType()` and `wrapAs()` do
12982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * not perform duplication of file descriptors, while `toTargetType()` and
13082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `convertTo()` do.
13182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
13282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
13382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
13482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `Return<void>` to `binder::Status`.
13582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
13682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `Return<void>`.
13782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The corresponding `binder::Status`.
13882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
13982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// convert: Return<void> -> ::android::binder::Status
140b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa::android::binder::Status toBinderStatus(Return<void> const& t);
14182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
14282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
14382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `Return<void>` to `status_t`. This is for legacy binder calls.
14482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
14582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `Return<void>`.
14682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The corresponding `status_t`.
14782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
14882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// convert: Return<void> -> status_t
149b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t toStatusT(Return<void> const& t);
15082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
15182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
15282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Wrap `native_handle_t*` in `hidl_handle`.
15382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
15482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] nh The source `native_handle_t*`.
15582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The `hidl_handle` that points to \p nh.
15682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
15782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// wrap: native_handle_t* -> hidl_handle
158b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasahidl_handle inHidlHandle(native_handle_t const* nh);
15982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
16082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
16182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `int32_t` to `Dataspace`.
16282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
16382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The source `int32_t`.
16482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \result The corresponding `Dataspace`.
16582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
16682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// convert: int32_t -> Dataspace
167b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin VongmasaDataspace toHardwareDataspace(int32_t l);
16882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
16982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
17082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `Dataspace` to `int32_t`.
17182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
17282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `Dataspace`.
17382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \result The corresponding `int32_t`.
17482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
17582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// convert: Dataspace -> int32_t
176b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasaint32_t toRawDataspace(Dataspace const& t);
17782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
17882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
17982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Wrap an opaque buffer inside a `hidl_vec<uint8_t>`.
18082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
18182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The pointer to the beginning of the opaque buffer.
18282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] size The size of the buffer.
18382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return A `hidl_vec<uint8_t>` that points to the buffer.
18482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
18582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// wrap: void*, size_t -> hidl_vec<uint8_t>
186b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasahidl_vec<uint8_t> inHidlBytes(void const* l, size_t size);
18782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
18882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
18982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Create a `hidl_vec<uint8_t>` that is a copy of an opaque buffer.
19082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
19182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The pointer to the beginning of the opaque buffer.
19282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] size The size of the buffer.
19382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return A `hidl_vec<uint8_t>` that is a copy of the input buffer.
19482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
19582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// convert: void*, size_t -> hidl_vec<uint8_t>
196b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasahidl_vec<uint8_t> toHidlBytes(void const* l, size_t size);
19782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
19882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
19982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Wrap `GraphicBuffer` in `AnwBuffer`.
20082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
20182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The wrapper of type `AnwBuffer`.
20282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The source `GraphicBuffer`.
20382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
20482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// wrap: GraphicBuffer -> AnwBuffer
205b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasavoid wrapAs(AnwBuffer* t, GraphicBuffer const& l);
20682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
20782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
20882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `AnwBuffer` to `GraphicBuffer`.
20982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
21082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] l The destination `GraphicBuffer`.
21182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `AnwBuffer`.
21282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
21382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * This function will duplicate all file descriptors in \p t.
21482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
21582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// convert: AnwBuffer -> GraphicBuffer
21682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// Ref: frameworks/native/libs/ui/GraphicBuffer.cpp: GraphicBuffer::flatten
217b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool convertTo(GraphicBuffer* l, AnwBuffer const& t);
21882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
21982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
22082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * Conversion functions for types outside media
22182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * ============================================
22282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
22382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * Some objects in libui and libgui that were made to go through binder calls do
22482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * not expose ways to read or write their fields to the public. To pass an
22582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * object of this kind through the HIDL boundary, translation functions need to
22682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * work around the access restriction by using the publicly available
22782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `flatten()` and `unflatten()` functions.
22882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
22982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * All `flatten()` and `unflatten()` overloads follow the same convention as
23082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * follows:
23182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
23282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *     status_t flatten(ObjectType const& object,
23382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *                      [OtherType const& other, ...]
23482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *                      void*& buffer, size_t& size,
23582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *                      int*& fds, size_t& numFds)
23682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
23782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *     status_t unflatten(ObjectType* object,
23882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *                        [OtherType* other, ...,]
23982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *                        void*& buffer, size_t& size,
24082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *                        int*& fds, size_t& numFds)
24182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
24282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * The number of `other` parameters varies depending on the `ObjectType`. For
24382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * example, in the process of unflattening an object that contains
24482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `hidl_handle`, `other` is needed to hold `native_handle_t` objects that will
24582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * be created.
24682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
24782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * The last four parameters always work the same way in all overloads of
24882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `flatten()` and `unflatten()`:
24982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * - For `flatten()`, `buffer` is the pointer to the non-fd buffer to be filled,
25082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   `size` is the size (in bytes) of the non-fd buffer pointed to by `buffer`,
25182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   `fds` is the pointer to the fd buffer to be filled, and `numFds` is the
25282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   size (in ints) of the fd buffer pointed to by `fds`.
25382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * - For `unflatten()`, `buffer` is the pointer to the non-fd buffer to be read
25482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   from, `size` is the size (in bytes) of the non-fd buffer pointed to by
25582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   `buffer`, `fds` is the pointer to the fd buffer to be read from, and
25682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   `numFds` is the size (in ints) of the fd buffer pointed to by `fds`.
25782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * - After a successful call to `flatten()` or `unflatten()`, `buffer` and `fds`
25882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   will be advanced, while `size` and `numFds` will be decreased to reflect
25982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   how much storage/data of the two buffers (fd and non-fd) have been used.
26082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * - After an unsuccessful call, the values of `buffer`, `size`, `fds` and
26182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *   `numFds` are invalid.
26282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
26382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * The return value of a successful `flatten()` or `unflatten()` call will be
26482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `OK` (also aliased as `NO_ERROR`). Any other values indicate a failure.
26582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
26682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * For each object type that supports flattening, there will be two accompanying
26782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * functions: `getFlattenedSize()` and `getFdCount()`. `getFlattenedSize()` will
26882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * return the size of the non-fd buffer that the object will need for
26982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * flattening. `getFdCount()` will return the size of the fd buffer that the
27082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * object will need for flattening.
27182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
27282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * The set of these four functions, `getFlattenedSize()`, `getFdCount()`,
27382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `flatten()` and `unflatten()`, are similar to functions of the same name in
27482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * the abstract class `Flattenable`. The only difference is that functions in
27582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * this file are not member functions of the object type. For example, we write
27682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
27782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *     flatten(x, buffer, size, fds, numFds)
27882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
27982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * instead of
28082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
28182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *     x.flatten(buffer, size, fds, numFds)
28282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
28382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * because we cannot modify the type of `x`.
28482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
28582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * There is one exception to the naming convention: `hidl_handle` that
28682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * represents a fence. The four functions for this "Fence" type have the word
28782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * "Fence" attched to their names because the object type, which is
28882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `hidl_handle`, does not carry the special meaning that the object itself can
28982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * only contain zero or one file descriptor.
29082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
29182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
29282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// Ref: frameworks/native/libs/ui/Fence.cpp
29382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
29482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
29582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the size of the non-fd buffer required to flatten a fence.
29682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
29782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] fence The input fence of type `hidl_handle`.
29882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The required size of the flat buffer.
29982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
30082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * The current version of this function always returns 4, which is the number of
30182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * bytes required to store the number of file descriptors contained in the fd
30282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * part of the flat buffer.
30382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
304b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFenceFlattenedSize(hidl_handle const& fence);
30582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
30682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
30782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the number of file descriptors contained in a fence.
30882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
30982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] fence The input fence of type `hidl_handle`.
31082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `0` if \p fence does not contain a valid file descriptor, or `1`
31182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * otherwise.
31282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
313b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFenceFdCount(hidl_handle const& fence);
31482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
31582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
31682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Unflatten `Fence` to `hidl_handle`.
31782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
31882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] fence The destination `hidl_handle`.
31982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] nh The underlying native handle.
32082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat non-fd buffer.
32182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat non-fd buffer.
32282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] fds The pointer to the flat fd buffer.
32382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] numFds The size of the flat fd buffer.
32482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
32582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
32682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * If the return value is `NO_ERROR`, \p nh will point to a newly created
32782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * native handle, which needs to be deleted with `native_handle_delete()`
32882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * afterwards.
32982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
330b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t unflattenFence(hidl_handle* fence, native_handle_t** nh,
331b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        void const*& buffer, size_t& size, int const*& fds, size_t& numFds);
33282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
33382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
33482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Flatten `hidl_handle` as `Fence`.
33582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
33682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `hidl_handle`.
33782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat non-fd buffer.
33882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat non-fd buffer.
33982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] fds The pointer to the flat fd buffer.
34082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] numFds The size of the flat fd buffer.
34182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
34282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
343b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t flattenFence(hidl_handle const& fence,
344b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        void*& buffer, size_t& size, int*& fds, size_t& numFds);
34582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
34682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
34782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Wrap `Fence` in `hidl_handle`.
34882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
34982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The wrapper of type `hidl_handle`.
35082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] nh The native handle pointed to by \p t.
35182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The source `Fence`.
35282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
35382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * On success, \p nh will hold a newly created native handle, which must be
35482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * deleted manually with `native_handle_delete()` afterwards.
35582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
35682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// wrap: Fence -> hidl_handle
357b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool wrapAs(hidl_handle* t, native_handle_t** nh, Fence const& l);
35882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
35982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
36082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `hidl_handle` to `Fence`.
36182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
36282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] l The destination `Fence`. `l` must not have been used
36382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * (`l->isValid()` must return `false`) before this function is called.
36482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `hidl_handle`.
36582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
36682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * If \p t contains a valid file descriptor, it will be duplicated.
36782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
36882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// convert: hidl_handle -> Fence
369b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool convertTo(Fence* l, hidl_handle const& t);
37082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
37182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// Ref: frameworks/native/libs/ui/FenceTime.cpp: FenceTime::Snapshot
37282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
37382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
37482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the size of the non-fd buffer required to flatten
37582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `FenceTimeSnapshot`.
37682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
37782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The input `FenceTimeSnapshot`.
37882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The required size of the flat buffer.
37982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
380b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFlattenedSize(HGraphicBufferProducer::FenceTimeSnapshot const& t);
38182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
38282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
38382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the number of file descriptors contained in
38482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `FenceTimeSnapshot`.
38582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
38682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The input `FenceTimeSnapshot`.
38782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The number of file descriptors contained in \p snapshot.
38882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
389b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFdCount(HGraphicBufferProducer::FenceTimeSnapshot const& t);
39082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
39182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
39282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Flatten `FenceTimeSnapshot`.
39382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
39482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `FenceTimeSnapshot`.
39582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat non-fd buffer.
39682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat non-fd buffer.
39782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] fds The pointer to the flat fd buffer.
39882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] numFds The size of the flat fd buffer.
39982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
40082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
40182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * This function will duplicate the file descriptor in `t.fence` if `t.state ==
40282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * FENCE`.
40382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
404b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t flatten(HGraphicBufferProducer::FenceTimeSnapshot const& t,
405b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        void*& buffer, size_t& size, int*& fds, size_t& numFds);
40682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
40782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
40882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Unflatten `FenceTimeSnapshot`.
40982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
41082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The destination `FenceTimeSnapshot`.
41182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] nh The underlying native handle.
41282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat non-fd buffer.
41382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat non-fd buffer.
41482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] fds The pointer to the flat fd buffer.
41582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] numFds The size of the flat fd buffer.
41682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
41782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
41882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * If the return value is `NO_ERROR` and the constructed snapshot contains a
41982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * file descriptor, \p nh will be created to hold that file descriptor. In this
42082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * case, \p nh needs to be deleted with `native_handle_delete()` afterwards.
42182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
422b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t unflatten(
42382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        HGraphicBufferProducer::FenceTimeSnapshot* t, native_handle_t** nh,
424b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        void const*& buffer, size_t& size, int const*& fds, size_t& numFds);
42582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
42682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// Ref: frameworks/native/libs/gui/FrameTimestamps.cpp: FrameEventsDelta
42782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
42882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
42982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the size of the non-fd buffer required to flatten
43082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `FrameEventsDelta`.
43182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
43282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The input `FrameEventsDelta`.
43382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The required size of the flat buffer.
43482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
435b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFlattenedSize(HGraphicBufferProducer::FrameEventsDelta const& t);
43682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
43782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
43882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the number of file descriptors contained in
43982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `FrameEventsDelta`.
44082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
44182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The input `FrameEventsDelta`.
44282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The number of file descriptors contained in \p t.
44382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
444b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFdCount(HGraphicBufferProducer::FrameEventsDelta const& t);
44582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
44682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
44782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Unflatten `FrameEventsDelta`.
44882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
44982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The destination `FrameEventsDelta`.
45082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] nh The underlying array of native handles.
45182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat non-fd buffer.
45282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat non-fd buffer.
45382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] fds The pointer to the flat fd buffer.
45482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] numFds The size of the flat fd buffer.
45582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
45682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
45782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * If the return value is `NO_ERROR`, \p nh will have length 4, and it will be
45882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * populated with `nullptr` or newly created handles. Each non-null slot in \p
45982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * nh will need to be deleted manually with `native_handle_delete()`.
46082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
461b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t unflatten(HGraphicBufferProducer::FrameEventsDelta* t,
46282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        std::vector<native_handle_t*>* nh,
463b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        void const*& buffer, size_t& size, int const*& fds, size_t& numFds);
46482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
46582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
46682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Flatten `FrameEventsDelta`.
46782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
46882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `FrameEventsDelta`.
46982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat non-fd buffer.
47082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat non-fd buffer.
47182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] fds The pointer to the flat fd buffer.
47282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] numFds The size of the flat fd buffer.
47382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
47482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
47582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * This function will duplicate file descriptors contained in \p t.
47682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
47782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// Ref: frameworks/native/libs/gui/FrameTimestamp.cpp:
47882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim//      FrameEventsDelta::flatten
479b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t flatten(HGraphicBufferProducer::FrameEventsDelta const& t,
480b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        void*& buffer, size_t& size, int*& fds, size_t numFds);
48182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
48282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// Ref: frameworks/native/libs/gui/FrameTimestamps.cpp: FrameEventHistoryDelta
48382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
48482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
48582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the size of the non-fd buffer required to flatten
48682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::FrameEventHistoryDelta`.
48782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
48882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The input `HGraphicBufferProducer::FrameEventHistoryDelta`.
48982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The required size of the flat buffer.
49082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
491b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFlattenedSize(
492b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        HGraphicBufferProducer::FrameEventHistoryDelta const& t);
49382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
49482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
49582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the number of file descriptors contained in
49682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::FrameEventHistoryDelta`.
49782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
49882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The input `HGraphicBufferProducer::FrameEventHistoryDelta`.
49982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The number of file descriptors contained in \p t.
50082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
501b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFdCount(
502b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        HGraphicBufferProducer::FrameEventHistoryDelta const& t);
50382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
50482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
50582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Unflatten `FrameEventHistoryDelta`.
50682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
50782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The destination `FrameEventHistoryDelta`.
50882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] nh The underlying array of arrays of native handles.
50982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat non-fd buffer.
51082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat non-fd buffer.
51182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] fds The pointer to the flat fd buffer.
51282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] numFds The size of the flat fd buffer.
51382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
51482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
51582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * If the return value is `NO_ERROR`, \p nh will be populated with `nullptr` or
51682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * newly created handles. The second dimension of \p nh will be 4. Each non-null
51782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * slot in \p nh will need to be deleted manually with `native_handle_delete()`.
51882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
519b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t unflatten(
52082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        HGraphicBufferProducer::FrameEventHistoryDelta* t,
52182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        std::vector<std::vector<native_handle_t*> >* nh,
522b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        void const*& buffer, size_t& size, int const*& fds, size_t& numFds);
52382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
52482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
52582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Flatten `FrameEventHistoryDelta`.
52682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
52782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `FrameEventHistoryDelta`.
52882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat non-fd buffer.
52982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat non-fd buffer.
53082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] fds The pointer to the flat fd buffer.
53182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] numFds The size of the flat fd buffer.
53282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
53382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
53482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * This function will duplicate file descriptors contained in \p t.
53582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
536b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t flatten(
53782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        HGraphicBufferProducer::FrameEventHistoryDelta const& t,
538b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        void*& buffer, size_t& size, int*& fds, size_t& numFds);
53982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
54082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
54182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Wrap `::android::FrameEventHistoryData` in
54282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::FrameEventHistoryDelta`.
54382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
54482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The wrapper of type
54582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::FrameEventHistoryDelta`.
54682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] nh The array of array of native handles that are referred to by
54782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * members of \p t.
54882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The source `::android::FrameEventHistoryDelta`.
54982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
55082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * On success, each member of \p nh will be either `nullptr` or a newly created
55182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * native handle. All the non-`nullptr` elements must be deleted individually
55282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * with `native_handle_delete()`.
55382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
554b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool wrapAs(HGraphicBufferProducer::FrameEventHistoryDelta* t,
55582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        std::vector<std::vector<native_handle_t*> >* nh,
556b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        ::android::FrameEventHistoryDelta const& l);
55782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
55882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
55982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `HGraphicBufferProducer::FrameEventHistoryDelta` to
56082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `::android::FrameEventHistoryDelta`.
56182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
56282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] l The destination `::android::FrameEventHistoryDelta`.
56382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `HGraphicBufferProducer::FrameEventHistoryDelta`.
56482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
56582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * This function will duplicate all file descriptors contained in \p t.
56682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
567b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool convertTo(
56882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        ::android::FrameEventHistoryDelta* l,
569b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        HGraphicBufferProducer::FrameEventHistoryDelta const& t);
57082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
57182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// Ref: frameworks/native/libs/ui/Region.cpp
57282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
57382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
57482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the size of the buffer required to flatten `Region`.
57582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
57682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The input `Region`.
57782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The required size of the flat buffer.
57882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
579b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFlattenedSize(Region const& t);
58082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
58182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
58282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Unflatten `Region`.
58382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
58482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The destination `Region`.
58582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat buffer.
58682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat buffer.
58782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
58882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
589b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t unflatten(Region* t, void const*& buffer, size_t& size);
59082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
59182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
59282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Flatten `Region`.
59382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
59482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `Region`.
59582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat buffer.
59682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat buffer.
59782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
59882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
599b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t flatten(Region const& t, void*& buffer, size_t& size);
60082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
60182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
60282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `::android::Region` to `Region`.
60382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
60482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The destination `Region`.
60582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The source `::android::Region`.
60682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
60782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// convert: ::android::Region -> Region
608b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool convertTo(Region* t, ::android::Region const& l);
60982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
61082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
61182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `Region` to `::android::Region`.
61282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
61382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] l The destination `::android::Region`.
61482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `Region`.
61582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
61682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// convert: Region -> ::android::Region
617b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool convertTo(::android::Region* l, Region const& t);
61882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
61982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// Ref: frameworks/native/libs/gui/BGraphicBufferProducer.cpp:
62082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim//      BGraphicBufferProducer::QueueBufferInput
62182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
62282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
62382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the size of the buffer required to flatten
62482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::QueueBufferInput`.
62582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
62682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The input `HGraphicBufferProducer::QueueBufferInput`.
62782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The required size of the flat buffer.
62882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
629b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFlattenedSize(HGraphicBufferProducer::QueueBufferInput const& t);
63082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
63182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
63282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Return the number of file descriptors contained in
63382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::QueueBufferInput`.
63482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
63582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The input `HGraphicBufferProducer::QueueBufferInput`.
63682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The number of file descriptors contained in \p t.
63782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
638b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasasize_t getFdCount(
639b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        HGraphicBufferProducer::QueueBufferInput const& t);
64082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
64182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Flatten `HGraphicBufferProducer::QueueBufferInput`.
64282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
64382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `HGraphicBufferProducer::QueueBufferInput`.
64482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] nh The native handle cloned from `t.fence`.
64582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat non-fd buffer.
64682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat non-fd buffer.
64782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] fds The pointer to the flat fd buffer.
64882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] numFds The size of the flat fd buffer.
64982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
65082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
65182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * This function will duplicate the file descriptor in `t.fence`. */
652b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t flatten(HGraphicBufferProducer::QueueBufferInput const& t,
65382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        native_handle_t** nh,
654b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        void*& buffer, size_t& size, int*& fds, size_t& numFds);
65582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
65682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
65782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Unflatten `HGraphicBufferProducer::QueueBufferInput`.
65882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
65982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The destination `HGraphicBufferProducer::QueueBufferInput`.
66082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] nh The underlying native handle for `t->fence`.
66182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] buffer The pointer to the flat non-fd buffer.
66282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] size The size of the flat non-fd buffer.
66382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] fds The pointer to the flat fd buffer.
66482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in,out] numFds The size of the flat fd buffer.
66582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return `NO_ERROR` on success; other value on failure.
66682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
66782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * If the return value is `NO_ERROR` and `t->fence` contains a valid file
66882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * descriptor, \p nh will be a newly created native handle holding that file
66982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * descriptor. \p nh needs to be deleted with `native_handle_delete()`
67082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * afterwards.
67182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
672b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasastatus_t unflatten(
67382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        HGraphicBufferProducer::QueueBufferInput* t, native_handle_t** nh,
674b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        void const*& buffer, size_t& size, int const*& fds, size_t& numFds);
67582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
67682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
67782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Wrap `BGraphicBufferProducer::QueueBufferInput` in
67882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::QueueBufferInput`.
67982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
68082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The wrapper of type
68182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::QueueBufferInput`.
68282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] nh The underlying native handle for `t->fence`.
68382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The source `BGraphicBufferProducer::QueueBufferInput`.
68482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
68582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * If the return value is `true` and `t->fence` contains a valid file
68682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * descriptor, \p nh will be a newly created native handle holding that file
68782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * descriptor. \p nh needs to be deleted with `native_handle_delete()`
68882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * afterwards.
68982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
690b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool wrapAs(
69182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        HGraphicBufferProducer::QueueBufferInput* t,
69282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        native_handle_t** nh,
693b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        BGraphicBufferProducer::QueueBufferInput const& l);
69482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
69582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
69682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `HGraphicBufferProducer::QueueBufferInput` to
69782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `BGraphicBufferProducer::QueueBufferInput`.
69882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
69982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] l The destination `BGraphicBufferProducer::QueueBufferInput`.
70082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `HGraphicBufferProducer::QueueBufferInput`.
70182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
70282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * If `t.fence` has a valid file descriptor, it will be duplicated.
70382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
704b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool convertTo(
70582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        BGraphicBufferProducer::QueueBufferInput* l,
706b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        HGraphicBufferProducer::QueueBufferInput const& t);
70782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
70882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// Ref: frameworks/native/libs/gui/BGraphicBufferProducer.cpp:
70982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim//      BGraphicBufferProducer::QueueBufferOutput
71082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
71182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
71282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Wrap `BGraphicBufferProducer::QueueBufferOutput` in
71382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::QueueBufferOutput`.
71482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
71582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] t The wrapper of type
71682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::QueueBufferOutput`.
71782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] nh The array of array of native handles that are referred to by
71882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * members of \p t.
71982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The source `BGraphicBufferProducer::QueueBufferOutput`.
72082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
72182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * On success, each member of \p nh will be either `nullptr` or a newly created
72282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * native handle. All the non-`nullptr` elements must be deleted individually
72382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * with `native_handle_delete()`.
72482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
72582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// wrap: BGraphicBufferProducer::QueueBufferOutput ->
72682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// HGraphicBufferProducer::QueueBufferOutput
727b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool wrapAs(HGraphicBufferProducer::QueueBufferOutput* t,
72882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        std::vector<std::vector<native_handle_t*> >* nh,
729b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        BGraphicBufferProducer::QueueBufferOutput const& l);
73082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
73182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
73282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `HGraphicBufferProducer::QueueBufferOutput` to
73382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `BGraphicBufferProducer::QueueBufferOutput`.
73482832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
73582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[out] l The destination `BGraphicBufferProducer::QueueBufferOutput`.
73682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] t The source `HGraphicBufferProducer::QueueBufferOutput`.
73782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
73882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * This function will duplicate all file descriptors contained in \p t.
73982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
74082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// convert: HGraphicBufferProducer::QueueBufferOutput ->
74182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim// BGraphicBufferProducer::QueueBufferOutput
742b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasabool convertTo(
74382832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim        BGraphicBufferProducer::QueueBufferOutput* l,
744b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        HGraphicBufferProducer::QueueBufferOutput const& t);
74582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
74682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
74782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `BGraphicBufferProducer::DisconnectMode` to
74882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `HGraphicBufferProducer::DisconnectMode`.
74982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
75082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The source `BGraphicBufferProducer::DisconnectMode`.
75182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The corresponding `HGraphicBufferProducer::DisconnectMode`.
75282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
753b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin VongmasaHGraphicBufferProducer::DisconnectMode toHidlDisconnectMode(
754b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        BGraphicBufferProducer::DisconnectMode l);
75582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
75682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim/**
75782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \brief Convert `HGraphicBufferProducer::DisconnectMode` to
75882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * `BGraphicBufferProducer::DisconnectMode`.
75982832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim *
76082832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \param[in] l The source `HGraphicBufferProducer::DisconnectMode`.
76182832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim * \return The corresponding `BGraphicBufferProducer::DisconnectMode`.
76282832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim */
763b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin VongmasaBGraphicBufferProducer::DisconnectMode toGuiDisconnectMode(
764b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa        HGraphicBufferProducer::DisconnectMode t);
76582832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
76682832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim}  // namespace conversion
76782832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim}  // namespace android
76882832ceb96670bf95013c7b42e22f32f58050131Wonsik Kim
769b5d108dbdf2559858a5d1705eeb7bdc4c0a019c2Pawin Vongmasa#endif  // MEDIA_STAGEFRIGHT_BQHELPER_CONVERSION_H_
770