summaryrefslogtreecommitdiff
path: root/camera/mm-camera-interface/mm_camera.h
blob: 57c229bcd9a88a72c32436baa0397e2d9818e758 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
/*
Copyright (c) 2011-2012,2015, 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_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[MM_CAMERA_MAX_NUM_FRAMES];
    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_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__ */