19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_HARDWARE_CAMERA_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_HARDWARE_CAMERA_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks#include <utils/Timers.h>
21ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis#include <gui/ISurfaceTexture.h>
229c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev#include <system/camera.h>
2342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li#include <camera/ICameraClient.h>
2442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li#include <camera/ICameraRecordingProxy.h>
2542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li#include <camera/ICameraRecordingProxyListener.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Changstruct CameraInfo {
30b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    /**
319c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev     * The direction that the camera faces to. It should be CAMERA_FACING_BACK
329c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev     * or CAMERA_FACING_FRONT.
33b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     */
34b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    int facing;
35b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
36b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    /**
37b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     * The orientation of the camera image. The value is the angle that the
389c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev     * camera image needs to be rotated clockwise so it shows correctly on the
399c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev     * display in its natural orientation. It should be 0, 90, 180, or 270.
40b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     *
4199a3f3e4e06b4370101ca97cc11dbe81d772fefaWu-cheng Li     * For example, suppose a device has a naturally tall screen. The
4299a3f3e4e06b4370101ca97cc11dbe81d772fefaWu-cheng Li     * back-facing camera sensor is mounted in landscape. You are looking at
4399a3f3e4e06b4370101ca97cc11dbe81d772fefaWu-cheng Li     * the screen. If the top side of the camera sensor is aligned with the
4499a3f3e4e06b4370101ca97cc11dbe81d772fefaWu-cheng Li     * right edge of the screen in natural orientation, the value should be
459c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev     * 90. If the top side of a front-facing camera sensor is aligned with the
469c7ac0d142eaf4b083a309299ab023932a9bb109Iliyan Malchev     * right of the screen, the value should be 270.
47b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang     */
48b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    int orientation;
49b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang};
50b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ICameraService;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ICamera;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Surface;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Mutex;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass String8;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
575e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks// ref-counted object for callbacks
585e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparksclass CameraListener: virtual public RefBase
595e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks{
605e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparkspublic:
615e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks    virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2) = 0;
62bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li    virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr,
63bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li                          camera_frame_metadata_t *metadata) = 0;
6459c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr) = 0;
655e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks};
665e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Camera : public BnCameraClient, public IBinder::DeathRecipient
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // construct a camera client from an existing remote
712adc2dbbd65fc89983f20702db2004f9b8cf8258James Dong    static  sp<Camera>  create(const sp<ICamera>& camera);
72e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    static  int32_t     getNumberOfCameras();
73b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang    static  status_t    getCameraInfo(int cameraId,
74b8bb78f54b48868465a9d69d65fda08524ab5ae1Chih-Chung Chang                                      struct CameraInfo* cameraInfo);
75e25cc656392d8866e163f78b60c7791455d0fb44Chih-Chung Chang    static  sp<Camera>  connect(int cameraId);
7642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li            virtual     ~Camera();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        init();
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    reconnect();
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        disconnect();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    lock();
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    unlock();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    getStatus() { return mStatus; }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8685cfdd011241a5f2fb7fabc65b5943a39af7e1deJamie Gennis            // pass the buffered Surface to the camera service
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    setPreviewDisplay(const sp<Surface>& surface);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis            // pass the buffered ISurfaceTexture to the camera service
90ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis            status_t    setPreviewTexture(const sp<ISurfaceTexture>& surfaceTexture);
91ff2dc46c121c166f10684da069d07ae11d4f9b9aJamie Gennis
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // start preview mode, must call setPreviewDisplay first
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    startPreview();
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // stop preview mode
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        stopPreview();
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // get preview state
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool        previewEnabled();
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // start recording mode, must call setPreviewDisplay first
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    startRecording();
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // stop recording mode
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        stopRecording();
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // get recording state
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bool        recordingEnabled();
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // release a recording frame
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        releaseRecordingFrame(const sp<IMemory>& mem);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // autoFocus - status returned from callback
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    autoFocus();
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
116244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang            // cancel auto focus
117244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang            status_t    cancelAutoFocus();
118244f8c26365a303d9dd861bd48a29a4b48578da1Chih-Chung Chang
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // take a picture - picture returned from callback
120e00cab707dcaf6f05adb5ccb9c80fdf25c483427James Dong            status_t    takePicture(int msgType);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // set preview/capture parameters - key/value pairs
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    setParameters(const String8& params);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // get preview/capture parameters - key/value pairs
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String8     getParameters() const;
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12836f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li            // send command to camera driver
12936f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li            status_t    sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
13036f68b8f24df906c969581b0b8e1a47f95dc03cbWu-cheng Li
13138311859e809118f2cba3597d056abffe4eb80c0James Dong            // tell camera hal to store meta data or real YUV in video buffers.
13238311859e809118f2cba3597d056abffe4eb80c0James Dong            status_t    storeMetaDataInBuffers(bool enabled);
13338311859e809118f2cba3597d056abffe4eb80c0James Dong
1345e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks            void        setListener(const sp<CameraListener>& listener);
13542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li            void        setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener);
1365e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks            void        setPreviewCallbackFlags(int preview_callback_flag);
1375e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks
13842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li            sp<ICameraRecordingProxy> getRecordingProxy();
13942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ICameraClient interface
1412a04aefdf03abbdabb035f89c8a1df636c168de0Dave Sparks    virtual void        notifyCallback(int32_t msgType, int32_t ext, int32_t ext2);
142bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li    virtual void        dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
143bb1e275c0e684dd213f124da77110cdd9d6f090cWu-cheng Li                                     camera_frame_metadata_t *metadata);
14459c1a935295cb30c2ba2f759855e89c174b42a07Dave Sparks    virtual void        dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<ICamera>         remote();
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    class RecordingProxy : public BnCameraRecordingProxy
14942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    {
15042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    public:
15142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        RecordingProxy(const sp<Camera>& camera);
15242419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
15342419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        // ICameraRecordingProxy interface
15442419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener);
15542419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        virtual void stopRecording();
15642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        virtual void releaseRecordingFrame(const sp<IMemory>& mem);
15742419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
15842419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    private:
15942419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li        sp<Camera>         mCamera;
16042419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li    };
16142419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Camera();
1646f0602e84a0387fe9239a57f44785de40feb051cDave Sparks                        Camera(const Camera&);
1656f0602e84a0387fe9239a57f44785de40feb051cDave Sparks                        Camera& operator=(const Camera);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        virtual void binderDied(const wp<IBinder>& who);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            class DeathNotifier: public IBinder::DeathRecipient
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public:
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DeathNotifier() {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                virtual void binderDied(const wp<IBinder>& who);
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            };
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            static sp<DeathNotifier> mDeathNotifier;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // helper function to obtain camera service handle
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            static const sp<ICameraService>& getCameraService();
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<ICamera>         mCamera;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t            mStatus;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1855e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks            sp<CameraListener>  mListener;
18642419ce28a09eb63e29a8fef87e6f5534f41902fWu-cheng Li            sp<ICameraRecordingProxyListener>  mRecordingProxyListener;
1875e27115995c4506dddf4f1271effd4fb4c935ad3Dave Sparks
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            friend class DeathNotifier;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            static  Mutex               mLock;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            static  sp<ICameraService>  mCameraService;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
197