blob: 0b811d23d4892c16a2694dca36674618a4260a77 [file] [log] [blame]
Mathias Agopian3cf61352010-02-09 17:46:37 -08001/*
2**
3** Copyright 2008, 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 "ICamera"
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080020#include <android/hardware/ICamera.h>
21#include <android/hardware/ICameraClient.h>
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -070022#include <binder/Parcel.h>
23#include <camera/CameraUtils.h>
Mathias Agopiandf712ea2012-02-25 18:48:35 -080024#include <gui/Surface.h>
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -070025#include <gui/view/Surface.h>
Praveen Chavan6773d472016-01-13 01:24:30 -080026#include <media/hardware/HardwareAPI.h>
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -070027#include <stdint.h>
28#include <sys/types.h>
29#include <utils/Log.h>
Mathias Agopian3cf61352010-02-09 17:46:37 -080030
31namespace android {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080032namespace hardware {
Mathias Agopian3cf61352010-02-09 17:46:37 -080033
34enum {
35 DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -070036 SET_PREVIEW_TARGET,
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -070037#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
38 SET_PREVIEW_TARGET_SURFACE,
39#endif
Mathias Agopian3cf61352010-02-09 17:46:37 -080040 SET_PREVIEW_CALLBACK_FLAG,
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -070041 SET_PREVIEW_CALLBACK_TARGET,
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -070042#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
43 SET_PREVIEW_CALLBACK_TARGET_SURFACE,
44#endif
Mathias Agopian3cf61352010-02-09 17:46:37 -080045 START_PREVIEW,
46 STOP_PREVIEW,
47 AUTO_FOCUS,
48 CANCEL_AUTO_FOCUS,
49 TAKE_PICTURE,
50 SET_PARAMETERS,
51 GET_PARAMETERS,
52 SEND_COMMAND,
53 CONNECT,
54 LOCK,
55 UNLOCK,
56 PREVIEW_ENABLED,
57 START_RECORDING,
58 STOP_RECORDING,
59 RECORDING_ENABLED,
60 RELEASE_RECORDING_FRAME,
Chien-Yu Chen8cca0752015-11-13 15:28:48 -080061 SET_VIDEO_BUFFER_MODE,
62 SET_VIDEO_BUFFER_TARGET,
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -070063#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
64 SET_VIDEO_BUFFER_TARGET_SURFACE,
65#endif
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -070066 RELEASE_RECORDING_FRAME_HANDLE,
Yin-Chia Yehb5df5472017-03-20 19:32:19 -070067 RELEASE_RECORDING_FRAME_HANDLE_BATCH,
Yin-Chia Yehdba03232019-08-19 15:54:28 -070068 SET_AUDIO_RESTRICTION,
Yin-Chia Yehcfab4e12019-09-09 13:08:28 -070069 GET_GLOBAL_AUDIO_RESTRICTION,
Mathias Agopian3cf61352010-02-09 17:46:37 -080070};
71
72class BpCamera: public BpInterface<ICamera>
73{
74public:
Chih-Hung Hsieh090ef602016-04-27 10:39:54 -070075 explicit BpCamera(const sp<IBinder>& impl)
Mathias Agopian3cf61352010-02-09 17:46:37 -080076 : BpInterface<ICamera>(impl)
77 {
78 }
79
80 // disconnect from camera service
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080081 binder::Status disconnect()
Mathias Agopian3cf61352010-02-09 17:46:37 -080082 {
Steve Block3856b092011-10-20 11:56:00 +010083 ALOGV("disconnect");
Mathias Agopian3cf61352010-02-09 17:46:37 -080084 Parcel data, reply;
85 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
86 remote()->transact(DISCONNECT, data, &reply);
Igor Murashkinbef3f232013-05-30 17:47:38 -070087 reply.readExceptionCode();
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080088 return binder::Status::ok();
Mathias Agopian3cf61352010-02-09 17:46:37 -080089 }
90
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -070091 // pass the Surface to the camera service
92 status_t setPreviewTarget(const sp<SurfaceType>& target) {
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -070093 ALOGV("setPreviewTarget");
Jamie Gennisbfa33aa2010-12-20 11:51:31 -080094 Parcel data, reply;
95 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -070096#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
97 view::Surface viewSurfaceProducer = view::Surface::fromSurface(target);
98 data.writeParcelable(viewSurfaceProducer);
99 remote()->transact(SET_PREVIEW_TARGET_SURFACE, data, &reply);
100#else
101 sp<IBinder> b(IInterface::asBinder(target));
Jamie Gennisbfa33aa2010-12-20 11:51:31 -0800102 data.writeStrongBinder(b);
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -0700103 remote()->transact(SET_PREVIEW_TARGET, data, &reply);
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700104#endif
Jamie Gennisbfa33aa2010-12-20 11:51:31 -0800105 return reply.readInt32();
106 }
107
Mathias Agopian3cf61352010-02-09 17:46:37 -0800108 // set the preview callback flag to affect how the received frames from
109 // preview are handled. See Camera.h for details.
110 void setPreviewCallbackFlag(int flag)
111 {
Steve Block3856b092011-10-20 11:56:00 +0100112 ALOGV("setPreviewCallbackFlag(%d)", flag);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800113 Parcel data, reply;
114 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
115 data.writeInt32(flag);
116 remote()->transact(SET_PREVIEW_CALLBACK_FLAG, data, &reply);
117 }
118
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700119 status_t setPreviewCallbackTarget(const sp<SurfaceType>& target) {
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700120 ALOGV("setPreviewCallbackTarget");
121 Parcel data, reply;
122 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700123#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
124 view::Surface viewCallbackProducer = view::Surface::fromSurface(target);
125 data.writeParcelable(viewCallbackProducer);
126 remote()->transact(SET_PREVIEW_CALLBACK_TARGET_SURFACE, data, &reply);
127#else
128 sp<IBinder> b(IInterface::asBinder(target));
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700129 data.writeStrongBinder(b);
130 remote()->transact(SET_PREVIEW_CALLBACK_TARGET, data, &reply);
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700131#endif
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700132 return reply.readInt32();
133 }
134
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -0700135 // start preview mode, must call setPreviewTarget first
Mathias Agopian3cf61352010-02-09 17:46:37 -0800136 status_t startPreview()
137 {
Steve Block3856b092011-10-20 11:56:00 +0100138 ALOGV("startPreview");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800139 Parcel data, reply;
140 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
141 remote()->transact(START_PREVIEW, data, &reply);
142 return reply.readInt32();
143 }
144
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -0700145 // start recording mode, must call setPreviewTarget first
Mathias Agopian3cf61352010-02-09 17:46:37 -0800146 status_t startRecording()
147 {
Steve Block3856b092011-10-20 11:56:00 +0100148 ALOGV("startRecording");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800149 Parcel data, reply;
150 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
151 remote()->transact(START_RECORDING, data, &reply);
152 return reply.readInt32();
153 }
154
155 // stop preview mode
156 void stopPreview()
157 {
Steve Block3856b092011-10-20 11:56:00 +0100158 ALOGV("stopPreview");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800159 Parcel data, reply;
160 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
161 remote()->transact(STOP_PREVIEW, data, &reply);
162 }
163
164 // stop recording mode
165 void stopRecording()
166 {
Steve Block3856b092011-10-20 11:56:00 +0100167 ALOGV("stopRecording");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800168 Parcel data, reply;
169 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
170 remote()->transact(STOP_RECORDING, data, &reply);
171 }
172
173 void releaseRecordingFrame(const sp<IMemory>& mem)
174 {
Steve Block3856b092011-10-20 11:56:00 +0100175 ALOGV("releaseRecordingFrame");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800176 Parcel data, reply;
177 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800178 data.writeStrongBinder(IInterface::asBinder(mem));
Praveen Chavan6773d472016-01-13 01:24:30 -0800179
Mathias Agopian3cf61352010-02-09 17:46:37 -0800180 remote()->transact(RELEASE_RECORDING_FRAME, data, &reply);
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -0700181 }
Praveen Chavan6773d472016-01-13 01:24:30 -0800182
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -0700183 void releaseRecordingFrameHandle(native_handle_t *handle) {
184 ALOGV("releaseRecordingFrameHandle");
185 Parcel data, reply;
186 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
187 data.writeNativeHandle(handle);
188
189 remote()->transact(RELEASE_RECORDING_FRAME_HANDLE, data, &reply);
190
191 // Close the native handle because camera received a dup copy.
192 native_handle_close(handle);
193 native_handle_delete(handle);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800194 }
195
Yin-Chia Yehb5df5472017-03-20 19:32:19 -0700196 void releaseRecordingFrameHandleBatch(const std::vector<native_handle_t*>& handles) {
197 ALOGV("releaseRecordingFrameHandleBatch");
198 Parcel data, reply;
199 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
200 uint32_t n = handles.size();
201 data.writeUint32(n);
202 for (auto& handle : handles) {
203 data.writeNativeHandle(handle);
204 }
205 remote()->transact(RELEASE_RECORDING_FRAME_HANDLE_BATCH, data, &reply);
206
207 // Close the native handle because camera received a dup copy.
208 for (auto& handle : handles) {
209 native_handle_close(handle);
210 native_handle_delete(handle);
211 }
212 }
213
Yin-Chia Yehcfab4e12019-09-09 13:08:28 -0700214 status_t setAudioRestriction(int32_t mode) {
Yin-Chia Yehdba03232019-08-19 15:54:28 -0700215 Parcel data, reply;
216 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
217 data.writeInt32(mode);
218 remote()->transact(SET_AUDIO_RESTRICTION, data, &reply);
219 return reply.readInt32();
220 }
221
Yin-Chia Yehcfab4e12019-09-09 13:08:28 -0700222 int32_t getGlobalAudioRestriction() {
223 Parcel data, reply;
224 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
225 remote()->transact(GET_GLOBAL_AUDIO_RESTRICTION, data, &reply);
226 return reply.readInt32();
227 }
228
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800229 status_t setVideoBufferMode(int32_t videoBufferMode)
James Donge2ad6732010-10-18 20:42:51 -0700230 {
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800231 ALOGV("setVideoBufferMode: %d", videoBufferMode);
James Donge2ad6732010-10-18 20:42:51 -0700232 Parcel data, reply;
233 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800234 data.writeInt32(videoBufferMode);
235 remote()->transact(SET_VIDEO_BUFFER_MODE, data, &reply);
James Donge2ad6732010-10-18 20:42:51 -0700236 return reply.readInt32();
237 }
238
Mathias Agopian3cf61352010-02-09 17:46:37 -0800239 // check preview state
240 bool previewEnabled()
241 {
Steve Block3856b092011-10-20 11:56:00 +0100242 ALOGV("previewEnabled");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800243 Parcel data, reply;
244 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
245 remote()->transact(PREVIEW_ENABLED, data, &reply);
246 return reply.readInt32();
247 }
248
249 // check recording state
250 bool recordingEnabled()
251 {
Steve Block3856b092011-10-20 11:56:00 +0100252 ALOGV("recordingEnabled");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800253 Parcel data, reply;
254 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
255 remote()->transact(RECORDING_ENABLED, data, &reply);
256 return reply.readInt32();
257 }
258
259 // auto focus
260 status_t autoFocus()
261 {
Steve Block3856b092011-10-20 11:56:00 +0100262 ALOGV("autoFocus");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800263 Parcel data, reply;
264 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
265 remote()->transact(AUTO_FOCUS, data, &reply);
266 status_t ret = reply.readInt32();
267 return ret;
268 }
269
270 // cancel focus
271 status_t cancelAutoFocus()
272 {
Steve Block3856b092011-10-20 11:56:00 +0100273 ALOGV("cancelAutoFocus");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800274 Parcel data, reply;
275 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
276 remote()->transact(CANCEL_AUTO_FOCUS, data, &reply);
277 status_t ret = reply.readInt32();
278 return ret;
279 }
280
281 // take a picture - returns an IMemory (ref-counted mmap)
James Donge468ac52011-02-17 16:38:06 -0800282 status_t takePicture(int msgType)
Mathias Agopian3cf61352010-02-09 17:46:37 -0800283 {
Steve Block3856b092011-10-20 11:56:00 +0100284 ALOGV("takePicture: 0x%x", msgType);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800285 Parcel data, reply;
286 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
James Donge468ac52011-02-17 16:38:06 -0800287 data.writeInt32(msgType);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800288 remote()->transact(TAKE_PICTURE, data, &reply);
289 status_t ret = reply.readInt32();
290 return ret;
291 }
292
293 // set preview/capture parameters - key/value pairs
294 status_t setParameters(const String8& params)
295 {
Steve Block3856b092011-10-20 11:56:00 +0100296 ALOGV("setParameters");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800297 Parcel data, reply;
298 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
299 data.writeString8(params);
300 remote()->transact(SET_PARAMETERS, data, &reply);
301 return reply.readInt32();
302 }
303
304 // get preview/capture parameters - key/value pairs
305 String8 getParameters() const
306 {
Steve Block3856b092011-10-20 11:56:00 +0100307 ALOGV("getParameters");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800308 Parcel data, reply;
309 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
310 remote()->transact(GET_PARAMETERS, data, &reply);
311 return reply.readString8();
312 }
313 virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
314 {
Steve Block3856b092011-10-20 11:56:00 +0100315 ALOGV("sendCommand");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800316 Parcel data, reply;
317 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
318 data.writeInt32(cmd);
319 data.writeInt32(arg1);
320 data.writeInt32(arg2);
321 remote()->transact(SEND_COMMAND, data, &reply);
322 return reply.readInt32();
323 }
324 virtual status_t connect(const sp<ICameraClient>& cameraClient)
325 {
326 Parcel data, reply;
327 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
Marco Nelissen06b46062014-11-14 07:58:25 -0800328 data.writeStrongBinder(IInterface::asBinder(cameraClient));
Mathias Agopian3cf61352010-02-09 17:46:37 -0800329 remote()->transact(CONNECT, data, &reply);
330 return reply.readInt32();
331 }
332 virtual status_t lock()
333 {
334 Parcel data, reply;
335 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
336 remote()->transact(LOCK, data, &reply);
337 return reply.readInt32();
338 }
339 virtual status_t unlock()
340 {
341 Parcel data, reply;
342 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
343 remote()->transact(UNLOCK, data, &reply);
344 return reply.readInt32();
345 }
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800346
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700347 status_t setVideoTarget(const sp<SurfaceType>& target) {
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800348 ALOGV("setVideoTarget");
349 Parcel data, reply;
350 data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700351#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
352 view::Surface viewSurfaceProducer = view::Surface::fromSurface(target);
353 data.writeParcelable(viewSurfaceProducer);
354 remote()->transact(SET_VIDEO_BUFFER_TARGET_SURFACE, data, &reply);
355#else
356 sp<IBinder> b(IInterface::asBinder(target));
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800357 data.writeStrongBinder(b);
358 remote()->transact(SET_VIDEO_BUFFER_TARGET, data, &reply);
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700359#endif
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800360 return reply.readInt32();
361 }
Mathias Agopian3cf61352010-02-09 17:46:37 -0800362};
363
364IMPLEMENT_META_INTERFACE(Camera, "android.hardware.ICamera");
365
366// ----------------------------------------------------------------------
367
368status_t BnCamera::onTransact(
369 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
370{
371 switch(code) {
372 case DISCONNECT: {
Steve Block3856b092011-10-20 11:56:00 +0100373 ALOGV("DISCONNECT");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800374 CHECK_INTERFACE(ICamera, data, reply);
375 disconnect();
Igor Murashkinbef3f232013-05-30 17:47:38 -0700376 reply->writeNoException();
Mathias Agopian3cf61352010-02-09 17:46:37 -0800377 return NO_ERROR;
378 } break;
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -0700379 case SET_PREVIEW_TARGET: {
380 ALOGV("SET_PREVIEW_TARGET");
Jamie Gennisbfa33aa2010-12-20 11:51:31 -0800381 CHECK_INTERFACE(ICamera, data, reply);
Andy McFadden8ba01022012-12-18 09:46:54 -0800382 sp<IGraphicBufferProducer> st =
383 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700384#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
385 sp<Surface> sp = new Surface(st);
386 reply->writeInt32(setPreviewTarget(sp));
387#else
388 reply->writeInt32(setPreviewTarget(st));
389#endif
390 return NO_ERROR;
391 } break;
392#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
393 case SET_PREVIEW_TARGET_SURFACE: {
394 ALOGV("SET_PREVIEW_TARGET_SURFACE");
395 CHECK_INTERFACE(ICamera, data, reply);
396 view::Surface viewSurface;
397 data.readParcelable(&viewSurface);
398 sp<Surface> st = viewSurface.toSurface();
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -0700399 reply->writeInt32(setPreviewTarget(st));
Jamie Gennisbfa33aa2010-12-20 11:51:31 -0800400 return NO_ERROR;
401 } break;
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700402#endif
Mathias Agopian3cf61352010-02-09 17:46:37 -0800403 case SET_PREVIEW_CALLBACK_FLAG: {
Steve Block3856b092011-10-20 11:56:00 +0100404 ALOGV("SET_PREVIEW_CALLBACK_TYPE");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800405 CHECK_INTERFACE(ICamera, data, reply);
406 int callback_flag = data.readInt32();
407 setPreviewCallbackFlag(callback_flag);
408 return NO_ERROR;
409 } break;
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700410 case SET_PREVIEW_CALLBACK_TARGET: {
411 ALOGV("SET_PREVIEW_CALLBACK_TARGET");
412 CHECK_INTERFACE(ICamera, data, reply);
413 sp<IGraphicBufferProducer> cp =
414 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700415#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
416 sp<Surface> sp = new Surface(cp);
417 reply->writeInt32(setPreviewCallbackTarget(sp));
418#else
419 reply->writeInt32(setPreviewCallbackTarget(cp));
420#endif
421 return NO_ERROR;
422 }
423#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
424 case SET_PREVIEW_CALLBACK_TARGET_SURFACE: {
425 ALOGV("SET_PREVIEW_CALLBACK_TARGET_SURFACE");
426 CHECK_INTERFACE(ICamera, data, reply);
427 view::Surface viewSurface;
428 data.readParcelable(&viewSurface);
429 sp<Surface> cp = viewSurface.toSurface();
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700430 reply->writeInt32(setPreviewCallbackTarget(cp));
431 return NO_ERROR;
432 }
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700433#endif
Mathias Agopian3cf61352010-02-09 17:46:37 -0800434 case START_PREVIEW: {
Steve Block3856b092011-10-20 11:56:00 +0100435 ALOGV("START_PREVIEW");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800436 CHECK_INTERFACE(ICamera, data, reply);
437 reply->writeInt32(startPreview());
438 return NO_ERROR;
439 } break;
440 case START_RECORDING: {
Steve Block3856b092011-10-20 11:56:00 +0100441 ALOGV("START_RECORDING");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800442 CHECK_INTERFACE(ICamera, data, reply);
443 reply->writeInt32(startRecording());
444 return NO_ERROR;
445 } break;
446 case STOP_PREVIEW: {
Steve Block3856b092011-10-20 11:56:00 +0100447 ALOGV("STOP_PREVIEW");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800448 CHECK_INTERFACE(ICamera, data, reply);
449 stopPreview();
450 return NO_ERROR;
451 } break;
452 case STOP_RECORDING: {
Steve Block3856b092011-10-20 11:56:00 +0100453 ALOGV("STOP_RECORDING");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800454 CHECK_INTERFACE(ICamera, data, reply);
455 stopRecording();
456 return NO_ERROR;
457 } break;
458 case RELEASE_RECORDING_FRAME: {
Steve Block3856b092011-10-20 11:56:00 +0100459 ALOGV("RELEASE_RECORDING_FRAME");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800460 CHECK_INTERFACE(ICamera, data, reply);
461 sp<IMemory> mem = interface_cast<IMemory>(data.readStrongBinder());
462 releaseRecordingFrame(mem);
463 return NO_ERROR;
464 } break;
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -0700465 case RELEASE_RECORDING_FRAME_HANDLE: {
466 ALOGV("RELEASE_RECORDING_FRAME_HANDLE");
467 CHECK_INTERFACE(ICamera, data, reply);
468 // releaseRecordingFrameHandle will be responsble to close the native handle.
469 releaseRecordingFrameHandle(data.readNativeHandle());
470 return NO_ERROR;
471 } break;
Yin-Chia Yehb5df5472017-03-20 19:32:19 -0700472 case RELEASE_RECORDING_FRAME_HANDLE_BATCH: {
473 ALOGV("RELEASE_RECORDING_FRAME_HANDLE_BATCH");
474 CHECK_INTERFACE(ICamera, data, reply);
475 // releaseRecordingFrameHandle will be responsble to close the native handle.
476 uint32_t n = data.readUint32();
477 std::vector<native_handle_t*> handles;
478 handles.reserve(n);
479 for (uint32_t i = 0; i < n; i++) {
480 handles.push_back(data.readNativeHandle());
481 }
482 releaseRecordingFrameHandleBatch(handles);
483 return NO_ERROR;
484 } break;
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800485 case SET_VIDEO_BUFFER_MODE: {
486 ALOGV("SET_VIDEO_BUFFER_MODE");
James Donge2ad6732010-10-18 20:42:51 -0700487 CHECK_INTERFACE(ICamera, data, reply);
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800488 int32_t mode = data.readInt32();
489 reply->writeInt32(setVideoBufferMode(mode));
James Donge2ad6732010-10-18 20:42:51 -0700490 return NO_ERROR;
491 } break;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800492 case PREVIEW_ENABLED: {
Steve Block3856b092011-10-20 11:56:00 +0100493 ALOGV("PREVIEW_ENABLED");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800494 CHECK_INTERFACE(ICamera, data, reply);
495 reply->writeInt32(previewEnabled());
496 return NO_ERROR;
497 } break;
498 case RECORDING_ENABLED: {
Steve Block3856b092011-10-20 11:56:00 +0100499 ALOGV("RECORDING_ENABLED");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800500 CHECK_INTERFACE(ICamera, data, reply);
501 reply->writeInt32(recordingEnabled());
502 return NO_ERROR;
503 } break;
504 case AUTO_FOCUS: {
Steve Block3856b092011-10-20 11:56:00 +0100505 ALOGV("AUTO_FOCUS");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800506 CHECK_INTERFACE(ICamera, data, reply);
507 reply->writeInt32(autoFocus());
508 return NO_ERROR;
509 } break;
510 case CANCEL_AUTO_FOCUS: {
Steve Block3856b092011-10-20 11:56:00 +0100511 ALOGV("CANCEL_AUTO_FOCUS");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800512 CHECK_INTERFACE(ICamera, data, reply);
513 reply->writeInt32(cancelAutoFocus());
514 return NO_ERROR;
515 } break;
516 case TAKE_PICTURE: {
Steve Block3856b092011-10-20 11:56:00 +0100517 ALOGV("TAKE_PICTURE");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800518 CHECK_INTERFACE(ICamera, data, reply);
James Donge468ac52011-02-17 16:38:06 -0800519 int msgType = data.readInt32();
520 reply->writeInt32(takePicture(msgType));
Mathias Agopian3cf61352010-02-09 17:46:37 -0800521 return NO_ERROR;
522 } break;
523 case SET_PARAMETERS: {
Steve Block3856b092011-10-20 11:56:00 +0100524 ALOGV("SET_PARAMETERS");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800525 CHECK_INTERFACE(ICamera, data, reply);
526 String8 params(data.readString8());
527 reply->writeInt32(setParameters(params));
528 return NO_ERROR;
529 } break;
530 case GET_PARAMETERS: {
Steve Block3856b092011-10-20 11:56:00 +0100531 ALOGV("GET_PARAMETERS");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800532 CHECK_INTERFACE(ICamera, data, reply);
533 reply->writeString8(getParameters());
534 return NO_ERROR;
535 } break;
536 case SEND_COMMAND: {
Steve Block3856b092011-10-20 11:56:00 +0100537 ALOGV("SEND_COMMAND");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800538 CHECK_INTERFACE(ICamera, data, reply);
539 int command = data.readInt32();
540 int arg1 = data.readInt32();
541 int arg2 = data.readInt32();
542 reply->writeInt32(sendCommand(command, arg1, arg2));
543 return NO_ERROR;
544 } break;
545 case CONNECT: {
546 CHECK_INTERFACE(ICamera, data, reply);
547 sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(data.readStrongBinder());
548 reply->writeInt32(connect(cameraClient));
549 return NO_ERROR;
550 } break;
551 case LOCK: {
552 CHECK_INTERFACE(ICamera, data, reply);
553 reply->writeInt32(lock());
554 return NO_ERROR;
555 } break;
556 case UNLOCK: {
557 CHECK_INTERFACE(ICamera, data, reply);
558 reply->writeInt32(unlock());
559 return NO_ERROR;
560 } break;
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800561 case SET_VIDEO_BUFFER_TARGET: {
562 ALOGV("SET_VIDEO_BUFFER_TARGET");
563 CHECK_INTERFACE(ICamera, data, reply);
564 sp<IGraphicBufferProducer> st =
565 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700566#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
567 sp<Surface> sp = new Surface(st);
568 reply->writeInt32(setVideoTarget(sp));
569#else
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800570 reply->writeInt32(setVideoTarget(st));
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700571#endif
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800572 return NO_ERROR;
573 } break;
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700574#if WB_LIBCAMERASERVICE_WITH_DEPENDENCIES
575 case SET_VIDEO_BUFFER_TARGET_SURFACE: {
576 ALOGV("SET_VIDEO_BUFFER_TARGET_SURFACE");
577 CHECK_INTERFACE(ICamera, data, reply);
578 view::Surface viewSurface;
579 data.readParcelable(&viewSurface);
580 sp<Surface> cp = viewSurface.toSurface();
581 reply->writeInt32(setVideoTarget(cp));
582 return NO_ERROR;
583 } break;
584#endif
Yin-Chia Yehdba03232019-08-19 15:54:28 -0700585 case SET_AUDIO_RESTRICTION: {
586 CHECK_INTERFACE(ICamera, data, reply);
587 int32_t mode = data.readInt32();
588 reply->writeInt32(setAudioRestriction(mode));
589 return NO_ERROR;
590 } break;
Yin-Chia Yehcfab4e12019-09-09 13:08:28 -0700591 case GET_GLOBAL_AUDIO_RESTRICTION: {
592 CHECK_INTERFACE(ICamera, data, reply);
593 reply->writeInt32(getGlobalAudioRestriction());
594 return NO_ERROR;
595 } break;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800596 default:
597 return BBinder::onTransact(code, data, reply, flags);
598 }
599}
600
601// ----------------------------------------------------------------------------
602
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800603} // namespace hardware
604} // namespace android