19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright (C) 2008, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "Camera"
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
2242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li#include <binder/IPCThreadState.h>
23000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <binder/IServiceManager.h>
240795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IMemory.h>
25000479f9e325b4e426a67033abd92d47da412725Mathias Agopian
26000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <camera/Camera.h>
2742419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h>
28000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <camera/ICameraService.h>
29000479f9e325b4e426a67033abd92d47da412725Mathias Agopian
30000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <surfaceflinger/Surface.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// client singleton for camera service binder interface
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectMutex Camera::mLock;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<ICameraService> Camera::mCameraService;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<Camera::DeathNotifier> Camera::mDeathNotifier;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// establish binder interface to camera service
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst sp<ICameraService>& Camera::getCameraService()
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock _l(mLock);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mCameraService.get() == 0) {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<IServiceManager> sm = defaultServiceManager();
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sp<IBinder> binder;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        do {
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            binder = sm->getService(String16("media.camera"));
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (binder != 0)
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOGW("CameraService not published, waiting...");
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            usleep(500000); // 0.5 s
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } while(true);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDeathNotifier == NULL) {
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDeathNotifier = new DeathNotifier();
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        binder->linkToDeath(mDeathNotifier);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCameraService = interface_cast<ICameraService>(binder);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGE_IF(mCameraService==0, "no CameraService!?");
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mCameraService;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectCamera::Camera()
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    init();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70325ac475c51dc0d54503f725179ea2d9353485bbJames Dong// construct a camera client from an existing camera remote
712adc2dbbd65fc89983f20702db2004f9b8cf8258James Dongsp<Camera> Camera::create(const sp<ICamera>& camera)
722adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong{
73325ac475c51dc0d54503f725179ea2d9353485bbJames Dong     LOGV("create");
74325ac475c51dc0d54503f725179ea2d9353485bbJames Dong     if (camera == 0) {
75325ac475c51dc0d54503f725179ea2d9353485bbJames Dong         LOGE("camera remote is a NULL pointer");
76325ac475c51dc0d54503f725179ea2d9353485bbJames Dong         return 0;
77325ac475c51dc0d54503f725179ea2d9353485bbJames Dong     }
78325ac475c51dc0d54503f725179ea2d9353485bbJames Dong
792adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong    sp<Camera> c = new Camera();
802adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong    if (camera->connect(c) == NO_ERROR) {
812adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong        c->mStatus = NO_ERROR;
822adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong        c->mCamera = camera;
832adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong        camera->asBinder()->linkToDeath(c);
840e73cdc9834c21df6363e7ed2b6acef5180b4dfcWu-cheng Li        return c;
852adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong    }
860e73cdc9834c21df6363e7ed2b6acef5180b4dfcWu-cheng Li    return 0;
872adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong}
882adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Camera::init()
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mStatus = UNKNOWN_ERROR;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectCamera::~Camera()
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
96553447b8ff949618f299bba38ef04c2b6740f1d3Chih-Chung Chang    // We don't need to call disconnect() here because if the CameraService
97553447b8ff949618f299bba38ef04c2b6740f1d3Chih-Chung Chang    // thinks we are the owner of the hardware, it will hold a (strong)
98553447b8ff949618f299bba38ef04c2b6740f1d3Chih-Chung Chang    // reference to us, and we can't possibly be here. We also don't want to
99553447b8ff949618f299bba38ef04c2b6740f1d3Chih-Chung Chang    // call disconnect() here if we are in the same process as mediaserver,
100553447b8ff949618f299bba38ef04c2b6740f1d3Chih-Chung Chang    // because we may be invoked by CameraService::Client::connect() and will
101553447b8ff949618f299bba38ef04c2b6740f1d3Chih-Chung Chang    // deadlock if we call any method of ICamera here.
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
104e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Changint32_t Camera::getNumberOfCameras()
105e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang{
106e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    const sp<ICameraService>& cs = getCameraService();
107e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    if (cs == 0) return 0;
108e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    return cs->getNumberOfCameras();
109e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang}
110e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang
111b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Changstatus_t Camera::getCameraInfo(int cameraId,
112b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang                               struct CameraInfo* cameraInfo) {
113b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    const sp<ICameraService>& cs = getCameraService();
114b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    if (cs == 0) return UNKNOWN_ERROR;
115b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    return cs->getCameraInfo(cameraId, cameraInfo);
116b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang}
117b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
118e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Changsp<Camera> Camera::connect(int cameraId)
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("connect");
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<Camera> c = new Camera();
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const sp<ICameraService>& cs = getCameraService();
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (cs != 0) {
124e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang        c->mCamera = cs->connect(c, cameraId);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c->mCamera != 0) {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->mCamera->asBinder()->linkToDeath(c);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c->mStatus = NO_ERROR;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        c.clear();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Camera::disconnect()
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("disconnect");
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mCamera != 0) {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCamera->disconnect();
140cfea8fda1291feab9b04a1c99824d1a3965782a8Chih-Chung Chang        mCamera->asBinder()->unlinkToDeath(this);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCamera = 0;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t Camera::reconnect()
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("reconnect");
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return NO_INIT;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->connect(this);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<ICamera> Camera::remote()
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mCamera;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t Camera::lock()
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return NO_INIT;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->lock();
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t Camera::unlock()
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return NO_INIT;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->unlock();
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17285cfdd011241a5f2fb7fabc65b5943a39af7e1deJamie Gennis// pass the buffered Surface to the camera service
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t Camera::setPreviewDisplay(const sp<Surface>& surface)
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17585cfdd011241a5f2fb7fabc65b5943a39af7e1deJamie Gennis    LOGV("setPreviewDisplay(%p)", surface.get());
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return NO_INIT;
178b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li    if (surface != 0) {
17985cfdd011241a5f2fb7fabc65b5943a39af7e1deJamie Gennis        return c->setPreviewDisplay(surface);
180b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li    } else {
181b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li        LOGD("app passed NULL surface");
182b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li        return c->setPreviewDisplay(0);
183b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li    }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
186ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis// pass the buffered ISurfaceTexture to the camera service
187ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennisstatus_t Camera::setPreviewTexture(const sp<ISurfaceTexture>& surfaceTexture)
188ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis{
189ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis    LOGV("setPreviewTexture(%p)", surfaceTexture.get());
190ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis    sp <ICamera> c = mCamera;
191ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis    if (c == 0) return NO_INIT;
192ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis    if (surfaceTexture != 0) {
193ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis        return c->setPreviewTexture(surfaceTexture);
194ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis    } else {
195ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis        LOGD("app passed NULL surface");
196ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis        return c->setPreviewTexture(0);
197ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis    }
198ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis}
199ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis
200b8a10fe45657f2dcc50cae8a06805f8438a6937eWu-cheng Li// start preview mode
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t Camera::startPreview()
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("startPreview");
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return NO_INIT;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->startPreview();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20938311859e809118f2cba3597d056abffe4eb80c0James Dongstatus_t Camera::storeMetaDataInBuffers(bool enabled)
21038311859e809118f2cba3597d056abffe4eb80c0James Dong{
21138311859e809118f2cba3597d056abffe4eb80c0James Dong    LOGV("storeMetaDataInBuffers: %s",
21238311859e809118f2cba3597d056abffe4eb80c0James Dong            enabled? "true": "false");
21338311859e809118f2cba3597d056abffe4eb80c0James Dong    sp <ICamera> c = mCamera;
21438311859e809118f2cba3597d056abffe4eb80c0James Dong    if (c == 0) return NO_INIT;
21538311859e809118f2cba3597d056abffe4eb80c0James Dong    return c->storeMetaDataInBuffers(enabled);
21638311859e809118f2cba3597d056abffe4eb80c0James Dong}
21738311859e809118f2cba3597d056abffe4eb80c0James Dong
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// start recording mode, must call setPreviewDisplay first
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t Camera::startRecording()
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("startRecording");
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return NO_INIT;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->startRecording();
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// stop preview mode
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Camera::stopPreview()
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("stopPreview");
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->stopPreview();
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// stop recording mode
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Camera::stopRecording()
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("stopRecording");
24042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    {
24142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        Mutex::Autolock _l(mLock);
24242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        mRecordingProxyListener.clear();
24342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->stopRecording();
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// release a recording frame
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Camera::releaseRecordingFrame(const sp<IMemory>& mem)
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("releaseRecordingFrame");
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    c->releaseRecordingFrame(mem);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// get preview state
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool Camera::previewEnabled()
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("previewEnabled");
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return false;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->previewEnabled();
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// get recording state
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool Camera::recordingEnabled()
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("recordingEnabled");
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return false;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->recordingEnabled();
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t Camera::autoFocus()
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("autoFocus");
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return NO_INIT;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->autoFocus();
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
284244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Changstatus_t Camera::cancelAutoFocus()
285244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang{
286244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    LOGV("cancelAutoFocus");
287244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    sp <ICamera> c = mCamera;
288244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    if (c == 0) return NO_INIT;
289244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang    return c->cancelAutoFocus();
290244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang}
291244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// take a picture
293e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dongstatus_t Camera::takePicture(int msgType)
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
295e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    LOGV("takePicture: 0x%x", msgType);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return NO_INIT;
298e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong    return c->takePicture(msgType);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// set preview/capture parameters - key/value pairs
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t Camera::setParameters(const String8& params)
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("setParameters");
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c == 0) return NO_INIT;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return c->setParameters(params);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// get preview/capture parameters - key/value pairs
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectString8 Camera::getParameters() const
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("getParameters");
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 params;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp <ICamera> c = mCamera;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (c != 0) params = mCamera->getParameters();
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return params;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li// send command to camera driver
32136f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Listatus_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
32236f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li{
323ca9d9dc8271017e60e3a0e477e416283433e721cWu-cheng Li    LOGV("sendCommand");
32436f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    sp <ICamera> c = mCamera;
32536f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    if (c == 0) return NO_INIT;
32636f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li    return c->sendCommand(cmd, arg1, arg2);
32736f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li}
32836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li
3295e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparksvoid Camera::setListener(const sp<CameraListener>& listener)
3305e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks{
3315e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    Mutex::Autolock _l(mLock);
3325e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    mListener = listener;
3335e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks}
3345e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks
33542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Livoid Camera::setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener)
33642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li{
33742419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    Mutex::Autolock _l(mLock);
33842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    mRecordingProxyListener = listener;
33942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li}
34042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
3415e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparksvoid Camera::setPreviewCallbackFlags(int flag)
3425e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks{
3435e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    LOGV("setPreviewCallbackFlags");
3445e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    sp <ICamera> c = mCamera;
3455e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    if (c == 0) return;
3465e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    mCamera->setPreviewCallbackFlag(flag);
3475e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks}
3485e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks
3492a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks// callback from camera service
3502a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparksvoid Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
3512a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks{
3525e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    sp<CameraListener> listener;
3535e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    {
3545e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks        Mutex::Autolock _l(mLock);
3555e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks        listener = mListener;
3565e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    }
3575e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    if (listener != NULL) {
3585e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks        listener->notify(msgType, ext1, ext2);
3595e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    }
3602a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks}
3612a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks
362d6289b1b03d209219c2dd3126ee8839a45682b33Dave Sparks// callback from camera service when frame or image is ready
363bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Livoid Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
364bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li                          camera_frame_metadata_t *metadata)
3652a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks{
3665e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    sp<CameraListener> listener;
3675e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    {
3685e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks        Mutex::Autolock _l(mLock);
3695e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks        listener = mListener;
3705e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    }
3715e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    if (listener != NULL) {
372bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li        listener->postData(msgType, dataPtr, metadata);
3735e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    }
3742a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks}
3752a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks
37659c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks// callback from camera service when timestamped frame is ready
37759c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparksvoid Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
37859c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks{
37942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    // If recording proxy listener is registered, forward the frame and return.
38042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    // The other listener (mListener) is ignored because the receiver needs to
38142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    // call releaseRecordingFrame.
38242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    sp<ICameraRecordingProxyListener> proxylistener;
38342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    {
38442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        Mutex::Autolock _l(mLock);
38542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        proxylistener = mRecordingProxyListener;
38642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    }
38742419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    if (proxylistener != NULL) {
38842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        proxylistener->dataCallbackTimestamp(timestamp, msgType, dataPtr);
38942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        return;
39042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    }
39142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
39259c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    sp<CameraListener> listener;
39359c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    {
39459c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        Mutex::Autolock _l(mLock);
39559c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        listener = mListener;
39659c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    }
39759c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    if (listener != NULL) {
39859c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks        listener->postDataTimestamp(timestamp, msgType, dataPtr);
399df7a856d3d7a62049e3d1091cf07e95019da4609James Dong    } else {
400df7a856d3d7a62049e3d1091cf07e95019da4609James Dong        LOGW("No listener was set. Drop a recording frame.");
401df7a856d3d7a62049e3d1091cf07e95019da4609James Dong        releaseRecordingFrame(dataPtr);
40259c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    }
40359c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks}
40459c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Camera::binderDied(const wp<IBinder>& who) {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGW("ICamera died");
407a1b653d41df9a7999e1dba2a508295671ff6771dJames Dong    notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, 0);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Camera::DeathNotifier::binderDied(const wp<IBinder>& who) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGV("binderDied");
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock _l(Camera::mLock);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Camera::mCameraService.clear();
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOGW("Camera server died!");
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41742419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Lisp<ICameraRecordingProxy> Camera::getRecordingProxy() {
41842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    LOGV("getProxy");
41942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    return new RecordingProxy(this);
42042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li}
42142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
42242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Listatus_t Camera::RecordingProxy::startRecording(const sp<ICameraRecordingProxyListener>& listener)
42342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li{
42442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    LOGV("RecordingProxy::startRecording");
42542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    mCamera->setRecordingProxyListener(listener);
42642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    mCamera->reconnect();
42742419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    return mCamera->startRecording();
42842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li}
42942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
43042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Livoid Camera::RecordingProxy::stopRecording()
43142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li{
43242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    LOGV("RecordingProxy::stopRecording");
43342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    mCamera->stopRecording();
43442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li}
43542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
43642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Livoid Camera::RecordingProxy::releaseRecordingFrame(const sp<IMemory>& mem)
43742419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li{
43842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    LOGV("RecordingProxy::releaseRecordingFrame");
43942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    mCamera->releaseRecordingFrame(mem);
44042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li}
44142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
44242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng LiCamera::RecordingProxy::RecordingProxy(const sp<Camera>& camera)
44342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li{
44442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    mCamera = camera;
44542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li}
44642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
448