1e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman/*
2e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Copyright (C) 2016 The Android Open Source Project
3e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
4e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Licensed under the Apache License, Version 2.0 (the "License");
5e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * you may not use this file except in compliance with the License.
6e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * You may obtain a copy of the License at
7e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
8e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *      http://www.apache.org/licenses/LICENSE-2.0
9e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman *
10e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * Unless required by applicable law or agreed to in writing, software
11e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * distributed under the License is distributed on an "AS IS" BASIS,
12e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * See the License for the specific language governing permissions and
14e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman * limitations under the License.
15e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman */
16e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
17e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#ifndef _OMX_FENCE_PARCELABLE_
18e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#define _OMX_FENCE_PARCELABLE_
19e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
20e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#include <binder/Parcel.h>
21e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
22e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace android {
23e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
24e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct OMXFenceParcelable;
25e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
26e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman// This is needed temporarily for the OMX HIDL transition.
27e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace hardware {
28e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    struct hidl_handle;
29e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace media { namespace omx { namespace V1_0 {
30e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace implementation {
31e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    void wrapAs(::android::OMXFenceParcelable* l,
32e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::hidl_handle const& t);
33e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool convertTo(::android::OMXFenceParcelable* l,
34e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::hidl_handle const& t);
35e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}
36e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramannamespace utils {
37e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    void wrapAs(::android::OMXFenceParcelable* l,
38e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::hidl_handle const& t);
39e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    bool convertTo(::android::OMXFenceParcelable* l,
40e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::hidl_handle const& t);
41e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}
42e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}}}}
43e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
44e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanstruct OMXFenceParcelable : public Parcelable {
45e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXFenceParcelable() : mFenceFd(-1) {}
46e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXFenceParcelable(int fenceFd) : mFenceFd(fenceFd) {}
47e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
48e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int get() const { return mFenceFd; }
49e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
50e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    status_t readFromParcel(const Parcel* parcel) override;
51e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    status_t writeToParcel(Parcel* parcel) const override;
52e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
53e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramanprivate:
54e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // Disable copy ctor and operator=
55e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXFenceParcelable(const OMXFenceParcelable &);
56e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    OMXFenceParcelable &operator=(const OMXFenceParcelable &);
57e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
58e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int mFenceFd;
59e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
60e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    // This is needed temporarily for OMX HIDL transition.
61e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend void (::android::hardware::media::omx::V1_0::implementation::
62e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            wrapAs)(OMXFenceParcelable* l,
63e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::hidl_handle const& t);
64e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend bool (::android::hardware::media::omx::V1_0::implementation::
65e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            convertTo)(OMXFenceParcelable* l,
66e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::hidl_handle const& t);
67e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend void (::android::hardware::media::omx::V1_0::utils::
68e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            wrapAs)(OMXFenceParcelable* l,
69e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::hidl_handle const& t);
70e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    friend bool (::android::hardware::media::omx::V1_0::utils::
71e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            convertTo)(OMXFenceParcelable* l,
72e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            ::android::hardware::hidl_handle const& t);
73e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman};
74e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
75e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramaninline status_t OMXFenceParcelable::readFromParcel(const Parcel* parcel) {
76e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    int32_t haveFence;
77e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    status_t err = parcel->readInt32(&haveFence);
78e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    if (err == OK && haveFence) {
79e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        int fd = ::dup(parcel->readFileDescriptor());
80e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        if (fd < 0) {
81e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman            return fd;
82e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        }
83e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        mFenceFd = fd;
84e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    }
85e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    return err;
86e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}
87e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
88e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatramaninline status_t OMXFenceParcelable::writeToParcel(Parcel* parcel) const {
89e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    status_t err = parcel->writeInt32(mFenceFd >= 0);
90e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    if (err == OK && mFenceFd >= 0) {
91e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman        err = parcel->writeFileDescriptor(mFenceFd, true /* takeOwnership */);
92e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    }
93e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman    return err;
94e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman}
95e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
96e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman} // namespace android
97e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman
98e2b43843fd12783188edd2c54188ea8d26864788Vijay Venkatraman#endif // _OMX_FENCE_PARCELABLE_
99