13068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen/*
23068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * Copyright (C) 2015 The Android Open Source Project
33068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen *
43068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * Licensed under the Apache License, Version 2.0 (the "License");
53068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * you may not use this file except in compliance with the License.
63068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * You may obtain a copy of the License at
73068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen *
83068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen *      http://www.apache.org/licenses/LICENSE-2.0
93068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen *
103068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * Unless required by applicable law or agreed to in writing, software
113068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * distributed under the License is distributed on an "AS IS" BASIS,
123068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * See the License for the specific language governing permissions and
143068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * limitations under the License.
153068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen */
163068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
173068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen#ifndef ANDROID_SERVERS_CAMERA_CAMERAFLASHLIGHT_H
183068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen#define ANDROID_SERVERS_CAMERA_CAMERAFLASHLIGHT_H
193068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
203068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen#include "hardware/camera_common.h"
213068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen#include "utils/KeyedVector.h"
2288da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen#include "utils/SortedVector.h"
233068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen#include "gui/GLConsumer.h"
243068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen#include "gui/Surface.h"
253068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen#include "common/CameraDeviceBase.h"
26d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen#include "device1/CameraHardwareInterface.h"
273068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
283068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chennamespace android {
293068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
303068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen/**
313068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * FlashControlBase is a base class for flash control. It defines the functions
323068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * that a flash control for each camera module/device version should implement.
333068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen */
343068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chenclass FlashControlBase : public virtual VirtualLightRefBase {
353068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen    public:
363068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        virtual ~FlashControlBase();
373068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
383068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // Whether a camera device has a flash unit. Calling this function may
393068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // cause the torch mode to be turned off in HAL v1 devices. If
403068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // previously-on torch mode is turned off,
413068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // callbacks.torch_mode_status_change() should be invoked.
4288da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        virtual status_t hasFlashUnit(const String8& cameraId,
433068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen                    bool *hasFlash) = 0;
443068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
453068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // set the torch mode to on or off.
4688da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        virtual status_t setTorchMode(const String8& cameraId,
473068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen                    bool enabled) = 0;
483068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen};
493068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
503068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen/**
513068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * CameraFlashlight can be used by camera service to control flashflight.
523068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen */
533068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chenclass CameraFlashlight : public virtual VirtualLightRefBase {
543068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen    public:
553068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        CameraFlashlight(CameraModule& cameraModule,
563068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen                const camera_module_callbacks_t& callbacks);
573068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        virtual ~CameraFlashlight();
583068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
5988da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // Find all flash units. This must be called before other methods. All
6088da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // camera devices must be closed when it's called because HAL v1 devices
6188da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // need to be opened to query available flash modes.
6288da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t findFlashUnits();
633068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
6488da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // Whether a camera device has a flash unit. Before findFlashUnits() is
6588da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // called, this function always returns false.
6688da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        bool hasFlashUnit(const String8& cameraId);
6788da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen
6888da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // set the torch mode to on or off.
6988da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t setTorchMode(const String8& cameraId, bool enabled);
703068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
713068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // Notify CameraFlashlight that camera service is going to open a camera
723068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // device. CameraFlashlight will free the resources that may cause the
733068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // camera open to fail. Camera service must call this function before
743068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // opening a camera device.
7588da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t prepareDeviceOpen(const String8& cameraId);
7688da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen
7788da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // Notify CameraFlashlight that camera service has closed a camera
7888da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // device. CameraFlashlight may invoke callbacks for torch mode
7988da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // available depending on the implementation.
8088da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t deviceClosed(const String8& cameraId);
813068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
823068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen    private:
833068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // create flashlight control based on camera module API and camera
843068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // device API versions.
8588da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t createFlashlightControl(const String8& cameraId);
8688da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen
8788da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // mLock should be locked.
8888da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        bool hasFlashUnitLocked(const String8& cameraId);
893068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
903068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        sp<FlashControlBase> mFlashControl;
913068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        CameraModule *mCameraModule;
923068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        const camera_module_callbacks_t *mCallbacks;
9388da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        SortedVector<String8> mOpenedCameraIds;
943068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
9588da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // camera id -> if it has a flash unit
9688da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        KeyedVector<String8, bool> mHasFlashlightMap;
9788da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        bool mFlashlightMapInitialized;
9888da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen
9988da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        Mutex mLock; // protect CameraFlashlight API
1003068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen};
1013068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1023068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen/**
1033068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * Flash control for camera module v2.4 and above.
1043068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen */
10588da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chenclass ModuleFlashControl : public FlashControlBase {
1063068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen    public:
10788da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        ModuleFlashControl(CameraModule& cameraModule,
1083068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen                const camera_module_callbacks_t& callbacks);
10988da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        virtual ~ModuleFlashControl();
1103068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1113068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // FlashControlBase
11288da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t hasFlashUnit(const String8& cameraId, bool *hasFlash);
11388da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t setTorchMode(const String8& cameraId, bool enabled);
1143068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1153068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen    private:
1163068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        CameraModule *mCameraModule;
1173068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1183068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        Mutex mLock;
1193068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen};
1203068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1213068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen/**
1223068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen * Flash control for camera module <= v2.3 and camera HAL v2-v3
1233068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen */
1243068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chenclass CameraDeviceClientFlashControl : public FlashControlBase {
1253068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen    public:
1263068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        CameraDeviceClientFlashControl(CameraModule& cameraModule,
1273068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen                const camera_module_callbacks_t& callbacks);
1283068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        virtual ~CameraDeviceClientFlashControl();
1293068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1303068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // FlashControlBase
13188da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t setTorchMode(const String8& cameraId, bool enabled);
13288da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t hasFlashUnit(const String8& cameraId, bool *hasFlash);
1333068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1343068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen    private:
1353068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // connect to a camera device
13688da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t connectCameraDevice(const String8& cameraId);
13788da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // disconnect and free mDevice
13888da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t disconnectCameraDevice();
1393068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1403068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // initialize a surface
14188da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t initializeSurface(sp<CameraDeviceBase>& device, int32_t width,
14288da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen                int32_t height);
1433068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
14488da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // submit a request to enable the torch mode
14588da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t submitTorchEnabledRequest();
1463068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1473068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        // get the smallest surface size of IMPLEMENTATION_DEFINED
1483068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        status_t getSmallestSurfaceSize(const camera_info& info, int32_t *width,
1493068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen                    int32_t *height);
1503068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
151d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        // protected by mLock
15288da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        status_t hasFlashUnitLocked(const String8& cameraId, bool *hasFlash);
1533068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1543068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        CameraModule *mCameraModule;
1553068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        const camera_module_callbacks_t *mCallbacks;
15688da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        String8 mCameraId;
1573068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        bool mTorchEnabled;
1583068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        CameraMetadata *mMetadata;
15988da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // WORKAROUND: will be set to true for HAL v2 devices where
16088da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // setStreamingRequest() needs to be call for torch mode settings to
16188da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        // take effect.
16288da526d97442c80731e01bfc94c6b47c4b0c3c7Chien-Yu Chen        bool mStreaming;
1633068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1643068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        sp<CameraDeviceBase> mDevice;
1653068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1663068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        sp<IGraphicBufferProducer> mProducer;
1673068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        sp<IGraphicBufferConsumer>  mConsumer;
1683068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        sp<GLConsumer> mSurfaceTexture;
169727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala        sp<Surface> mSurface;
1703068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        int32_t mStreamId;
1713068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
1723068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen        Mutex mLock;
1733068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen};
1743068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
175d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen/**
176d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen * Flash control for camera module <= v2.3 and camera HAL v1
177d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen */
178d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chenclass CameraHardwareInterfaceFlashControl : public FlashControlBase {
179d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen    public:
180d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        CameraHardwareInterfaceFlashControl(CameraModule& cameraModule,
181d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen                const camera_module_callbacks_t& callbacks);
182d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        virtual ~CameraHardwareInterfaceFlashControl();
183d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
184d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        // FlashControlBase
185d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        status_t setTorchMode(const String8& cameraId, bool enabled);
186d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        status_t hasFlashUnit(const String8& cameraId, bool *hasFlash);
187d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
188d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen    private:
189d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        // connect to a camera device
190d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        status_t connectCameraDevice(const String8& cameraId);
191d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
192d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        // disconnect and free mDevice
193d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        status_t disconnectCameraDevice();
194d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
195d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        // initialize the preview window
196d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        status_t initializePreviewWindow(sp<CameraHardwareInterface> device,
197d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen                int32_t width, int32_t height);
198d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
199d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        // start preview and enable torch
200d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        status_t startPreviewAndTorch();
201d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
202d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        // get the smallest surface
203d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        status_t getSmallestSurfaceSize(int32_t *width, int32_t *height);
204d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
205d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        // protected by mLock
2066dcc706b3b06eedcc8d24a3001543c3f49999d94Chien-Yu Chen        // If this function opens camera device in order to check if it has a flash unit, the
2076dcc706b3b06eedcc8d24a3001543c3f49999d94Chien-Yu Chen        // camera device will remain open if keepDeviceOpen is true and the camera device will be
2086dcc706b3b06eedcc8d24a3001543c3f49999d94Chien-Yu Chen        // closed if keepDeviceOpen is false. If camera device is already open when calling this
2096dcc706b3b06eedcc8d24a3001543c3f49999d94Chien-Yu Chen        // function, keepDeviceOpen is ignored.
2106dcc706b3b06eedcc8d24a3001543c3f49999d94Chien-Yu Chen        status_t hasFlashUnitLocked(const String8& cameraId, bool *hasFlash, bool keepDeviceOpen);
211d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
212d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        CameraModule *mCameraModule;
213d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        const camera_module_callbacks_t *mCallbacks;
214d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        sp<CameraHardwareInterface> mDevice;
215d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        String8 mCameraId;
216d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        CameraParameters mParameters;
217d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        bool mTorchEnabled;
218d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
219d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        sp<IGraphicBufferProducer> mProducer;
220d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        sp<IGraphicBufferConsumer>  mConsumer;
221d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        sp<GLConsumer> mSurfaceTexture;
222727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala        sp<Surface> mSurface;
223d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
224d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen        Mutex mLock;
225d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen};
226d231fd61ca94441183abda9766ce6906a5b4c3cfChien-Yu Chen
2273068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen} // namespace android
2283068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen
2293068d73c6c7e1f44523b1466b903a9c82408b258Chien-Yu Chen#endif
230