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