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 27d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <Camera.h> 28d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <ICameraRecordingProxyListener.h> 29d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICameraService.h> 30d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/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 = 43d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala &::android::hardware::ICameraService::connect; 440f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk 453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// construct a camera client from an existing camera remote 46d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalasp<Camera> Camera::create(const sp<::android::hardware::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; 5806b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen IInterface::asBinder(camera)->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 74280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganovsp<Camera> Camera::connect(int cameraId, const String16& clientPackageName, 7598a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen int clientUid, int clientPid) 763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 7798a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen return CameraBaseT::connect(cameraId, clientPackageName, clientUid, clientPid); 783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 80b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun Hestatus_t Camera::connectLegacy(int cameraId, int halVersion, 81280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganov const String16& clientPackageName, 82b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He int clientUid, 83b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He sp<Camera>& camera) 84b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He{ 85b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He ALOGV("%s: connect legacy camera device", __FUNCTION__); 86b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He sp<Camera> c = new Camera(cameraId); 87d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<::android::hardware::ICameraClient> cl = c; 88b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He status_t status = NO_ERROR; 89d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const sp<::android::hardware::ICameraService>& cs = CameraBaseT::getCameraService(); 90b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He 91d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala binder::Status ret; 92d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (cs != nullptr) { 93d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ret = cs.get()->connectLegacy(cl, cameraId, halVersion, clientPackageName, 94d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala clientUid, /*out*/&(c->mCamera)); 95b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He } 96d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (ret.isOk() && c->mCamera != nullptr) { 9706b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen IInterface::asBinder(c->mCamera)->linkToDeath(c); 98b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He c->mStatus = NO_ERROR; 99b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He camera = c; 100b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He } else { 1013525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala switch(ret.serviceSpecificErrorCode()) { 1023525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala case hardware::ICameraService::ERROR_DISCONNECTED: 1033525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala status = -ENODEV; 1043525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala break; 1053525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala case hardware::ICameraService::ERROR_CAMERA_IN_USE: 1063525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala status = -EBUSY; 1073525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala break; 1083525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala case hardware::ICameraService::ERROR_INVALID_OPERATION: 1093525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala status = -EINVAL; 1103525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala break; 1113525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala case hardware::ICameraService::ERROR_MAX_CAMERAS_IN_USE: 1123525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala status = -EUSERS; 1133525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala break; 1143525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT: 1153525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala status = BAD_VALUE; 1163525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala break; 1173525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala case hardware::ICameraService::ERROR_DEPRECATED_HAL: 1183525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala status = -EOPNOTSUPP; 1193525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala break; 1203525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala case hardware::ICameraService::ERROR_DISABLED: 1213525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala status = -EACCES; 1223525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala break; 1233525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala case hardware::ICameraService::ERROR_PERMISSION_DENIED: 1243525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala status = PERMISSION_DENIED; 1253525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala break; 1263525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala default: 1273525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala status = -EINVAL; 1283525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala ALOGW("An error occurred while connecting to camera %d: %s", cameraId, 1293525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala (cs != nullptr) ? "Service not available" : ret.toString8().string()); 1303525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala break; 1313525dd92724e4942c9259f19581d63b93f18e14bEino-Ville Talvala } 132b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He c.clear(); 133b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He } 134b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He return status; 135b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He} 136b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He 1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::reconnect() 1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1393856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reconnect"); 140d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->connect(this); 1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::lock() 1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 147d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 1483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->lock(); 1503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::unlock() 1533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 154d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 1553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->unlock(); 1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1598ba01021b573889802e67e029225a96f0dfa471aAndy McFadden// pass the buffered IGraphicBufferProducer to the camera service 1604b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvalastatus_t Camera::setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer) 161bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis{ 1624b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala ALOGV("setPreviewTarget(%p)", bufferProducer.get()); 163d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 164bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis if (c == 0) return NO_INIT; 16599617adda9bc46c43f511f0940bc735c73de61deMathias Agopian ALOGD_IF(bufferProducer == 0, "app passed NULL surface"); 1661ce7c34e67c2cf58dd88c31f36f4bd62e375f7f0Eino-Ville Talvala return c->setPreviewTarget(bufferProducer); 167bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis} 168bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis 1698cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chenstatus_t Camera::setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer) 1708cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen{ 1718cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGV("setVideoTarget(%p)", bufferProducer.get()); 172d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 1738cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen if (c == 0) return NO_INIT; 1748cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGD_IF(bufferProducer == 0, "app passed NULL video surface"); 1758cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return c->setVideoTarget(bufferProducer); 1768cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen} 1778cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen 1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// start preview mode 1793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startPreview() 1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("startPreview"); 182d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 1833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 1843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->startPreview(); 1853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 1863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 1878cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chenstatus_t Camera::setVideoBufferMode(int32_t videoBufferMode) 188e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong{ 1898cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen ALOGV("setVideoBufferMode: %d", videoBufferMode); 190d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 191e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong if (c == 0) return NO_INIT; 1928cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen return c->setVideoBufferMode(videoBufferMode); 193e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong} 194e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong 1954b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala// start recording mode, must call setPreviewTarget first 1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startRecording() 1973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("startRecording"); 199d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->startRecording(); 2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop preview mode 2053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopPreview() 2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stopPreview"); 208d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 2093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 2103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->stopPreview(); 2113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop recording mode 2143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopRecording() 2153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stopRecording"); 2174ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 2184ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Mutex::Autolock _l(mLock); 2194ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li mRecordingProxyListener.clear(); 2204ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 221d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 2223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 2233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->stopRecording(); 2243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// release a recording frame 2273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::releaseRecordingFrame(const sp<IMemory>& mem) 2283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("releaseRecordingFrame"); 230d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 2313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 2323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian c->releaseRecordingFrame(mem); 2333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2352d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chenvoid Camera::releaseRecordingFrameHandle(native_handle_t* handle) 2362d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen{ 2372d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGV("releaseRecordingFrameHandle"); 2382d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen sp <::android::hardware::ICamera> c = mCamera; 2392d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen if (c == 0) return; 2402d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen c->releaseRecordingFrameHandle(handle); 2412d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen} 2422d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 2433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview state 2443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::previewEnabled() 2453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("previewEnabled"); 247d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 2483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return false; 2493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->previewEnabled(); 2503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get recording state 2533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::recordingEnabled() 2543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("recordingEnabled"); 256d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 2573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return false; 2583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->recordingEnabled(); 2593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::autoFocus() 2623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("autoFocus"); 264d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 2653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->autoFocus(); 2673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::cancelAutoFocus() 2703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("cancelAutoFocus"); 272d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 2733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->cancelAutoFocus(); 2753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// take a picture 278e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dongstatus_t Camera::takePicture(int msgType) 2793cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("takePicture: 0x%x", msgType); 281d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 2823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 283e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong return c->takePicture(msgType); 2843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// set preview/capture parameters - key/value pairs 2873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setParameters(const String8& params) 2883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameters"); 290d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 2913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 2923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->setParameters(params); 2933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 2943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 2953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview/capture parameters - key/value pairs 2963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianString8 Camera::getParameters() const 2973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 2983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getParameters"); 2993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian String8 params; 300d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 3013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c != 0) params = mCamera->getParameters(); 3023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return params; 3033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// send command to camera driver 3063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) 3073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 3083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("sendCommand"); 309d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 3103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return NO_INIT; 3113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian return c->sendCommand(cmd, arg1, arg2); 3123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setListener(const sp<CameraListener>& listener) 3153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 3163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian Mutex::Autolock _l(mLock); 3173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mListener = listener; 3183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3204ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Livoid Camera::setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener) 3214ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 3224ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Mutex::Autolock _l(mLock); 3234ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li mRecordingProxyListener = listener; 3244ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li} 3254ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 3263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setPreviewCallbackFlags(int flag) 3273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 3283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setPreviewCallbackFlags"); 329d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 3303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian if (c == 0) return; 3313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian mCamera->setPreviewCallbackFlag(flag); 3323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3343ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvalastatus_t Camera::setPreviewCallbackTarget( 3353ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala const sp<IGraphicBufferProducer>& callbackProducer) 3363ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala{ 337d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp <::android::hardware::ICamera> c = mCamera; 3383ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala if (c == 0) return NO_INIT; 3393ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala return c->setPreviewCallbackTarget(callbackProducer); 3403ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala} 3413ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala 3423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service 3433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) 3443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 345c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin return CameraBaseT::notifyCallback(msgType, ext1, ext2); 3463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when frame or image is ready 34957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Livoid Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr, 35057c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li camera_frame_metadata_t *metadata) 3513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 352fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin sp<CameraListener> listener; 353fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin { 354fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin Mutex::Autolock _l(mLock); 355fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin listener = mListener; 356fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin } 357fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin if (listener != NULL) { 358fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin listener->postData(msgType, dataPtr, metadata); 359fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin } 3603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when timestamped frame is ready 3633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) 3643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{ 3654ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li // If recording proxy listener is registered, forward the frame and return. 3664ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li // The other listener (mListener) is ignored because the receiver needs to 3674ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li // call releaseRecordingFrame. 3684ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li sp<ICameraRecordingProxyListener> proxylistener; 3694ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li { 3704ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li Mutex::Autolock _l(mLock); 3714ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li proxylistener = mRecordingProxyListener; 3724ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 3734ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li if (proxylistener != NULL) { 3744ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li proxylistener->dataCallbackTimestamp(timestamp, msgType, dataPtr); 3754ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li return; 3764ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li } 3774ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 378fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin sp<CameraListener> listener; 379fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin { 380fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin Mutex::Autolock _l(mLock); 381fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin listener = mListener; 382fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin } 383fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin 384fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin if (listener != NULL) { 385fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin listener->postDataTimestamp(timestamp, msgType, dataPtr); 386fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin } else { 3875ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("No listener was set. Drop a recording frame."); 388c42478ed7b8a379d2f8a43d4d349680c8a37573fJames Dong releaseRecordingFrame(dataPtr); 3893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian } 3903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian} 3913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian 3922d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chenvoid Camera::recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle) 3932d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen{ 3942d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // If recording proxy listener is registered, forward the frame and return. 3952d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // The other listener (mListener) is ignored because the receiver needs to 3962d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen // call releaseRecordingFrameHandle. 3972d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen sp<ICameraRecordingProxyListener> proxylistener; 3982d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen { 3992d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen Mutex::Autolock _l(mLock); 4002d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen proxylistener = mRecordingProxyListener; 4012d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } 4022d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen if (proxylistener != NULL) { 4032d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen proxylistener->recordingFrameHandleCallbackTimestamp(timestamp, handle); 4042d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen return; 4052d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } 4062d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 4072d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen sp<CameraListener> listener; 4082d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen { 4092d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen Mutex::Autolock _l(mLock); 4102d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen listener = mListener; 4112d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } 4122d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 4132d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen if (listener != NULL) { 4142d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen listener->postRecordingFrameHandleTimestamp(timestamp, handle); 4152d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } else { 4162d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGW("No listener was set. Drop a recording frame."); 4172d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen releaseRecordingFrameHandle(handle); 4182d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen } 4192d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen} 4202d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 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 4462d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chenvoid Camera::RecordingProxy::releaseRecordingFrameHandle(native_handle_t* handle) { 4472d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen ALOGV("RecordingProxy::releaseRecordingFrameHandle"); 4482d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen mCamera->releaseRecordingFrameHandle(handle); 4492d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen} 4502d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen 4514ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng LiCamera::RecordingProxy::RecordingProxy(const sp<Camera>& camera) 4524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{ 4534ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li mCamera = camera; 4544ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li} 4554ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li 4563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android 457