Camera.cpp revision 48af7e8dd40883d6154e7029d9500072b551b5fa
16df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui/*
26df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui**
36df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui** Copyright (C) 2008, The Android Open Source Project
46df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui**
56df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui** Licensed under the Apache License, Version 2.0 (the "License");
66df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui** you may not use this file except in compliance with the License.
76df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui** You may obtain a copy of the License at
86df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui**
96df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui**     http://www.apache.org/licenses/LICENSE-2.0
106df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui**
116df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui** Unless required by applicable law or agreed to in writing, software
126df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui** distributed under the License is distributed on an "AS IS" BASIS,
136df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui** See the License for the specific language governing permissions and
156df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui** limitations under the License.
166df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui*/
176df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
186df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui//#define LOG_NDEBUG 0
196df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#define LOG_TAG "Camera"
206df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#include <utils/Log.h>
216df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#include <utils/threads.h>
221b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <utils/String16.h>
236df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#include <binder/IPCThreadState.h>
246df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#include <binder/IServiceManager.h>
256df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#include <binder/IMemory.h>
266df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
276df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#include <camera/Camera.h>
286df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#include <camera/ICameraRecordingProxyListener.h>
296df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#include <camera/ICameraService.h>
306df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
316df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#include <gui/IGraphicBufferProducer.h>
326df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui#include <gui/Surface.h>
336df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
346df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuinamespace android {
356df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
366df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// client singleton for camera service binder interface
376df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuiMutex Camera::mLock;
386df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuisp<ICameraService> Camera::mCameraService;
396df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuisp<Camera::DeathNotifier> Camera::mDeathNotifier;
406df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
416df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// establish binder interface to camera service
426df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuiconst sp<ICameraService>& Camera::getCameraService()
436df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
446df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    Mutex::Autolock _l(mLock);
456df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (mCameraService.get() == 0) {
466df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        sp<IServiceManager> sm = defaultServiceManager();
476df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        sp<IBinder> binder;
486df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        do {
496df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui            binder = sm->getService(String16("media.camera"));
506df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui            if (binder != 0)
516df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui                break;
526df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui            ALOGW("CameraService not published, waiting...");
536df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui            usleep(500000); // 0.5 s
546df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        } while(true);
556df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        if (mDeathNotifier == NULL) {
566df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui            mDeathNotifier = new DeathNotifier();
576df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        }
586df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        binder->linkToDeath(mDeathNotifier);
59e0fb528f8e3bbab04620c8534177168b358e837bztenghui        mCameraService = interface_cast<ICameraService>(binder);
60e0fb528f8e3bbab04620c8534177168b358e837bztenghui    }
616df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGE_IF(mCameraService==0, "no CameraService!?");
621b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    return mCameraService;
636df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
646df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
656df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// ---------------------------------------------------------------------------
666df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
676df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuiCamera::Camera()
686df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
696df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    init();
706df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
716df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
726df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// construct a camera client from an existing camera remote
736df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuisp<Camera> Camera::create(const sp<ICamera>& camera)
743db62dfc5102247d415df4667bd9609e669fc022ztenghui{
753db62dfc5102247d415df4667bd9609e669fc022ztenghui     ALOGV("create");
766df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui     if (camera == 0) {
776df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui         ALOGE("camera remote is a NULL pointer");
786df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui         return 0;
796df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui     }
806df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
816df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp<Camera> c = new Camera();
826df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (camera->connect(c) == NO_ERROR) {
836df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        c->mStatus = NO_ERROR;
846df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        c->mCamera = camera;
856df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        camera->asBinder()->linkToDeath(c);
866df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        return c;
876df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    }
886df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return 0;
896df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
906df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
916df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuivoid Camera::init()
926df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
936df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    mStatus = UNKNOWN_ERROR;
946df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
956df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
966df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuiCamera::~Camera()
976df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
986df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    // We don't need to call disconnect() here because if the CameraService
996df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    // thinks we are the owner of the hardware, it will hold a (strong)
1006df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    // reference to us, and we can't possibly be here. We also don't want to
1016df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    // call disconnect() here if we are in the same process as mediaserver,
1026df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    // because we may be invoked by CameraService::Client::connect() and will
1036df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    // deadlock if we call any method of ICamera here.
1046df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
1056df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
1066df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuiint32_t Camera::getNumberOfCameras()
1076df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
1086df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    const sp<ICameraService>& cs = getCameraService();
1096df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (cs == 0) return 0;
1106df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return cs->getNumberOfCameras();
1116df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
1126df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
1136df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::getCameraInfo(int cameraId,
1146df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui                               struct CameraInfo* cameraInfo) {
1156df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    const sp<ICameraService>& cs = getCameraService();
1166df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (cs == 0) return UNKNOWN_ERROR;
1176df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return cs->getCameraInfo(cameraId, cameraInfo);
1186df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
1196df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
1206df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuisp<Camera> Camera::connect(int cameraId, const String16& clientPackageName,
1216df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        int clientUid)
1226df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
1236df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("connect");
1246df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp<Camera> c = new Camera();
1256df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp<ICameraClient> cl = c;
1266df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    const sp<ICameraService>& cs = getCameraService();
1276df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (cs != 0) {
1286df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        c->mCamera = cs->connect(cl, cameraId, clientPackageName, clientUid);
1296df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    }
1306df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c->mCamera != 0) {
1316df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        c->mCamera->asBinder()->linkToDeath(c);
1326df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        c->mStatus = NO_ERROR;
1336df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    } else {
1346df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        c.clear();
1356df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    }
1366df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c;
1376df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
1386df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
1396df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuivoid Camera::disconnect()
1406df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
1416df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("disconnect");
1426df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (mCamera != 0) {
1436df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        mCamera->disconnect();
1446df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        mCamera->asBinder()->unlinkToDeath(this);
1456df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        mCamera = 0;
146e0fb528f8e3bbab04620c8534177168b358e837bztenghui    }
1476df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
1486df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
1496df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::reconnect()
1506df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
1516df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("reconnect");
1526df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
1536df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return NO_INIT;
1546df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->connect(this);
1556df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
1566df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
1576df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuisp<ICamera> Camera::remote()
1586df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
1596df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return mCamera;
1606df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
1616df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
1626df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::lock()
1636df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
1646df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
1656df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return NO_INIT;
1666df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->lock();
1676df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
1686df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
1696df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::unlock()
1706df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
1716df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
1726df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return NO_INIT;
1736df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->unlock();
1746df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
1756df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
1766df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// pass the buffered Surface to the camera service
1776df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::setPreviewDisplay(const sp<Surface>& surface)
1786df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
1796df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("setPreviewDisplay(%p)", surface.get());
1806df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
1816df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return NO_INIT;
1826df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (surface != 0) {
1836df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        return c->setPreviewDisplay(surface);
1846df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    } else {
1856df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        ALOGD("app passed NULL surface");
1866df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        return c->setPreviewDisplay(0);
1876df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    }
1886df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
1896df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
1906df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// pass the buffered IGraphicBufferProducer to the camera service
1916df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::setPreviewTexture(const sp<IGraphicBufferProducer>& bufferProducer)
1926df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
1936df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("setPreviewTexture(%p)", bufferProducer.get());
1946df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
1956df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return NO_INIT;
1966df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (bufferProducer != 0) {
1976df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        return c->setPreviewTexture(bufferProducer);
1986df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    } else {
1996df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        ALOGD("app passed NULL surface");
2006df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        return c->setPreviewTexture(0);
2016df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    }
2026df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2036df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
2046df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// start preview mode
2056df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::startPreview()
2066df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
2076df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("startPreview");
2086df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
2096df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return NO_INIT;
2106df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->startPreview();
2116df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2126df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
2136df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::storeMetaDataInBuffers(bool enabled)
2146df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
2156df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("storeMetaDataInBuffers: %s",
216e0fb528f8e3bbab04620c8534177168b358e837bztenghui            enabled? "true": "false");
2176df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
2186df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return NO_INIT;
2196df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->storeMetaDataInBuffers(enabled);
2206df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2216df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
222e0fb528f8e3bbab04620c8534177168b358e837bztenghui// start recording mode, must call setPreviewDisplay first
2236df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::startRecording()
2246df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
2256df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("startRecording");
2266df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
2276df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return NO_INIT;
2286df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->startRecording();
2296df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2306df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
2316df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// stop preview mode
2326df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuivoid Camera::stopPreview()
2336df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
2346df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("stopPreview");
2356df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
2366df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return;
2376df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    c->stopPreview();
2386df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2396df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
2406df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// stop recording mode
2416df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuivoid Camera::stopRecording()
2426df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
2436df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("stopRecording");
2446df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    {
2456df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        Mutex::Autolock _l(mLock);
2466df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui        mRecordingProxyListener.clear();
2476df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    }
2486df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
2496df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return;
2506df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    c->stopRecording();
2516df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2526df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
2536df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// release a recording frame
254e0fb528f8e3bbab04620c8534177168b358e837bztenghuivoid Camera::releaseRecordingFrame(const sp<IMemory>& mem)
255e0fb528f8e3bbab04620c8534177168b358e837bztenghui{
256e0fb528f8e3bbab04620c8534177168b358e837bztenghui    ALOGV("releaseRecordingFrame");
257e0fb528f8e3bbab04620c8534177168b358e837bztenghui    sp <ICamera> c = mCamera;
258e0fb528f8e3bbab04620c8534177168b358e837bztenghui    if (c == 0) return;
259e0fb528f8e3bbab04620c8534177168b358e837bztenghui    c->releaseRecordingFrame(mem);
2606df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2616df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
2626df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// get preview state
2636df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuibool Camera::previewEnabled()
2646df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
2656df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("previewEnabled");
2666df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
2676df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return false;
2686df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->previewEnabled();
2696df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2706df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
2716df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// get recording state
2726df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuibool Camera::recordingEnabled()
2736df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
2746df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("recordingEnabled");
2756df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
2766df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return false;
2776df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->recordingEnabled();
2786df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2796df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
2806df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::autoFocus()
2816df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
2826df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("autoFocus");
2836df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
2846df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return NO_INIT;
2856df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->autoFocus();
2866df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2876df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
2886df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::cancelAutoFocus()
2896df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
2906df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("cancelAutoFocus");
2916df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
2926df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    if (c == 0) return NO_INIT;
2936df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->cancelAutoFocus();
2946df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
2956df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
2966df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// take a picture
2976df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::takePicture(int msgType)
2986df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui{
2996df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    ALOGV("takePicture: 0x%x", msgType);
3006df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    sp <ICamera> c = mCamera;
301e0fb528f8e3bbab04620c8534177168b358e837bztenghui    if (c == 0) return NO_INIT;
3026df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui    return c->takePicture(msgType);
3036df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui}
3046df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui
3056df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghui// set preview/capture parameters - key/value pairs
3066df48bfe8cccdfec58f5f94be3cf3a2c64697e56ztenghuistatus_t Camera::setParameters(const String8& params)
307{
308    ALOGV("setParameters");
309    sp <ICamera> c = mCamera;
310    if (c == 0) return NO_INIT;
311    return c->setParameters(params);
312}
313
314// get preview/capture parameters - key/value pairs
315String8 Camera::getParameters() const
316{
317    ALOGV("getParameters");
318    String8 params;
319    sp <ICamera> c = mCamera;
320    if (c != 0) params = mCamera->getParameters();
321    return params;
322}
323
324// send command to camera driver
325status_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
326{
327    ALOGV("sendCommand");
328    sp <ICamera> c = mCamera;
329    if (c == 0) return NO_INIT;
330    return c->sendCommand(cmd, arg1, arg2);
331}
332
333void Camera::setListener(const sp<CameraListener>& listener)
334{
335    Mutex::Autolock _l(mLock);
336    mListener = listener;
337}
338
339void Camera::setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener)
340{
341    Mutex::Autolock _l(mLock);
342    mRecordingProxyListener = listener;
343}
344
345void Camera::setPreviewCallbackFlags(int flag)
346{
347    ALOGV("setPreviewCallbackFlags");
348    sp <ICamera> c = mCamera;
349    if (c == 0) return;
350    mCamera->setPreviewCallbackFlag(flag);
351}
352
353// callback from camera service
354void Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
355{
356    sp<CameraListener> listener;
357    {
358        Mutex::Autolock _l(mLock);
359        listener = mListener;
360    }
361    if (listener != NULL) {
362        listener->notify(msgType, ext1, ext2);
363    }
364}
365
366// callback from camera service when frame or image is ready
367void Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
368                          camera_frame_metadata_t *metadata)
369{
370    sp<CameraListener> listener;
371    {
372        Mutex::Autolock _l(mLock);
373        listener = mListener;
374    }
375    if (listener != NULL) {
376        listener->postData(msgType, dataPtr, metadata);
377    }
378}
379
380// callback from camera service when timestamped frame is ready
381void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
382{
383    // If recording proxy listener is registered, forward the frame and return.
384    // The other listener (mListener) is ignored because the receiver needs to
385    // call releaseRecordingFrame.
386    sp<ICameraRecordingProxyListener> proxylistener;
387    {
388        Mutex::Autolock _l(mLock);
389        proxylistener = mRecordingProxyListener;
390    }
391    if (proxylistener != NULL) {
392        proxylistener->dataCallbackTimestamp(timestamp, msgType, dataPtr);
393        return;
394    }
395
396    sp<CameraListener> listener;
397    {
398        Mutex::Autolock _l(mLock);
399        listener = mListener;
400    }
401    if (listener != NULL) {
402        listener->postDataTimestamp(timestamp, msgType, dataPtr);
403    } else {
404        ALOGW("No listener was set. Drop a recording frame.");
405        releaseRecordingFrame(dataPtr);
406    }
407}
408
409void Camera::binderDied(const wp<IBinder>& who) {
410    ALOGW("ICamera died");
411    notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0);
412}
413
414void Camera::DeathNotifier::binderDied(const wp<IBinder>& who) {
415    ALOGV("binderDied");
416    Mutex::Autolock _l(Camera::mLock);
417    Camera::mCameraService.clear();
418    ALOGW("Camera server died!");
419}
420
421sp<ICameraRecordingProxy> Camera::getRecordingProxy() {
422    ALOGV("getProxy");
423    return new RecordingProxy(this);
424}
425
426status_t Camera::RecordingProxy::startRecording(const sp<ICameraRecordingProxyListener>& listener)
427{
428    ALOGV("RecordingProxy::startRecording");
429    mCamera->setRecordingProxyListener(listener);
430    mCamera->reconnect();
431    return mCamera->startRecording();
432}
433
434void Camera::RecordingProxy::stopRecording()
435{
436    ALOGV("RecordingProxy::stopRecording");
437    mCamera->stopRecording();
438}
439
440void Camera::RecordingProxy::releaseRecordingFrame(const sp<IMemory>& mem)
441{
442    ALOGV("RecordingProxy::releaseRecordingFrame");
443    mCamera->releaseRecordingFrame(mem);
444}
445
446Camera::RecordingProxy::RecordingProxy(const sp<Camera>& camera)
447{
448    mCamera = camera;
449}
450
451}; // namespace android
452