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