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