Home | History | Annotate | Download | only in camera2
      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