1d291c222357303b9611cab89d0c3b047584ef377Chong Zhang/*
2d291c222357303b9611cab89d0c3b047584ef377Chong Zhang * Copyright 2015 The Android Open Source Project
3d291c222357303b9611cab89d0c3b047584ef377Chong Zhang *
4d291c222357303b9611cab89d0c3b047584ef377Chong Zhang * Licensed under the Apache License, Version 2.0 (the "License");
5d291c222357303b9611cab89d0c3b047584ef377Chong Zhang * you may not use this file except in compliance with the License.
6d291c222357303b9611cab89d0c3b047584ef377Chong Zhang * You may obtain a copy of the License at
7d291c222357303b9611cab89d0c3b047584ef377Chong Zhang *
8d291c222357303b9611cab89d0c3b047584ef377Chong Zhang *      http://www.apache.org/licenses/LICENSE-2.0
9d291c222357303b9611cab89d0c3b047584ef377Chong Zhang *
10d291c222357303b9611cab89d0c3b047584ef377Chong Zhang * Unless required by applicable law or agreed to in writing, software
11d291c222357303b9611cab89d0c3b047584ef377Chong Zhang * distributed under the License is distributed on an "AS IS" BASIS,
12d291c222357303b9611cab89d0c3b047584ef377Chong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d291c222357303b9611cab89d0c3b047584ef377Chong Zhang * See the License for the specific language governing permissions and
14d291c222357303b9611cab89d0c3b047584ef377Chong Zhang * limitations under the License.
15d291c222357303b9611cab89d0c3b047584ef377Chong Zhang */
16d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
17d291c222357303b9611cab89d0c3b047584ef377Chong Zhang#ifndef PERSISTENT_SURFACE_H_
18d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
19d291c222357303b9611cab89d0c3b047584ef377Chong Zhang#define PERSISTENT_SURFACE_H_
20d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
21addf2cbb120346ae42e78fa739245a353db5edadChong Zhang#include <android/IGraphicBufferSource.h>
22addf2cbb120346ae42e78fa739245a353db5edadChong Zhang#include <binder/Parcel.h>
23d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar#include <hidl/HidlSupport.h>
2479c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar#include <hidl/HybridInterface.h>
25d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar#include <gui/IGraphicBufferProducer.h>
26d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar#include <media/stagefright/foundation/ABase.h>
27d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar
28d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnarusing android::hidl::base::V1_0::IBase;
29d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
30d291c222357303b9611cab89d0c3b047584ef377Chong Zhangnamespace android {
31d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
32d291c222357303b9611cab89d0c3b047584ef377Chong Zhangstruct PersistentSurface : public RefBase {
33addf2cbb120346ae42e78fa739245a353db5edadChong Zhang    PersistentSurface() {}
34addf2cbb120346ae42e78fa739245a353db5edadChong Zhang
35d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar    // create an OMX persistent surface
36d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    PersistentSurface(
37d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            const sp<IGraphicBufferProducer>& bufferProducer,
38addf2cbb120346ae42e78fa739245a353db5edadChong Zhang            const sp<IGraphicBufferSource>& bufferSource) :
39d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        mBufferProducer(bufferProducer),
40addf2cbb120346ae42e78fa739245a353db5edadChong Zhang        mBufferSource(bufferSource) { }
41d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
42d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar    // create a HIDL persistent surface
43d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar    PersistentSurface(
44d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar            const sp<IGraphicBufferProducer>& bufferProducer,
45d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar            const sp<IBase>& hidlTarget) :
46d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar        mBufferProducer(bufferProducer),
47d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar        mHidlTarget(hidlTarget) { }
48d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar
49d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    sp<IGraphicBufferProducer> getBufferProducer() const {
50d291c222357303b9611cab89d0c3b047584ef377Chong Zhang        return mBufferProducer;
51d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    }
52d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
53addf2cbb120346ae42e78fa739245a353db5edadChong Zhang    sp<IGraphicBufferSource> getBufferSource() const {
54addf2cbb120346ae42e78fa739245a353db5edadChong Zhang        return mBufferSource;
55addf2cbb120346ae42e78fa739245a353db5edadChong Zhang    }
56addf2cbb120346ae42e78fa739245a353db5edadChong Zhang
57d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar    sp<IBase> getHidlTarget() const {
58d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar        return mHidlTarget;
59d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar    }
60d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar
61addf2cbb120346ae42e78fa739245a353db5edadChong Zhang    status_t writeToParcel(Parcel *parcel) const {
62addf2cbb120346ae42e78fa739245a353db5edadChong Zhang        parcel->writeStrongBinder(IInterface::asBinder(mBufferProducer));
6379c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar        // this can handle null
64addf2cbb120346ae42e78fa739245a353db5edadChong Zhang        parcel->writeStrongBinder(IInterface::asBinder(mBufferSource));
6579c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar        // write hidl target
6679c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar        if (mHidlTarget != nullptr) {
6779c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            HalToken token;
6879c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            bool result = createHalToken(mHidlTarget, &token);
6979c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            parcel->writeBool(result);
7079c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            if (result) {
7179c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar                parcel->writeByteArray(token.size(), token.data());
7279c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            }
7379c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar        } else {
7479c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            parcel->writeBool(false);
7579c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar        }
76addf2cbb120346ae42e78fa739245a353db5edadChong Zhang        return NO_ERROR;
77addf2cbb120346ae42e78fa739245a353db5edadChong Zhang    }
78addf2cbb120346ae42e78fa739245a353db5edadChong Zhang
79addf2cbb120346ae42e78fa739245a353db5edadChong Zhang    status_t readFromParcel(const Parcel *parcel) {
80addf2cbb120346ae42e78fa739245a353db5edadChong Zhang        mBufferProducer = interface_cast<IGraphicBufferProducer>(
81addf2cbb120346ae42e78fa739245a353db5edadChong Zhang                parcel->readStrongBinder());
82addf2cbb120346ae42e78fa739245a353db5edadChong Zhang        mBufferSource = interface_cast<IGraphicBufferSource>(
83addf2cbb120346ae42e78fa739245a353db5edadChong Zhang                parcel->readStrongBinder());
8479c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar        // read hidl target
8579c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar        bool haveHidlTarget = parcel->readBool();
8679c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar        if (haveHidlTarget) {
8779c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            std::vector<uint8_t> tokenVector;
8879c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            parcel->readByteVector(&tokenVector);
8979c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            HalToken token = HalToken(tokenVector);
9079c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            mHidlTarget = retrieveHalInterface(token);
9179c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            deleteHalToken(token);
9279c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar        } else {
9379c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar            mHidlTarget.clear();
9479c49ae0bdaaee24d7dc26b6658acfab27274b22Lajos Molnar        }
95addf2cbb120346ae42e78fa739245a353db5edadChong Zhang        return NO_ERROR;
96d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    }
97d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
98d291c222357303b9611cab89d0c3b047584ef377Chong Zhangprivate:
99addf2cbb120346ae42e78fa739245a353db5edadChong Zhang    sp<IGraphicBufferProducer> mBufferProducer;
100addf2cbb120346ae42e78fa739245a353db5edadChong Zhang    sp<IGraphicBufferSource> mBufferSource;
101d3663c97fb8bd44877e07a753a12b838a780b69cLajos Molnar    sp<IBase> mHidlTarget;
102d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
103d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    DISALLOW_EVIL_CONSTRUCTORS(PersistentSurface);
104d291c222357303b9611cab89d0c3b047584ef377Chong Zhang};
105d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
106d291c222357303b9611cab89d0c3b047584ef377Chong Zhang}  // namespace android
107d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
108d291c222357303b9611cab89d0c3b047584ef377Chong Zhang#endif  // PERSISTENT_SURFACE_H_
109