• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **
3 ** Copyright 2013, 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_NDEBUG 0
19 #define LOG_TAG "CameraRequest"
20 #include <utils/Log.h>
21 
22 #include <camera/camera2/CaptureRequest.h>
23 
24 #include <binder/Parcel.h>
25 #include <gui/Surface.h>
26 
27 namespace android {
28 
readFromParcel(Parcel * parcel)29 status_t CaptureRequest::readFromParcel(Parcel* parcel) {
30     if (parcel == NULL) {
31         ALOGE("%s: Null parcel", __FUNCTION__);
32         return BAD_VALUE;
33     }
34 
35     mMetadata.clear();
36     mSurfaceList.clear();
37 
38     status_t err;
39 
40     if ((err = mMetadata.readFromParcel(parcel)) != OK) {
41         ALOGE("%s: Failed to read metadata from parcel", __FUNCTION__);
42         return err;
43     }
44     ALOGV("%s: Read metadata from parcel", __FUNCTION__);
45 
46     int32_t size;
47     if ((err = parcel->readInt32(&size)) != OK) {
48         ALOGE("%s: Failed to read surface list size from parcel", __FUNCTION__);
49         return err;
50     }
51     ALOGV("%s: Read surface list size = %d", __FUNCTION__, size);
52 
53     // Do not distinguish null arrays from 0-sized arrays.
54     for (int i = 0; i < size; ++i) {
55         // Parcel.writeParcelableArray
56         size_t len;
57         const char16_t* className = parcel->readString16Inplace(&len);
58         ALOGV("%s: Read surface class = %s", __FUNCTION__,
59               className != NULL ? String8(className).string() : "<null>");
60 
61         if (className == NULL) {
62             continue;
63         }
64 
65         // Surface.writeToParcel
66         const char16_t* name = parcel->readString16Inplace(&len);
67         ALOGV("%s: Read surface name = %s", __FUNCTION__,
68             name != NULL ? String8(name).string() : "<null>");
69         sp<IBinder> binder(parcel->readStrongBinder());
70         ALOGV("%s: Read surface binder = %p",
71               __FUNCTION__, binder.get());
72 
73         sp<Surface> surface;
74 
75         if (binder != NULL) {
76             sp<IGraphicBufferProducer> gbp =
77                     interface_cast<IGraphicBufferProducer>(binder);
78             surface = new Surface(gbp);
79         }
80 
81         mSurfaceList.push_back(surface);
82     }
83 
84     int isReprocess = 0;
85     if ((err = parcel->readInt32(&isReprocess)) != OK) {
86         ALOGE("%s: Failed to read reprocessing from parcel", __FUNCTION__);
87         return err;
88     }
89     mIsReprocess = (isReprocess != 0);
90 
91     return OK;
92 }
93 
writeToParcel(Parcel * parcel) const94 status_t CaptureRequest::writeToParcel(Parcel* parcel) const {
95     if (parcel == NULL) {
96         ALOGE("%s: Null parcel", __FUNCTION__);
97         return BAD_VALUE;
98     }
99 
100     status_t err;
101 
102     if ((err = mMetadata.writeToParcel(parcel)) != OK) {
103         return err;
104     }
105 
106     int32_t size = static_cast<int32_t>(mSurfaceList.size());
107 
108     // Send 0-sized arrays when it's empty. Do not send null arrays.
109     parcel->writeInt32(size);
110 
111     for (int32_t i = 0; i < size; ++i) {
112         sp<Surface> surface = mSurfaceList[i];
113 
114         sp<IBinder> binder;
115         if (surface != 0) {
116             binder = IInterface::asBinder(surface->getIGraphicBufferProducer());
117         }
118 
119         // not sure if readParcelableArray does this, hard to tell from source
120         parcel->writeString16(String16("android.view.Surface"));
121 
122         // Surface.writeToParcel
123         parcel->writeString16(String16("unknown_name"));
124         // Surface.nativeWriteToParcel
125         parcel->writeStrongBinder(binder);
126     }
127 
128     parcel->writeInt32(mIsReprocess ? 1 : 0);
129 
130     return OK;
131 }
132 
133 }; // namespace android
134