blob: 0d62fbe9be89cfc808f75b5d200a73f11a42b179 [file] [log] [blame]
/*
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__ */