1 /* 2 ** 3 ** Copyright 2015-2018, 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/view/Surface.h> 26 #include <utils/String8.h> 27 28 namespace android { 29 30 31 const int OutputConfiguration::INVALID_ROTATION = -1; 32 const int OutputConfiguration::INVALID_SET_ID = -1; 33 34 const std::vector<sp<IGraphicBufferProducer>>& 35 OutputConfiguration::getGraphicBufferProducers() const { 36 return mGbps; 37 } 38 39 int OutputConfiguration::getRotation() const { 40 return mRotation; 41 } 42 43 int OutputConfiguration::getSurfaceSetID() const { 44 return mSurfaceSetID; 45 } 46 47 int OutputConfiguration::getSurfaceType() const { 48 return mSurfaceType; 49 } 50 51 int OutputConfiguration::getWidth() const { 52 return mWidth; 53 } 54 55 int OutputConfiguration::getHeight() const { 56 return mHeight; 57 } 58 59 bool OutputConfiguration::isDeferred() const { 60 return mIsDeferred; 61 } 62 63 bool OutputConfiguration::isShared() const { 64 return mIsShared; 65 } 66 67 String16 OutputConfiguration::getPhysicalCameraId() const { 68 return mPhysicalCameraId; 69 } 70 71 OutputConfiguration::OutputConfiguration() : 72 mRotation(INVALID_ROTATION), 73 mSurfaceSetID(INVALID_SET_ID), 74 mSurfaceType(SURFACE_TYPE_UNKNOWN), 75 mWidth(0), 76 mHeight(0), 77 mIsDeferred(false), 78 mIsShared(false) { 79 } 80 81 OutputConfiguration::OutputConfiguration(const android::Parcel& parcel) : 82 mRotation(INVALID_ROTATION), 83 mSurfaceSetID(INVALID_SET_ID) { 84 readFromParcel(&parcel); 85 } 86 87 status_t OutputConfiguration::readFromParcel(const android::Parcel* parcel) { 88 status_t err = OK; 89 int rotation = 0; 90 91 if (parcel == nullptr) return BAD_VALUE; 92 93 if ((err = parcel->readInt32(&rotation)) != OK) { 94 ALOGE("%s: Failed to read rotation from parcel", __FUNCTION__); 95 return err; 96 } 97 98 int setID = INVALID_SET_ID; 99 if ((err = parcel->readInt32(&setID)) != OK) { 100 ALOGE("%s: Failed to read surface set ID from parcel", __FUNCTION__); 101 return err; 102 } 103 104 int surfaceType = SURFACE_TYPE_UNKNOWN; 105 if ((err = parcel->readInt32(&surfaceType)) != OK) { 106 ALOGE("%s: Failed to read surface type from parcel", __FUNCTION__); 107 return err; 108 } 109 110 int width = 0; 111 if ((err = parcel->readInt32(&width)) != OK) { 112 ALOGE("%s: Failed to read surface width from parcel", __FUNCTION__); 113 return err; 114 } 115 116 int height = 0; 117 if ((err = parcel->readInt32(&height)) != OK) { 118 ALOGE("%s: Failed to read surface height from parcel", __FUNCTION__); 119 return err; 120 } 121 122 int isDeferred = 0; 123 if ((err = parcel->readInt32(&isDeferred)) != OK) { 124 ALOGE("%s: Failed to read surface isDeferred flag from parcel", __FUNCTION__); 125 return err; 126 } 127 128 int isShared = 0; 129 if ((err = parcel->readInt32(&isShared)) != OK) { 130 ALOGE("%s: Failed to read surface isShared flag from parcel", __FUNCTION__); 131 return err; 132 } 133 134 if (isDeferred && surfaceType != SURFACE_TYPE_SURFACE_VIEW && 135 surfaceType != SURFACE_TYPE_SURFACE_TEXTURE) { 136 ALOGE("%s: Invalid surface type for deferred configuration", __FUNCTION__); 137 return BAD_VALUE; 138 } 139 140 std::vector<view::Surface> surfaceShims; 141 if ((err = parcel->readParcelableVector(&surfaceShims)) != OK) { 142 ALOGE("%s: Failed to read surface(s) from parcel", __FUNCTION__); 143 return err; 144 } 145 146 parcel->readString16(&mPhysicalCameraId); 147 148 mRotation = rotation; 149 mSurfaceSetID = setID; 150 mSurfaceType = surfaceType; 151 mWidth = width; 152 mHeight = height; 153 mIsDeferred = isDeferred != 0; 154 mIsShared = isShared != 0; 155 for (auto& surface : surfaceShims) { 156 ALOGV("%s: OutputConfiguration: %p, name %s", __FUNCTION__, 157 surface.graphicBufferProducer.get(), 158 String8(surface.name).string()); 159 mGbps.push_back(surface.graphicBufferProducer); 160 } 161 162 ALOGV("%s: OutputConfiguration: rotation = %d, setId = %d, surfaceType = %d," 163 " physicalCameraId = %s", __FUNCTION__, mRotation, mSurfaceSetID, 164 mSurfaceType, String8(mPhysicalCameraId).string()); 165 166 return err; 167 } 168 169 OutputConfiguration::OutputConfiguration(sp<IGraphicBufferProducer>& gbp, int rotation, 170 const String16& physicalId, 171 int surfaceSetID, bool isShared) { 172 mGbps.push_back(gbp); 173 mRotation = rotation; 174 mSurfaceSetID = surfaceSetID; 175 mIsDeferred = false; 176 mIsShared = isShared; 177 mPhysicalCameraId = physicalId; 178 } 179 180 OutputConfiguration::OutputConfiguration( 181 const std::vector<sp<IGraphicBufferProducer>>& gbps, 182 int rotation, const String16& physicalCameraId, int surfaceSetID, int surfaceType, 183 int width, int height, bool isShared) 184 : mGbps(gbps), mRotation(rotation), mSurfaceSetID(surfaceSetID), mSurfaceType(surfaceType), 185 mWidth(width), mHeight(height), mIsDeferred(false), mIsShared(isShared), 186 mPhysicalCameraId(physicalCameraId) { } 187 188 status_t OutputConfiguration::writeToParcel(android::Parcel* parcel) const { 189 190 if (parcel == nullptr) return BAD_VALUE; 191 status_t err = OK; 192 193 err = parcel->writeInt32(mRotation); 194 if (err != OK) return err; 195 196 err = parcel->writeInt32(mSurfaceSetID); 197 if (err != OK) return err; 198 199 err = parcel->writeInt32(mSurfaceType); 200 if (err != OK) return err; 201 202 err = parcel->writeInt32(mWidth); 203 if (err != OK) return err; 204 205 err = parcel->writeInt32(mHeight); 206 if (err != OK) return err; 207 208 err = parcel->writeInt32(mIsDeferred ? 1 : 0); 209 if (err != OK) return err; 210 211 err = parcel->writeInt32(mIsShared ? 1 : 0); 212 if (err != OK) return err; 213 214 std::vector<view::Surface> surfaceShims; 215 for (auto& gbp : mGbps) { 216 view::Surface surfaceShim; 217 surfaceShim.name = String16("unknown_name"); // name of surface 218 surfaceShim.graphicBufferProducer = gbp; 219 surfaceShims.push_back(surfaceShim); 220 } 221 err = parcel->writeParcelableVector(surfaceShims); 222 if (err != OK) return err; 223 224 err = parcel->writeString16(mPhysicalCameraId); 225 if (err != OK) return err; 226 227 return OK; 228 } 229 230 bool OutputConfiguration::gbpsEqual(const OutputConfiguration& other) const { 231 const std::vector<sp<IGraphicBufferProducer> >& otherGbps = 232 other.getGraphicBufferProducers(); 233 234 if (mGbps.size() != otherGbps.size()) { 235 return false; 236 } 237 238 for (size_t i = 0; i < mGbps.size(); i++) { 239 if (mGbps[i] != otherGbps[i]) { 240 return false; 241 } 242 } 243 244 return true; 245 } 246 247 bool OutputConfiguration::gbpsLessThan(const OutputConfiguration& other) const { 248 const std::vector<sp<IGraphicBufferProducer> >& otherGbps = 249 other.getGraphicBufferProducers(); 250 251 if (mGbps.size() != otherGbps.size()) { 252 return mGbps.size() < otherGbps.size(); 253 } 254 255 for (size_t i = 0; i < mGbps.size(); i++) { 256 if (mGbps[i] != otherGbps[i]) { 257 return mGbps[i] < otherGbps[i]; 258 } 259 } 260 261 return false; 262 } 263 }; // namespace android 264