OutputConfiguration.cpp revision f675356f9e275b9a52101a997ad20404922b5147
1/*
2**
3** Copyright 2015, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9**     http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18#define LOG_TAG "OutputConfiguration"
19//#define LOG_NDEBUG 0
20
21#include <utils/Log.h>
22
23#include <camera/camera2/OutputConfiguration.h>
24#include <binder/Parcel.h>
25#include <gui/Surface.h>
26#include <utils/String8.h>
27
28namespace android {
29
30
31const int OutputConfiguration::INVALID_ROTATION = -1;
32const int OutputConfiguration::INVALID_SET_ID = -1;
33
34sp<IGraphicBufferProducer> OutputConfiguration::getGraphicBufferProducer() const {
35    return mGbp;
36}
37
38int OutputConfiguration::getRotation() const {
39    return mRotation;
40}
41
42int OutputConfiguration::getSurfaceSetID() const {
43    return mSurfaceSetID;
44}
45
46int OutputConfiguration::getSurfaceType() const {
47    return mSurfaceType;
48}
49
50int OutputConfiguration::getWidth() const {
51    return mWidth;
52}
53
54int OutputConfiguration::getHeight() const {
55    return mHeight;
56}
57
58OutputConfiguration::OutputConfiguration() :
59        mRotation(INVALID_ROTATION),
60        mSurfaceSetID(INVALID_SET_ID),
61        mSurfaceType(SURFACE_TYPE_UNKNOWN),
62        mWidth(0),
63        mHeight(0) {
64}
65
66OutputConfiguration::OutputConfiguration(const android::Parcel& parcel) :
67        mRotation(INVALID_ROTATION),
68        mSurfaceSetID(INVALID_SET_ID) {
69    readFromParcel(&parcel);
70}
71
72status_t OutputConfiguration::readFromParcel(const android::Parcel* parcel) {
73    status_t err = OK;
74    int rotation = 0;
75
76    if (parcel == nullptr) return BAD_VALUE;
77
78    if ((err = parcel->readInt32(&rotation)) != OK) {
79        ALOGE("%s: Failed to read rotation from parcel", __FUNCTION__);
80        return err;
81    }
82
83    int setID = INVALID_SET_ID;
84    if ((err = parcel->readInt32(&setID)) != OK) {
85        ALOGE("%s: Failed to read surface set ID from parcel", __FUNCTION__);
86        return err;
87    }
88
89    int surfaceType = SURFACE_TYPE_UNKNOWN;
90    if ((err = parcel->readInt32(&surfaceType)) != OK) {
91        ALOGE("%s: Failed to read surface type from parcel", __FUNCTION__);
92        return err;
93    }
94
95    int width = 0;
96    if ((err = parcel->readInt32(&width)) != OK) {
97        ALOGE("%s: Failed to read surface width from parcel", __FUNCTION__);
98        return err;
99    }
100
101    int height = 0;
102    if ((err = parcel->readInt32(&height)) != OK) {
103        ALOGE("%s: Failed to read surface height from parcel", __FUNCTION__);
104        return err;
105    }
106
107    view::Surface surfaceShim;
108    if ((err = surfaceShim.readFromParcel(parcel)) != OK) {
109        // Read surface failure for deferred surface configuration is expected.
110        if (surfaceType == SURFACE_TYPE_SURFACE_VIEW ||
111                surfaceType == SURFACE_TYPE_SURFACE_TEXTURE) {
112            ALOGV("%s: Get null surface from a deferred surface configuration (%dx%d)",
113                    __FUNCTION__, width, height);
114            err = OK;
115        } else {
116            ALOGE("%s: Failed to read surface from parcel", __FUNCTION__);
117            return err;
118        }
119    }
120
121    mGbp = surfaceShim.graphicBufferProducer;
122    mRotation = rotation;
123    mSurfaceSetID = setID;
124    mSurfaceType = surfaceType;
125    mWidth = width;
126    mHeight = height;
127
128    ALOGV("%s: OutputConfiguration: bp = %p, name = %s, rotation = %d, setId = %d,"
129            "surfaceType = %d", __FUNCTION__, mGbp.get(), String8(surfaceShim.name).string(),
130            mRotation, mSurfaceSetID, mSurfaceType);
131
132    return err;
133}
134
135OutputConfiguration::OutputConfiguration(sp<IGraphicBufferProducer>& gbp, int rotation,
136        int surfaceSetID) {
137    mGbp = gbp;
138    mRotation = rotation;
139    mSurfaceSetID = surfaceSetID;
140}
141
142status_t OutputConfiguration::writeToParcel(android::Parcel* parcel) const {
143
144    if (parcel == nullptr) return BAD_VALUE;
145    status_t err = OK;
146
147    err = parcel->writeInt32(mRotation);
148    if (err != OK) return err;
149
150    err = parcel->writeInt32(mSurfaceSetID);
151    if (err != OK) return err;
152
153    err = parcel->writeInt32(mSurfaceType);
154    if (err != OK) return err;
155
156    err = parcel->writeInt32(mWidth);
157    if (err != OK) return err;
158
159    err = parcel->writeInt32(mHeight);
160    if (err != OK) return err;
161
162    view::Surface surfaceShim;
163    surfaceShim.name = String16("unknown_name"); // name of surface
164    surfaceShim.graphicBufferProducer = mGbp;
165
166    err = surfaceShim.writeToParcel(parcel);
167    if (err != OK) return err;
168
169    return OK;
170}
171
172}; // namespace android
173