13cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian/*
23cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * Copyright (C) 2008 The Android Open Source Project
33cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian *
43cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
53cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * you may not use this file except in compliance with the License.
63cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * You may obtain a copy of the License at
73cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian *
83cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
93cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian *
103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * Unless required by applicable law or agreed to in writing, software
113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * See the License for the specific language governing permissions and
143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian * limitations under the License.
153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian */
163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#ifndef ANDROID_HARDWARE_CAMERA_H
183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#define ANDROID_HARDWARE_CAMERA_H
193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <utils/Timers.h>
21d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
22d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICameraService.h>
23d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala
248ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
259e626526453f91999bdf3de4c2ec8e55c5d90511Iliyan Malchev#include <system/camera.h>
264ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxy.h>
274ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h>
28d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <camera/android/hardware/ICamera.h>
29d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <camera/android/hardware/ICameraClient.h>
30c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/CameraBase.h>
313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android {
333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass Surface;
353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass String8;
36ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalaclass String16;
373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ref-counted object for callbacks
393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass CameraListener: virtual public RefBase
403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic:
423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0;
4357c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li    virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr,
4457c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li                          camera_frame_metadata_t *metadata) = 0;
453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) = 0;
462d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen    virtual void postRecordingFrameHandleTimestamp(nsecs_t timestamp, native_handle_t* handle) = 0;
473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian};
483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
49c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera;
50c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
51c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkintemplate <>
52c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinstruct CameraTraits<Camera>
53c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin{
54d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    typedef CameraListener                     TCamListener;
55d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    typedef ::android::hardware::ICamera       TCamUser;
56d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    typedef ::android::hardware::ICameraClient TCamCallbacks;
57d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    typedef ::android::binder::Status(::android::hardware::ICameraService::*TCamConnectService)
58d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        (const sp<::android::hardware::ICameraClient>&,
59d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int, const String16&, int, int,
60d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        /*out*/
61d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        sp<::android::hardware::ICamera>*);
620f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    static TCamConnectService     fnConnectService;
63c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin};
64c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
650f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk
66c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera :
67c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    public CameraBase<Camera>,
68d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    public ::android::hardware::BnCameraClient
693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic:
71ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    enum {
72d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        USE_CALLING_UID = ::android::hardware::ICameraService::USE_CALLING_UID
73ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    };
7498a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen    enum {
75d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        USE_CALLING_PID = ::android::hardware::ICameraService::USE_CALLING_PID
7698a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen    };
77ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // construct a camera client from an existing remote
79d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    static  sp<Camera>  create(const sp<::android::hardware::ICamera>& camera);
80ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    static  sp<Camera>  connect(int cameraId,
81280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganov                                const String16& clientPackageName,
8298a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen                                int clientUid, int clientPid);
83ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
84b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He    static  status_t  connectLegacy(int cameraId, int halVersion,
85280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganov                                     const String16& clientPackageName,
86b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He                                     int clientUid, sp<Camera>& camera);
87b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He
884ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li            virtual     ~Camera();
893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
903cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    reconnect();
913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    lock();
923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    unlock();
933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
948ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            // pass the buffered IGraphicBufferProducer to the camera service
954b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala            status_t    setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer);
96bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis
974b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala            // start preview mode, must call setPreviewTarget first
983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    startPreview();
993cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // stop preview mode
1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        stopPreview();
1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // get preview state
1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            bool        previewEnabled();
1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1064b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala            // start recording mode, must call setPreviewTarget first
1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    startRecording();
1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // stop recording mode
1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        stopRecording();
1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // get recording state
1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            bool        recordingEnabled();
1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // release a recording frame
1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        releaseRecordingFrame(const sp<IMemory>& mem);
1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1182d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen            // release a recording frame handle
1192d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen            void        releaseRecordingFrameHandle(native_handle_t *handle);
1202d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen
1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // autoFocus - status returned from callback
1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    autoFocus();
1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // cancel auto focus
1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    cancelAutoFocus();
1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // take a picture - picture returned from callback
128e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong            status_t    takePicture(int msgType);
1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // set preview/capture parameters - key/value pairs
1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    setParameters(const String8& params);
1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // get preview/capture parameters - key/value pairs
1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            String8     getParameters() const;
1353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // send command to camera driver
1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1398cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // Tell camera how to pass video buffers. videoBufferMode is one of VIDEO_BUFFER_MODE_*.
1408cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // Returns OK if the specified video buffer mode is supported. If videoBufferMode is
1418cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // VIDEO_BUFFER_MODE_BUFFER_QUEUE, setVideoTarget() must be called before starting
1428cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // video recording.
1438cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            status_t    setVideoBufferMode(int32_t videoBufferMode);
1448cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
1458cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // Set the video buffer producer for camera to use in VIDEO_BUFFER_MODE_BUFFER_QUEUE
1468cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // mode.
1478cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            status_t    setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer);
148e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong
1493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        setListener(const sp<CameraListener>& listener);
1504ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li            void        setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener);
1513ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
1523ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // Configure preview callbacks to app. Only one of the older
1533ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // callbacks or the callback surface can be active at the same time;
1543ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // enabling one will disable the other if active. Flags can be
1553ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // disabled by calling it with CAMERA_FRAME_CALLBACK_FLAG_NOOP, and
1563ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // Target by calling it with a NULL interface.
1573cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        setPreviewCallbackFlags(int preview_callback_flag);
1583ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            status_t    setPreviewCallbackTarget(
1593ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                    const sp<IGraphicBufferProducer>& callbackProducer);
1603cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1614ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li            sp<ICameraRecordingProxy> getRecordingProxy();
1624ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1633cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // ICameraClient interface
1643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual void        notifyCallback(int32_t msgType, int32_t ext, int32_t ext2);
16557c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li    virtual void        dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
16657c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li                                     camera_frame_metadata_t *metadata);
1673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual void        dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);
1682d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen    virtual void        recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle);
1693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1704ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    class RecordingProxy : public BnCameraRecordingProxy
1714ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    {
1724ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    public:
1734ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        RecordingProxy(const sp<Camera>& camera);
1744ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1754ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        // ICameraRecordingProxy interface
1764ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener);
1774ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual void stopRecording();
1784ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual void releaseRecordingFrame(const sp<IMemory>& mem);
1792d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen        virtual void releaseRecordingFrameHandle(native_handle_t* handle);
1804ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    private:
1824ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        sp<Camera>         mCamera;
1834ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    };
1844ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1851d88023e1de6b9f370eb4be944dd9c4480d01f11Igor Murashkinprotected:
186c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin                        Camera(int cameraId);
1873cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian                        Camera(const Camera&);
1883cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian                        Camera& operator=(const Camera);
1893cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
190c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    sp<ICameraRecordingProxyListener>  mRecordingProxyListener;
1913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
192c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    friend class        CameraBase;
1933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian};
1943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android
1963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#endif
198