blob: 224468274b507b57c6f204b9bd471b0b049fd3d7 [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>
Eino-Ville Talvalaceb388d2013-02-19 10:40:14 -080022#include <utils/String16.h>
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +080023#include <binder/IPCThreadState.h>
Mathias Agopian3cf61352010-02-09 17:46:37 -080024#include <binder/IServiceManager.h>
25#include <binder/IMemory.h>
26
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080027#include <Camera.h>
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080028#include <android/hardware/ICameraService.h>
29#include <android/hardware/ICamera.h>
Mathias Agopian3cf61352010-02-09 17:46:37 -080030
Andy McFadden8ba01022012-12-18 09:46:54 -080031#include <gui/IGraphicBufferProducer.h>
Mathias Agopiandf712ea2012-02-25 18:48:35 -080032#include <gui/Surface.h>
Mathias Agopian3cf61352010-02-09 17:46:37 -080033
34namespace android {
35
Igor Murashkinc073ba52013-02-26 14:32:34 -080036Camera::Camera(int cameraId)
37 : CameraBase(cameraId)
Mathias Agopian3cf61352010-02-09 17:46:37 -080038{
Mathias Agopian3cf61352010-02-09 17:46:37 -080039}
40
Ruben Brunk0f61d8f2013-08-08 13:07:18 -070041CameraTraits<Camera>::TCamConnectService CameraTraits<Camera>::fnConnectService =
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080042 &::android::hardware::ICameraService::connect;
Ruben Brunk0f61d8f2013-08-08 13:07:18 -070043
Mathias Agopian3cf61352010-02-09 17:46:37 -080044// construct a camera client from an existing camera remote
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080045sp<Camera> Camera::create(const sp<::android::hardware::ICamera>& camera)
Mathias Agopian3cf61352010-02-09 17:46:37 -080046{
Steve Block3856b092011-10-20 11:56:00 +010047 ALOGV("create");
Mathias Agopian3cf61352010-02-09 17:46:37 -080048 if (camera == 0) {
Steve Block29357bc2012-01-06 19:20:56 +000049 ALOGE("camera remote is a NULL pointer");
Mathias Agopian3cf61352010-02-09 17:46:37 -080050 return 0;
51 }
52
Igor Murashkinc073ba52013-02-26 14:32:34 -080053 sp<Camera> c = new Camera(-1);
Mathias Agopian3cf61352010-02-09 17:46:37 -080054 if (camera->connect(c) == NO_ERROR) {
55 c->mStatus = NO_ERROR;
56 c->mCamera = camera;
Marco Nelissen06b46062014-11-14 07:58:25 -080057 IInterface::asBinder(camera)->linkToDeath(c);
Wu-cheng Li627baac2011-01-04 20:00:55 +080058 return c;
Mathias Agopian3cf61352010-02-09 17:46:37 -080059 }
Wu-cheng Li627baac2011-01-04 20:00:55 +080060 return 0;
Mathias Agopian3cf61352010-02-09 17:46:37 -080061}
62
Mathias Agopian3cf61352010-02-09 17:46:37 -080063Camera::~Camera()
64{
Chih-Chung Changd06618e2010-05-13 15:14:24 +080065 // We don't need to call disconnect() here because if the CameraService
66 // thinks we are the owner of the hardware, it will hold a (strong)
67 // reference to us, and we can't possibly be here. We also don't want to
68 // call disconnect() here if we are in the same process as mediaserver,
69 // because we may be invoked by CameraService::Client::connect() and will
70 // deadlock if we call any method of ICamera here.
Mathias Agopian3cf61352010-02-09 17:46:37 -080071}
72
Svetoslav Ganov280405a2015-05-12 02:19:27 +000073sp<Camera> Camera::connect(int cameraId, const String16& clientPackageName,
Chengfei Taobe683db2023-01-31 18:52:49 +000074 int clientUid, int clientPid, int targetSdkVersion, bool overrideToPortrait,
75 bool forceSlowJpegMode)
Mathias Agopian3cf61352010-02-09 17:46:37 -080076{
Shuzhen Wangd4abdf72021-05-28 11:22:50 -070077 return CameraBaseT::connect(cameraId, clientPackageName, clientUid,
Chengfei Taobe683db2023-01-31 18:52:49 +000078 clientPid, targetSdkVersion, overrideToPortrait, forceSlowJpegMode);
Mathias Agopian3cf61352010-02-09 17:46:37 -080079}
80
81status_t Camera::reconnect()
82{
Steve Block3856b092011-10-20 11:56:00 +010083 ALOGV("reconnect");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080084 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -080085 if (c == 0) return NO_INIT;
86 return c->connect(this);
87}
88
Mathias Agopian3cf61352010-02-09 17:46:37 -080089status_t Camera::lock()
90{
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080091 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -080092 if (c == 0) return NO_INIT;
93 return c->lock();
94}
95
96status_t Camera::unlock()
97{
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080098 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -080099 if (c == 0) return NO_INIT;
100 return c->unlock();
101}
102
Andy McFadden8ba01022012-12-18 09:46:54 -0800103// pass the buffered IGraphicBufferProducer to the camera service
Eino-Ville Talvala4b820b02013-08-21 14:39:05 -0700104status_t Camera::setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)
Jamie Gennisbfa33aa2010-12-20 11:51:31 -0800105{
Eino-Ville Talvala4b820b02013-08-21 14:39:05 -0700106 ALOGV("setPreviewTarget(%p)", bufferProducer.get());
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800107 sp <::android::hardware::ICamera> c = mCamera;
Jamie Gennisbfa33aa2010-12-20 11:51:31 -0800108 if (c == 0) return NO_INIT;
Mathias Agopian99617ad2013-03-12 18:42:23 -0700109 ALOGD_IF(bufferProducer == 0, "app passed NULL surface");
Eino-Ville Talvala1ce7c342013-08-21 13:57:21 -0700110 return c->setPreviewTarget(bufferProducer);
Jamie Gennisbfa33aa2010-12-20 11:51:31 -0800111}
112
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800113status_t Camera::setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer)
114{
115 ALOGV("setVideoTarget(%p)", bufferProducer.get());
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800116 sp <::android::hardware::ICamera> c = mCamera;
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800117 if (c == 0) return NO_INIT;
118 ALOGD_IF(bufferProducer == 0, "app passed NULL video surface");
119 return c->setVideoTarget(bufferProducer);
120}
121
Mathias Agopian3cf61352010-02-09 17:46:37 -0800122// start preview mode
123status_t Camera::startPreview()
124{
Steve Block3856b092011-10-20 11:56:00 +0100125 ALOGV("startPreview");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800126 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800127 if (c == 0) return NO_INIT;
128 return c->startPreview();
129}
130
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800131status_t Camera::setVideoBufferMode(int32_t videoBufferMode)
James Donge2ad6732010-10-18 20:42:51 -0700132{
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800133 ALOGV("setVideoBufferMode: %d", videoBufferMode);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800134 sp <::android::hardware::ICamera> c = mCamera;
James Donge2ad6732010-10-18 20:42:51 -0700135 if (c == 0) return NO_INIT;
Chien-Yu Chen8cca0752015-11-13 15:28:48 -0800136 return c->setVideoBufferMode(videoBufferMode);
James Donge2ad6732010-10-18 20:42:51 -0700137}
138
Eino-Ville Talvala4b820b02013-08-21 14:39:05 -0700139// start recording mode, must call setPreviewTarget first
Mathias Agopian3cf61352010-02-09 17:46:37 -0800140status_t Camera::startRecording()
141{
Steve Block3856b092011-10-20 11:56:00 +0100142 ALOGV("startRecording");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800143 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800144 if (c == 0) return NO_INIT;
145 return c->startRecording();
146}
147
148// stop preview mode
149void Camera::stopPreview()
150{
Steve Block3856b092011-10-20 11:56:00 +0100151 ALOGV("stopPreview");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800152 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800153 if (c == 0) return;
154 c->stopPreview();
155}
156
157// stop recording mode
158void Camera::stopRecording()
159{
Steve Block3856b092011-10-20 11:56:00 +0100160 ALOGV("stopRecording");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800161 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800162 if (c == 0) return;
163 c->stopRecording();
164}
165
166// release a recording frame
167void Camera::releaseRecordingFrame(const sp<IMemory>& mem)
168{
Steve Block3856b092011-10-20 11:56:00 +0100169 ALOGV("releaseRecordingFrame");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800170 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800171 if (c == 0) return;
172 c->releaseRecordingFrame(mem);
173}
174
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -0700175void Camera::releaseRecordingFrameHandle(native_handle_t* handle)
176{
177 ALOGV("releaseRecordingFrameHandle");
178 sp <::android::hardware::ICamera> c = mCamera;
179 if (c == 0) return;
180 c->releaseRecordingFrameHandle(handle);
181}
182
Yin-Chia Yehb5df5472017-03-20 19:32:19 -0700183void Camera::releaseRecordingFrameHandleBatch(
184 const std::vector<native_handle_t*> handles) {
185 ALOGV("releaseRecordingFrameHandleBatch");
186 sp <::android::hardware::ICamera> c = mCamera;
187 if (c == 0) return;
188 c->releaseRecordingFrameHandleBatch(handles);
189}
190
Mathias Agopian3cf61352010-02-09 17:46:37 -0800191// get preview state
192bool Camera::previewEnabled()
193{
Steve Block3856b092011-10-20 11:56:00 +0100194 ALOGV("previewEnabled");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800195 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800196 if (c == 0) return false;
197 return c->previewEnabled();
198}
199
200// get recording state
201bool Camera::recordingEnabled()
202{
Steve Block3856b092011-10-20 11:56:00 +0100203 ALOGV("recordingEnabled");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800204 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800205 if (c == 0) return false;
206 return c->recordingEnabled();
207}
208
209status_t Camera::autoFocus()
210{
Steve Block3856b092011-10-20 11:56:00 +0100211 ALOGV("autoFocus");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800212 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800213 if (c == 0) return NO_INIT;
214 return c->autoFocus();
215}
216
217status_t Camera::cancelAutoFocus()
218{
Steve Block3856b092011-10-20 11:56:00 +0100219 ALOGV("cancelAutoFocus");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800220 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800221 if (c == 0) return NO_INIT;
222 return c->cancelAutoFocus();
223}
224
225// take a picture
James Donge468ac52011-02-17 16:38:06 -0800226status_t Camera::takePicture(int msgType)
Mathias Agopian3cf61352010-02-09 17:46:37 -0800227{
Steve Block3856b092011-10-20 11:56:00 +0100228 ALOGV("takePicture: 0x%x", msgType);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800229 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800230 if (c == 0) return NO_INIT;
James Donge468ac52011-02-17 16:38:06 -0800231 return c->takePicture(msgType);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800232}
233
234// set preview/capture parameters - key/value pairs
235status_t Camera::setParameters(const String8& params)
236{
Steve Block3856b092011-10-20 11:56:00 +0100237 ALOGV("setParameters");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800238 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800239 if (c == 0) return NO_INIT;
240 return c->setParameters(params);
241}
242
243// get preview/capture parameters - key/value pairs
244String8 Camera::getParameters() const
245{
Steve Block3856b092011-10-20 11:56:00 +0100246 ALOGV("getParameters");
Mathias Agopian3cf61352010-02-09 17:46:37 -0800247 String8 params;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800248 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800249 if (c != 0) params = mCamera->getParameters();
250 return params;
251}
252
253// send command to camera driver
254status_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
255{
Steve Block3856b092011-10-20 11:56:00 +0100256 ALOGV("sendCommand");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800257 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800258 if (c == 0) return NO_INIT;
259 return c->sendCommand(cmd, arg1, arg2);
260}
261
262void Camera::setListener(const sp<CameraListener>& listener)
263{
264 Mutex::Autolock _l(mLock);
265 mListener = listener;
266}
267
268void Camera::setPreviewCallbackFlags(int flag)
269{
Steve Block3856b092011-10-20 11:56:00 +0100270 ALOGV("setPreviewCallbackFlags");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800271 sp <::android::hardware::ICamera> c = mCamera;
Mathias Agopian3cf61352010-02-09 17:46:37 -0800272 if (c == 0) return;
273 mCamera->setPreviewCallbackFlag(flag);
274}
275
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700276status_t Camera::setPreviewCallbackTarget(
277 const sp<IGraphicBufferProducer>& callbackProducer)
278{
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800279 sp <::android::hardware::ICamera> c = mCamera;
Eino-Ville Talvala3ee35502013-04-02 15:45:11 -0700280 if (c == 0) return NO_INIT;
281 return c->setPreviewCallbackTarget(callbackProducer);
282}
283
Yin-Chia Yehcfab4e12019-09-09 13:08:28 -0700284status_t Camera::setAudioRestriction(int32_t mode)
Yin-Chia Yehdba03232019-08-19 15:54:28 -0700285{
286 sp <::android::hardware::ICamera> c = mCamera;
287 if (c == 0) return NO_INIT;
288 return c->setAudioRestriction(mode);
289}
290
Yin-Chia Yehcfab4e12019-09-09 13:08:28 -0700291int32_t Camera::getGlobalAudioRestriction()
292{
293 sp <::android::hardware::ICamera> c = mCamera;
294 if (c == 0) return NO_INIT;
295 return c->getGlobalAudioRestriction();
296}
297
Mathias Agopian3cf61352010-02-09 17:46:37 -0800298// callback from camera service
299void Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
300{
Igor Murashkinc073ba52013-02-26 14:32:34 -0800301 return CameraBaseT::notifyCallback(msgType, ext1, ext2);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800302}
303
304// callback from camera service when frame or image is ready
Wu-cheng Li57c86182011-07-30 05:00:37 +0800305void Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
306 camera_frame_metadata_t *metadata)
Mathias Agopian3cf61352010-02-09 17:46:37 -0800307{
Igor Murashkinfa4cf9d2013-03-04 16:14:23 -0800308 sp<CameraListener> listener;
309 {
310 Mutex::Autolock _l(mLock);
311 listener = mListener;
312 }
313 if (listener != NULL) {
314 listener->postData(msgType, dataPtr, metadata);
315 }
Mathias Agopian3cf61352010-02-09 17:46:37 -0800316}
317
318// callback from camera service when timestamped frame is ready
319void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
320{
Igor Murashkinfa4cf9d2013-03-04 16:14:23 -0800321 sp<CameraListener> listener;
322 {
323 Mutex::Autolock _l(mLock);
324 listener = mListener;
325 }
326
327 if (listener != NULL) {
328 listener->postDataTimestamp(timestamp, msgType, dataPtr);
329 } else {
Steve Block5ff1dd52012-01-05 23:22:43 +0000330 ALOGW("No listener was set. Drop a recording frame.");
James Dongc42478e2010-11-15 10:38:37 -0800331 releaseRecordingFrame(dataPtr);
Mathias Agopian3cf61352010-02-09 17:46:37 -0800332 }
333}
334
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -0700335void Camera::recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle)
336{
Chien-Yu Chen2d13b1d2016-04-28 12:11:20 -0700337 sp<CameraListener> listener;
338 {
339 Mutex::Autolock _l(mLock);
340 listener = mListener;
341 }
342
343 if (listener != NULL) {
344 listener->postRecordingFrameHandleTimestamp(timestamp, handle);
345 } else {
346 ALOGW("No listener was set. Drop a recording frame.");
347 releaseRecordingFrameHandle(handle);
348 }
349}
350
Yin-Chia Yehb5df5472017-03-20 19:32:19 -0700351void Camera::recordingFrameHandleCallbackTimestampBatch(
352 const std::vector<nsecs_t>& timestamps,
353 const std::vector<native_handle_t*>& handles)
354{
Yin-Chia Yehb5df5472017-03-20 19:32:19 -0700355 sp<CameraListener> listener;
356 {
357 Mutex::Autolock _l(mLock);
358 listener = mListener;
359 }
360
361 if (listener != NULL) {
362 listener->postRecordingFrameHandleTimestampBatch(timestamps, handles);
363 } else {
364 ALOGW("No listener was set. Drop a batch of recording frames.");
365 releaseRecordingFrameHandleBatch(handles);
366 }
367}
368
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800369sp<ICameraRecordingProxy> Camera::getRecordingProxy() {
Steve Block3856b092011-10-20 11:56:00 +0100370 ALOGV("getProxy");
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800371 return new RecordingProxy(this);
372}
373
Eino-Ville Talvalab8ed8ef2020-06-22 16:59:48 -0700374status_t Camera::RecordingProxy::startRecording()
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800375{
Steve Block3856b092011-10-20 11:56:00 +0100376 ALOGV("RecordingProxy::startRecording");
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800377 mCamera->reconnect();
378 return mCamera->startRecording();
379}
380
381void Camera::RecordingProxy::stopRecording()
382{
Steve Block3856b092011-10-20 11:56:00 +0100383 ALOGV("RecordingProxy::stopRecording");
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800384 mCamera->stopRecording();
385}
386
Wu-cheng Li4ca2c7c2011-06-01 17:22:24 +0800387Camera::RecordingProxy::RecordingProxy(const sp<Camera>& camera)
388{
389 mCamera = camera;
390}
391
Mathias Agopian3cf61352010-02-09 17:46:37 -0800392}; // namespace android