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>
218ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
229e626526453f91999bdf3de4c2ec8e55c5d90511Iliyan Malchev#include <system/camera.h>
234ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraClient.h>
244ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxy.h>
254ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h>
26c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICameraService.h>
27c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/ICamera.h>
28c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin#include <camera/CameraBase.h>
293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopiannamespace android {
313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass Surface;
333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass String8;
34ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvalaclass String16;
353cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian// ref-counted object for callbacks
373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianclass CameraListener: virtual public RefBase
383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic:
403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0;
4157c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li    virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr,
4257c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li                          camera_frame_metadata_t *metadata) = 0;
433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) = 0;
443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian};
453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
46c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera;
47c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
48c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkintemplate <>
49c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinstruct CameraTraits<Camera>
50c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin{
51c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    typedef CameraListener        TCamListener;
52c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    typedef ICamera               TCamUser;
53c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    typedef ICameraClient         TCamCallbacks;
540f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    typedef status_t (ICameraService::*TCamConnectService)(const sp<ICameraClient>&,
550f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                                                           int, const String16&, int,
560f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                                                           /*out*/
570f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk                                                           sp<ICamera>&);
580f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    static TCamConnectService     fnConnectService;
59c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin};
60c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
610f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk
62c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera :
63c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    public CameraBase<Camera>,
64c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    public BnCameraClient
653cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
663cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic:
67ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    enum {
68c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin        USE_CALLING_UID = ICameraService::USE_CALLING_UID
69ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    };
70ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // construct a camera client from an existing remote
723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    static  sp<Camera>  create(const sp<ICamera>& camera);
73ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    static  sp<Camera>  connect(int cameraId,
74ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                                const String16& clientPackageName,
75ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala                                int clientUid);
76ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
77b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He    static  status_t  connectLegacy(int cameraId, int halVersion,
78b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He                                     const String16& clientPackageName,
79b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He                                     int clientUid, sp<Camera>& camera);
80b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He
814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li            virtual     ~Camera();
823cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
833cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    reconnect();
843cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    lock();
853cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    unlock();
863cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
878ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            // pass the buffered IGraphicBufferProducer to the camera service
884b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala            status_t    setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer);
89bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis
904b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala            // start preview mode, must call setPreviewTarget first
913cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    startPreview();
923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // stop preview mode
943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        stopPreview();
953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // get preview state
973cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            bool        previewEnabled();
983cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
994b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala            // start recording mode, must call setPreviewTarget first
1003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    startRecording();
1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // stop recording mode
1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        stopRecording();
1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // get recording state
1063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            bool        recordingEnabled();
1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // release a recording frame
1093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        releaseRecordingFrame(const sp<IMemory>& mem);
1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // autoFocus - status returned from callback
1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    autoFocus();
1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // cancel auto focus
1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    cancelAutoFocus();
1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // take a picture - picture returned from callback
118e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong            status_t    takePicture(int msgType);
1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // set preview/capture parameters - key/value pairs
1213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    setParameters(const String8& params);
1223cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1233cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // get preview/capture parameters - key/value pairs
1243cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            String8     getParameters() const;
1253cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1263cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // send command to camera driver
1273cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
129e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            // tell camera hal to store meta data or real YUV in video buffers.
130e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong            status_t    storeMetaDataInBuffers(bool enabled);
131e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong
1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        setListener(const sp<CameraListener>& listener);
1334ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li            void        setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener);
1343ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
1353ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // Configure preview callbacks to app. Only one of the older
1363ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // callbacks or the callback surface can be active at the same time;
1373ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // enabling one will disable the other if active. Flags can be
1383ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // disabled by calling it with CAMERA_FRAME_CALLBACK_FLAG_NOOP, and
1393ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // Target by calling it with a NULL interface.
1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        setPreviewCallbackFlags(int preview_callback_flag);
1413ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            status_t    setPreviewCallbackTarget(
1423ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                    const sp<IGraphicBufferProducer>& callbackProducer);
1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li            sp<ICameraRecordingProxy> getRecordingProxy();
1454ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1463cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // ICameraClient interface
1473cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual void        notifyCallback(int32_t msgType, int32_t ext, int32_t ext2);
14857c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li    virtual void        dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
14957c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li                                     camera_frame_metadata_t *metadata);
1503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual void        dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);
1513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1524ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    class RecordingProxy : public BnCameraRecordingProxy
1534ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    {
1544ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    public:
1554ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        RecordingProxy(const sp<Camera>& camera);
1564ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1574ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        // ICameraRecordingProxy interface
1584ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener);
1594ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual void stopRecording();
1604ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual void releaseRecordingFrame(const sp<IMemory>& mem);
1614ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1624ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    private:
1634ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        sp<Camera>         mCamera;
1644ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    };
1654ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1661d88023e1de6b9f370eb4be944dd9c4480d01f11Igor Murashkinprotected:
167c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin                        Camera(int cameraId);
1683cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian                        Camera(const Camera&);
1693cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian                        Camera& operator=(const Camera);
1703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
171c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    sp<ICameraRecordingProxyListener>  mRecordingProxyListener;
1723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
173c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    friend class        CameraBase;
1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian};
1753cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1763cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android
1773cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1783cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#endif
179