xref: /aosp_15_r20/frameworks/av/camera/camera2/CaptureRequest.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2013, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker **     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker // #define LOG_NDEBUG 0
19*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "CameraRequest"
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <utils/String16.h>
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker #include <camera/camera2/CaptureRequest.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <camera/StringUtils.h>
25*ec779b8eSAndroid Build Coastguard Worker 
26*ec779b8eSAndroid Build Coastguard Worker #include <binder/Parcel.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <gui/Flags.h>  // remove with WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
28*ec779b8eSAndroid Build Coastguard Worker #include <gui/Surface.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <gui/view/Surface.h>
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker namespace android {
32*ec779b8eSAndroid Build Coastguard Worker namespace hardware {
33*ec779b8eSAndroid Build Coastguard Worker namespace camera2 {
34*ec779b8eSAndroid Build Coastguard Worker 
35*ec779b8eSAndroid Build Coastguard Worker // These must be in the .cpp (to avoid inlining)
36*ec779b8eSAndroid Build Coastguard Worker CaptureRequest::CaptureRequest() = default;
37*ec779b8eSAndroid Build Coastguard Worker CaptureRequest::~CaptureRequest() = default;
38*ec779b8eSAndroid Build Coastguard Worker CaptureRequest::CaptureRequest(const CaptureRequest& rhs) = default;
39*ec779b8eSAndroid Build Coastguard Worker CaptureRequest::CaptureRequest(CaptureRequest&& rhs) noexcept = default;
40*ec779b8eSAndroid Build Coastguard Worker 
41*ec779b8eSAndroid Build Coastguard Worker 
readFromParcel(const android::Parcel * parcel)42*ec779b8eSAndroid Build Coastguard Worker status_t CaptureRequest::readFromParcel(const android::Parcel* parcel) {
43*ec779b8eSAndroid Build Coastguard Worker     if (parcel == NULL) {
44*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Null parcel", __FUNCTION__);
45*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
46*ec779b8eSAndroid Build Coastguard Worker     }
47*ec779b8eSAndroid Build Coastguard Worker 
48*ec779b8eSAndroid Build Coastguard Worker     mSurfaceList.clear();
49*ec779b8eSAndroid Build Coastguard Worker     mStreamIdxList.clear();
50*ec779b8eSAndroid Build Coastguard Worker     mSurfaceIdxList.clear();
51*ec779b8eSAndroid Build Coastguard Worker     mPhysicalCameraSettings.clear();
52*ec779b8eSAndroid Build Coastguard Worker 
53*ec779b8eSAndroid Build Coastguard Worker     status_t err = OK;
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker     int32_t settingsCount;
56*ec779b8eSAndroid Build Coastguard Worker     if ((err = parcel->readInt32(&settingsCount)) != OK) {
57*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Failed to read the settings count from parcel: %d", __FUNCTION__, err);
58*ec779b8eSAndroid Build Coastguard Worker         return err;
59*ec779b8eSAndroid Build Coastguard Worker     }
60*ec779b8eSAndroid Build Coastguard Worker 
61*ec779b8eSAndroid Build Coastguard Worker     if (settingsCount <= 0) {
62*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Settings count %d should always be positive!", __FUNCTION__, settingsCount);
63*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
64*ec779b8eSAndroid Build Coastguard Worker     }
65*ec779b8eSAndroid Build Coastguard Worker 
66*ec779b8eSAndroid Build Coastguard Worker     for (int32_t i = 0; i < settingsCount; i++) {
67*ec779b8eSAndroid Build Coastguard Worker         String16 id;
68*ec779b8eSAndroid Build Coastguard Worker         if ((err = parcel->readString16(&id)) != OK) {
69*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Failed to read camera id!", __FUNCTION__);
70*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
71*ec779b8eSAndroid Build Coastguard Worker         }
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker         CameraMetadata settings;
74*ec779b8eSAndroid Build Coastguard Worker         if ((err = settings.readFromParcel(parcel)) != OK) {
75*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Failed to read metadata from parcel", __FUNCTION__);
76*ec779b8eSAndroid Build Coastguard Worker             return err;
77*ec779b8eSAndroid Build Coastguard Worker         }
78*ec779b8eSAndroid Build Coastguard Worker         ALOGV("%s: Read metadata from parcel", __FUNCTION__);
79*ec779b8eSAndroid Build Coastguard Worker         mPhysicalCameraSettings.push_back({toStdString(id), settings});
80*ec779b8eSAndroid Build Coastguard Worker     }
81*ec779b8eSAndroid Build Coastguard Worker 
82*ec779b8eSAndroid Build Coastguard Worker     int isReprocess = 0;
83*ec779b8eSAndroid Build Coastguard Worker     if ((err = parcel->readInt32(&isReprocess)) != OK) {
84*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Failed to read reprocessing from parcel", __FUNCTION__);
85*ec779b8eSAndroid Build Coastguard Worker         return err;
86*ec779b8eSAndroid Build Coastguard Worker     }
87*ec779b8eSAndroid Build Coastguard Worker     mIsReprocess = (isReprocess != 0);
88*ec779b8eSAndroid Build Coastguard Worker 
89*ec779b8eSAndroid Build Coastguard Worker     int32_t size;
90*ec779b8eSAndroid Build Coastguard Worker     if ((err = parcel->readInt32(&size)) != OK) {
91*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Failed to read surface list size from parcel", __FUNCTION__);
92*ec779b8eSAndroid Build Coastguard Worker         return err;
93*ec779b8eSAndroid Build Coastguard Worker     }
94*ec779b8eSAndroid Build Coastguard Worker     ALOGV("%s: Read surface list size = %d", __FUNCTION__, size);
95*ec779b8eSAndroid Build Coastguard Worker 
96*ec779b8eSAndroid Build Coastguard Worker     // Do not distinguish null arrays from 0-sized arrays.
97*ec779b8eSAndroid Build Coastguard Worker     for (int32_t i = 0; i < size; ++i) {
98*ec779b8eSAndroid Build Coastguard Worker         // Parcel.writeParcelableArray
99*ec779b8eSAndroid Build Coastguard Worker         std::optional<std::string> className;
100*ec779b8eSAndroid Build Coastguard Worker         parcel->readUtf8FromUtf16(&className);
101*ec779b8eSAndroid Build Coastguard Worker         ALOGV("%s: Read surface class = %s", __FUNCTION__,
102*ec779b8eSAndroid Build Coastguard Worker               className.value_or("<null>").c_str());
103*ec779b8eSAndroid Build Coastguard Worker 
104*ec779b8eSAndroid Build Coastguard Worker         if (className == std::nullopt) {
105*ec779b8eSAndroid Build Coastguard Worker             continue;
106*ec779b8eSAndroid Build Coastguard Worker         }
107*ec779b8eSAndroid Build Coastguard Worker 
108*ec779b8eSAndroid Build Coastguard Worker         // Surface.writeToParcel
109*ec779b8eSAndroid Build Coastguard Worker         view::Surface surfaceShim;
110*ec779b8eSAndroid Build Coastguard Worker         if ((err = surfaceShim.readFromParcel(parcel)) != OK) {
111*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Failed to read output target Surface %d from parcel: %s (%d)",
112*ec779b8eSAndroid Build Coastguard Worker                     __FUNCTION__, i, strerror(-err), err);
113*ec779b8eSAndroid Build Coastguard Worker             return err;
114*ec779b8eSAndroid Build Coastguard Worker         }
115*ec779b8eSAndroid Build Coastguard Worker 
116*ec779b8eSAndroid Build Coastguard Worker #if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
117*ec779b8eSAndroid Build Coastguard Worker         sp<Surface> surface = surfaceShim.toSurface();
118*ec779b8eSAndroid Build Coastguard Worker #else
119*ec779b8eSAndroid Build Coastguard Worker         sp<Surface> surface;
120*ec779b8eSAndroid Build Coastguard Worker         if (surfaceShim.graphicBufferProducer != NULL) {
121*ec779b8eSAndroid Build Coastguard Worker             surface = new Surface(surfaceShim.graphicBufferProducer);
122*ec779b8eSAndroid Build Coastguard Worker         }
123*ec779b8eSAndroid Build Coastguard Worker #endif
124*ec779b8eSAndroid Build Coastguard Worker         mSurfaceList.push_back(surface);
125*ec779b8eSAndroid Build Coastguard Worker     }
126*ec779b8eSAndroid Build Coastguard Worker 
127*ec779b8eSAndroid Build Coastguard Worker     int32_t streamSurfaceSize;
128*ec779b8eSAndroid Build Coastguard Worker     if ((err = parcel->readInt32(&streamSurfaceSize)) != OK) {
129*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Failed to read streamSurfaceSize from parcel", __FUNCTION__);
130*ec779b8eSAndroid Build Coastguard Worker         return err;
131*ec779b8eSAndroid Build Coastguard Worker     }
132*ec779b8eSAndroid Build Coastguard Worker 
133*ec779b8eSAndroid Build Coastguard Worker     if (streamSurfaceSize < 0) {
134*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Bad streamSurfaceSize %d from parcel", __FUNCTION__, streamSurfaceSize);
135*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
136*ec779b8eSAndroid Build Coastguard Worker     }
137*ec779b8eSAndroid Build Coastguard Worker 
138*ec779b8eSAndroid Build Coastguard Worker     for (int32_t i = 0; i < streamSurfaceSize; ++i) {
139*ec779b8eSAndroid Build Coastguard Worker         int streamIdx;
140*ec779b8eSAndroid Build Coastguard Worker         if ((err = parcel->readInt32(&streamIdx)) != OK) {
141*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Failed to read stream index from parcel", __FUNCTION__);
142*ec779b8eSAndroid Build Coastguard Worker             return err;
143*ec779b8eSAndroid Build Coastguard Worker         }
144*ec779b8eSAndroid Build Coastguard Worker         mStreamIdxList.push_back(streamIdx);
145*ec779b8eSAndroid Build Coastguard Worker 
146*ec779b8eSAndroid Build Coastguard Worker         int surfaceIdx;
147*ec779b8eSAndroid Build Coastguard Worker         if ((err = parcel->readInt32(&surfaceIdx)) != OK) {
148*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Failed to read surface index from parcel", __FUNCTION__);
149*ec779b8eSAndroid Build Coastguard Worker             return err;
150*ec779b8eSAndroid Build Coastguard Worker         }
151*ec779b8eSAndroid Build Coastguard Worker         mSurfaceIdxList.push_back(surfaceIdx);
152*ec779b8eSAndroid Build Coastguard Worker     }
153*ec779b8eSAndroid Build Coastguard Worker 
154*ec779b8eSAndroid Build Coastguard Worker     int32_t hasUserTag;
155*ec779b8eSAndroid Build Coastguard Worker     if ((err = parcel->readInt32(&hasUserTag)) != OK) {
156*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Failed to read user tag availability flag", __FUNCTION__);
157*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
158*ec779b8eSAndroid Build Coastguard Worker     }
159*ec779b8eSAndroid Build Coastguard Worker     if (hasUserTag) {
160*ec779b8eSAndroid Build Coastguard Worker         String16 userTag;
161*ec779b8eSAndroid Build Coastguard Worker         if ((err = parcel->readString16(&userTag)) != OK) {
162*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Failed to read user tag!", __FUNCTION__);
163*ec779b8eSAndroid Build Coastguard Worker             return BAD_VALUE;
164*ec779b8eSAndroid Build Coastguard Worker         }
165*ec779b8eSAndroid Build Coastguard Worker         mUserTag = toStdString(userTag);
166*ec779b8eSAndroid Build Coastguard Worker     }
167*ec779b8eSAndroid Build Coastguard Worker 
168*ec779b8eSAndroid Build Coastguard Worker     return OK;
169*ec779b8eSAndroid Build Coastguard Worker }
170*ec779b8eSAndroid Build Coastguard Worker 
writeToParcel(android::Parcel * parcel) const171*ec779b8eSAndroid Build Coastguard Worker status_t CaptureRequest::writeToParcel(android::Parcel* parcel) const {
172*ec779b8eSAndroid Build Coastguard Worker     if (parcel == NULL) {
173*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Null parcel", __FUNCTION__);
174*ec779b8eSAndroid Build Coastguard Worker         return BAD_VALUE;
175*ec779b8eSAndroid Build Coastguard Worker     }
176*ec779b8eSAndroid Build Coastguard Worker 
177*ec779b8eSAndroid Build Coastguard Worker     status_t err = OK;
178*ec779b8eSAndroid Build Coastguard Worker 
179*ec779b8eSAndroid Build Coastguard Worker     int32_t settingsCount = static_cast<int32_t>(mPhysicalCameraSettings.size());
180*ec779b8eSAndroid Build Coastguard Worker 
181*ec779b8eSAndroid Build Coastguard Worker     if ((err = parcel->writeInt32(settingsCount)) != OK) {
182*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s: Failed to write settings count!", __FUNCTION__);
183*ec779b8eSAndroid Build Coastguard Worker         return err;
184*ec779b8eSAndroid Build Coastguard Worker     }
185*ec779b8eSAndroid Build Coastguard Worker 
186*ec779b8eSAndroid Build Coastguard Worker     for (const auto &it : mPhysicalCameraSettings) {
187*ec779b8eSAndroid Build Coastguard Worker         if ((err = parcel->writeString16(toString16(it.id))) != OK) {
188*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Failed to camera id!", __FUNCTION__);
189*ec779b8eSAndroid Build Coastguard Worker             return err;
190*ec779b8eSAndroid Build Coastguard Worker         }
191*ec779b8eSAndroid Build Coastguard Worker 
192*ec779b8eSAndroid Build Coastguard Worker         if ((err = it.settings.writeToParcel(parcel)) != OK) {
193*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Failed to write settings!", __FUNCTION__);
194*ec779b8eSAndroid Build Coastguard Worker             return err;
195*ec779b8eSAndroid Build Coastguard Worker         }
196*ec779b8eSAndroid Build Coastguard Worker     }
197*ec779b8eSAndroid Build Coastguard Worker 
198*ec779b8eSAndroid Build Coastguard Worker     parcel->writeInt32(mIsReprocess ? 1 : 0);
199*ec779b8eSAndroid Build Coastguard Worker 
200*ec779b8eSAndroid Build Coastguard Worker     if (mSurfaceConverted) {
201*ec779b8eSAndroid Build Coastguard Worker         parcel->writeInt32(0); // 0-sized array
202*ec779b8eSAndroid Build Coastguard Worker     } else {
203*ec779b8eSAndroid Build Coastguard Worker         int32_t size = static_cast<int32_t>(mSurfaceList.size());
204*ec779b8eSAndroid Build Coastguard Worker 
205*ec779b8eSAndroid Build Coastguard Worker         // Send 0-sized arrays when it's empty. Do not send null arrays.
206*ec779b8eSAndroid Build Coastguard Worker         parcel->writeInt32(size);
207*ec779b8eSAndroid Build Coastguard Worker 
208*ec779b8eSAndroid Build Coastguard Worker         for (int32_t i = 0; i < size; ++i) {
209*ec779b8eSAndroid Build Coastguard Worker             // not sure if readParcelableArray does this, hard to tell from source
210*ec779b8eSAndroid Build Coastguard Worker             parcel->writeString16(String16("android.view.Surface"));
211*ec779b8eSAndroid Build Coastguard Worker 
212*ec779b8eSAndroid Build Coastguard Worker             // Surface.writeToParcel
213*ec779b8eSAndroid Build Coastguard Worker #if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
214*ec779b8eSAndroid Build Coastguard Worker             view::Surface surfaceShim = view::Surface::fromSurface(mSurfaceList[i]);
215*ec779b8eSAndroid Build Coastguard Worker #else
216*ec779b8eSAndroid Build Coastguard Worker             view::Surface surfaceShim;
217*ec779b8eSAndroid Build Coastguard Worker             surfaceShim.name = String16("unknown_name");
218*ec779b8eSAndroid Build Coastguard Worker             surfaceShim.graphicBufferProducer = mSurfaceList[i]->getIGraphicBufferProducer();
219*ec779b8eSAndroid Build Coastguard Worker #endif
220*ec779b8eSAndroid Build Coastguard Worker             if ((err = surfaceShim.writeToParcel(parcel)) != OK) {
221*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s: Failed to write output target Surface %d to parcel: %s (%d)",
222*ec779b8eSAndroid Build Coastguard Worker                         __FUNCTION__, i, strerror(-err), err);
223*ec779b8eSAndroid Build Coastguard Worker                 return err;
224*ec779b8eSAndroid Build Coastguard Worker             }
225*ec779b8eSAndroid Build Coastguard Worker         }
226*ec779b8eSAndroid Build Coastguard Worker     }
227*ec779b8eSAndroid Build Coastguard Worker 
228*ec779b8eSAndroid Build Coastguard Worker     parcel->writeInt32(mStreamIdxList.size());
229*ec779b8eSAndroid Build Coastguard Worker     for (size_t i = 0; i < mStreamIdxList.size(); ++i) {
230*ec779b8eSAndroid Build Coastguard Worker         if ((err = parcel->writeInt32(mStreamIdxList[i])) != OK) {
231*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Failed to write stream index to parcel", __FUNCTION__);
232*ec779b8eSAndroid Build Coastguard Worker             return err;
233*ec779b8eSAndroid Build Coastguard Worker         }
234*ec779b8eSAndroid Build Coastguard Worker         if ((err = parcel->writeInt32(mSurfaceIdxList[i])) != OK) {
235*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: Failed to write surface index to parcel", __FUNCTION__);
236*ec779b8eSAndroid Build Coastguard Worker             return err;
237*ec779b8eSAndroid Build Coastguard Worker         }
238*ec779b8eSAndroid Build Coastguard Worker     }
239*ec779b8eSAndroid Build Coastguard Worker 
240*ec779b8eSAndroid Build Coastguard Worker     if (mUserTag.empty()) {
241*ec779b8eSAndroid Build Coastguard Worker         parcel->writeInt32(0);
242*ec779b8eSAndroid Build Coastguard Worker     } else {
243*ec779b8eSAndroid Build Coastguard Worker         parcel->writeInt32(1);
244*ec779b8eSAndroid Build Coastguard Worker         parcel->writeString16(toString16(mUserTag));
245*ec779b8eSAndroid Build Coastguard Worker     }
246*ec779b8eSAndroid Build Coastguard Worker 
247*ec779b8eSAndroid Build Coastguard Worker     return OK;
248*ec779b8eSAndroid Build Coastguard Worker }
249*ec779b8eSAndroid Build Coastguard Worker 
250*ec779b8eSAndroid Build Coastguard Worker } // namespace camera2
251*ec779b8eSAndroid Build Coastguard Worker } // namespace hardware
252*ec779b8eSAndroid Build Coastguard Worker } // namespace android
253