Home | History | Annotate | Download | only in camera
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "Camera-CaptureResult"
     18 #include <utils/Log.h>
     19 
     20 #include <camera/CaptureResult.h>
     21 #include <binder/Parcel.h>
     22 
     23 namespace android {
     24 
     25 bool CaptureResultExtras::isValid() {
     26     return requestId >= 0;
     27 }
     28 
     29 status_t CaptureResultExtras::readFromParcel(const android::Parcel *parcel) {
     30     if (parcel == NULL) {
     31         ALOGE("%s: Null parcel", __FUNCTION__);
     32         return BAD_VALUE;
     33     }
     34 
     35     parcel->readInt32(&requestId);
     36     parcel->readInt32(&burstId);
     37     parcel->readInt32(&afTriggerId);
     38     parcel->readInt32(&precaptureTriggerId);
     39     parcel->readInt64(&frameNumber);
     40     parcel->readInt32(&partialResultCount);
     41     parcel->readInt32(&errorStreamId);
     42     auto physicalCameraIdPresent = parcel->readBool();
     43     if (physicalCameraIdPresent) {
     44         String16 cameraId;
     45         status_t res = OK;
     46         if ((res = parcel->readString16(&cameraId)) != OK) {
     47             ALOGE("%s: Failed to read camera id: %d", __FUNCTION__, res);
     48             return res;
     49         }
     50         errorPhysicalCameraId = cameraId;
     51     }
     52 
     53     return OK;
     54 }
     55 
     56 status_t CaptureResultExtras::writeToParcel(android::Parcel *parcel) const {
     57     if (parcel == NULL) {
     58         ALOGE("%s: Null parcel", __FUNCTION__);
     59         return BAD_VALUE;
     60     }
     61 
     62     parcel->writeInt32(requestId);
     63     parcel->writeInt32(burstId);
     64     parcel->writeInt32(afTriggerId);
     65     parcel->writeInt32(precaptureTriggerId);
     66     parcel->writeInt64(frameNumber);
     67     parcel->writeInt32(partialResultCount);
     68     parcel->writeInt32(errorStreamId);
     69     if (errorPhysicalCameraId.size() > 0) {
     70         parcel->writeBool(true);
     71         status_t res = OK;
     72         if ((res = parcel->writeString16(errorPhysicalCameraId)) != OK) {
     73             ALOGE("%s: Failed to write physical camera ID to parcel: %d", __FUNCTION__, res);
     74             return res;
     75         }
     76     } else {
     77         parcel->writeBool(false);
     78     }
     79 
     80     return OK;
     81 }
     82 
     83 status_t PhysicalCaptureResultInfo::readFromParcel(const android::Parcel* parcel) {
     84     status_t res;
     85 
     86     mPhysicalCameraId.remove(mPhysicalCameraId.size());
     87     mPhysicalCameraMetadata.clear();
     88 
     89     if ((res = parcel->readString16(&mPhysicalCameraId)) != OK) {
     90         ALOGE("%s: Failed to read camera id: %d", __FUNCTION__, res);
     91         return res;
     92     }
     93 
     94     if ((res = mPhysicalCameraMetadata.readFromParcel(parcel)) != OK) {
     95         ALOGE("%s: Failed to read metadata from parcel: %d", __FUNCTION__, res);
     96         return res;
     97     }
     98     return OK;
     99 }
    100 
    101 status_t PhysicalCaptureResultInfo::writeToParcel(android::Parcel* parcel) const {
    102     status_t res;
    103     if ((res = parcel->writeString16(mPhysicalCameraId)) != OK) {
    104         ALOGE("%s: Failed to write physical camera ID to parcel: %d",
    105                 __FUNCTION__, res);
    106         return res;
    107     }
    108     if ((res = mPhysicalCameraMetadata.writeToParcel(parcel)) != OK) {
    109         ALOGE("%s: Failed to write physical camera metadata to parcel: %d",
    110                 __FUNCTION__, res);
    111         return res;
    112     }
    113     return OK;
    114 }
    115 
    116 CaptureResult::CaptureResult() :
    117         mMetadata(), mResultExtras() {
    118 }
    119 
    120 CaptureResult::CaptureResult(const CaptureResult &otherResult) {
    121     mResultExtras = otherResult.mResultExtras;
    122     mMetadata = otherResult.mMetadata;
    123     mPhysicalMetadatas = otherResult.mPhysicalMetadatas;
    124 }
    125 
    126 status_t CaptureResult::readFromParcel(android::Parcel *parcel) {
    127 
    128     ALOGV("%s: parcel = %p", __FUNCTION__, parcel);
    129 
    130     if (parcel == NULL) {
    131         ALOGE("%s: parcel is null", __FUNCTION__);
    132         return BAD_VALUE;
    133     }
    134 
    135     mMetadata.clear();
    136     mPhysicalMetadatas.clear();
    137 
    138     status_t res = OK;
    139     res = mMetadata.readFromParcel(parcel);
    140     if (res != OK) {
    141         ALOGE("%s: Failed to read metadata from parcel.",
    142               __FUNCTION__);
    143         return res;
    144     }
    145     ALOGV("%s: Read metadata from parcel", __FUNCTION__);
    146 
    147     int32_t physicalMetadataCount;
    148     if ((res = parcel->readInt32(&physicalMetadataCount)) != OK) {
    149         ALOGE("%s: Failed to read the physical metadata count from parcel: %d", __FUNCTION__, res);
    150         return res;
    151     }
    152     if (physicalMetadataCount < 0) {
    153         ALOGE("%s: Invalid physical metadata count from parcel: %d",
    154                 __FUNCTION__, physicalMetadataCount);
    155         return BAD_VALUE;
    156     }
    157 
    158     for (int32_t i = 0; i < physicalMetadataCount; i++) {
    159         String16 cameraId;
    160         if ((res = parcel->readString16(&cameraId)) != OK) {
    161             ALOGE("%s: Failed to read camera id: %d", __FUNCTION__, res);
    162             return res;
    163         }
    164 
    165         CameraMetadata physicalMetadata;
    166         if ((res = physicalMetadata.readFromParcel(parcel)) != OK) {
    167             ALOGE("%s: Failed to read metadata from parcel: %d", __FUNCTION__, res);
    168             return res;
    169         }
    170 
    171         mPhysicalMetadatas.emplace(mPhysicalMetadatas.end(), cameraId, physicalMetadata);
    172     }
    173     ALOGV("%s: Read physical metadata from parcel", __FUNCTION__);
    174 
    175     res = mResultExtras.readFromParcel(parcel);
    176     if (res != OK) {
    177         ALOGE("%s: Failed to read result extras from parcel.",
    178                 __FUNCTION__);
    179         return res;
    180     }
    181     ALOGV("%s: Read result extras from parcel", __FUNCTION__);
    182 
    183     return OK;
    184 }
    185 
    186 status_t CaptureResult::writeToParcel(android::Parcel *parcel) const {
    187 
    188     ALOGV("%s: parcel = %p", __FUNCTION__, parcel);
    189 
    190     if (parcel == NULL) {
    191         ALOGE("%s: parcel is null", __FUNCTION__);
    192         return BAD_VALUE;
    193     }
    194 
    195     status_t res;
    196 
    197     res = mMetadata.writeToParcel(parcel);
    198     if (res != OK) {
    199         ALOGE("%s: Failed to write metadata to parcel", __FUNCTION__);
    200         return res;
    201     }
    202     ALOGV("%s: Wrote metadata to parcel", __FUNCTION__);
    203 
    204     int32_t physicalMetadataCount = static_cast<int32_t>(mPhysicalMetadatas.size());
    205     res = parcel->writeInt32(physicalMetadataCount);
    206     if (res != OK) {
    207         ALOGE("%s: Failed to write physical metadata count to parcel: %d",
    208                 __FUNCTION__, res);
    209         return BAD_VALUE;
    210     }
    211     for (const auto& physicalMetadata : mPhysicalMetadatas) {
    212         if ((res = parcel->writeString16(physicalMetadata.mPhysicalCameraId)) != OK) {
    213             ALOGE("%s: Failed to write physical camera ID to parcel: %d",
    214                     __FUNCTION__, res);
    215             return res;
    216         }
    217         if ((res = physicalMetadata.mPhysicalCameraMetadata.writeToParcel(parcel)) != OK) {
    218             ALOGE("%s: Failed to write physical camera metadata to parcel: %d",
    219                     __FUNCTION__, res);
    220             return res;
    221         }
    222     }
    223     ALOGV("%s: Wrote physical camera metadata to parcel", __FUNCTION__);
    224 
    225     res = mResultExtras.writeToParcel(parcel);
    226     if (res != OK) {
    227         ALOGE("%s: Failed to write result extras to parcel", __FUNCTION__);
    228         return res;
    229     }
    230     ALOGV("%s: Wrote result extras to parcel", __FUNCTION__);
    231 
    232     return OK;
    233 }
    234 
    235 }
    236