1 /*
2 Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
3 
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
6 met:
7     * Redistributions of source code must retain the above copyright
8       notice, this list of conditions and the following disclaimer.
9     * Redistributions in binary form must reproduce the above
10       copyright notice, this list of conditions and the following
11       disclaimer in the documentation and/or other materials provided
12       with the distribution.
13     * Neither the name of The Linux Foundation nor the names of its
14       contributors may be used to endorse or promote products derived
15       from this software without specific prior written permission.
16 
17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29 
30 #ifndef __MM_QCAMERA_APP_H__
31 #define __MM_QCAMERA_APP_H__
32 
33 #include "camera.h"
34 #include "mm_qcamera_main_menu.h"
35 #include "mm_camera_interface.h"
36 #include "mm_jpeg_interface.h"
37 
38 #define MM_QCAMERA_APP_INTERATION 1
39 
40 #define MM_APP_MAX_DUMP_FRAME_NUM 1000
41 
42 #define PREVIEW_BUF_NUM 7
43 #define VIDEO_BUF_NUM 7
44 #define ISP_PIX_BUF_NUM 9
45 
46 #define STATS_BUF_NUM 4
47 
48 typedef enum {
49     MM_CAMERA_OK,
50     MM_CAMERA_E_GENERAL,
51     MM_CAMERA_E_NO_MEMORY,
52     MM_CAMERA_E_NOT_SUPPORTED,
53     MM_CAMERA_E_INVALID_INPUT,
54     MM_CAMERA_E_INVALID_OPERATION, /* 5 */
55     MM_CAMERA_E_ENCODE,
56     MM_CAMERA_E_BUFFER_REG,
57     MM_CAMERA_E_PMEM_ALLOC,
58     MM_CAMERA_E_CAPTURE_FAILED,
59     MM_CAMERA_E_CAPTURE_TIMEOUT, /* 10 */
60 }mm_camera_status_type_t;
61 
62 typedef struct {
63     int num;
64     mm_camera_buf_def_t bufs[MM_CAMERA_MAX_NUM_FRAMES];
65     struct ion_allocation_data alloc[MM_CAMERA_MAX_NUM_FRAMES];
66     struct ion_fd_data ion_info_fd[MM_CAMERA_MAX_NUM_FRAMES];
67 } mm_camear_app_buf_t;
68 
69 typedef struct {
70     uint32_t id;
71     mm_camera_stream_config_t str_config;
72     mm_camear_app_buf_t app_bufs;
73 }mm_camear_stream_t;
74 
75 typedef enum{
76     CAMERA_STATE_OPEN,
77     CAMERA_STATE_PREVIEW,
78     CAMERA_STATE_RECORD,
79     CAMERA_STATE_SNAPSHOT,
80     CAMERA_STATE_RDI
81 }camera_state;
82 
83 typedef enum{
84     CAMERA_MODE,
85     RECORDER_MODE,
86     ZSL_MODE,
87     RDI_MODE
88 }camera_mode;
89 
90 #define MM_QCAM_APP_MAX_STREAM_NUM MM_CAMERA_IMG_MODE_MAX
91 
92 typedef struct {
93     mm_camera_buf_def_t *frame;
94     uint8_t ref_cnt;
95 } repro_src_buf_info;
96 
97 typedef struct {
98     struct cam_list list;
99     void* data;
100 } mm_qcamera_q_node_t;
101 
102 typedef struct {
103     mm_qcamera_q_node_t head; /* dummy head */
104     uint32_t size;
105     pthread_mutex_t lock;
106 } mm_qcamera_queue_t;
107 
108 typedef struct {
109     mm_camera_vtbl_t *cam;
110     mm_camear_mem_vtbl_t *mem_cam;
111     int8_t my_id;
112     //mm_camera_op_mode_type_t op_mode;
113     uint32_t ch_id;
114     cam_ctrl_dimension_t dim;
115     int open_flag;
116     int ionfd;
117     mm_camear_stream_t stream[MM_QCAM_APP_MAX_STREAM_NUM];
118     camera_mode cam_mode;
119     camera_state cam_state;
120     int fullSizeSnapshot;
121 
122     mm_jpeg_ops_t jpeg_ops;
123     uint32_t jpeg_hdl;
124     mm_camera_super_buf_t* current_job_frames;
125     uint32_t current_job_id;
126     mm_camear_app_buf_t jpeg_buf;
127 
128     uint32_t isp_repro_handle;
129     uint8_t repro_dest_num;
130     mm_qcamera_queue_t repro_q;
131     repro_src_buf_info repro_buf_info[ISP_PIX_BUF_NUM];
132     mm_camera_repro_config_data_t repro_config;
133 } mm_camera_app_obj_t;
134 
135 typedef struct {
136   void *ptr;
137   void* ptr_jpeg;
138 
139   mm_camera_info_t *(*mm_camera_query) (uint8_t *num_cameras);
140   mm_camera_vtbl_t *(*mm_camera_open) (uint8_t camera_idx,
141                                mm_camear_mem_vtbl_t *mem_vtbl);
142   uint32_t (*jpeg_open) (mm_jpeg_ops_t *ops);
143 
144   /*uint8_t *(*mm_camera_do_mmap)(uint32_t size, int *pmemFd);
145   int (*mm_camera_do_munmap)(int pmem_fd, void *addr, size_t size);
146 
147    uint8_t *(*mm_camera_do_mmap_ion)(int ion_fd, struct ion_allocation_data *alloc,
148              struct ion_fd_data *ion_info_fd, int *mapFd);
149   int (*mm_camera_do_munmap_ion) (int ion_fd, struct ion_fd_data *ion_info_fd,
150                    void *addr, size_t size);*/
151 #if 0
152   uint32_t (*mm_camera_get_msm_frame_len)(cam_format_t fmt_type,
153                                             camera_mode_t mode,
154                                             int width,
155                                             int height,
156                                             int image_type,
157                                             uint8_t *num_planes,
158                                             uint32_t planes[]);
159 #ifndef DISABLE_JPEG_ENCODING
160   void (*set_callbacks)(jpegfragment_callback_t fragcallback,
161     jpeg_callback_t eventcallback, void* userdata, void* output_buffer,
162     int * outBufferSize);
163   int8_t (*omxJpegOpen)(void);
164   void (*omxJpegClose)(void);
165   int8_t (*omxJpegStart)(void);
166   int8_t (*omxJpegEncode)(omx_jpeg_encode_params *encode_params);
167   void (*omxJpegFinish)(void);
168   int8_t (*mm_jpeg_encoder_setMainImageQuality)(uint32_t quality);
169 #endif
170 #endif
171 } hal_interface_lib_t;
172 
173 typedef struct {
174     //mm_camera_vtbl_t *cam;
175     uint8_t num_cameras;
176     mm_camera_app_obj_t *obj[2];
177     mm_camera_info_t *cam_info;
178     int use_overlay;
179     int use_user_ptr;
180     hal_interface_lib_t hal_lib;
181     int cam_open;
182     int run_sanity;
183 } mm_camera_app_t;
184 
185 extern mm_camera_app_t my_cam_app;
186 extern USER_INPUT_DISPLAY_T input_display;
187 extern int mm_app_dl_render(int frame_fd, struct crop_info * cropinfo);
188 extern mm_camera_app_obj_t *mm_app_get_cam_obj(int8_t cam_id);
189 extern int mm_app_load_hal();
190 extern int mm_app_init();
191 extern void mm_app_user_ptr(int use_user_ptr);
192 extern int mm_app_open_ch(int cam_id);
193 extern void mm_app_close_ch(int cam_id, int ch_type);
194 extern int mm_app_set_dim(int8_t cam_id, cam_ctrl_dimension_t *dim);
195 extern int mm_app_run_unit_test();
196 extern int mm_app_unit_test_entry(mm_camera_app_t *cam_app);
197 extern int mm_app_unit_test();
198 extern void mm_app_set_dim_def(cam_ctrl_dimension_t *dim);
199 extern int mm_app_open(uint8_t camera_idx);
200 extern int mm_app_close(int8_t cam_id);
201 extern int startPreview(int cam_id);
202 extern int mm_app_stop_preview(int cam_id);
203 extern int mm_app_stop_video(int cam_id);
204 extern int startRecording(int cam_id);
205 extern int stopRecording(int cam_id);
206 extern int mm_app_take_picture(int cam_id);
207 extern int mm_app_take_raw_picture(int cam_id);
208 extern int mm_app_get_dim(int8_t cam_id, cam_ctrl_dimension_t *dim);
209 extern int mm_app_streamon_preview(int cam_id);
210 extern int mm_app_set_snapshot_fmt(int cam_id,mm_camera_image_fmt_t *fmt);
211 
212 extern int mm_app_dual_test_entry(mm_camera_app_t *cam_app);
213 extern int mm_app_dual_test();
214 
215 extern int mm_camera_app_wait();
216 extern void mm_camera_app_done();
217 
218 extern int mm_stream_initbuf(uint32_t camera_handle,
219                              uint32_t ch_id, uint32_t stream_id,
220                              void *user_data,
221                              mm_camera_frame_len_offset *frame_offset_info,
222                              uint8_t num_bufs,
223                              uint8_t *initial_reg_flag,
224                              mm_camera_buf_def_t *bufs);
225 
226 extern int mm_stream_deinitbuf(uint32_t camera_handle,
227                              uint32_t ch_id, uint32_t stream_id,
228                              void *user_data, uint8_t num_bufs,
229                              mm_camera_buf_def_t *bufs);
230 
231 extern void mm_app_preview_notify_cb(mm_camera_super_buf_t *bufs,
232                                      void *user_data);
233 #endif /* __MM_QCAMERA_APP_H__ */
234 
235 
236 
237 
238 
239 
240 
241 
242 
243