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