Camera.cpp revision fa4cf9d310685b4c25877cba772ff7da84caf517
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
423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// construct a camera client from an existing camera remote
433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiansp<Camera> Camera::create(const sp<ICamera>& camera)
443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block     ALOGV("create");
463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian     if (camera == 0) {
4729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block         ALOGE("camera remote is a NULL pointer");
483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian         return 0;
493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian     }
503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
51c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    sp<Camera> c = new Camera(-1);
523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (camera->connect(c) == NO_ERROR) {
533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c->mStatus = NO_ERROR;
543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        c->mCamera = camera;
553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        camera->asBinder()->linkToDeath(c);
56627baacc748c5e2ed68bdb256aea4d70fcfe9ce4Wu-cheng Li        return c;
573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
58627baacc748c5e2ed68bdb256aea4d70fcfe9ce4Wu-cheng Li    return 0;
593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianCamera::~Camera()
623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
63d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // We don't need to call disconnect() here because if the CameraService
64d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // thinks we are the owner of the hardware, it will hold a (strong)
65d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // reference to us, and we can't possibly be here. We also don't want to
66d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // call disconnect() here if we are in the same process as mediaserver,
67d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // because we may be invoked by CameraService::Client::connect() and will
68d06618ee31c11ac7ac6698f95444041a4785a5abChih-Chung Chang    // deadlock if we call any method of ICamera here.
693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
71ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalasp<Camera> Camera::connect(int cameraId, const String16& clientPackageName,
72ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala        int clientUid)
733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
74c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    return CameraBaseT::connect(cameraId, clientPackageName, clientUid);
753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::reconnect()
783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("reconnect");
803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->connect(this);
833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::lock()
863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->lock();
903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::unlock()
933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->unlock();
973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
994b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis// pass the buffered Surface to the camera service
1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setPreviewDisplay(const sp<Surface>& surface)
1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setPreviewDisplay(%p)", surface.get());
1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (surface != 0) {
1064b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis        return c->setPreviewDisplay(surface);
1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    } else {
108b8a805261bf0282e992d3608035e47d05a898710Steve Block        ALOGD("app passed NULL surface");
1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian        return c->setPreviewDisplay(0);
1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1138ba01021b573889802e67e029225a96f0dfa471aAndy McFadden// pass the buffered IGraphicBufferProducer to the camera service
1148ba01021b573889802e67e029225a96f0dfa471aAndy McFaddenstatus_t Camera::setPreviewTexture(const sp<IGraphicBufferProducer>& bufferProducer)
115bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis{
1168ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    ALOGV("setPreviewTexture(%p)", bufferProducer.get());
117bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    sp <ICamera> c = mCamera;
118bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    if (c == 0) return NO_INIT;
1198ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    if (bufferProducer != 0) {
1208ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        return c->setPreviewTexture(bufferProducer);
121bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    } else {
122b8a805261bf0282e992d3608035e47d05a898710Steve Block        ALOGD("app passed NULL surface");
123bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis        return c->setPreviewTexture(0);
124bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis    }
125bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis}
126bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis
1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// start preview mode
1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startPreview()
1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("startPreview");
1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->startPreview();
1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
136e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dongstatus_t Camera::storeMetaDataInBuffers(bool enabled)
137e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong{
1383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("storeMetaDataInBuffers: %s",
139e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            enabled? "true": "false");
140e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    sp <ICamera> c = mCamera;
141e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    if (c == 0) return NO_INIT;
142e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong    return c->storeMetaDataInBuffers(enabled);
143e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong}
144e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong
1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// start recording mode, must call setPreviewDisplay first
1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::startRecording()
1473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("startRecording");
1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
1513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->startRecording();
1523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop preview mode
1553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopPreview()
1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stopPreview");
1583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
1603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    c->stopPreview();
1613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1623cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// stop recording mode
1643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::stopRecording()
1653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("stopRecording");
1674ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    {
1684ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        Mutex::Autolock _l(mLock);
1694ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        mRecordingProxyListener.clear();
1704ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    }
1713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
1733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    c->stopRecording();
1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// release a recording frame
1773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::releaseRecordingFrame(const sp<IMemory>& mem)
1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("releaseRecordingFrame");
1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
1823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    c->releaseRecordingFrame(mem);
1833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview state
1863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::previewEnabled()
1873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("previewEnabled");
1893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return false;
1913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->previewEnabled();
1923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
1933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get recording state
1953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianbool Camera::recordingEnabled()
1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
1973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("recordingEnabled");
1983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
1993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return false;
2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->recordingEnabled();
2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::autoFocus()
2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("autoFocus");
2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->autoFocus();
2093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::cancelAutoFocus()
2123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("cancelAutoFocus");
2143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->cancelAutoFocus();
2173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// take a picture
220e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dongstatus_t Camera::takePicture(int msgType)
2213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("takePicture: 0x%x", msgType);
2233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
225e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong    return c->takePicture(msgType);
2263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// set preview/capture parameters - key/value pairs
2293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::setParameters(const String8& params)
2303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setParameters");
2323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->setParameters(params);
2353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// get preview/capture parameters - key/value pairs
2383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias AgopianString8 Camera::getParameters() const
2393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getParameters");
2413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    String8 params;
2423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c != 0) params = mCamera->getParameters();
2443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return params;
2453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// send command to camera driver
2483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianstatus_t Camera::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
2493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("sendCommand");
2513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2523cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return NO_INIT;
2533cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    return c->sendCommand(cmd, arg1, arg2);
2543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setListener(const sp<CameraListener>& listener)
2573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2583cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    Mutex::Autolock _l(mLock);
2593cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    mListener = listener;
2603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2613cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2624ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Livoid Camera::setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener)
2634ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{
2644ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    Mutex::Autolock _l(mLock);
2654ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mRecordingProxyListener = listener;
2664ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
2674ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
2683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::setPreviewCallbackFlags(int flag)
2693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("setPreviewCallbackFlags");
2713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    sp <ICamera> c = mCamera;
2723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    if (c == 0) return;
2733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    mCamera->setPreviewCallbackFlag(flag);
2743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service
2773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2)
2783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
279c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    return CameraBaseT::notifyCallback(msgType, ext1, ext2);
2803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when frame or image is ready
28357c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Livoid Camera::dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
28457c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li                          camera_frame_metadata_t *metadata)
2853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
286fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    sp<CameraListener> listener;
287fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    {
288fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin        Mutex::Autolock _l(mLock);
289fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin        listener = mListener;
290fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    }
291fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    if (listener != NULL) {
292fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin        listener->postData(msgType, dataPtr, metadata);
293fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    }
2943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
2953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// callback from camera service when timestamped frame is ready
2973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianvoid Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)
2983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
2994ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    // If recording proxy listener is registered, forward the frame and return.
3004ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    // The other listener (mListener) is ignored because the receiver needs to
3014ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    // call releaseRecordingFrame.
3024ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    sp<ICameraRecordingProxyListener> proxylistener;
3034ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    {
3044ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        Mutex::Autolock _l(mLock);
3054ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        proxylistener = mRecordingProxyListener;
3064ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    }
3074ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    if (proxylistener != NULL) {
3084ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        proxylistener->dataCallbackTimestamp(timestamp, msgType, dataPtr);
3094ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        return;
3104ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    }
3114ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
312fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    sp<CameraListener> listener;
313fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    {
314fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin        Mutex::Autolock _l(mLock);
315fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin        listener = mListener;
316fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    }
317fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin
318fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    if (listener != NULL) {
319fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin        listener->postDataTimestamp(timestamp, msgType, dataPtr);
320fa4cf9d310685b4c25877cba772ff7da84caf517Igor Murashkin    } else {
3215ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block        ALOGW("No listener was set. Drop a recording frame.");
322c42478ed7b8a379d2f8a43d4d349680c8a37573fJames Dong        releaseRecordingFrame(dataPtr);
3233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    }
3243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}
3253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
3264ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Lisp<ICameraRecordingProxy> Camera::getRecordingProxy() {
3273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("getProxy");
3284ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    return new RecordingProxy(this);
3294ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
3304ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
3314ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Listatus_t Camera::RecordingProxy::startRecording(const sp<ICameraRecordingProxyListener>& listener)
3324ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{
3333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("RecordingProxy::startRecording");
3344ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mCamera->setRecordingProxyListener(listener);
3354ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mCamera->reconnect();
3364ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    return mCamera->startRecording();
3374ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
3384ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
3394ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Livoid Camera::RecordingProxy::stopRecording()
3404ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{
3413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("RecordingProxy::stopRecording");
3424ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mCamera->stopRecording();
3434ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
3444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
3454ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Livoid Camera::RecordingProxy::releaseRecordingFrame(const sp<IMemory>& mem)
3464ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{
3473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("RecordingProxy::releaseRecordingFrame");
3484ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mCamera->releaseRecordingFrame(mem);
3494ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
3504ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
3514ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng LiCamera::RecordingProxy::RecordingProxy(const sp<Camera>& camera)
3524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li{
3534ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    mCamera = camera;
3544ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li}
3554ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
3563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android
357