xref: /aosp_15_r20/frameworks/av/camera/Camera.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright (C) 2008, 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 "Camera"
20*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <utils/threads.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <binder/IMemory.h>
25*ec779b8eSAndroid Build Coastguard Worker 
26*ec779b8eSAndroid Build Coastguard Worker #include <Camera.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/ICameraService.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/ICamera.h>
29*ec779b8eSAndroid Build Coastguard Worker 
30*ec779b8eSAndroid Build Coastguard Worker #include <gui/IGraphicBufferProducer.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <gui/Surface.h>
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker namespace android {
34*ec779b8eSAndroid Build Coastguard Worker 
Camera(int cameraId)35*ec779b8eSAndroid Build Coastguard Worker Camera::Camera(int cameraId)
36*ec779b8eSAndroid Build Coastguard Worker     : CameraBase(cameraId)
37*ec779b8eSAndroid Build Coastguard Worker {
38*ec779b8eSAndroid Build Coastguard Worker }
39*ec779b8eSAndroid Build Coastguard Worker 
40*ec779b8eSAndroid Build Coastguard Worker CameraTraits<Camera>::TCamConnectService CameraTraits<Camera>::fnConnectService =
41*ec779b8eSAndroid Build Coastguard Worker         &::android::hardware::ICameraService::connect;
42*ec779b8eSAndroid Build Coastguard Worker 
43*ec779b8eSAndroid Build Coastguard Worker // construct a camera client from an existing camera remote
create(const sp<::android::hardware::ICamera> & camera)44*ec779b8eSAndroid Build Coastguard Worker sp<Camera> Camera::create(const sp<::android::hardware::ICamera>& camera)
45*ec779b8eSAndroid Build Coastguard Worker {
46*ec779b8eSAndroid Build Coastguard Worker      ALOGV("create");
47*ec779b8eSAndroid Build Coastguard Worker      if (camera == 0) {
48*ec779b8eSAndroid Build Coastguard Worker          ALOGE("camera remote is a NULL pointer");
49*ec779b8eSAndroid Build Coastguard Worker          return 0;
50*ec779b8eSAndroid Build Coastguard Worker      }
51*ec779b8eSAndroid Build Coastguard Worker 
52*ec779b8eSAndroid Build Coastguard Worker     sp<Camera> c = new Camera(-1);
53*ec779b8eSAndroid Build Coastguard Worker     if (camera->connect(c) == NO_ERROR) {
54*ec779b8eSAndroid Build Coastguard Worker         c->mStatus = NO_ERROR;
55*ec779b8eSAndroid Build Coastguard Worker         c->mCamera = camera;
56*ec779b8eSAndroid Build Coastguard Worker         IInterface::asBinder(camera)->linkToDeath(c);
57*ec779b8eSAndroid Build Coastguard Worker         return c;
58*ec779b8eSAndroid Build Coastguard Worker     }
59*ec779b8eSAndroid Build Coastguard Worker     return 0;
60*ec779b8eSAndroid Build Coastguard Worker }
61*ec779b8eSAndroid Build Coastguard Worker 
~Camera()62*ec779b8eSAndroid Build Coastguard Worker Camera::~Camera()
63*ec779b8eSAndroid Build Coastguard Worker {
64*ec779b8eSAndroid Build Coastguard Worker     // We don't need to call disconnect() here because if the CameraService
65*ec779b8eSAndroid Build Coastguard Worker     // thinks we are the owner of the hardware, it will hold a (strong)
66*ec779b8eSAndroid Build Coastguard Worker     // reference to us, and we can't possibly be here. We also don't want to
67*ec779b8eSAndroid Build Coastguard Worker     // call disconnect() here if we are in the same process as mediaserver,
68*ec779b8eSAndroid Build Coastguard Worker     // because we may be invoked by CameraService::Client::connect() and will
69*ec779b8eSAndroid Build Coastguard Worker     // deadlock if we call any method of ICamera here.
70*ec779b8eSAndroid Build Coastguard Worker }
71*ec779b8eSAndroid Build Coastguard Worker 
connect(int cameraId,int targetSdkVersion,int rotationOverride,bool forceSlowJpegMode,const AttributionSourceState & clientAttribution,int32_t devicePolicy)72*ec779b8eSAndroid Build Coastguard Worker sp<Camera> Camera::connect(int cameraId, int targetSdkVersion, int rotationOverride,
73*ec779b8eSAndroid Build Coastguard Worker         bool forceSlowJpegMode, const AttributionSourceState& clientAttribution,
74*ec779b8eSAndroid Build Coastguard Worker         int32_t devicePolicy)
75*ec779b8eSAndroid Build Coastguard Worker {
76*ec779b8eSAndroid Build Coastguard Worker     return CameraBaseT::connect(cameraId, targetSdkVersion, rotationOverride,
77*ec779b8eSAndroid Build Coastguard Worker             forceSlowJpegMode, clientAttribution, devicePolicy);
78*ec779b8eSAndroid Build Coastguard Worker }
79*ec779b8eSAndroid Build Coastguard Worker 
reconnect()80*ec779b8eSAndroid Build Coastguard Worker status_t Camera::reconnect()
81*ec779b8eSAndroid Build Coastguard Worker {
82*ec779b8eSAndroid Build Coastguard Worker     ALOGV("reconnect");
83*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
84*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
85*ec779b8eSAndroid Build Coastguard Worker     return c->connect(this);
86*ec779b8eSAndroid Build Coastguard Worker }
87*ec779b8eSAndroid Build Coastguard Worker 
lock()88*ec779b8eSAndroid Build Coastguard Worker status_t Camera::lock()
89*ec779b8eSAndroid Build Coastguard Worker {
90*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
91*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
92*ec779b8eSAndroid Build Coastguard Worker     return c->lock();
93*ec779b8eSAndroid Build Coastguard Worker }
94*ec779b8eSAndroid Build Coastguard Worker 
unlock()95*ec779b8eSAndroid Build Coastguard Worker status_t Camera::unlock()
96*ec779b8eSAndroid Build Coastguard Worker {
97*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
98*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
99*ec779b8eSAndroid Build Coastguard Worker     return c->unlock();
100*ec779b8eSAndroid Build Coastguard Worker }
101*ec779b8eSAndroid Build Coastguard Worker 
102*ec779b8eSAndroid Build Coastguard Worker // pass the Surface to the camera service
setPreviewTarget(const sp<SurfaceType> & target)103*ec779b8eSAndroid Build Coastguard Worker status_t Camera::setPreviewTarget(const sp<SurfaceType>& target) {
104*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setPreviewTarget(%p)", target.get());
105*ec779b8eSAndroid Build Coastguard Worker     sp<::android::hardware::ICamera> c = mCamera;
106*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
107*ec779b8eSAndroid Build Coastguard Worker     ALOGD_IF(target == 0, "app passed NULL surface");
108*ec779b8eSAndroid Build Coastguard Worker     return c->setPreviewTarget(target);
109*ec779b8eSAndroid Build Coastguard Worker }
110*ec779b8eSAndroid Build Coastguard Worker 
setVideoTarget(const sp<SurfaceType> & target)111*ec779b8eSAndroid Build Coastguard Worker status_t Camera::setVideoTarget(const sp<SurfaceType>& target) {
112*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setVideoTarget(%p)", target.get());
113*ec779b8eSAndroid Build Coastguard Worker     sp<::android::hardware::ICamera> c = mCamera;
114*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
115*ec779b8eSAndroid Build Coastguard Worker     ALOGD_IF(target == 0, "app passed NULL video surface");
116*ec779b8eSAndroid Build Coastguard Worker     return c->setVideoTarget(target);
117*ec779b8eSAndroid Build Coastguard Worker }
118*ec779b8eSAndroid Build Coastguard Worker 
119*ec779b8eSAndroid Build Coastguard Worker // start preview mode
startPreview()120*ec779b8eSAndroid Build Coastguard Worker status_t Camera::startPreview()
121*ec779b8eSAndroid Build Coastguard Worker {
122*ec779b8eSAndroid Build Coastguard Worker     ALOGV("startPreview");
123*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
124*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
125*ec779b8eSAndroid Build Coastguard Worker     return c->startPreview();
126*ec779b8eSAndroid Build Coastguard Worker }
127*ec779b8eSAndroid Build Coastguard Worker 
setVideoBufferMode(int32_t videoBufferMode)128*ec779b8eSAndroid Build Coastguard Worker status_t Camera::setVideoBufferMode(int32_t videoBufferMode)
129*ec779b8eSAndroid Build Coastguard Worker {
130*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setVideoBufferMode: %d", videoBufferMode);
131*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
132*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
133*ec779b8eSAndroid Build Coastguard Worker     return c->setVideoBufferMode(videoBufferMode);
134*ec779b8eSAndroid Build Coastguard Worker }
135*ec779b8eSAndroid Build Coastguard Worker 
136*ec779b8eSAndroid Build Coastguard Worker // start recording mode, must call setPreviewTarget first
startRecording()137*ec779b8eSAndroid Build Coastguard Worker status_t Camera::startRecording()
138*ec779b8eSAndroid Build Coastguard Worker {
139*ec779b8eSAndroid Build Coastguard Worker     ALOGV("startRecording");
140*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
141*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
142*ec779b8eSAndroid Build Coastguard Worker     return c->startRecording();
143*ec779b8eSAndroid Build Coastguard Worker }
144*ec779b8eSAndroid Build Coastguard Worker 
145*ec779b8eSAndroid Build Coastguard Worker // stop preview mode
stopPreview()146*ec779b8eSAndroid Build Coastguard Worker void Camera::stopPreview()
147*ec779b8eSAndroid Build Coastguard Worker {
148*ec779b8eSAndroid Build Coastguard Worker     ALOGV("stopPreview");
149*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
150*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return;
151*ec779b8eSAndroid Build Coastguard Worker     c->stopPreview();
152*ec779b8eSAndroid Build Coastguard Worker }
153*ec779b8eSAndroid Build Coastguard Worker 
154*ec779b8eSAndroid Build Coastguard Worker // stop recording mode
stopRecording()155*ec779b8eSAndroid Build Coastguard Worker void Camera::stopRecording()
156*ec779b8eSAndroid Build Coastguard Worker {
157*ec779b8eSAndroid Build Coastguard Worker     ALOGV("stopRecording");
158*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
159*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return;
160*ec779b8eSAndroid Build Coastguard Worker     c->stopRecording();
161*ec779b8eSAndroid Build Coastguard Worker }
162*ec779b8eSAndroid Build Coastguard Worker 
163*ec779b8eSAndroid Build Coastguard Worker // release a recording frame
releaseRecordingFrame(const sp<IMemory> & mem)164*ec779b8eSAndroid Build Coastguard Worker void Camera::releaseRecordingFrame(const sp<IMemory>& mem)
165*ec779b8eSAndroid Build Coastguard Worker {
166*ec779b8eSAndroid Build Coastguard Worker     ALOGV("releaseRecordingFrame");
167*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
168*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return;
169*ec779b8eSAndroid Build Coastguard Worker     c->releaseRecordingFrame(mem);
170*ec779b8eSAndroid Build Coastguard Worker }
171*ec779b8eSAndroid Build Coastguard Worker 
releaseRecordingFrameHandle(native_handle_t * handle)172*ec779b8eSAndroid Build Coastguard Worker void Camera::releaseRecordingFrameHandle(native_handle_t* handle)
173*ec779b8eSAndroid Build Coastguard Worker {
174*ec779b8eSAndroid Build Coastguard Worker     ALOGV("releaseRecordingFrameHandle");
175*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
176*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return;
177*ec779b8eSAndroid Build Coastguard Worker     c->releaseRecordingFrameHandle(handle);
178*ec779b8eSAndroid Build Coastguard Worker }
179*ec779b8eSAndroid Build Coastguard Worker 
releaseRecordingFrameHandleBatch(const std::vector<native_handle_t * > handles)180*ec779b8eSAndroid Build Coastguard Worker void Camera::releaseRecordingFrameHandleBatch(
181*ec779b8eSAndroid Build Coastguard Worker         const std::vector<native_handle_t*> handles) {
182*ec779b8eSAndroid Build Coastguard Worker     ALOGV("releaseRecordingFrameHandleBatch");
183*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
184*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return;
185*ec779b8eSAndroid Build Coastguard Worker     c->releaseRecordingFrameHandleBatch(handles);
186*ec779b8eSAndroid Build Coastguard Worker }
187*ec779b8eSAndroid Build Coastguard Worker 
188*ec779b8eSAndroid Build Coastguard Worker // get preview state
previewEnabled()189*ec779b8eSAndroid Build Coastguard Worker bool Camera::previewEnabled()
190*ec779b8eSAndroid Build Coastguard Worker {
191*ec779b8eSAndroid Build Coastguard Worker     ALOGV("previewEnabled");
192*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
193*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return false;
194*ec779b8eSAndroid Build Coastguard Worker     return c->previewEnabled();
195*ec779b8eSAndroid Build Coastguard Worker }
196*ec779b8eSAndroid Build Coastguard Worker 
197*ec779b8eSAndroid Build Coastguard Worker // get recording state
recordingEnabled()198*ec779b8eSAndroid Build Coastguard Worker bool Camera::recordingEnabled()
199*ec779b8eSAndroid Build Coastguard Worker {
200*ec779b8eSAndroid Build Coastguard Worker     ALOGV("recordingEnabled");
201*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
202*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return false;
203*ec779b8eSAndroid Build Coastguard Worker     return c->recordingEnabled();
204*ec779b8eSAndroid Build Coastguard Worker }
205*ec779b8eSAndroid Build Coastguard Worker 
autoFocus()206*ec779b8eSAndroid Build Coastguard Worker status_t Camera::autoFocus()
207*ec779b8eSAndroid Build Coastguard Worker {
208*ec779b8eSAndroid Build Coastguard Worker     ALOGV("autoFocus");
209*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
210*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
211*ec779b8eSAndroid Build Coastguard Worker     return c->autoFocus();
212*ec779b8eSAndroid Build Coastguard Worker }
213*ec779b8eSAndroid Build Coastguard Worker 
cancelAutoFocus()214*ec779b8eSAndroid Build Coastguard Worker status_t Camera::cancelAutoFocus()
215*ec779b8eSAndroid Build Coastguard Worker {
216*ec779b8eSAndroid Build Coastguard Worker     ALOGV("cancelAutoFocus");
217*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
218*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
219*ec779b8eSAndroid Build Coastguard Worker     return c->cancelAutoFocus();
220*ec779b8eSAndroid Build Coastguard Worker }
221*ec779b8eSAndroid Build Coastguard Worker 
222*ec779b8eSAndroid Build Coastguard Worker // take a picture
takePicture(int msgType)223*ec779b8eSAndroid Build Coastguard Worker status_t Camera::takePicture(int msgType)
224*ec779b8eSAndroid Build Coastguard Worker {
225*ec779b8eSAndroid Build Coastguard Worker     ALOGV("takePicture: 0x%x", msgType);
226*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
227*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
228*ec779b8eSAndroid Build Coastguard Worker     return c->takePicture(msgType);
229*ec779b8eSAndroid Build Coastguard Worker }
230*ec779b8eSAndroid Build Coastguard Worker 
231*ec779b8eSAndroid Build Coastguard Worker // set preview/capture parameters - key/value pairs
setParameters(const String8 & params)232*ec779b8eSAndroid Build Coastguard Worker status_t Camera::setParameters(const String8& params)
233*ec779b8eSAndroid Build Coastguard Worker {
234*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setParameters");
235*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
236*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
237*ec779b8eSAndroid Build Coastguard Worker     return c->setParameters(params);
238*ec779b8eSAndroid Build Coastguard Worker }
239*ec779b8eSAndroid Build Coastguard Worker 
240*ec779b8eSAndroid Build Coastguard Worker // get preview/capture parameters - key/value pairs
getParameters() const241*ec779b8eSAndroid Build Coastguard Worker String8 Camera::getParameters() const
242*ec779b8eSAndroid Build Coastguard Worker {
243*ec779b8eSAndroid Build Coastguard Worker     ALOGV("getParameters");
244*ec779b8eSAndroid Build Coastguard Worker     String8 params;
245*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
246*ec779b8eSAndroid Build Coastguard Worker     if (c != 0) params = c->getParameters();
247*ec779b8eSAndroid Build Coastguard Worker     return params;
248*ec779b8eSAndroid Build Coastguard Worker }
249*ec779b8eSAndroid Build Coastguard Worker 
250*ec779b8eSAndroid Build Coastguard Worker // send command to camera driver
sendCommand(int32_t cmd,int32_t arg1,int32_t arg2)251*ec779b8eSAndroid Build Coastguard Worker status_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
252*ec779b8eSAndroid Build Coastguard Worker {
253*ec779b8eSAndroid Build Coastguard Worker     ALOGV("sendCommand");
254*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
255*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
256*ec779b8eSAndroid Build Coastguard Worker     return c->sendCommand(cmd, arg1, arg2);
257*ec779b8eSAndroid Build Coastguard Worker }
258*ec779b8eSAndroid Build Coastguard Worker 
setListener(const sp<CameraListener> & listener)259*ec779b8eSAndroid Build Coastguard Worker void Camera::setListener(const sp<CameraListener>& listener)
260*ec779b8eSAndroid Build Coastguard Worker {
261*ec779b8eSAndroid Build Coastguard Worker     Mutex::Autolock _l(mLock);
262*ec779b8eSAndroid Build Coastguard Worker     mListener = listener;
263*ec779b8eSAndroid Build Coastguard Worker }
264*ec779b8eSAndroid Build Coastguard Worker 
setPreviewCallbackFlags(int flag)265*ec779b8eSAndroid Build Coastguard Worker void Camera::setPreviewCallbackFlags(int flag)
266*ec779b8eSAndroid Build Coastguard Worker {
267*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setPreviewCallbackFlags");
268*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
269*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return;
270*ec779b8eSAndroid Build Coastguard Worker     c->setPreviewCallbackFlag(flag);
271*ec779b8eSAndroid Build Coastguard Worker }
272*ec779b8eSAndroid Build Coastguard Worker 
setPreviewCallbackTarget(const sp<SurfaceType> & target)273*ec779b8eSAndroid Build Coastguard Worker status_t Camera::setPreviewCallbackTarget(const sp<SurfaceType>& target) {
274*ec779b8eSAndroid Build Coastguard Worker     sp<::android::hardware::ICamera> c = mCamera;
275*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
276*ec779b8eSAndroid Build Coastguard Worker     return c->setPreviewCallbackTarget(target);
277*ec779b8eSAndroid Build Coastguard Worker }
278*ec779b8eSAndroid Build Coastguard Worker 
setAudioRestriction(int32_t mode)279*ec779b8eSAndroid Build Coastguard Worker status_t Camera::setAudioRestriction(int32_t mode)
280*ec779b8eSAndroid Build Coastguard Worker {
281*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
282*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
283*ec779b8eSAndroid Build Coastguard Worker     return c->setAudioRestriction(mode);
284*ec779b8eSAndroid Build Coastguard Worker }
285*ec779b8eSAndroid Build Coastguard Worker 
getGlobalAudioRestriction()286*ec779b8eSAndroid Build Coastguard Worker int32_t Camera::getGlobalAudioRestriction()
287*ec779b8eSAndroid Build Coastguard Worker {
288*ec779b8eSAndroid Build Coastguard Worker     sp <::android::hardware::ICamera> c = mCamera;
289*ec779b8eSAndroid Build Coastguard Worker     if (c == 0) return NO_INIT;
290*ec779b8eSAndroid Build Coastguard Worker     return c->getGlobalAudioRestriction();
291*ec779b8eSAndroid Build Coastguard Worker }
292*ec779b8eSAndroid Build Coastguard Worker 
293*ec779b8eSAndroid Build Coastguard Worker // callback from camera service
notifyCallback(int32_t msgType,int32_t ext1,int32_t ext2)294*ec779b8eSAndroid Build Coastguard Worker void Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
295*ec779b8eSAndroid Build Coastguard Worker {
296*ec779b8eSAndroid Build Coastguard Worker     return CameraBaseT::notifyCallback(msgType, ext1, ext2);
297*ec779b8eSAndroid Build Coastguard Worker }
298*ec779b8eSAndroid Build Coastguard Worker 
299*ec779b8eSAndroid Build Coastguard Worker // callback from camera service when frame or image is ready
dataCallback(int32_t msgType,const sp<IMemory> & dataPtr,camera_frame_metadata_t * metadata)300*ec779b8eSAndroid Build Coastguard Worker void Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
301*ec779b8eSAndroid Build Coastguard Worker                           camera_frame_metadata_t *metadata)
302*ec779b8eSAndroid Build Coastguard Worker {
303*ec779b8eSAndroid Build Coastguard Worker     sp<CameraListener> listener;
304*ec779b8eSAndroid Build Coastguard Worker     {
305*ec779b8eSAndroid Build Coastguard Worker         Mutex::Autolock _l(mLock);
306*ec779b8eSAndroid Build Coastguard Worker         listener = mListener;
307*ec779b8eSAndroid Build Coastguard Worker     }
308*ec779b8eSAndroid Build Coastguard Worker     if (listener != NULL) {
309*ec779b8eSAndroid Build Coastguard Worker         listener->postData(msgType, dataPtr, metadata);
310*ec779b8eSAndroid Build Coastguard Worker     }
311*ec779b8eSAndroid Build Coastguard Worker }
312*ec779b8eSAndroid Build Coastguard Worker 
313*ec779b8eSAndroid Build Coastguard Worker // callback from camera service when timestamped frame is ready
dataCallbackTimestamp(nsecs_t timestamp,int32_t msgType,const sp<IMemory> & dataPtr)314*ec779b8eSAndroid Build Coastguard Worker void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
315*ec779b8eSAndroid Build Coastguard Worker {
316*ec779b8eSAndroid Build Coastguard Worker     sp<CameraListener> listener;
317*ec779b8eSAndroid Build Coastguard Worker     {
318*ec779b8eSAndroid Build Coastguard Worker         Mutex::Autolock _l(mLock);
319*ec779b8eSAndroid Build Coastguard Worker         listener = mListener;
320*ec779b8eSAndroid Build Coastguard Worker     }
321*ec779b8eSAndroid Build Coastguard Worker 
322*ec779b8eSAndroid Build Coastguard Worker     if (listener != NULL) {
323*ec779b8eSAndroid Build Coastguard Worker         listener->postDataTimestamp(timestamp, msgType, dataPtr);
324*ec779b8eSAndroid Build Coastguard Worker     } else {
325*ec779b8eSAndroid Build Coastguard Worker         ALOGW("No listener was set. Drop a recording frame.");
326*ec779b8eSAndroid Build Coastguard Worker         releaseRecordingFrame(dataPtr);
327*ec779b8eSAndroid Build Coastguard Worker     }
328*ec779b8eSAndroid Build Coastguard Worker }
329*ec779b8eSAndroid Build Coastguard Worker 
recordingFrameHandleCallbackTimestamp(nsecs_t timestamp,native_handle_t * handle)330*ec779b8eSAndroid Build Coastguard Worker void Camera::recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle)
331*ec779b8eSAndroid Build Coastguard Worker {
332*ec779b8eSAndroid Build Coastguard Worker     sp<CameraListener> listener;
333*ec779b8eSAndroid Build Coastguard Worker     {
334*ec779b8eSAndroid Build Coastguard Worker         Mutex::Autolock _l(mLock);
335*ec779b8eSAndroid Build Coastguard Worker         listener = mListener;
336*ec779b8eSAndroid Build Coastguard Worker     }
337*ec779b8eSAndroid Build Coastguard Worker 
338*ec779b8eSAndroid Build Coastguard Worker     if (listener != NULL) {
339*ec779b8eSAndroid Build Coastguard Worker         listener->postRecordingFrameHandleTimestamp(timestamp, handle);
340*ec779b8eSAndroid Build Coastguard Worker     } else {
341*ec779b8eSAndroid Build Coastguard Worker         ALOGW("No listener was set. Drop a recording frame.");
342*ec779b8eSAndroid Build Coastguard Worker         releaseRecordingFrameHandle(handle);
343*ec779b8eSAndroid Build Coastguard Worker     }
344*ec779b8eSAndroid Build Coastguard Worker }
345*ec779b8eSAndroid Build Coastguard Worker 
recordingFrameHandleCallbackTimestampBatch(const std::vector<nsecs_t> & timestamps,const std::vector<native_handle_t * > & handles)346*ec779b8eSAndroid Build Coastguard Worker void Camera::recordingFrameHandleCallbackTimestampBatch(
347*ec779b8eSAndroid Build Coastguard Worker         const std::vector<nsecs_t>& timestamps,
348*ec779b8eSAndroid Build Coastguard Worker         const std::vector<native_handle_t*>& handles)
349*ec779b8eSAndroid Build Coastguard Worker {
350*ec779b8eSAndroid Build Coastguard Worker     sp<CameraListener> listener;
351*ec779b8eSAndroid Build Coastguard Worker     {
352*ec779b8eSAndroid Build Coastguard Worker         Mutex::Autolock _l(mLock);
353*ec779b8eSAndroid Build Coastguard Worker         listener = mListener;
354*ec779b8eSAndroid Build Coastguard Worker     }
355*ec779b8eSAndroid Build Coastguard Worker 
356*ec779b8eSAndroid Build Coastguard Worker     if (listener != NULL) {
357*ec779b8eSAndroid Build Coastguard Worker         listener->postRecordingFrameHandleTimestampBatch(timestamps, handles);
358*ec779b8eSAndroid Build Coastguard Worker     } else {
359*ec779b8eSAndroid Build Coastguard Worker         ALOGW("No listener was set. Drop a batch of recording frames.");
360*ec779b8eSAndroid Build Coastguard Worker         releaseRecordingFrameHandleBatch(handles);
361*ec779b8eSAndroid Build Coastguard Worker     }
362*ec779b8eSAndroid Build Coastguard Worker }
363*ec779b8eSAndroid Build Coastguard Worker 
getRecordingProxy()364*ec779b8eSAndroid Build Coastguard Worker sp<ICameraRecordingProxy> Camera::getRecordingProxy() {
365*ec779b8eSAndroid Build Coastguard Worker     ALOGV("getProxy");
366*ec779b8eSAndroid Build Coastguard Worker     return new RecordingProxy(this);
367*ec779b8eSAndroid Build Coastguard Worker }
368*ec779b8eSAndroid Build Coastguard Worker 
startRecording()369*ec779b8eSAndroid Build Coastguard Worker status_t Camera::RecordingProxy::startRecording()
370*ec779b8eSAndroid Build Coastguard Worker {
371*ec779b8eSAndroid Build Coastguard Worker     ALOGV("RecordingProxy::startRecording");
372*ec779b8eSAndroid Build Coastguard Worker     mCamera->reconnect();
373*ec779b8eSAndroid Build Coastguard Worker     return mCamera->startRecording();
374*ec779b8eSAndroid Build Coastguard Worker }
375*ec779b8eSAndroid Build Coastguard Worker 
stopRecording()376*ec779b8eSAndroid Build Coastguard Worker void Camera::RecordingProxy::stopRecording()
377*ec779b8eSAndroid Build Coastguard Worker {
378*ec779b8eSAndroid Build Coastguard Worker     ALOGV("RecordingProxy::stopRecording");
379*ec779b8eSAndroid Build Coastguard Worker     mCamera->stopRecording();
380*ec779b8eSAndroid Build Coastguard Worker }
381*ec779b8eSAndroid Build Coastguard Worker 
RecordingProxy(const sp<Camera> & camera)382*ec779b8eSAndroid Build Coastguard Worker Camera::RecordingProxy::RecordingProxy(const sp<Camera>& camera)
383*ec779b8eSAndroid Build Coastguard Worker {
384*ec779b8eSAndroid Build Coastguard Worker     mCamera = camera;
385*ec779b8eSAndroid Build Coastguard Worker }
386*ec779b8eSAndroid Build Coastguard Worker 
387*ec779b8eSAndroid Build Coastguard Worker }; // namespace android
388