blob: 0bc735fcca670d835ec449338916ace641060196 [file] [log] [blame]
Mathias Agopian3cf61352010-02-09 17:46:37 -08001/*
2**
3** Copyright (C) 2008, The Android Open Source Project
Mathias Agopian3cf61352010-02-09 17:46:37 -08004**
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 "Camera"
20#include <utils/Log.h>
21#include <utils/threads.h>
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +080022#include <binder/IPCThreadState.h>
Mathias Agopian3cf61352010-02-09 17:46:37 -080023#include <binder/IServiceManager.h>
24#include <binder/IMemory.h>
25
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080026#include <Camera.h>
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080027#include <android/hardware/ICameraService.h>
28#include <android/hardware/ICamera.h>
Mathias Agopian3cf61352010-02-09 17:46:37 -080029
Andy McFadden8ba01022012-12-18 09:46:54 -080030#include <gui/IGraphicBufferProducer.h>
Mathias Agopiandf712ea2012-02-25 18:48:35 -080031#include <gui/Surface.h>
Mathias Agopian3cf61352010-02-09 17:46:37 -080032
33namespace android {
34
Igor Murashkinc073ba52013-02-26 14:32:34 -080035Camera::Camera(int cameraId)
36 : CameraBase(cameraId)
Mathias Agopian3cf61352010-02-09 17:46:37 -080037{
Mathias Agopian3cf61352010-02-09 17:46:37 -080038}
39
Ruben Brunk0f61d8f2013-08-08 13:07:18 -070040CameraTraits<Camera>::TCamConnectService CameraTraits<Camera>::fnConnectService =
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080041 &::android::hardware::ICameraService::connect;
Ruben Brunk0f61d8f2013-08-08 13:07:18 -070042
Mathias Agopian3cf61352010-02-09 17:46:37 -080043// construct a camera client from an existing camera remote
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080044sp<Camera> Camera::create(const sp<::android::hardware::ICamera>& camera)
Mathias Agopian3cf61352010-02-09 17:46:37 -080045{
Steve Block3856b092011-10-20 11:56:00 +010046 ALOGV("create");
Mathias Agopian3cf61352010-02-09 17:46:37 -080047 if (camera == 0) {
Steve Block29357bc2012-01-06 19:20:56 +000048 ALOGE("camera remote is a NULL pointer");
Mathias Agopian3cf61352010-02-09 17:46:37 -080049 return 0;
50 }
51
Igor Murashkinc073ba52013-02-26 14:32:34 -080052 sp<Camera> c = new Camera(-1);
Mathias Agopian3cf61352010-02-09 17:46:37 -080053 if (camera->connect(c) == NO_ERROR) {
54 c->mStatus = NO_ERROR;
55 c->mCamera = camera;
Marco Nelissen06b46062014-11-14 07:58:25 -080056 IInterface::asBinder(camera)->linkToDeath(c);
Wu-cheng Li627baac2011-01-04 20:00:55 +080057 return c;
Mathias Agopian3cf61352010-02-09 17:46:37 -080058 }
Wu-cheng Li627baac2011-01-04 20:00:55 +080059 return 0;
Mathias Agopian3cf61352010-02-09 17:46:37 -080060}
61
Mathias Agopian3cf61352010-02-09 17:46:37 -080062Camera::~Camera()
63{
Chih-Chung Changd06618e2010-05-13 15:14:24 +080064 // We don't need to call disconnect() here because if the CameraService
65 // thinks we are the owner of the hardware, it will hold a (strong)
66 // reference to us, and we can't possibly be here. We also don't want to
67 // call disconnect() here if we are in the same process as mediaserver,
68 // because we may be invoked by CameraService::Client::connect() and will
69 // deadlock if we call any method of ICamera here.
Mathias Agopian3cf61352010-02-09 17:46:37 -080070}
71
Austin Borgerd1ad6c62024-07-01 11:28:31 -070072sp<Camera> Camera::connect(int cameraId, int targetSdkVersion, int rotationOverride,
Austin Borger65e64642024-06-11 15:58:23 -070073 bool forceSlowJpegMode, const AttributionSourceState& clientAttribution,
74 int32_t devicePolicy)
Mathias Agopian3cf61352010-02-09 17:46:37 -080075{
Austin Borgerd1ad6c62024-07-01 11:28:31 -070076 return CameraBaseT::connect(cameraId, targetSdkVersion, rotationOverride,
Austin Borger65e64642024-06-11 15:58:23 -070077 forceSlowJpegMode, clientAttribution, devicePolicy);
Mathias Agopian3cf61352010-02-09 17:46:37 -080078}
79
80status_t Camera::reconnect()
81{
Steve Block3856b092011-10-20 11:56:00 +010082 ALOGV("reconnect");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080083 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -080084 if (c == 0) return NO_INIT;
85 return c->connect(this);
86}
87
Mathias Agopian3cf61352010-02-09 17:46:37 -080088status_t Camera::lock()
89{
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080090 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -080091 if (c == 0) return NO_INIT;
92 return c->lock();
93}
94
95status_t Camera::unlock()
96{
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080097 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -080098 if (c == 0) return NO_INIT;
99 return c->unlock();
100}
101
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700102// pass the Surface to the camera service
103status_t Camera::setPreviewTarget(const sp<SurfaceType>& target) {
104 ALOGV("setPreviewTarget(%p)", target.get());
105 sp<::android::hardware::ICamera> c = mCamera;
Jamie Gennisbfa33aa2010-12-20 11:51:31 -0800106 if (c == 0) return NO_INIT;
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700107 ALOGD_IF(target == 0, "app passed NULL surface");
108 return c->setPreviewTarget(target);
Jamie Gennisbfa33aa2010-12-20 11:51:31 -0800109}
110
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700111status_t Camera::setVideoTarget(const sp<SurfaceType>& target) {
112 ALOGV("setVideoTarget(%p)", target.get());
113 sp<::android::hardware::ICamera> c = mCamera;
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800114 if (c == 0) return NO_INIT;
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700115 ALOGD_IF(target == 0, "app passed NULL video surface");
116 return c->setVideoTarget(target);
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800117}
118
Mathias Agopian3cf61352010-02-09 17:46:37 -0800119// start preview mode
120status_t Camera::startPreview()
121{
Steve Block3856b092011-10-20 11:56:00 +0100122 ALOGV("startPreview");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800123 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800124 if (c == 0) return NO_INIT;
125 return c->startPreview();
126}
127
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800128status_t Camera::setVideoBufferMode(int32_t videoBufferMode)
James Donge2ad6732010-10-18 20:42:51 -0700129{
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800130 ALOGV("setVideoBufferMode: %d", videoBufferMode);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800131 sp <::android::hardware::ICamera> c = mCamera;
James Donge2ad6732010-10-18 20:42:51 -0700132 if (c == 0) return NO_INIT;
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800133 return c->setVideoBufferMode(videoBufferMode);
James Donge2ad6732010-10-18 20:42:51 -0700134}
135
Eino-Ville Talvala4b820b02013-08-21 14:39:05 -0700136// start recording mode, must call setPreviewTarget first
Mathias Agopian3cf61352010-02-09 17:46:37 -0800137status_t Camera::startRecording()
138{
Steve Block3856b092011-10-20 11:56:00 +0100139 ALOGV("startRecording");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800140 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800141 if (c == 0) return NO_INIT;
142 return c->startRecording();
143}
144
145// stop preview mode
146void Camera::stopPreview()
147{
Steve Block3856b092011-10-20 11:56:00 +0100148 ALOGV("stopPreview");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800149 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800150 if (c == 0) return;
151 c->stopPreview();
152}
153
154// stop recording mode
155void Camera::stopRecording()
156{
Steve Block3856b092011-10-20 11:56:00 +0100157 ALOGV("stopRecording");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800158 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800159 if (c == 0) return;
160 c->stopRecording();
161}
162
163// release a recording frame
164void Camera::releaseRecordingFrame(const sp<IMemory>& mem)
165{
Steve Block3856b092011-10-20 11:56:00 +0100166 ALOGV("releaseRecordingFrame");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800167 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800168 if (c == 0) return;
169 c->releaseRecordingFrame(mem);
170}
171
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -0700172void Camera::releaseRecordingFrameHandle(native_handle_t* handle)
173{
174 ALOGV("releaseRecordingFrameHandle");
175 sp <::android::hardware::ICamera> c = mCamera;
176 if (c == 0) return;
177 c->releaseRecordingFrameHandle(handle);
178}
179
Yin-Chia Yehb5df5472017-03-20 19:32:19 -0700180void Camera::releaseRecordingFrameHandleBatch(
181 const std::vector<native_handle_t*> handles) {
182 ALOGV("releaseRecordingFrameHandleBatch");
183 sp <::android::hardware::ICamera> c = mCamera;
184 if (c == 0) return;
185 c->releaseRecordingFrameHandleBatch(handles);
186}
187
Mathias Agopian3cf61352010-02-09 17:46:37 -0800188// get preview state
189bool Camera::previewEnabled()
190{
Steve Block3856b092011-10-20 11:56:00 +0100191 ALOGV("previewEnabled");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800192 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800193 if (c == 0) return false;
194 return c->previewEnabled();
195}
196
197// get recording state
198bool Camera::recordingEnabled()
199{
Steve Block3856b092011-10-20 11:56:00 +0100200 ALOGV("recordingEnabled");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800201 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800202 if (c == 0) return false;
203 return c->recordingEnabled();
204}
205
206status_t Camera::autoFocus()
207{
Steve Block3856b092011-10-20 11:56:00 +0100208 ALOGV("autoFocus");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800209 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800210 if (c == 0) return NO_INIT;
211 return c->autoFocus();
212}
213
214status_t Camera::cancelAutoFocus()
215{
Steve Block3856b092011-10-20 11:56:00 +0100216 ALOGV("cancelAutoFocus");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800217 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800218 if (c == 0) return NO_INIT;
219 return c->cancelAutoFocus();
220}
221
222// take a picture
James Donge468ac52011-02-17 16:38:06 -0800223status_t Camera::takePicture(int msgType)
Mathias Agopian3cf61352010-02-09 17:46:37 -0800224{
Steve Block3856b092011-10-20 11:56:00 +0100225 ALOGV("takePicture: 0x%x", msgType);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800226 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800227 if (c == 0) return NO_INIT;
James Donge468ac52011-02-17 16:38:06 -0800228 return c->takePicture(msgType);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800229}
230
231// set preview/capture parameters - key/value pairs
232status_t Camera::setParameters(const String8& params)
233{
Steve Block3856b092011-10-20 11:56:00 +0100234 ALOGV("setParameters");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800235 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800236 if (c == 0) return NO_INIT;
237 return c->setParameters(params);
238}
239
240// get preview/capture parameters - key/value pairs
241String8 Camera::getParameters() const
242{
Steve Block3856b092011-10-20 11:56:00 +0100243 ALOGV("getParameters");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800244 String8 params;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800245 sp <::android::hardware::ICamera> c = mCamera;
Tony Guo3966c1f2023-09-07 03:46:05 +0000246 if (c != 0) params = c->getParameters();
Mathias Agopian3cf61352010-02-09 17:46:37 -0800247 return params;
248}
249
250// send command to camera driver
251status_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
252{
Steve Block3856b092011-10-20 11:56:00 +0100253 ALOGV("sendCommand");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800254 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800255 if (c == 0) return NO_INIT;
256 return c->sendCommand(cmd, arg1, arg2);
257}
258
259void Camera::setListener(const sp<CameraListener>& listener)
260{
261 Mutex::Autolock _l(mLock);
262 mListener = listener;
263}
264
265void Camera::setPreviewCallbackFlags(int flag)
266{
Steve Block3856b092011-10-20 11:56:00 +0100267 ALOGV("setPreviewCallbackFlags");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800268 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800269 if (c == 0) return;
Tony Guo3966c1f2023-09-07 03:46:05 +0000270 c->setPreviewCallbackFlag(flag);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800271}
272
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700273status_t Camera::setPreviewCallbackTarget(const sp<SurfaceType>& target) {
274 sp<::android::hardware::ICamera> c = mCamera;
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700275 if (c == 0) return NO_INIT;
Carlos Martinez Romeroca0ff172024-09-12 08:45:52 -0700276 return c->setPreviewCallbackTarget(target);
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700277}
278
Yin-Chia Yehcfab4e12019-09-09 13:08:28 -0700279status_t Camera::setAudioRestriction(int32_t mode)
Yin-Chia Yehdba03232019-08-19 15:54:28 -0700280{
281 sp <::android::hardware::ICamera> c = mCamera;
282 if (c == 0) return NO_INIT;
283 return c->setAudioRestriction(mode);
284}
285
Yin-Chia Yehcfab4e12019-09-09 13:08:28 -0700286int32_t Camera::getGlobalAudioRestriction()
287{
288 sp <::android::hardware::ICamera> c = mCamera;
289 if (c == 0) return NO_INIT;
290 return c->getGlobalAudioRestriction();
291}
292
Mathias Agopian3cf61352010-02-09 17:46:37 -0800293// callback from camera service
294void Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
295{
Igor Murashkinc073ba52013-02-26 14:32:34 -0800296 return CameraBaseT::notifyCallback(msgType, ext1, ext2);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800297}
298
299// callback from camera service when frame or image is ready
Wu-cheng Li57c86182011-07-30 05:00:37 +0800300void Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
301 camera_frame_metadata_t *metadata)
Mathias Agopian3cf61352010-02-09 17:46:37 -0800302{
Igor Murashkinfa4cf9d2013-03-04 16:14:23 -0800303 sp<CameraListener> listener;
304 {
305 Mutex::Autolock _l(mLock);
306 listener = mListener;
307 }
308 if (listener != NULL) {
309 listener->postData(msgType, dataPtr, metadata);
310 }
Mathias Agopian3cf61352010-02-09 17:46:37 -0800311}
312
313// callback from camera service when timestamped frame is ready
314void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
315{
Igor Murashkinfa4cf9d2013-03-04 16:14:23 -0800316 sp<CameraListener> listener;
317 {
318 Mutex::Autolock _l(mLock);
319 listener = mListener;
320 }
321
322 if (listener != NULL) {
323 listener->postDataTimestamp(timestamp, msgType, dataPtr);
324 } else {
Steve Block5ff1dd52012-01-05 23:22:43 +0000325 ALOGW("No listener was set. Drop a recording frame.");
James Dongc42478e2010-11-15 10:38:37 -0800326 releaseRecordingFrame(dataPtr);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800327 }
328}
329
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -0700330void Camera::recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle)
331{
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -0700332 sp<CameraListener> listener;
333 {
334 Mutex::Autolock _l(mLock);
335 listener = mListener;
336 }
337
338 if (listener != NULL) {
339 listener->postRecordingFrameHandleTimestamp(timestamp, handle);
340 } else {
341 ALOGW("No listener was set. Drop a recording frame.");
342 releaseRecordingFrameHandle(handle);
343 }
344}
345
Yin-Chia Yehb5df5472017-03-20 19:32:19 -0700346void Camera::recordingFrameHandleCallbackTimestampBatch(
347 const std::vector<nsecs_t>& timestamps,
348 const std::vector<native_handle_t*>& handles)
349{
Yin-Chia Yehb5df5472017-03-20 19:32:19 -0700350 sp<CameraListener> listener;
351 {
352 Mutex::Autolock _l(mLock);
353 listener = mListener;
354 }
355
356 if (listener != NULL) {
357 listener->postRecordingFrameHandleTimestampBatch(timestamps, handles);
358 } else {
359 ALOGW("No listener was set. Drop a batch of recording frames.");
360 releaseRecordingFrameHandleBatch(handles);
361 }
362}
363
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800364sp<ICameraRecordingProxy> Camera::getRecordingProxy() {
Steve Block3856b092011-10-20 11:56:00 +0100365 ALOGV("getProxy");
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800366 return new RecordingProxy(this);
367}
368
Eino-Ville Talvalab8ed8ef2020-06-22 16:59:48 -0700369status_t Camera::RecordingProxy::startRecording()
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800370{
Steve Block3856b092011-10-20 11:56:00 +0100371 ALOGV("RecordingProxy::startRecording");
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800372 mCamera->reconnect();
373 return mCamera->startRecording();
374}
375
376void Camera::RecordingProxy::stopRecording()
377{
Steve Block3856b092011-10-20 11:56:00 +0100378 ALOGV("RecordingProxy::stopRecording");
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800379 mCamera->stopRecording();
380}
381
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800382Camera::RecordingProxy::RecordingProxy(const sp<Camera>& camera)
383{
384 mCamera = camera;
385}
386
Mathias Agopian3cf61352010-02-09 17:46:37 -0800387}; // namespace android