166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Redistribution and use in source and binary forms, with or without
466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * modification, are permitted provided that the following conditions are
566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * met:
666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *     * Redistributions of source code must retain the above copyright
766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       notice, this list of conditions and the following disclaimer.
866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *     * Redistributions in binary form must reproduce the above
966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       copyright notice, this list of conditions and the following
1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       disclaimer in the documentation and/or other materials provided
1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       with the distribution.
1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *     * Neither the name of The Linux Foundation nor the names of its
1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       contributors may be used to endorse or promote products derived
1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       from this software without specific prior written permission.
1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */
2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef __QCAMERA2HARDWAREINTERFACE_H__
3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define __QCAMERA2HARDWAREINTERFACE_H__
3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies
3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/Mutex.h>
3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/Condition.h>
3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies
3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "camera.h"
3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraAllocator.h"
4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraChannel.h"
4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraCmdThread.h"
4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraDisplay.h"
4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraMem.h"
4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraParameters.h"
4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraParametersIntf.h"
4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraPerf.h"
4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraPostProc.h"
4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraQueue.h"
4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraStream.h"
5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraStateMachine.h"
5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraThermalAdapter.h"
5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef TARGET_TS_MAKEUP
5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "ts_makeup_engine.h"
5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "ts_detectface_engine.h"
5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" {
5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_interface.h"
5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_jpeg_interface.h"
6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraTrace.h"
6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera {
6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef TRUE
6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define TRUE 1
6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef FALSE
7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define FALSE 0
7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef enum {
7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_CH_TYPE_ZSL,
7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_CH_TYPE_CAPTURE,
7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_CH_TYPE_PREVIEW,
7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_CH_TYPE_VIDEO,
7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_CH_TYPE_SNAPSHOT,
8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_CH_TYPE_RAW,
8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_CH_TYPE_METADATA,
8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_CH_TYPE_ANALYSIS,
8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_CH_TYPE_CALLBACK,
8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_CH_TYPE_MAX
8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} qcamera_ch_type_enum_t;
8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef struct {
8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t msg_type;
8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t ext1;
9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t ext2;
9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} qcamera_evt_argm_t;
9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define QCAMERA_DUMP_FRM_PREVIEW             1
9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define QCAMERA_DUMP_FRM_VIDEO               (1<<1)
9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define QCAMERA_DUMP_FRM_SNAPSHOT            (1<<2)
9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define QCAMERA_DUMP_FRM_THUMBNAIL           (1<<3)
9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define QCAMERA_DUMP_FRM_RAW                 (1<<4)
9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define QCAMERA_DUMP_FRM_JPEG                (1<<5)
9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define QCAMERA_DUMP_FRM_INPUT_REPROCESS     (1<<6)
10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define QCAMERA_DUMP_FRM_MASK_ALL    0x000000ff
10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define QCAMERA_ION_USE_CACHE   true
10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define QCAMERA_ION_USE_NOCACHE false
10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define MAX_ONGOING_JOBS 25
10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define MAX(a, b) ((a) > (b) ? (a) : (b))
10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define EXIF_ASCII_PREFIX_SIZE           8   //(sizeof(ExifAsciiPrefix))
11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef enum {
11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_NOTIFY_CALLBACK,
11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_DATA_CALLBACK,
11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_DATA_TIMESTAMP_CALLBACK,
11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCAMERA_DATA_SNAPSHOT_CALLBACK
11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} qcamera_callback_type_m;
11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef void (*camera_release_callback)(void *user_data,
11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                        void *cookie,
12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                        int32_t cb_status);
12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef void (*jpeg_data_callback)(int32_t msg_type,
12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        const camera_memory_t *data, unsigned int index,
12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_frame_metadata_t *metadata, void *user,
12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t frame_idx, camera_release_callback release_cb,
12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        void *release_cookie, void *release_data);
12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef struct {
12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qcamera_callback_type_m  cb_type;    // event type
12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t                  msg_type;   // msg type
13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t                  ext1;       // extended parameter
13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t                  ext2;       // extended parameter
13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_memory_t *        data;       // ptr to data memory struct
13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    unsigned int             index;      // index of the buf in the whole buffer
13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int64_t                  timestamp;  // buffer timestamp
13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_frame_metadata_t *metadata;   // meta data
13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void                    *user_data;  // any data needs to be released after callback
13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void                    *cookie;     // release callback cookie
13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_release_callback  release_cb; // release callback
13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t                 frame_index;  // frame index for the buffer
14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} qcamera_callback_argm_t;
14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinclass QCameraCbNotifier {
14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinpublic:
14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraCbNotifier(QCamera2HardwareInterface *parent) :
14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          mNotifyCb (NULL),
14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          mDataCb (NULL),
14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          mDataCbTimestamp (NULL),
14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          mCallbackCookie (NULL),
14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          mJpegCb(NULL),
15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          mJpegCallbackCookie(NULL),
15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          mParent (parent),
15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          mDataQ(releaseNotifications, this),
15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          mActive(false){}
15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual ~QCameraCbNotifier();
15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual int32_t notifyCallback(qcamera_callback_argm_t &cbArgs);
15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual void setCallbacks(camera_notify_callback notifyCb,
15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                              camera_data_callback dataCb,
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                              camera_data_timestamp_callback dataCbTimestamp,
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                              void *callbackCookie);
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual void setJpegCallBacks(
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            jpeg_data_callback jpegCb, void *callbackCookie);
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual int32_t startSnapshots();
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual void stopSnapshots();
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual void exit();
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void * cbNotifyRoutine(void * data);
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void releaseNotifications(void *data, void *user_data);
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static bool matchSnapshotNotifications(void *data, void *user_data);
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static bool matchPreviewNotifications(void *data, void *user_data);
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual int32_t flushPreviewNotifications();
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinprivate:
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_notify_callback         mNotifyCb;
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_data_callback           mDataCb;
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_data_timestamp_callback mDataCbTimestamp;
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void                          *mCallbackCookie;
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    jpeg_data_callback             mJpegCb;
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void                          *mJpegCallbackCookie;
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface     *mParent;
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraQueue     mDataQ;
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraCmdThread mProcTh;
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool             mActive;
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin};
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinclass QCamera2HardwareInterface : public QCameraAllocator,
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        public QCameraThermalCallback, public QCameraAdjustFPS
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinpublic:
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* static variable and functions accessed by camera service */
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static camera_device_ops_t mCameraOps;
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int set_preview_window(struct camera_device *,
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        struct preview_stream_ops *window);
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void set_CallBacks(struct camera_device *,
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_notify_callback notify_cb,
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_data_callback data_cb,
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_data_timestamp_callback data_cb_timestamp,
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_request_memory get_memory,
20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        void *user);
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void enable_msg_type(struct camera_device *, int32_t msg_type);
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void disable_msg_type(struct camera_device *, int32_t msg_type);
20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int msg_type_enabled(struct camera_device *, int32_t msg_type);
20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int start_preview(struct camera_device *);
20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void stop_preview(struct camera_device *);
20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int preview_enabled(struct camera_device *);
20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int store_meta_data_in_buffers(struct camera_device *, int enable);
20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int restart_start_preview(struct camera_device *);
20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int restart_stop_preview(struct camera_device *);
21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int pre_start_recording(struct camera_device *);
21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int start_recording(struct camera_device *);
21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void stop_recording(struct camera_device *);
21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int recording_enabled(struct camera_device *);
21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void release_recording_frame(struct camera_device *, const void *opaque);
21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int auto_focus(struct camera_device *);
21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int cancel_auto_focus(struct camera_device *);
21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int pre_take_picture(struct camera_device *);
21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int take_picture(struct camera_device *);
21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int takeLiveSnapshot_internal();
22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int takeBackendPic_internal(bool *JpegMemOpt, char *raw_format);
22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void clearIntPendingEvents();
22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void checkIntPicPending(bool JpegMemOpt, char *raw_format);
22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int cancel_picture(struct camera_device *);
22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int set_parameters(struct camera_device *, const char *parms);
22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int stop_after_set_params(struct camera_device *);
22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int commit_params(struct camera_device *);
22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int restart_after_set_params(struct camera_device *);
22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static char* get_parameters(struct camera_device *);
22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void put_parameters(struct camera_device *, char *);
23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int send_command(struct camera_device *,
23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              int32_t cmd, int32_t arg1, int32_t arg2);
23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int send_command_restart(struct camera_device *,
23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int32_t cmd, int32_t arg1, int32_t arg2);
23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void release(struct camera_device *);
23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int dump(struct camera_device *, int fd);
23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int close_camera_device(hw_device_t *);
23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int register_face_image(struct camera_device *,
23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                   void *img_ptr,
24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                   cam_pp_offline_src_config_t *config);
24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int prepare_preview(struct camera_device *);
24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int prepare_snapshot(struct camera_device *device);
24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinpublic:
24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface(uint32_t cameraId);
24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual ~QCamera2HardwareInterface();
24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int openCamera(struct hw_device_t **hw_device);
24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Dual camera specific oprations
25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int bundleRelatedCameras(bool syncOn,
25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint32_t related_sensor_session_id);
25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int getCameraSessionId(uint32_t* session_id);
25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    const cam_sync_related_sensors_event_info_t* getRelatedCamSyncInfo(
25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            void);
25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t setRelatedCamSyncInfo(
25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_sync_related_sensors_event_info_t* info);
25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t setMpoComposition(bool enable);
25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool getMpoComposition(void);
25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool getRecordingHintValue(void);
26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t setRecordingHintValue(int32_t value);
26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isPreviewRestartNeeded(void) { return mPreviewRestartNeeded; };
26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int getCapabilities(uint32_t cameraId,
26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            struct camera_info *info, cam_sync_type_t *cam_type);
26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int initCapabilities(uint32_t cameraId, mm_camera_vtbl_t *cameraHandle);
26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_capability_t *getCamHalCapabilities();
26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Implementation of QCameraAllocator
26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual QCameraMemory *allocateStreamBuf(cam_stream_type_t stream_type,
26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            size_t size, int stride, int scanline, uint8_t &bufferCnt);
27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual int32_t allocateMoreStreamBuf(QCameraMemory *mem_obj,
27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            size_t size, uint8_t &bufferCnt);
27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual QCameraHeapMemory *allocateStreamInfoBuf(cam_stream_type_t stream_type);
27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual QCameraHeapMemory *allocateMiscBuf(cam_stream_info_t *streamInfo);
27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual QCameraMemory *allocateStreamUserBuf(cam_stream_info_t *streamInfo);
27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual void waitForDeferredAlloc(cam_stream_type_t stream_type);
27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Implementation of QCameraThermalCallback
27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual int thermalEvtHandle(qcamera_thermal_level_enum_t *level,
28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            void *userdata, void *data);
28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual int recalcFPSRange(int &minFPS, int &maxFPS,
28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            const float &minVideoFPS, const float &maxVideoFPS,
28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_fps_range_t &adjustedRange);
28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    friend class QCameraStateMachine;
28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    friend class QCameraPostProcessor;
28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    friend class QCameraCbNotifier;
28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    friend class QCameraMuxer;
29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void setJpegCallBacks(jpeg_data_callback jpegCb,
29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            void *callbackCookie);
29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t initJpegHandle();
29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t deinitJpegHandle();
29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t setJpegHandleInfo(mm_jpeg_ops_t *ops,
29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mm_jpeg_mpo_ops_t *mpo_ops, uint32_t pJpegClientHandle);
29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t getJpegHandleInfo(mm_jpeg_ops_t *ops,
29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mm_jpeg_mpo_ops_t *mpo_ops, uint32_t *pJpegClientHandle);
29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t getCameraId() { return mCameraId; };
30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinprivate:
30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int setPreviewWindow(struct preview_stream_ops *window);
30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int setCallBacks(
30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_notify_callback notify_cb,
30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_data_callback data_cb,
30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_data_timestamp_callback data_cb_timestamp,
30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_request_memory get_memory,
30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        void *user);
30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int enableMsgType(int32_t msg_type);
30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int disableMsgType(int32_t msg_type);
31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int msgTypeEnabled(int32_t msg_type);
31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int msgTypeEnabledWithLock(int32_t msg_type);
31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int startPreview();
31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int stopPreview();
31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int storeMetaDataInBuffers(int enable);
31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int preStartRecording();
31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int startRecording();
31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int stopRecording();
31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int releaseRecordingFrame(const void *opaque);
31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int autoFocus();
32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int cancelAutoFocus();
32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int preTakePicture();
32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int takePicture();
32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int stopCaptureChannel(bool destroy);
32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int cancelPicture();
32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int takeLiveSnapshot();
32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int takePictureInternal();
32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int cancelLiveSnapshot();
32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char* getParameters() {return mParameters.getParameters(); }
32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int putParameters(char *);
33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int sendCommand(int32_t cmd, int32_t &arg1, int32_t &arg2);
33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int release();
33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int dump(int fd);
33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int registerFaceImage(void *img_ptr,
33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          cam_pp_offline_src_config_t *config,
33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          int32_t &faceID);
33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t longShot();
33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t deferPPInit();
33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int openCamera();
34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int closeCamera();
34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int processAPI(qcamera_sm_evt_enum_t api, void *api_payload);
34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int processEvt(qcamera_sm_evt_enum_t evt, void *evt_payload);
34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int processSyncEvt(qcamera_sm_evt_enum_t evt, void *evt_payload);
34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void lockAPI();
34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void waitAPIResult(qcamera_sm_evt_enum_t api_evt, qcamera_api_result_t *apiResult);
34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void unlockAPI();
34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void signalAPIResult(qcamera_api_result_t *result);
34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void signalEvtResult(qcamera_api_result_t *result);
35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int calcThermalLevel(qcamera_thermal_level_enum_t level,
35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            const int minFPSi, const int maxFPSi,
35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            const float &minVideoFPS, const float &maxVideoFPS,
35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_fps_range_t &adjustedRange,
35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            enum msm_vfe_frame_skip_pattern &skipPattern);
35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int updateThermalLevel(void *level);
35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // update entris to set parameters and check if restart is needed
35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int updateParameters(const char *parms, bool &needRestart);
36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // send request to server to set parameters
36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int commitParameterChanges();
36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isCaptureShutterEnabled();
36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool needDebugFps();
36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isRegularCapture();
36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isCACEnabled();
36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool is4k2kResolution(cam_dimension_t* resolution);
36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isPreviewRestartEnabled();
36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool needReprocess();
37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool needRotationReprocess();
37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void debugShowVideoFPS();
37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void debugShowPreviewFPS();
37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void dumpJpegToFile(const void *data, size_t size, uint32_t index);
37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void dumpFrameToFile(QCameraStream *stream,
37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mm_camera_buf_def_t *frame, uint32_t dump_type, const char *misc = NULL);
37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void dumpMetadataToFile(QCameraStream *stream,
37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            mm_camera_buf_def_t *frame,char *type);
37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void playShutter();
38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void getThumbnailSize(cam_dimension_t &dim);
38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t getJpegQuality();
38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraExif *getExifData();
38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_sensor_t getSensorType();
38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isLowPowerMode();
38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processAutoFocusEvent(cam_auto_focus_data_t &focus_data);
38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processZoomEvent(cam_crop_data_t &crop_info);
38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processPrepSnapshotDoneEvent(cam_prep_snapshot_state_t prep_snapshot_state);
389d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    int32_t processASDUpdate(cam_asd_decision_t asd_decision);
39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processJpegNotify(qcamera_jpeg_evt_payload_t *jpeg_job);
39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processHDRData(cam_asd_hdr_scene_data_t hdr_scene);
39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processRetroAECUnlock();
39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processZSLCaptureDone();
39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processSceneData(cam_scene_mode_type scene);
39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t transAwbMetaToParams(cam_awb_params_t &awb_params);
39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processFocusPositionInfo(cam_focus_pos_info_t &cur_pos_info);
39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processAEInfo(cam_3a_params_t &ae_params);
39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t sendDataNotify(int32_t msg_type,
40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            camera_memory_t *data,
40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint8_t index,
40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            camera_frame_metadata_t *metadata,
40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint32_t frame_idx);
40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t sendPreviewCallback(QCameraStream *stream,
40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCameraMemory *memory, uint32_t idx);
40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t selectScene(QCameraChannel *pChannel,
40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mm_camera_super_buf_t *recvd_frame);
41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addChannel(qcamera_ch_type_enum_t ch_type);
41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t startChannel(qcamera_ch_type_enum_t ch_type);
41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t stopChannel(qcamera_ch_type_enum_t ch_type);
41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t delChannel(qcamera_ch_type_enum_t ch_type, bool destroy = true);
41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addPreviewChannel();
41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addSnapshotChannel();
41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addVideoChannel();
41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addZSLChannel();
41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addCaptureChannel();
42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addRawChannel();
42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addMetaDataChannel();
42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addAnalysisChannel();
42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraReprocessChannel *addReprocChannel(QCameraChannel *pInputChannel,
42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int8_t cur_channel_index = 0);
42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraReprocessChannel *addOfflineReprocChannel(
42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                cam_pp_offline_src_config_t &img_config,
42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                cam_pp_feature_config_t &pp_feature,
42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                stream_cb_routine stream_cb,
42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                void *userdata);
43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addCallbackChannel();
43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t addStreamToChannel(QCameraChannel *pChannel,
43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               cam_stream_type_t streamType,
43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               stream_cb_routine streamCB,
43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               void *userData);
43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t preparePreview();
43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void unpreparePreview();
43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t prepareRawStream(QCameraChannel *pChannel);
43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraChannel *getChannelByHandle(uint32_t channelHandle);
44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_buf_def_t *getSnapshotFrame(mm_camera_super_buf_t *recvd_frame);
44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processFaceDetectionResult(cam_faces_data_t *fd_data);
44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool needPreviewFDCallback(uint8_t num_faces);
44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t processHistogramStats(cam_hist_stats_t &stats_data);
44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t setHistogram(bool histogram_en);
44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t setFaceDetection(bool enabled);
44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t prepareHardwareForSnapshot(int32_t afNeeded);
447d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    bool needProcessPreviewFrame(uint32_t frameID);
44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool needSendPreviewCallback();
44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isNoDisplayMode() {return mParameters.isNoDisplayMode();};
45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isZSLMode() {return mParameters.isZSLMode();};
45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isRdiMode() {return mParameters.isRdiMode();};
45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t numOfSnapshotsExpected() {
45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return mParameters.getNumOfSnapshots();};
45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isSecureMode() {return mParameters.isSecureMode();};
45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isLongshotEnabled() { return mLongshotEnabled; };
45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isHFRMode() {return mParameters.isHfrMode();};
45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isLiveSnapshot() {return m_stateMachine.isRecording();};
45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void setRetroPicture(bool enable) { bRetroPicture = enable; };
45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isRetroPicture() {return bRetroPicture; };
46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool isHDRMode() {return mParameters.isHDREnabled();};
46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t getBufNumRequired(cam_stream_type_t stream_type);
46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool needFDMetadata(qcamera_ch_type_enum_t channel_type);
46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t configureOnlineRotation(QCameraChannel &ch);
46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t declareSnapshotStreams();
46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t unconfigureAdvancedCapture();
46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t configureAdvancedCapture();
46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t configureAFBracketing(bool enable = true);
46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t configureHDRBracketing();
46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t stopAdvancedCapture(QCameraPicChannel *pChannel);
47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t startAdvancedCapture(QCameraPicChannel *pChannel);
47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t configureOptiZoom();
47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t configureStillMore();
47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t configureAEBracketing();
47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t updatePostPreviewParameters();
47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    inline void setOutputImageCount(uint32_t aCount) {mOutputCount = aCount;}
47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    inline uint32_t getOutputImageCount() {return mOutputCount;}
47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool processUFDumps(qcamera_jpeg_evt_payload_t *evt);
47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void captureDone();
47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t updateMetadata(metadata_buffer_t *pMetaData);
48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void fillFacesData(cam_faces_data_t &faces_data, metadata_buffer_t *metadata);
48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t getPPConfig(cam_pp_feature_config_t &pp_config,
48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int8_t curIndex = 0, bool multipass = FALSE);
48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual uint32_t scheduleBackgroundTask(BackgroundTask* bgTask);
48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    virtual int32_t waitForBackgroundTask(uint32_t &taskId);
48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool needDeferred(cam_stream_type_t stream_type);
48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void camEvtHandle(uint32_t camera_handle,
48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          mm_camera_event_t *evt,
48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          void *user_data);
49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void jpegEvtHandle(jpeg_job_status_t status,
49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                              uint32_t client_hdl,
49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                              uint32_t jobId,
49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                              mm_jpeg_output_t *p_buf,
49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                              void *userdata);
49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void *evtNotifyRoutine(void *data);
49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // functions for different data notify cb
49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void zsl_channel_cb(mm_camera_super_buf_t *recvd_frame, void *userdata);
50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void capture_channel_cb_routine(mm_camera_super_buf_t *recvd_frame,
50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                           void *userdata);
50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void postproc_channel_cb_routine(mm_camera_super_buf_t *recvd_frame,
50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                            void *userdata);
50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void rdi_mode_stream_cb_routine(mm_camera_super_buf_t *frame,
50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              QCameraStream *stream,
50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              void *userdata);
50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void nodisplay_preview_stream_cb_routine(mm_camera_super_buf_t *frame,
50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                    QCameraStream *stream,
50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                    void *userdata);
51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void preview_stream_cb_routine(mm_camera_super_buf_t *frame,
51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                          QCameraStream *stream,
51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                          void *userdata);
51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void synchronous_stream_cb_routine(mm_camera_super_buf_t *frame,
51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCameraStream *stream, void *userdata);
51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void postview_stream_cb_routine(mm_camera_super_buf_t *frame,
51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                           QCameraStream *stream,
51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                           void *userdata);
51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void video_stream_cb_routine(mm_camera_super_buf_t *frame,
51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                        QCameraStream *stream,
52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                        void *userdata);
52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void snapshot_channel_cb_routine(mm_camera_super_buf_t *frame,
52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           void *userdata);
52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void raw_channel_cb_routine(mm_camera_super_buf_t *frame,
52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            void *userdata);
52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void raw_stream_cb_routine(mm_camera_super_buf_t *frame,
52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                      QCameraStream *stream,
52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                      void *userdata);
52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void preview_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame,
52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              QCameraStream * stream,
53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              void * userdata);
53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void snapshot_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame,
53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                               QCameraStream * stream,
53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                               void * userdata);
53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void metadata_stream_cb_routine(mm_camera_super_buf_t *frame,
53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                           QCameraStream *stream,
53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                           void *userdata);
53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void callback_stream_cb_routine(mm_camera_super_buf_t *frame,
53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCameraStream *stream, void *userdata);
53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void reprocess_stream_cb_routine(mm_camera_super_buf_t *frame,
54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                            QCameraStream *stream,
54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                            void *userdata);
54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void releaseCameraMemory(void *data,
54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    void *cookie,
54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    int32_t cbStatus);
54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void returnStreamBuffer(void *data,
54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                   void *cookie,
54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                   int32_t cbStatus);
54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void getLogLevel();
55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t startRAWChannel(QCameraChannel *pChannel);
55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t stopRAWChannel();
55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    inline bool getNeedRestart() {return m_bNeedRestart;}
55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    inline void setNeedRestart(bool needRestart) {m_bNeedRestart = needRestart;}
55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
557d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    /*Start display skip. Skip starts after
558d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    skipCnt number of frames from current frame*/
559d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    void setDisplaySkip(bool enabled, uint8_t skipCnt = 0);
560d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    /*Caller can specify range frameID to skip.
561d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    if end is 0, all the frames after start will be skipped*/
562d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    void setDisplayFrameSkip(uint32_t start = 0, uint32_t end = 0);
563d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    /*Verifies if frameId is valid to skip*/
564d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    bool isDisplayFrameToSkip(uint32_t frameId);
565d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinprivate:
56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_device_t   mCameraDevice;
56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t          mCameraId;
56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_vtbl_t *mCameraHandle;
57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mCameraOpened;
57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_jpeg_metadata_t mJpegMetadata;
57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bRelCamCalibValid;
57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    preview_stream_ops_t *mPreviewWindow;
57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraParametersIntf mParameters;
57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t               mMsgEnabled;
57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int                   mStoreMetaDataInFrame;
57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_notify_callback         mNotifyCb;
58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_data_callback           mDataCb;
58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_data_timestamp_callback mDataCbTimestamp;
58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_request_memory          mGetMemory;
58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    jpeg_data_callback             mJpegCb;
58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void                          *mCallbackCookie;
58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void                          *mJpegCallbackCookie;
58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool                           m_bMpoEnabled;
58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraStateMachine m_stateMachine;   // state machine
59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_smThreadActive;
59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraPostProcessor m_postprocessor; // post processor
59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraThermalAdapter &m_thermalAdapter;
59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraCbNotifier m_cbNotifier;
59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraPerfLock m_perfLock;
59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_t m_lock;
59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_t m_cond;
59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    api_result_list *m_apiResultList;
59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraMemoryPool m_memoryPool;
59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_t m_evtLock;
60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_t m_evtCond;
60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qcamera_api_result_t m_evtResult;
60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraChannel *m_channels[QCAMERA_CH_TYPE_MAX]; // array holding channel ptr
60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bPreviewStarted;             //flag indicates first preview frame callback is received
60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bRecordStarted;             //flag indicates Recording is started for first time
60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Signifies if ZSL Retro Snapshots are enabled
61166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool bRetroPicture;
61266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Signifies AEC locked during zsl snapshots
61366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bLedAfAecLock;
61466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_af_state_t m_currentFocusState;
61566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
61666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mDumpFrmCnt;  // frame dump count
61766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mDumpSkipCnt; // frame skip count
61866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_exif_params_t mExifParams;
61966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    qcamera_thermal_level_enum_t mThermalLevel;
62066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mActiveAF;
62166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_HDRSceneEnabled;
62266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mLongshotEnabled;
62366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
62466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_t mLiveSnapshotThread;
62566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_t mIntPicThread;
62666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mFlashNeeded;
62766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mDeviceRotation;
62866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mCaptureRotation;
62966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mJpegExifRotation;
63066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mUseJpegExifRotation;
63166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mIs3ALocked;
63266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mPrepSnapRun;
63366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t mZoomLevel;
63466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Flag to indicate whether preview restart needed (for dual camera mode)
63566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mPreviewRestartNeeded;
63666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
63766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int mVFrameCount;
63866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int mVLastFrameCount;
63966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    nsecs_t mVLastFpsTime;
64066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    double mVFps;
64166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int mPFrameCount;
64266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int mPLastFrameCount;
64366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    nsecs_t mPLastFpsTime;
64466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    double mPFps;
645d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    uint8_t mInstantAecFrameCount;
64666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
64766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //eztune variables for communication with eztune server at backend
64866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bIntJpegEvtPending;
64966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bIntRawEvtPending;
65066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char m_BackendFileName[QCAMERA_MAX_FILEPATH_LENGTH];
65166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    size_t mBackendFileSize;
65266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_t m_int_lock;
65366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_cond_t m_int_cond;
65466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
65566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    enum DeferredWorkCmd {
65666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CMD_DEF_ALLOCATE_BUFF,
65766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CMD_DEF_PPROC_START,
65866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CMD_DEF_PPROC_INIT,
65966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CMD_DEF_METADATA_ALLOC,
66066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CMD_DEF_CREATE_JPEG_SESSION,
66166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CMD_DEF_PARAM_ALLOC,
66266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CMD_DEF_PARAM_INIT,
66366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CMD_DEF_GENERIC,
66466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CMD_DEF_MAX
66566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    };
66666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
66766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef struct {
66866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCameraChannel *ch;
66966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_stream_type_t type;
67066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } DeferAllocBuffArgs;
67166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
67266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef struct {
67366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint8_t bufferCnt;
67466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        size_t size;
67566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } DeferMetadataAllocArgs;
67666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
67766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef struct {
67866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        jpeg_encode_callback_t jpeg_cb;
67966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        void *user_data;
68066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } DeferPProcInitArgs;
68166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
68266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef union {
68366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        DeferAllocBuffArgs allocArgs;
68466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCameraChannel *pprocArgs;
68566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        DeferMetadataAllocArgs metadataAllocArgs;
68666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        DeferPProcInitArgs pprocInitArgs;
68766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        BackgroundTask *genericArgs;
68866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } DeferWorkArgs;
68966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
69066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    typedef struct {
69166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t mDefJobId;
69266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
69366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        //Job status is needed to check job was successful or failed
69466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        //Error code when job was not sucessful and there is error
69566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        //0 when is initialized.
69666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        //for sucessfull job, do not need to maintain job status
69766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int32_t mDefJobStatus;
69866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } DefOngoingJob;
69966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
70066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    DefOngoingJob mDefOngoingJobs[MAX_ONGOING_JOBS];
70166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
70266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    struct DefWork
70366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    {
70466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        DefWork(DeferredWorkCmd cmd_,
70566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 uint32_t id_,
70666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 DeferWorkArgs args_)
70766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            : cmd(cmd_),
70866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              id(id_),
70966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              args(args_){};
71066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
71166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        DeferredWorkCmd cmd;
71266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t id;
71366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        DeferWorkArgs args;
71466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    };
71566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
71666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraCmdThread      mDeferredWorkThread;
71766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraQueue          mCmdQueue;
71866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
71966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    Mutex                 mDefLock;
72066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    Condition             mDefCond;
72166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
72266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t queueDeferredWork(DeferredWorkCmd cmd,
72366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               DeferWorkArgs args);
72466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t dequeueDeferredWork(DefWork* dw, int32_t jobStatus);
72566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t waitDeferredWork(uint32_t &job_id);
72666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static void *deferredWorkRoutine(void *obj);
72766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool checkDeferredWork(uint32_t &job_id);
72866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t getDefJobStatus(uint32_t &job_id);
72966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
73066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mReprocJob;
73166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mJpegJob;
73266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mMetadataAllocJob;
73366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mInitPProcJob;
73466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mParamAllocJob;
73566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mParamInitJob;
73666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mOutputCount;
73766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mInputCount;
73866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mAdvancedCaptureConfigured;
73966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mHDRBracketingEnabled;
74066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t mNumPreviewFaces;
74166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Jpeg Handle shared between HWI instances
74266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_ops_t         mJpegHandle;
74366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // MPO handle shared between HWI instances
74466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // this is needed for MPO composition of related
74566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // cam images
74666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_jpeg_mpo_ops_t     mJpegMpoHandle;
74766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t              mJpegClientHandle;
74866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool                  mJpegHandleOwner;
74966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
75066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   //ts add for makeup
75166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef TARGET_TS_MAKEUP
75266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    TSRect mFaceRect;
75366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool TsMakeupProcess_Preview(mm_camera_buf_def_t *pFrame,QCameraStream * pStream);
75466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool TsMakeupProcess_Snapshot(mm_camera_buf_def_t *pFrame,QCameraStream * pStream);
75566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool TsMakeupProcess(mm_camera_buf_def_t *frame,QCameraStream * stream,TSRect& faceRect);
75666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
75766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraMemory *mMetadataMem;
75866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
75966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static uint32_t sNextJobId;
76066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
76166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Gralloc memory details
76266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    pthread_mutex_t mGrallocLock;
76366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t mEnqueuedBuffers;
76466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool mCACDoneReceived;
76566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
76666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //GPU library to read buffer padding details.
76766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    void *lib_surface_utils;
76866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int (*LINK_get_surface_pixel_alignment)();
76966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mSurfaceStridePadding;
77066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
77166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //QCamera Display Object
77266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraDisplay mCameraDisplay;
77366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
77466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool m_bNeedRestart;
77566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    Mutex mMapLock;
77666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    Condition mMapCond;
777d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch
778d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    //Used to decide the next frameID to be skipped
779d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    uint32_t mLastPreviewFrameID;
780d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    //FrameID to start frame skip.
781d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    uint32_t mFrameSkipStart;
782d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    /*FrameID to stop frameskip. If this is not set,
783d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    all frames are skipped till we set this*/
784d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    uint32_t mFrameSkipEnd;
78566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin};
78666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
78766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera
78866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
78966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif /* __QCAMERA2HARDWAREINTERFACE_H__ */
790