Camera.cpp revision 35a055b8bfc6f3cbea409b2897caf936654519cb
13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/*
23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Copyright (C) 2008, The Android Open Source Project
43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Copyright (C) 2008 HTC Inc.
53cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
63cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License");
73cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** you may not use this file except in compliance with the License.
83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** You may obtain a copy of the License at
93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Unless required by applicable law or agreed to in writing, software
133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS,
143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** See the License for the specific language governing permissions and
163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** limitations under the License.
173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian*/
183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian//#define LOG_NDEBUG 0
203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#define LOG_TAG "Camera"
213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/Log.h>
223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/threads.h>
233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IServiceManager.h>
253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IMemory.h>
263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/Camera.h>
283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/ICameraService.h>
293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/Surface.h>
313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android {
333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// client singleton for camera service binder interface
353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianMutex Camera::mLock;
363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<ICameraService> Camera::mCameraService;
373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<Camera::DeathNotifier> Camera::mDeathNotifier;
383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// establish binder interface to camera service
403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst sp<ICameraService>& Camera::getCameraService()
413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    Mutex::Autolock _l(mLock);
433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (mCameraService.get() == 0) {
443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        sp<IServiceManager> sm = defaultServiceManager();
453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        sp<IBinder> binder;
463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        do {
473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            binder = sm->getService(String16("media.camera"));
483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            if (binder != 0)
493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian                break;
503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            LOGW("CameraService not published, waiting...");
513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            usleep(500000); // 0.5 s
523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } while(true);
533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        if (mDeathNotifier == NULL) {
543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            mDeathNotifier = new DeathNotifier();
553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        }
563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        binder->linkToDeath(mDeathNotifier);
573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        mCameraService = interface_cast<ICameraService>(binder);
583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGE_IF(mCameraService==0, "no CameraService!?");
603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return mCameraService;
613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------------
643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianCamera::Camera()
663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    init();
683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// construct a camera client from an existing camera remote
713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<Camera> Camera::create(const sp<ICamera>& camera)
723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian     LOGV("create");
743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian     if (camera == 0) {
753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian         LOGE("camera remote is a NULL pointer");
763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian         return 0;
773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian     }
783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp<Camera> c = new Camera();
803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (camera->connect(c) == NO_ERROR) {
813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c->mStatus = NO_ERROR;
823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c->mCamera = camera;
833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        camera->asBinder()->linkToDeath(c);
843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c;
863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::init()
893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    mStatus = UNKNOWN_ERROR;
913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianCamera::~Camera()
943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    disconnect();
963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
9835a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Changint32_t Camera::getNumberOfCameras()
9935a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang{
10035a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang    const sp<ICameraService>& cs = getCameraService();
10135a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang    if (cs == 0) return 0;
10235a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang    return cs->getNumberOfCameras();
10335a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang}
10435a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang
10535a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Changsp<Camera> Camera::connect(int cameraId)
1063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("connect");
1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp<Camera> c = new Camera();
1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    const sp<ICameraService>& cs = getCameraService();
1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (cs != 0) {
11135a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang        c->mCamera = cs->connect(c, cameraId);
1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c->mCamera != 0) {
1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c->mCamera->asBinder()->linkToDeath(c);
1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c->mStatus = NO_ERROR;
1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    } else {
1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c.clear();
1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c;
1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::disconnect()
1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("disconnect");
1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (mCamera != 0) {
1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        mCamera->disconnect();
127f8ed70a20f8b006539af98c8ad45be9561665f82Chih-Chung Chang        mCamera->asBinder()->unlinkToDeath(this);
1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        mCamera = 0;
1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::reconnect()
1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("reconnect");
1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->connect(this);
1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<ICamera> Camera::remote()
1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return mCamera;
1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::lock()
1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->lock();
1503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::unlock()
1533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->unlock();
1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// pass the buffered ISurface to the camera service
1603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setPreviewDisplay(const sp<Surface>& surface)
1613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("setPreviewDisplay");
1633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (surface != 0) {
1663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return c->setPreviewDisplay(surface->getISurface());
1673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    } else {
1683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGD("app passed NULL surface");
1693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return c->setPreviewDisplay(0);
1703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setPreviewDisplay(const sp<ISurface>& surface)
1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("setPreviewDisplay");
1763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (surface == 0) {
1773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        LOGD("app passed NULL surface");
1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->setPreviewDisplay(surface);
1823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// start preview mode
1863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startPreview()
1873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("startPreview");
1893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->startPreview();
1923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// start recording mode, must call setPreviewDisplay first
1953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startRecording()
1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("startRecording");
1983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->startRecording();
2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop preview mode
2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopPreview()
2053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("stopPreview");
2073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
2093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    c->stopPreview();
2103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop recording mode
2133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopRecording()
2143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("stopRecording");
2163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
2183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    c->stopRecording();
2193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// release a recording frame
2223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::releaseRecordingFrame(const sp<IMemory>& mem)
2233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("releaseRecordingFrame");
2253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
2273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    c->releaseRecordingFrame(mem);
2283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview state
2313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::previewEnabled()
2323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("previewEnabled");
2343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return false;
2363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->previewEnabled();
2373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get recording state
2403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::recordingEnabled()
2413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("recordingEnabled");
2433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return false;
2453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->recordingEnabled();
2463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::autoFocus()
2493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("autoFocus");
2513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->autoFocus();
2543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::cancelAutoFocus()
2573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("cancelAutoFocus");
2593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->cancelAutoFocus();
2623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// take a picture
2653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::takePicture()
2663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("takePicture");
2683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->takePicture();
2713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// set preview/capture parameters - key/value pairs
2743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setParameters(const String8& params)
2753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("setParameters");
2773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->setParameters(params);
2803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview/capture parameters - key/value pairs
2833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianString8 Camera::getParameters() const
2843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("getParameters");
2863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    String8 params;
2873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c != 0) params = mCamera->getParameters();
2893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return params;
2903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// send command to camera driver
2933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
2943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("sendCommand");
2963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->sendCommand(cmd, arg1, arg2);
2993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setListener(const sp<CameraListener>& listener)
3023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    Mutex::Autolock _l(mLock);
3043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    mListener = listener;
3053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setPreviewCallbackFlags(int flag)
3083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("setPreviewCallbackFlags");
3103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
3113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
3123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    mCamera->setPreviewCallbackFlag(flag);
3133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service
3163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
3173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp<CameraListener> listener;
3193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
3203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Mutex::Autolock _l(mLock);
3213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener = mListener;
3223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (listener != NULL) {
3243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener->notify(msgType, ext1, ext2);
3253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when frame or image is ready
3293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr)
3303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp<CameraListener> listener;
3323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
3333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Mutex::Autolock _l(mLock);
3343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener = mListener;
3353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (listener != NULL) {
3373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener->postData(msgType, dataPtr);
3383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when timestamped frame is ready
3423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
3433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp<CameraListener> listener;
3453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
3463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Mutex::Autolock _l(mLock);
3473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener = mListener;
3483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (listener != NULL) {
3503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener->postDataTimestamp(timestamp, msgType, dataPtr);
3513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::binderDied(const wp<IBinder>& who) {
3553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGW("ICamera died");
3563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0);
3573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::DeathNotifier::binderDied(const wp<IBinder>& who) {
3603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGV("binderDied");
3613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    Mutex::Autolock _l(Camera::mLock);
3623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    Camera::mCameraService.clear();
3633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    LOGW("Camera server died!");
3643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android
3673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
368