OutputConfiguration.cpp revision f51fca277eb5b86bd0b2e3fc90ecb2b63089de29
1b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh/*
2b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh**
3b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh** Copyright 2015, The Android Open Source Project
4b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh**
5b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh** Licensed under the Apache License, Version 2.0 (the "License");
6b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh** you may not use this file except in compliance with the License.
7b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh** You may obtain a copy of the License at
8b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh**
9b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh**     http://www.apache.org/licenses/LICENSE-2.0
10b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh**
11b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh** Unless required by applicable law or agreed to in writing, software
12b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh** distributed under the License is distributed on an "AS IS" BASIS,
13b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh** See the License for the specific language governing permissions and
15b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh** limitations under the License.
16b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh*/
17b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
18b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh#define LOG_TAG "OutputConfiguration"
19d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala//#define LOG_NDEBUG 0
20d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
21b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh#include <utils/Log.h>
22b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
23b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh#include <camera/camera2/OutputConfiguration.h>
24d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <gui/Surface.h>
25b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh#include <binder/Parcel.h>
26b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
27b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yehnamespace android {
28b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
29b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
30b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yehconst int OutputConfiguration::INVALID_ROTATION = -1;
31018107a82d80f186d3efca250e38e9c85436a4d9Zhijun Heconst int OutputConfiguration::INVALID_SET_ID = -1;
32b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
33b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yehsp<IGraphicBufferProducer> OutputConfiguration::getGraphicBufferProducer() const {
34b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh    return mGbp;
35b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh}
36b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
37b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yehint OutputConfiguration::getRotation() const {
38b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh    return mRotation;
39b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh}
40b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
41018107a82d80f186d3efca250e38e9c85436a4d9Zhijun Heint OutputConfiguration::getSurfaceSetID() const {
42018107a82d80f186d3efca250e38e9c85436a4d9Zhijun He    return mSurfaceSetID;
43018107a82d80f186d3efca250e38e9c85436a4d9Zhijun He}
44018107a82d80f186d3efca250e38e9c85436a4d9Zhijun He
455d677d1f0879d5101e38df480a38228a64d63959Zhijun Heint OutputConfiguration::getSurfaceType() const {
465d677d1f0879d5101e38df480a38228a64d63959Zhijun He    return mSurfaceType;
475d677d1f0879d5101e38df480a38228a64d63959Zhijun He}
485d677d1f0879d5101e38df480a38228a64d63959Zhijun He
495d677d1f0879d5101e38df480a38228a64d63959Zhijun Heint OutputConfiguration::getWidth() const {
505d677d1f0879d5101e38df480a38228a64d63959Zhijun He    return mWidth;
515d677d1f0879d5101e38df480a38228a64d63959Zhijun He}
525d677d1f0879d5101e38df480a38228a64d63959Zhijun He
535d677d1f0879d5101e38df480a38228a64d63959Zhijun Heint OutputConfiguration::getHeight() const {
545d677d1f0879d5101e38df480a38228a64d63959Zhijun He    return mHeight;
555d677d1f0879d5101e38df480a38228a64d63959Zhijun He}
565d677d1f0879d5101e38df480a38228a64d63959Zhijun He
57d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville TalvalaOutputConfiguration::OutputConfiguration() :
58d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        mRotation(INVALID_ROTATION),
595d677d1f0879d5101e38df480a38228a64d63959Zhijun He        mSurfaceSetID(INVALID_SET_ID),
605d677d1f0879d5101e38df480a38228a64d63959Zhijun He        mSurfaceType(SURFACE_TYPE_UNKNOWN),
615d677d1f0879d5101e38df480a38228a64d63959Zhijun He        mWidth(0),
625d677d1f0879d5101e38df480a38228a64d63959Zhijun He        mHeight(0) {
63d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala}
64d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
65f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville TalvalaOutputConfiguration::OutputConfiguration(const android::Parcel& parcel) :
66d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        mRotation(INVALID_ROTATION),
67d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        mSurfaceSetID(INVALID_SET_ID) {
68d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    readFromParcel(&parcel);
69d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala}
70d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
71f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvalastatus_t OutputConfiguration::readFromParcel(const android::Parcel* parcel) {
72d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    status_t err = OK;
73b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh    int rotation = 0;
74d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
75d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if (parcel == nullptr) return BAD_VALUE;
76d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
77d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if ((err = parcel->readInt32(&rotation)) != OK) {
78b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh        ALOGE("%s: Failed to read rotation from parcel", __FUNCTION__);
79d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return err;
80b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh    }
81b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
82018107a82d80f186d3efca250e38e9c85436a4d9Zhijun He    int setID = INVALID_SET_ID;
83d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if ((err = parcel->readInt32(&setID)) != OK) {
84018107a82d80f186d3efca250e38e9c85436a4d9Zhijun He        ALOGE("%s: Failed to read surface set ID from parcel", __FUNCTION__);
85d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        return err;
86018107a82d80f186d3efca250e38e9c85436a4d9Zhijun He    }
87018107a82d80f186d3efca250e38e9c85436a4d9Zhijun He
885d677d1f0879d5101e38df480a38228a64d63959Zhijun He    int surfaceType = SURFACE_TYPE_UNKNOWN;
895d677d1f0879d5101e38df480a38228a64d63959Zhijun He    if ((err = parcel->readInt32(&surfaceType)) != OK) {
905d677d1f0879d5101e38df480a38228a64d63959Zhijun He        ALOGE("%s: Failed to read surface type from parcel", __FUNCTION__);
915d677d1f0879d5101e38df480a38228a64d63959Zhijun He        return err;
925d677d1f0879d5101e38df480a38228a64d63959Zhijun He    }
935d677d1f0879d5101e38df480a38228a64d63959Zhijun He
945d677d1f0879d5101e38df480a38228a64d63959Zhijun He    int width = 0;
955d677d1f0879d5101e38df480a38228a64d63959Zhijun He    if ((err = parcel->readInt32(&width)) != OK) {
965d677d1f0879d5101e38df480a38228a64d63959Zhijun He        ALOGE("%s: Failed to read surface width from parcel", __FUNCTION__);
975d677d1f0879d5101e38df480a38228a64d63959Zhijun He        return err;
985d677d1f0879d5101e38df480a38228a64d63959Zhijun He    }
995d677d1f0879d5101e38df480a38228a64d63959Zhijun He
1005d677d1f0879d5101e38df480a38228a64d63959Zhijun He    int height = 0;
1015d677d1f0879d5101e38df480a38228a64d63959Zhijun He    if ((err = parcel->readInt32(&height)) != OK) {
1025d677d1f0879d5101e38df480a38228a64d63959Zhijun He        ALOGE("%s: Failed to read surface height from parcel", __FUNCTION__);
1035d677d1f0879d5101e38df480a38228a64d63959Zhijun He        return err;
1045d677d1f0879d5101e38df480a38228a64d63959Zhijun He    }
1055d677d1f0879d5101e38df480a38228a64d63959Zhijun He
106d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    view::Surface surfaceShim;
107d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if ((err = surfaceShim.readFromParcel(parcel)) != OK) {
1085d677d1f0879d5101e38df480a38228a64d63959Zhijun He        // Read surface failure for deferred surface configuration is expected.
1095d677d1f0879d5101e38df480a38228a64d63959Zhijun He        if (surfaceType == SURFACE_TYPE_SURFACE_VIEW ||
1105d677d1f0879d5101e38df480a38228a64d63959Zhijun He                surfaceType == SURFACE_TYPE_SURFACE_TEXTURE) {
1115d677d1f0879d5101e38df480a38228a64d63959Zhijun He            ALOGV("%s: Get null surface from a deferred surface configuration (%dx%d)",
1125d677d1f0879d5101e38df480a38228a64d63959Zhijun He                    __FUNCTION__, width, height);
1135d677d1f0879d5101e38df480a38228a64d63959Zhijun He            err = OK;
1145d677d1f0879d5101e38df480a38228a64d63959Zhijun He        } else {
1155d677d1f0879d5101e38df480a38228a64d63959Zhijun He            ALOGE("%s: Failed to read surface from parcel", __FUNCTION__);
1165d677d1f0879d5101e38df480a38228a64d63959Zhijun He            return err;
1175d677d1f0879d5101e38df480a38228a64d63959Zhijun He        }
118d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    }
119d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
120d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    mGbp = surfaceShim.graphicBufferProducer;
121b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh    mRotation = rotation;
122018107a82d80f186d3efca250e38e9c85436a4d9Zhijun He    mSurfaceSetID = setID;
1235d677d1f0879d5101e38df480a38228a64d63959Zhijun He    mSurfaceType = surfaceType;
1245d677d1f0879d5101e38df480a38228a64d63959Zhijun He    mWidth = width;
1255d677d1f0879d5101e38df480a38228a64d63959Zhijun He    mHeight = height;
126b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
1275d677d1f0879d5101e38df480a38228a64d63959Zhijun He    ALOGV("%s: OutputConfiguration: bp = %p, name = %s, rotation = %d, setId = %d,"
1285d677d1f0879d5101e38df480a38228a64d63959Zhijun He            "surfaceType = %d", __FUNCTION__, mGbp.get(), String8(surfaceShim.name).string(),
1295d677d1f0879d5101e38df480a38228a64d63959Zhijun He            mRotation, mSurfaceSetID, mSurfaceType);
130d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
131d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    return err;
132b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh}
133b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
134018107a82d80f186d3efca250e38e9c85436a4d9Zhijun HeOutputConfiguration::OutputConfiguration(sp<IGraphicBufferProducer>& gbp, int rotation,
135018107a82d80f186d3efca250e38e9c85436a4d9Zhijun He        int surfaceSetID) {
1363450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    mGbp = gbp;
1373450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk    mRotation = rotation;
138018107a82d80f186d3efca250e38e9c85436a4d9Zhijun He    mSurfaceSetID = surfaceSetID;
1393450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk}
1403450ba7879be6522ea46a56c5e66e5382f5dd5baRuben Brunk
141f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvalastatus_t OutputConfiguration::writeToParcel(android::Parcel* parcel) const {
142d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
143d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if (parcel == nullptr) return BAD_VALUE;
144d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    status_t err = OK;
145b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
146d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    err = parcel->writeInt32(mRotation);
147d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if (err != OK) return err;
148d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
149d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    err = parcel->writeInt32(mSurfaceSetID);
150d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if (err != OK) return err;
151d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
1525d677d1f0879d5101e38df480a38228a64d63959Zhijun He    err = parcel->writeInt32(mSurfaceType);
1535d677d1f0879d5101e38df480a38228a64d63959Zhijun He    if (err != OK) return err;
1545d677d1f0879d5101e38df480a38228a64d63959Zhijun He
1555d677d1f0879d5101e38df480a38228a64d63959Zhijun He    err = parcel->writeInt32(mWidth);
1565d677d1f0879d5101e38df480a38228a64d63959Zhijun He    if (err != OK) return err;
1575d677d1f0879d5101e38df480a38228a64d63959Zhijun He
1585d677d1f0879d5101e38df480a38228a64d63959Zhijun He    err = parcel->writeInt32(mHeight);
1595d677d1f0879d5101e38df480a38228a64d63959Zhijun He    if (err != OK) return err;
1605d677d1f0879d5101e38df480a38228a64d63959Zhijun He
161d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    view::Surface surfaceShim;
162d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    surfaceShim.name = String16("unknown_name"); // name of surface
163d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    surfaceShim.graphicBufferProducer = mGbp;
164d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
165d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    err = surfaceShim.writeToParcel(parcel);
166d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    if (err != OK) return err;
167b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
168b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh    return OK;
169b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh}
170b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh
171b97babb8c08969b55af3b6456d15f764c8873d3fYin-Chia Yeh}; // namespace android
172