/*
Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
      copyright notice, this list of conditions and the following
      disclaimer in the documentation and/or other materials provided
      with the distribution.
    * Neither the name of The Linux Foundation nor the names of its
      contributors may be used to endorse or promote products derived
      from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef __MM_CAMERA_H__
#define __MM_CAMERA_H__

#define TRUE 1
#define FALSE 0

typedef enum {
    MM_CAMERA_STREAM_STATE_NOTUSED,     /* not used */
    MM_CAMERA_STREAM_STATE_ACQUIRED,    /* acquired, fd opened  */
    MM_CAMERA_STREAM_STATE_CFG,             /* fmt & dim configured */
    MM_CAMERA_STREAM_STATE_REG,             /* buf regged, stream off */
    MM_CAMERA_STREAM_STATE_ACTIVE,      /* stream on */
    MM_CAMERA_STREAM_STATE_MAX
} mm_camera_stream_state_type_t;

typedef enum {
    MM_CAMERA_STATE_EVT_NOTUSED,
    MM_CAMERA_STATE_EVT_ACQUIRE,
    MM_CAMERA_STATE_EVT_ATTR,
    MM_CAMERA_STATE_EVT_RELEASE,
    MM_CAMERA_STATE_EVT_REG_BUF_CB,
    MM_CAMERA_STATE_EVT_SET_FMT,
    MM_CAMERA_STATE_EVT_SET_DIM,
    MM_CAMERA_STATE_EVT_REG_BUF, // request amount of buffers and enqueue all buffers to kernel
    MM_CAMERA_STATE_EVT_UNREG_BUF,
    MM_CAMERA_STATE_EVT_STREAM_ON,
    MM_CAMERA_STATE_EVT_STREAM_OFF,
    MM_CAMERA_STATE_EVT_QBUF,
    MM_CAMERA_STATE_EVT_GET_CROP,
    MM_CAMERA_STATE_EVT_DISPATCH_BUFFERED_FRAME,
    MM_CAMERA_STATE_EVT_REQUEST_BUF, // request amount of buffers to kernel only
    MM_CAMERA_STATE_EVT_ENQUEUE_BUF, // enqueue some of buffers to kernel only
    MM_CAMERA_STATE_EVT_MAX
} mm_camera_state_evt_type_t;

typedef struct {
    mm_camera_event_notify_t evt_cb;
    void * user_data;
} mm_camera_notify_cb_t;

typedef enum {
    MM_CAMERA_BUF_CB_ONCE,
    MM_CAMERA_BUF_CB_COUNT,
    MM_CAMERA_BUF_CB_INFINITE
} mm_camera_buf_cb_type_t;

typedef struct {
    mm_camera_buf_notify_t cb;
    mm_camera_buf_cb_type_t cb_type;
    uint32_t cb_count;
    void *user_data;
} mm_camera_buf_cb_t;

typedef enum {
    MM_CAMERA_STREAM_PIPE,
    MM_CAMERA_STREAM_PREVIEW,
    MM_CAMERA_STREAM_VIDEO,
    MM_CAMERA_STREAM_SNAPSHOT,
    MM_CAMERA_STREAM_THUMBNAIL,
    MM_CAMERA_STREAM_RAW,
    MM_CAMERA_STREAM_VIDEO_MAIN,
    MM_CAMERA_STREAM_MAX
} mm_camera_stream_type_t;

typedef struct mm_camera_frame_t mm_camera_frame_t;
struct mm_camera_frame_t{
    struct msm_frame frame;
    struct v4l2_plane planes[VIDEO_MAX_PLANES];
    uint8_t num_planes;
    int idx;
    int match;
    int valid_entry;
    mm_camera_frame_t *next;
};

typedef struct {
    pthread_mutex_t mutex;
    int cnt;
	int match_cnt;
    mm_camera_frame_t *head;
    mm_camera_frame_t *tail;
} mm_camera_frame_queue_t;

typedef struct {
    mm_camera_frame_queue_t readyq;
    int32_t num_frame;
    uint32_t frame_len;
    int8_t reg_flag;
    uint32_t frame_offset[MM_CAMERA_MAX_NUM_FRAMES];
    mm_camera_frame_t frame[MM_CAMERA_MAX_NUM_FRAMES];
    int8_t ref_count[MM_CAMERA_MAX_NUM_FRAMES];
    int32_t use_multi_fd;
    int qbuf;
    pthread_mutex_t mutex;
} mm_camera_stream_frame_t;

typedef struct {
    int32_t fd;
    mm_camera_stream_state_type_t state;
    mm_camera_stream_type_t stream_type;
    struct v4l2_format fmt;
    cam_format_t cam_fmt;
    mm_camera_stream_frame_t frame;
} mm_camera_stream_t;

typedef struct {
    mm_camera_stream_t stream;
    mm_camera_raw_streaming_type_t mode;
} mm_camera_ch_raw_t;

typedef struct {
    mm_camera_stream_t stream;
} mm_camera_ch_preview_t;

typedef struct {
    mm_camera_stream_t thumbnail;
    mm_camera_stream_t main;
    int    delivered_cnt;
    int8_t pending_cnt;
    uint32_t expected_matching_id;
} mm_camera_ch_snapshot_t;

typedef struct {
    int8_t fifo[MM_CAMERA_MAX_FRAME_NUM];
    int8_t low;
    int8_t high;
    int8_t len;
    int8_t water_mark;
} mm_camera_circule_fifo_t;

typedef struct {
    mm_camera_stream_t video;
    mm_camera_stream_t main;
    uint8_t has_main;
} mm_camera_ch_video_t;

#define MM_CAMERA_BUF_CB_MAX 4
typedef struct {
    mm_camera_channel_type_t type;
    pthread_mutex_t mutex;
    uint8_t acquired;
    mm_camera_buf_cb_t buf_cb[MM_CAMERA_BUF_CB_MAX];
    mm_camera_channel_attr_buffering_frame_t buffering_frame;
    union {
        mm_camera_ch_raw_t raw;
        mm_camera_ch_preview_t preview;
        mm_camera_ch_snapshot_t snapshot;
        mm_camera_ch_video_t video;
    };
} mm_camera_ch_t;

#define MM_CAMERA_EVT_ENTRY_MAX 4
typedef struct {
    mm_camera_event_notify_t evt_cb;
    void *user_data;
} mm_camera_evt_entry_t;

typedef struct {
    mm_camera_evt_entry_t evt[MM_CAMERA_EVT_ENTRY_MAX];
    int reg_count;
} mm_camera_evt_obj_t;

#define MM_CAMERA_CH_STREAM_MAX 2
typedef enum {
    MM_CAMERA_POLL_TYPE_EVT,
    MM_CAMERA_POLL_TYPE_CH,
    MM_CAMERA_POLL_TYPE_MAX
} mm_camera_poll_thread_type_t;

typedef struct {
    mm_camera_poll_thread_type_t poll_type;
    int32_t pfds[2];
    int poll_fd[MM_CAMERA_CH_STREAM_MAX+1];
    int num_fds;
    int used;
    pthread_t pid;
    int32_t state;
    int timeoutms;
    void *my_obj;
    mm_camera_channel_type_t ch_type;
    mm_camera_stream_t *poll_streams[MM_CAMERA_CH_STREAM_MAX];
    uint32_t cmd;
} mm_camera_poll_thread_data_t;

typedef struct {
    pthread_mutex_t mutex;
    pthread_cond_t cond_v;
    int32_t status;
    mm_camera_poll_thread_data_t data;
} mm_camera_poll_thread_t;

typedef struct {
    int stream_on_count_cfg;
    int stream_off_count_cfg;
    int stream_on_count;
    int stream_off_count;
} mm_camera_ch_stream_count_t;
#define MM_CAMERA_POLL_THRAED_MAX (MM_CAMERA_CH_MAX+1)

typedef struct {
  struct msm_mem_map_info cookie;
  uint32_t vaddr;
} mm_camera_mem_map_entry_t;

#define MM_CAMERA_MEM_MAP_MAX 8
typedef struct {
  int num;
  mm_camera_mem_map_entry_t entry[MM_CAMERA_MEM_MAP_MAX];
} mm_camera_mem_map_t;

typedef struct {
    int8_t my_id;
    camera_mode_t current_mode;
    mm_camera_op_mode_type_t op_mode;
    mm_camera_notify_cb_t *notify;
    mm_camera_ch_t ch[MM_CAMERA_CH_MAX];
    int ref_count;
    uint32_t ch_streaming_mask;
    int32_t ctrl_fd;
    int32_t ds_fd; // domain socket fd
    cam_ctrl_dimension_t dim;
    cam_prop_t properties;
    pthread_mutex_t mutex;
    mm_camera_evt_obj_t evt[MM_CAMERA_EVT_TYPE_MAX];
    mm_camera_ch_stream_count_t ch_stream_count[MM_CAMERA_CH_MAX];
    uint32_t evt_type_mask;
    mm_camera_poll_thread_t poll_threads[MM_CAMERA_POLL_THRAED_MAX];
    mm_camera_mem_map_t hist_mem_map;
    int full_liveshot;
    int snap_burst_num_by_user;
} mm_camera_obj_t;

#define MM_CAMERA_DEV_NAME_LEN 32
#define MM_CAMERA_DEV_OPEN_TRIES 2
#define MM_CAMERA_DEV_OPEN_RETRY_SLEEP 20

typedef struct {
    mm_camera_t camera[MSM_MAX_CAMERA_SENSORS];
    int8_t num_cam;
    char video_dev_name[MSM_MAX_CAMERA_SENSORS][MM_CAMERA_DEV_NAME_LEN];
    mm_camera_obj_t *cam_obj[MSM_MAX_CAMERA_SENSORS];
} mm_camera_ctrl_t;

typedef struct {
    mm_camera_parm_type_t parm_type;
     void *p_value;
} mm_camera_parm_t;

extern int32_t mm_camera_stream_fsm_fn_vtbl (mm_camera_obj_t * my_obj,
                                            mm_camera_stream_t *stream,
                                            mm_camera_state_evt_type_t evt, void *val);
extern const char *mm_camera_util_get_dev_name(mm_camera_obj_t * my_obj);
extern int32_t mm_camera_util_s_ctrl( int32_t fd,
                                            uint32_t id, int32_t value);
extern int32_t mm_camera_util_private_s_ctrl( int32_t fd,
                                            uint32_t id, int32_t value);
extern int32_t mm_camera_util_g_ctrl( int32_t fd,
                                            uint32_t id, int32_t *value);
extern int32_t mm_camera_ch_fn(mm_camera_obj_t * my_obj,
                                            mm_camera_channel_type_t ch_type,
                                            mm_camera_state_evt_type_t evt, void *val);
extern int32_t mm_camera_action(mm_camera_obj_t *my_obj, uint8_t start,
                                            mm_camera_ops_type_t opcode, void *parm);
extern int32_t mm_camera_open(mm_camera_obj_t *my_obj,
                                            mm_camera_op_mode_type_t op_mode);
extern int32_t mm_camera_close(mm_camera_obj_t *my_obj);
extern int32_t mm_camera_start(mm_camera_obj_t *my_obj,
                                            mm_camera_ops_type_t opcode, void *parm);
extern int32_t mm_camera_stop(mm_camera_obj_t *my_obj,
                                            mm_camera_ops_type_t opcode, void *parm);
extern int32_t mm_camera_get_parm(mm_camera_obj_t * my_obj,
                                            mm_camera_parm_t *parm);
extern int32_t mm_camera_set_parm(mm_camera_obj_t * my_obj,
                                            mm_camera_parm_t *parm);
extern int32_t mm_camera_request_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf);
extern int32_t mm_camera_enqueue_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf);
extern int32_t mm_camera_prepare_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf);
extern int32_t mm_camera_unprepare_buf(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type);
extern int mm_camera_poll_thread_launch(mm_camera_obj_t * my_obj, int ch_type);

int mm_camera_poll_thread_del_ch(mm_camera_obj_t * my_obj, int ch_type);
int mm_camera_poll_thread_add_ch(mm_camera_obj_t * my_obj, int ch_type);
extern int32_t mm_camera_poll_dispatch_buffered_frames(mm_camera_obj_t * my_obj, int ch_type);
extern int mm_camera_poll_thread_release(mm_camera_obj_t * my_obj, int ch_type);
extern void mm_camera_poll_threads_init(mm_camera_obj_t * my_obj);
extern void mm_camera_poll_threads_deinit(mm_camera_obj_t * my_obj);
extern int mm_camera_poll_busy(mm_camera_obj_t * my_obj);
extern void mm_camera_msm_data_notify(mm_camera_obj_t * my_obj, int fd,
                                            mm_camera_stream_type_t stream_type);
extern void mm_camera_msm_evt_notify(mm_camera_obj_t * my_obj, int fd);
extern int mm_camera_read_msm_frame(mm_camera_obj_t * my_obj,
                        mm_camera_stream_t *stream);
extern int32_t mm_camera_ch_acquire(mm_camera_obj_t *my_obj, mm_camera_channel_type_t ch_type);
extern void mm_camera_ch_release(mm_camera_obj_t *my_obj, mm_camera_channel_type_t ch_type);
extern int mm_camera_ch_is_active(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type);
extern void mm_camera_ch_util_get_stream_objs(mm_camera_obj_t * my_obj,
                                                            mm_camera_channel_type_t ch_type,
                                                            mm_camera_stream_t **stream1,
                                                            mm_camera_stream_t **stream2);
extern int mm_camera_stream_qbuf(mm_camera_obj_t * my_obj,
                                                            mm_camera_stream_t *stream,
                                                            int idx);
extern int mm_camera_stream_frame_get_q_cnt(mm_camera_frame_queue_t *q);
extern mm_camera_frame_t *mm_camera_stream_frame_deq(mm_camera_frame_queue_t *q);
extern mm_camera_frame_t *mm_camera_stream_frame_deq_no_lock(mm_camera_frame_queue_t *q);
extern void mm_camera_stream_frame_enq(mm_camera_frame_queue_t *q, mm_camera_frame_t *node);
extern void mm_camera_stream_frame_enq_no_lock(mm_camera_frame_queue_t *q, mm_camera_frame_t *node);
extern void mm_camera_stream_frame_refill_q(mm_camera_frame_queue_t *q, mm_camera_frame_t *node, int num);
extern int mm_camera_stream_is_active(mm_camera_stream_t *stream);
extern int32_t mm_camera_stream_util_buf_done(mm_camera_obj_t * my_obj,
                    mm_camera_stream_t *stream,
                    mm_camera_notify_frame_t *frame);
//extern int mm_camera_poll_add_stream(mm_camera_obj_t * my_obj, mm_camera_stream_t *stream);
//extern int mm_camera_poll_del_stream(mm_camera_obj_t * my_obj, mm_camera_stream_t *stream);
extern int mm_camera_dev_open(int *fd, char *dev_name);
extern int mm_camera_reg_event(mm_camera_obj_t * my_obj, mm_camera_event_notify_t evt_cb,
                           void *user_data, uint32_t evt_type);
extern int mm_camera_poll_send_ch_event(mm_camera_obj_t * my_obj, mm_camera_event_t *event);
extern void mm_camera_msm_proc_ch_event(mm_camera_obj_t *my_obj, mm_camera_event_t *event);
extern void mm_camera_dispatch_app_event(mm_camera_obj_t *my_obj, mm_camera_event_t *event);
extern void mm_camera_dispatch_buffered_frames(mm_camera_obj_t *my_obj, mm_camera_channel_type_t ch_type);
extern void mm_camera_check_pending_zsl_frames(mm_camera_obj_t *my_obj,
                                        mm_camera_channel_type_t ch_type);
extern int mm_camera_ch_util_get_num_stream(mm_camera_obj_t * my_obj,mm_camera_channel_type_t ch_type);
extern int32_t mm_camera_sendmsg(mm_camera_obj_t *my_obj, void *msg, uint32_t buf_size, int sendfd);
#endif /* __MM_CAMERA_H__ */
