Camera.cpp revision ceb388d6c03c38b96dc41c0ea4804b749aa077c4
13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/*
23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Copyright (C) 2008, The Android Open Source Project
43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
53cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License");
63cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** you may not use this file except in compliance with the License.
73cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** You may obtain a copy of the License at
83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian**
113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** Unless required by applicable law or agreed to in writing, software
123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS,
133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** See the License for the specific language governing permissions and
153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian** limitations under the License.
163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian*/
173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian//#define LOG_NDEBUG 0
193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#define LOG_TAG "Camera"
203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/Log.h>
213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/threads.h>
22ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala#include <utils/String16.h>
234ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <binder/IPCThreadState.h>
243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IServiceManager.h>
253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <binder/IMemory.h>
263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/Camera.h>
284ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h>
293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <camera/ICameraService.h>
303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
318ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
32df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/Surface.h>
333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android {
353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// client singleton for camera service binder interface
373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianMutex Camera::mLock;
383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<ICameraService> Camera::mCameraService;
393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<Camera::DeathNotifier> Camera::mDeathNotifier;
403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// establish binder interface to camera service
423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianconst sp<ICameraService>& Camera::getCameraService()
433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    Mutex::Autolock _l(mLock);
453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (mCameraService.get() == 0) {
463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        sp<IServiceManager> sm = defaultServiceManager();
473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        sp<IBinder> binder;
483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        do {
493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            binder = sm->getService(String16("media.camera"));
503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            if (binder != 0)
513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian                break;
525ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block            ALOGW("CameraService not published, waiting...");
533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            usleep(500000); // 0.5 s
543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        } while(true);
553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        if (mDeathNotifier == NULL) {
563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            mDeathNotifier = new DeathNotifier();
573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        }
583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        binder->linkToDeath(mDeathNotifier);
593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        mCameraService = interface_cast<ICameraService>(binder);
603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
6129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    ALOGE_IF(mCameraService==0, "no CameraService!?");
623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return mCameraService;
633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ---------------------------------------------------------------------------
663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianCamera::Camera()
683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    init();
703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// construct a camera client from an existing camera remote
733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<Camera> Camera::create(const sp<ICamera>& camera)
743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block     ALOGV("create");
763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian     if (camera == 0) {
7729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block         ALOGE("camera remote is a NULL pointer");
783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian         return 0;
793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian     }
803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp<Camera> c = new Camera();
823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (camera->connect(c) == NO_ERROR) {
833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c->mStatus = NO_ERROR;
843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c->mCamera = camera;
853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        camera->asBinder()->linkToDeath(c);
86627baacc748c5e2ed68bdb256aea4d70fcfe9ce4Wu-cheng Li        return c;
873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
88627baacc748c5e2ed68bdb256aea4d70fcfe9ce4Wu-cheng Li    return 0;
893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::init()
923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    mStatus = UNKNOWN_ERROR;
943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianCamera::~Camera()
973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
98d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // We don't need to call disconnect() here because if the CameraService
99d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // thinks we are the owner of the hardware, it will hold a (strong)
100d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // reference to us, and we can't possibly be here. We also don't want to
101d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // call disconnect() here if we are in the same process as mediaserver,
102d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // because we may be invoked by CameraService::Client::connect() and will
103d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // deadlock if we call any method of ICamera here.
1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
10635a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Changint32_t Camera::getNumberOfCameras()
10735a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang{
10835a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang    const sp<ICameraService>& cs = getCameraService();
10935a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang    if (cs == 0) return 0;
11035a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang    return cs->getNumberOfCameras();
11135a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang}
11235a055b8bfc6f3cbea409b2897caf936654519cbChih-Chung Chang
113ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Changstatus_t Camera::getCameraInfo(int cameraId,
114ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang                               struct CameraInfo* cameraInfo) {
115ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang    const sp<ICameraService>& cs = getCameraService();
116ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang    if (cs == 0) return UNKNOWN_ERROR;
117ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang    return cs->getCameraInfo(cameraId, cameraInfo);
118ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang}
119ddbdb35d176266b5ab64c30178f5cb76c5b1b4b4Chih-Chung Chang
120ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalasp<Camera> Camera::connect(int cameraId, const String16& clientPackageName,
121ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        int clientUid)
1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("connect");
1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp<Camera> c = new Camera();
125634a51509ee50475f3e9f8ccf897e90fc72ded31Igor Murashkin    sp<ICameraClient> cl = c;
1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    const sp<ICameraService>& cs = getCameraService();
1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (cs != 0) {
128ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        c->mCamera = cs->connect(cl, cameraId, clientPackageName, clientUid);
1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c->mCamera != 0) {
1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c->mCamera->asBinder()->linkToDeath(c);
1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c->mStatus = NO_ERROR;
1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    } else {
1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c.clear();
1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c;
1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::disconnect()
1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("disconnect");
1423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (mCamera != 0) {
1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        mCamera->disconnect();
144f8ed70a20f8b006539af98c8ad45be9561665f82Chih-Chung Chang        mCamera->asBinder()->unlinkToDeath(this);
1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        mCamera = 0;
1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::reconnect()
1503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("reconnect");
1523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->connect(this);
1553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<ICamera> Camera::remote()
1583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return mCamera;
1603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::lock()
1633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->lock();
1673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::unlock()
1703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->unlock();
1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1764b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis// pass the buffered Surface to the camera service
1773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setPreviewDisplay(const sp<Surface>& surface)
1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setPreviewDisplay(%p)", surface.get());
1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (surface != 0) {
1834b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis        return c->setPreviewDisplay(surface);
1843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    } else {
185b8a805261bf0282e992d3608035e47d05a898710Steve Block        ALOGD("app passed NULL surface");
1863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return c->setPreviewDisplay(0);
1873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1908ba01021b573889802e67e029225a96f0dfa471aAndy McFadden// pass the buffered IGraphicBufferProducer to the camera service
1918ba01021b573889802e67e029225a96f0dfa471aAndy McFaddenstatus_t Camera::setPreviewTexture(const sp<IGraphicBufferProducer>& bufferProducer)
192bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis{
1938ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    ALOGV("setPreviewTexture(%p)", bufferProducer.get());
194bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    sp <ICamera> c = mCamera;
195bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    if (c == 0) return NO_INIT;
1968ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    if (bufferProducer != 0) {
1978ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        return c->setPreviewTexture(bufferProducer);
198bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    } else {
199b8a805261bf0282e992d3608035e47d05a898710Steve Block        ALOGD("app passed NULL surface");
200bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        return c->setPreviewTexture(0);
201bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    }
202bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis}
203bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis
2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// start preview mode
2053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startPreview()
2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("startPreview");
2083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->startPreview();
2113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
213e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dongstatus_t Camera::storeMetaDataInBuffers(bool enabled)
214e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong{
2153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("storeMetaDataInBuffers: %s",
216e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            enabled? "true": "false");
217e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    sp <ICamera> c = mCamera;
218e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    if (c == 0) return NO_INIT;
219e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    return c->storeMetaDataInBuffers(enabled);
220e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong}
221e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong
2223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// start recording mode, must call setPreviewDisplay first
2233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startRecording()
2243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("startRecording");
2263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->startRecording();
2293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop preview mode
2323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopPreview()
2333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stopPreview");
2353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
2373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    c->stopPreview();
2383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop recording mode
2413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopRecording()
2423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stopRecording");
2444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    {
2454ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        Mutex::Autolock _l(mLock);
2464ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        mRecordingProxyListener.clear();
2474ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    }
2483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
2503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    c->stopRecording();
2513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// release a recording frame
2543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::releaseRecordingFrame(const sp<IMemory>& mem)
2553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("releaseRecordingFrame");
2573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
2593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    c->releaseRecordingFrame(mem);
2603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview state
2633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::previewEnabled()
2643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("previewEnabled");
2663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return false;
2683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->previewEnabled();
2693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get recording state
2723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::recordingEnabled()
2733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("recordingEnabled");
2753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return false;
2773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->recordingEnabled();
2783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::autoFocus()
2813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("autoFocus");
2833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->autoFocus();
2863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::cancelAutoFocus()
2893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("cancelAutoFocus");
2913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->cancelAutoFocus();
2943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// take a picture
297e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dongstatus_t Camera::takePicture(int msgType)
2983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("takePicture: 0x%x", msgType);
3003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
3013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
302e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong    return c->takePicture(msgType);
3033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// set preview/capture parameters - key/value pairs
3063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setParameters(const String8& params)
3073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setParameters");
3093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
3103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
3113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->setParameters(params);
3123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview/capture parameters - key/value pairs
3153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianString8 Camera::getParameters() const
3163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getParameters");
3183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    String8 params;
3193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
3203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c != 0) params = mCamera->getParameters();
3213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return params;
3223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// send command to camera driver
3253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
3263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("sendCommand");
3283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
3293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
3303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->sendCommand(cmd, arg1, arg2);
3313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setListener(const sp<CameraListener>& listener)
3343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    Mutex::Autolock _l(mLock);
3363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    mListener = listener;
3373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3394ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Livoid Camera::setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener)
3404ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{
3414ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    Mutex::Autolock _l(mLock);
3424ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mRecordingProxyListener = listener;
3434ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
3444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
3453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setPreviewCallbackFlags(int flag)
3463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setPreviewCallbackFlags");
3483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
3493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
3503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    mCamera->setPreviewCallbackFlag(flag);
3513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service
3543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
3553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp<CameraListener> listener;
3573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
3583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Mutex::Autolock _l(mLock);
3593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener = mListener;
3603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (listener != NULL) {
3623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener->notify(msgType, ext1, ext2);
3633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when frame or image is ready
36757c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Livoid Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
36857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li                          camera_frame_metadata_t *metadata)
3693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp<CameraListener> listener;
3713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
3723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Mutex::Autolock _l(mLock);
3733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener = mListener;
3743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (listener != NULL) {
37657c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li        listener->postData(msgType, dataPtr, metadata);
3773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when timestamped frame is ready
3813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
3823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
3834ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    // If recording proxy listener is registered, forward the frame and return.
3844ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    // The other listener (mListener) is ignored because the receiver needs to
3854ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    // call releaseRecordingFrame.
3864ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    sp<ICameraRecordingProxyListener> proxylistener;
3874ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    {
3884ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        Mutex::Autolock _l(mLock);
3894ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        proxylistener = mRecordingProxyListener;
3904ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    }
3914ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    if (proxylistener != NULL) {
3924ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        proxylistener->dataCallbackTimestamp(timestamp, msgType, dataPtr);
3934ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        return;
3944ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    }
3954ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
3963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp<CameraListener> listener;
3973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    {
3983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        Mutex::Autolock _l(mLock);
3993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener = mListener;
4003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
4013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (listener != NULL) {
4023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        listener->postDataTimestamp(timestamp, msgType, dataPtr);
403c42478ed7b8a379d2f8a43d4d349680c8a37573fJames Dong    } else {
4045ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block        ALOGW("No listener was set. Drop a recording frame.");
405c42478ed7b8a379d2f8a43d4d349680c8a37573fJames Dong        releaseRecordingFrame(dataPtr);
4063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
4073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::binderDied(const wp<IBinder>& who) {
4105ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block    ALOGW("ICamera died");
4113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0);
4123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::DeathNotifier::binderDied(const wp<IBinder>& who) {
4153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("binderDied");
4163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    Mutex::Autolock _l(Camera::mLock);
4173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    Camera::mCameraService.clear();
4185ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block    ALOGW("Camera server died!");
4193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
4203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
4214ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Lisp<ICameraRecordingProxy> Camera::getRecordingProxy() {
4223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getProxy");
4234ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    return new RecordingProxy(this);
4244ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
4254ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
4264ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Listatus_t Camera::RecordingProxy::startRecording(const sp<ICameraRecordingProxyListener>& listener)
4274ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{
4283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("RecordingProxy::startRecording");
4294ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mCamera->setRecordingProxyListener(listener);
4304ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mCamera->reconnect();
4314ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    return mCamera->startRecording();
4324ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
4334ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
4344ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Livoid Camera::RecordingProxy::stopRecording()
4354ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{
4363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("RecordingProxy::stopRecording");
4374ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mCamera->stopRecording();
4384ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
4394ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
4404ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Livoid Camera::RecordingProxy::releaseRecordingFrame(const sp<IMemory>& mem)
4414ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{
4423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("RecordingProxy::releaseRecordingFrame");
4434ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mCamera->releaseRecordingFrame(mem);
4444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
4454ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
4464ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng LiCamera::RecordingProxy::RecordingProxy(const sp<Camera>& camera)
4474ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{
4484ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mCamera = camera;
4494ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
4504ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
4513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android
452