Camera.cpp revision 4b820b0e1fa069714b123fc35784541d0f94d267
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> 30c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICamera.h> 313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 328ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h> 33df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/Surface.h> 343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android { 363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 37c073ba525404f3416c2824c435d3d926a9892f1bIgor MurashkinCamera::Camera(int cameraId) 38c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin : CameraBase(cameraId) 393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 420f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben BrunkCameraTraits<Camera>::TCamConnectService CameraTraits<Camera>::fnConnectService = 430f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk &ICameraService::connect; 440f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk 453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// construct a camera client from an existing camera remote 463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<Camera> Camera::create(const sp<ICamera>& camera) 473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("create"); 493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (camera == 0) { 5029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("camera remote is a NULL pointer"); 513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return 0; 523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 54c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin sp<Camera> c = new Camera(-1); 553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (camera->connect(c) == NO_ERROR) { 563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->mStatus = NO_ERROR; 573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->mCamera = camera; 583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian camera->asBinder()->linkToDeath(c); 59627baacc748c5e2ed68bdb256aea4d70fcfe9ce4Wu-cheng Li return c; 603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 61627baacc748c5e2ed68bdb256aea4d70fcfe9ce4Wu-cheng Li return 0; 623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianCamera::~Camera() 653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 66d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang // We don't need to call disconnect() here because if the CameraService 67d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang // thinks we are the owner of the hardware, it will hold a (strong) 68d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang // reference to us, and we can't possibly be here. We also don't want to 69d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang // call disconnect() here if we are in the same process as mediaserver, 70d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang // because we may be invoked by CameraService::Client::connect() and will 71d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang // deadlock if we call any method of ICamera here. 723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 74ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalasp<Camera> Camera::connect(int cameraId, const String16& clientPackageName, 75ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala int clientUid) 763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 77c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin return CameraBaseT::connect(cameraId, clientPackageName, clientUid); 783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::reconnect() 813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reconnect"); 833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->connect(this); 863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::lock() 893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->lock(); 933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::unlock() 963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->unlock(); 1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1028ba01021b573889802e67e029225a96f0dfa471aAndy McFadden// pass the buffered IGraphicBufferProducer to the camera service 1034b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvalastatus_t Camera::setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer) 104bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis{ 1054b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala ALOGV("setPreviewTarget(%p)", bufferProducer.get()); 106bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis sp <ICamera> c = mCamera; 107bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis if (c == 0) return NO_INIT; 10899617adda9bc46c43f511f0940bc735c73de61deMathias Agopian ALOGD_IF(bufferProducer == 0, "app passed NULL surface"); 1091ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala return c->setPreviewTarget(bufferProducer); 110bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis} 111bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis 1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// start preview mode 1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startPreview() 1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("startPreview"); 1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->startPreview(); 1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 121e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dongstatus_t Camera::storeMetaDataInBuffers(bool enabled) 122e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong{ 1233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("storeMetaDataInBuffers: %s", 124e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong enabled? "true": "false"); 125e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong sp <ICamera> c = mCamera; 126e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong if (c == 0) return NO_INIT; 127e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong return c->storeMetaDataInBuffers(enabled); 128e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong} 129e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong 1304b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala// start recording mode, must call setPreviewTarget first 1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startRecording() 1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("startRecording"); 1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->startRecording(); 1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop preview mode 1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopPreview() 1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stopPreview"); 1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->stopPreview(); 1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop recording mode 1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopRecording() 1503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stopRecording"); 1524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 1534ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Mutex::Autolock _l(mLock); 1544ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li mRecordingProxyListener.clear(); 1554ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 1583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->stopRecording(); 1593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// release a recording frame 1623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::releaseRecordingFrame(const sp<IMemory>& mem) 1633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("releaseRecordingFrame"); 1653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 1673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->releaseRecordingFrame(mem); 1683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview state 1713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::previewEnabled() 1723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("previewEnabled"); 1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return false; 1763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->previewEnabled(); 1773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get recording state 1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::recordingEnabled() 1813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("recordingEnabled"); 1833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return false; 1853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->recordingEnabled(); 1863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::autoFocus() 1893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("autoFocus"); 1913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 1923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->autoFocus(); 1943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::cancelAutoFocus() 1973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("cancelAutoFocus"); 1993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->cancelAutoFocus(); 2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// take a picture 205e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dongstatus_t Camera::takePicture(int msgType) 2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("takePicture: 0x%x", msgType); 2083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 210e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong return c->takePicture(msgType); 2113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// set preview/capture parameters - key/value pairs 2143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setParameters(const String8& params) 2153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameters"); 2173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->setParameters(params); 2203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview/capture parameters - key/value pairs 2233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianString8 Camera::getParameters() const 2243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getParameters"); 2263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian String8 params; 2273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c != 0) params = mCamera->getParameters(); 2293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return params; 2303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// send command to camera driver 2333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) 2343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("sendCommand"); 2363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->sendCommand(cmd, arg1, arg2); 2393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setListener(const sp<CameraListener>& listener) 2423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Mutex::Autolock _l(mLock); 2443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mListener = listener; 2453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2474ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Livoid Camera::setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener) 2484ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 2494ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Mutex::Autolock _l(mLock); 2504ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li mRecordingProxyListener = listener; 2514ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li} 2524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 2533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setPreviewCallbackFlags(int flag) 2543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setPreviewCallbackFlags"); 2563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian sp <ICamera> c = mCamera; 2573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 2583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mCamera->setPreviewCallbackFlag(flag); 2593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2613ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvalastatus_t Camera::setPreviewCallbackTarget( 2623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IGraphicBufferProducer>& callbackProducer) 2633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala{ 2643ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala sp <ICamera> c = mCamera; 2653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala if (c == 0) return NO_INIT; 2663ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala return c->setPreviewCallbackTarget(callbackProducer); 2673ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala} 2683ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 2693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service 2703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 2713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 272c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin return CameraBaseT::notifyCallback(msgType, ext1, ext2); 2733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when frame or image is ready 27657c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Livoid Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 27757c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata) 2783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 279fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin sp<CameraListener> listener; 280fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin { 281fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin Mutex::Autolock _l(mLock); 282fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin listener = mListener; 283fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin } 284fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin if (listener != NULL) { 285fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin listener->postData(msgType, dataPtr, metadata); 286fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin } 2873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when timestamped frame is ready 2903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) 2913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2924ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li // If recording proxy listener is registered, forward the frame and return. 2934ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li // The other listener (mListener) is ignored because the receiver needs to 2944ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li // call releaseRecordingFrame. 2954ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<ICameraRecordingProxyListener> proxylistener; 2964ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 2974ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Mutex::Autolock _l(mLock); 2984ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li proxylistener = mRecordingProxyListener; 2994ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 3004ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li if (proxylistener != NULL) { 3014ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li proxylistener->dataCallbackTimestamp(timestamp, msgType, dataPtr); 3024ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return; 3034ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 3044ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 305fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin sp<CameraListener> listener; 306fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin { 307fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin Mutex::Autolock _l(mLock); 308fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin listener = mListener; 309fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin } 310fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin 311fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin if (listener != NULL) { 312fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin listener->postDataTimestamp(timestamp, msgType, dataPtr); 313fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin } else { 3145ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("No listener was set. Drop a recording frame."); 315c42478ed7b8a379d2f8a43d4d349680c8a37573fJames Dong releaseRecordingFrame(dataPtr); 3163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 3173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3194ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Lisp<ICameraRecordingProxy> Camera::getRecordingProxy() { 3203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getProxy"); 3214ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return new RecordingProxy(this); 3224ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li} 3234ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 3244ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Listatus_t Camera::RecordingProxy::startRecording(const sp<ICameraRecordingProxyListener>& listener) 3254ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 3263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("RecordingProxy::startRecording"); 3274ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li mCamera->setRecordingProxyListener(listener); 3284ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li mCamera->reconnect(); 3294ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return mCamera->startRecording(); 3304ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li} 3314ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 3324ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Livoid Camera::RecordingProxy::stopRecording() 3334ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 3343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("RecordingProxy::stopRecording"); 3354ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li mCamera->stopRecording(); 3364ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li} 3374ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 3384ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Livoid Camera::RecordingProxy::releaseRecordingFrame(const sp<IMemory>& mem) 3394ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 3403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("RecordingProxy::releaseRecordingFrame"); 3414ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li mCamera->releaseRecordingFrame(mem); 3424ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li} 3434ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 3444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng LiCamera::RecordingProxy::RecordingProxy(const sp<Camera>& camera) 3454ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 3464ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li mCamera = camera; 3474ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li} 3484ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 3493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android 350