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;
47b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    virtual void postRecordingFrameHandleTimestampBatch(
48b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh            const std::vector<nsecs_t>& timestamps,
49b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh            const std::vector<native_handle_t*>& handles) = 0;
503cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian};
513cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
52c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera;
53c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
54c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkintemplate <>
55c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinstruct CameraTraits<Camera>
56c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin{
57d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    typedef CameraListener                     TCamListener;
58d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    typedef ::android::hardware::ICamera       TCamUser;
59d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    typedef ::android::hardware::ICameraClient TCamCallbacks;
60d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    typedef ::android::binder::Status(::android::hardware::ICameraService::*TCamConnectService)
61d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        (const sp<::android::hardware::ICameraClient>&,
62d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        int, const String16&, int, int,
63d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        /*out*/
64d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        sp<::android::hardware::ICamera>*);
650f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk    static TCamConnectService     fnConnectService;
66c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin};
67c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin
680f61d8f14aa368c9cd7076528e8096e10ed100a0Ruben Brunk
69c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkinclass Camera :
70c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    public CameraBase<Camera>,
71d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    public ::android::hardware::BnCameraClient
723cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian{
733cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopianpublic:
74ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    enum {
75d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        USE_CALLING_UID = ::android::hardware::ICameraService::USE_CALLING_UID
76ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    };
7798a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen    enum {
78d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala        USE_CALLING_PID = ::android::hardware::ICameraService::USE_CALLING_PID
7998a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen    };
80ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
813cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // construct a camera client from an existing remote
82d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    static  sp<Camera>  create(const sp<::android::hardware::ICamera>& camera);
83ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala    static  sp<Camera>  connect(int cameraId,
84280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganov                                const String16& clientPackageName,
8598a668f6ea51e4d894d2ebb61a0e18287fb14008Chien-Yu Chen                                int clientUid, int clientPid);
86ceb388d6c03c38b96dc41c0ea4804b749aa077c4Eino-Ville Talvala
87b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He    static  status_t  connectLegacy(int cameraId, int halVersion,
88280405a138a0068694f3c39b4290f510173133d9Svetoslav Ganov                                     const String16& clientPackageName,
89b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He                                     int clientUid, sp<Camera>& camera);
90b10cdadf0fb945e23ca77008d4af76584bd0e39aZhijun He
914ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li            virtual     ~Camera();
923cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
933cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    reconnect();
943cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    lock();
953cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    unlock();
963cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
978ba01021b573889802e67e029225a96f0dfa471aAndy McFadden            // pass the buffered IGraphicBufferProducer to the camera service
984b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala            status_t    setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer);
99bfa33aae4f54c0020a0568b16a3acb7b30b6ca3dJamie Gennis
1004b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala            // start preview mode, must call setPreviewTarget first
1013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    startPreview();
1023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1033cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // stop preview mode
1043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        stopPreview();
1053cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // get preview state
1073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            bool        previewEnabled();
1083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1094b820b0e1fa069714b123fc35784541d0f94d267Eino-Ville Talvala            // start recording mode, must call setPreviewTarget first
1103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    startRecording();
1113cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1123cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // stop recording mode
1133cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        stopRecording();
1143cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1153cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // get recording state
1163cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            bool        recordingEnabled();
1173cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1183cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // release a recording frame
1193cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        releaseRecordingFrame(const sp<IMemory>& mem);
1203cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1212d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen            // release a recording frame handle
1222d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen            void        releaseRecordingFrameHandle(native_handle_t *handle);
1232d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen
124b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh            // release a batch of recording frame handles
125b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh            void        releaseRecordingFrameHandleBatch(
126b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh                    const std::vector<native_handle_t*> handles);
127b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh
1283cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // autoFocus - status returned from callback
1293cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    autoFocus();
1303cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1313cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // cancel auto focus
1323cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    cancelAutoFocus();
1333cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1343cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // take a picture - picture returned from callback
135e468ac57f6e8afc6078c76d4eb1ac327112a3de0James Dong            status_t    takePicture(int msgType);
1363cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1373cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // set preview/capture parameters - key/value pairs
1383cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    setParameters(const String8& params);
1393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // get preview/capture parameters - key/value pairs
1413cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            String8     getParameters() const;
1423cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1433cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            // send command to camera driver
1443cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            status_t    sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);
1453cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1468cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // Tell camera how to pass video buffers. videoBufferMode is one of VIDEO_BUFFER_MODE_*.
1478cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // Returns OK if the specified video buffer mode is supported. If videoBufferMode is
1488cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // VIDEO_BUFFER_MODE_BUFFER_QUEUE, setVideoTarget() must be called before starting
1498cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // video recording.
1508cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            status_t    setVideoBufferMode(int32_t videoBufferMode);
1518cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen
1528cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // Set the video buffer producer for camera to use in VIDEO_BUFFER_MODE_BUFFER_QUEUE
1538cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            // mode.
1548cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen            status_t    setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer);
155e2ad6734eccc4b9ea7857c747ff9469a9c11ba09James Dong
1563cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        setListener(const sp<CameraListener>& listener);
1574ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li            void        setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener);
1583ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala
1593ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // Configure preview callbacks to app. Only one of the older
1603ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // callbacks or the callback surface can be active at the same time;
1613ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // enabling one will disable the other if active. Flags can be
1623ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // disabled by calling it with CAMERA_FRAME_CALLBACK_FLAG_NOOP, and
1633ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            // Target by calling it with a NULL interface.
1643cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian            void        setPreviewCallbackFlags(int preview_callback_flag);
1653ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala            status_t    setPreviewCallbackTarget(
1663ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala                    const sp<IGraphicBufferProducer>& callbackProducer);
1673cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1684ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li            sp<ICameraRecordingProxy> getRecordingProxy();
1694ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1703cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    // ICameraClient interface
1713cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual void        notifyCallback(int32_t msgType, int32_t ext, int32_t ext2);
17257c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li    virtual void        dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,
17357c86189bc07d9ccb0fd044e66df736d0bf19639Wu-cheng Li                                     camera_frame_metadata_t *metadata);
1743cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian    virtual void        dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);
1752d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen    virtual void        recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle);
176b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh    virtual void        recordingFrameHandleCallbackTimestampBatch(
177b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh                                const std::vector<nsecs_t>& timestamps,
178b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh                                const std::vector<native_handle_t*>& handles);
179b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh
1803cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
1814ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    class RecordingProxy : public BnCameraRecordingProxy
1824ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    {
1834ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    public:
184d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh        explicit RecordingProxy(const sp<Camera>& camera);
1854ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1864ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        // ICameraRecordingProxy interface
1874ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener);
1884ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual void stopRecording();
1894ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        virtual void releaseRecordingFrame(const sp<IMemory>& mem);
1902d13b1d3eeaba31d8c15acc6037fd68b150a9a66Chien-Yu Chen        virtual void releaseRecordingFrameHandle(native_handle_t* handle);
191b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh        virtual void releaseRecordingFrameHandleBatch(
192b5df547bce900fa5764d735bee304e79c001d60dYin-Chia Yeh                const std::vector<native_handle_t*>& handles);
1934ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1944ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    private:
1954ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li        sp<Camera>         mCamera;
1964ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    };
1974ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li
1981d88023e1de6b9f370eb4be944dd9c4480d01f11Igor Murashkinprotected:
199d19d994770a04f02c204affd29985c5aeaa58baaChih-Hung Hsieh    explicit            Camera(int cameraId);
2003cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian                        Camera(const Camera&);
2013cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian                        Camera& operator=(const Camera);
2023cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
203c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    sp<ICameraRecordingProxyListener>  mRecordingProxyListener;
2043cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
205c073ba525404f3416c2824c435d3d926a9892f1bIgor Murashkin    friend class        CameraBase;
2063cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian};
2073cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2083cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian}; // namespace android
2093cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
2103cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#endif
211