1 /* Copyright (c) 2016, The Linux Foundation. All rights reserved.
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are
5  * met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above
9  *       copyright notice, this list of conditions and the following
10  *       disclaimer in the documentation and/or other materials provided
11  *       with the distribution.
12  *     * Neither the name of The Linux Foundation nor the names of its
13  *       contributors may be used to endorse or promote products derived
14  *       from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  */
29 
30 #ifndef __MM_CAMERA_MUXER_H__
31 #define __MM_CAMERA_MUXER_H__
32 
33 // System dependencies
34 #include <media/msmb_camera.h>
35 
36 // Camera dependencies
37 #include "cam_intf.h"
38 #include "mm_camera.h"
39 
40 /*Frame sync node structure*/
41 typedef struct mm_frame_sync_queue_node {
42     /*Number of objects*/
43     uint8_t num_objs;
44     /*Super buffer for different objects*/
45     mm_camera_super_buf_t super_buf[MAX_OBJS_FOR_FRAME_SYNC];
46     /*FrameID of these super buffers*/
47     uint32_t frame_idx;
48     /*Is this matched?*/
49     uint8_t matched;
50 } mm_frame_sync_queue_node_t;
51 
52 
53 /*Utility Functions for dual camera*/
54 uint8_t mm_camera_util_get_index_by_num(uint8_t cam_num, uint32_t handler);
55 uint32_t mm_camera_util_get_handle_by_num(uint8_t num1, uint32_t handle);
56 uint32_t mm_camera_util_generate_handler_by_num(uint8_t cam_num, uint8_t index);
57 const char *mm_camera_util_get_dev_name_by_num(uint8_t cam_num, uint32_t cam_handle);
58 
59 /*Function to handle command from client for Auxillary Cameras*/
60 int32_t mm_camera_muxer_camera_open(uint8_t camera_idx,
61         mm_camera_obj_t *cam_obj);
62 int32_t mm_camera_muxer_query_capability(uint32_t camera_handle,
63         mm_camera_obj_t *cam_obj);
64 int32_t mm_camera_muxer_register_event_notify(uint32_t camera_handle,
65         mm_camera_event_notify_t evt_cb,
66         void *user_data, mm_camera_obj_t *cam_obj);
67 int32_t mm_camera_muxer_close_camera(uint32_t camera_handle,
68         mm_camera_obj_t *cam_obj);
69 int32_t mm_camera_muxer_map_buf(uint32_t camera_handle, uint8_t buf_type,
70         int fd, size_t size, void *buffer, mm_camera_obj_t *cam_obj);
71 int32_t mm_camera_muxer_map_bufs(uint32_t camera_handle,
72         const cam_buf_map_type_list *buf_map_list,
73         mm_camera_obj_t *cam_obj);
74 int32_t mm_camera_muxer_unmap_buf(uint32_t camera_handle,
75         uint8_t buf_type, mm_camera_obj_t *cam_obj);
76 int32_t mm_camera_muxer_set_parms(uint32_t camera_handle,
77         parm_buffer_t *parms, mm_camera_obj_t *cam_obj);
78 int32_t mm_camera_muxer_get_parms(uint32_t camera_handle,
79         parm_buffer_t *parms, mm_camera_obj_t *cam_obj);
80 int32_t mm_camera_muxer_do_auto_focus(uint32_t camera_handle,
81         mm_camera_obj_t *cam_obj);
82 int32_t mm_camera_muxer_cancel_auto_focus(uint32_t camera_handle,
83         mm_camera_obj_t *cam_obj);
84 int32_t mm_camera_muxer_prepare_snapshot(uint32_t camera_handle,
85         int32_t do_af_flag, mm_camera_obj_t *cam_obj);
86 int32_t mm_camera_muxer_start_zsl_snapshot(uint32_t camera_handle,
87         uint32_t ch_id, mm_camera_obj_t *cam_obj);
88 int32_t mm_camera_muxer_stop_zsl_snapshot(uint32_t camera_handle,
89         uint32_t ch_id, mm_camera_obj_t *cam_obj);
90 uint32_t mm_camera_muxer_add_channel(uint32_t camera_handle,
91         mm_camera_channel_attr_t *attr, mm_camera_buf_notify_t channel_cb,
92         void *userdata, uint32_t src_id, mm_camera_obj_t *cam_obj);
93 int32_t mm_camera_muxer_delete_channel(uint32_t camera_handle, uint32_t ch_id,
94         mm_camera_obj_t *cam_obj);
95 int32_t mm_camera_muxer_get_bundle_info(uint32_t camera_handle, uint32_t ch_id,
96         cam_bundle_config_t *bundle_info, mm_camera_obj_t *cam_obj);
97 uint32_t mm_camera_muxer_add_stream(uint32_t camera_handle,
98         uint32_t ch_id, uint32_t src__ch_id, uint32_t src_stream_id,
99         mm_camera_obj_t *cam_obj);
100 int32_t mm_camera_muxer_delete_stream(uint32_t camera_handle,
101         uint32_t ch_id, uint32_t stream_id,
102         mm_camera_obj_t *cam_obj);
103 int32_t mm_camera_muxer_link_stream(uint32_t camera_handle,
104         uint32_t ch_id, uint32_t stream_id, uint32_t linked_ch_id,
105         mm_camera_obj_t *cam_obj);
106 int32_t mm_camera_muxer_config_stream(uint32_t camera_handle,
107         uint32_t ch_id, uint32_t stream_id, mm_camera_stream_config_t *config,
108         mm_camera_obj_t *cam_obj);
109 int32_t mm_camera_muxer_map_stream_buf(uint32_t camera_handle,
110         uint32_t ch_id, uint32_t stream_id,
111         uint8_t buf_type, uint32_t buf_idx, int32_t plane_idx, int fd,
112         size_t size, void *buffer, mm_camera_obj_t *cam_obj);
113 int32_t mm_camera_muxer_map_stream_bufs(uint32_t camera_handle,
114         uint32_t ch_id, const cam_buf_map_type_list *buf_map_list,
115         mm_camera_obj_t *cam_obj);
116 int32_t mm_camera_muxer_unmap_stream_buf(uint32_t camera_handle,
117         uint32_t ch_id, uint32_t stream_id,
118         uint8_t buf_type, uint32_t buf_idx,
119         int32_t plane_idx, mm_camera_obj_t *cam_obj);
120 int32_t mm_camera_muxer_set_stream_parms(uint32_t camera_handle,
121         uint32_t ch_id, uint32_t s_id, cam_stream_parm_buffer_t *parms,
122         mm_camera_obj_t *cam_obj);
123 int32_t mm_camera_muxer_get_stream_parms(uint32_t camera_handle,
124         uint32_t ch_id, uint32_t s_id, cam_stream_parm_buffer_t *parms,
125         mm_camera_obj_t *cam_obj);
126 int32_t mm_camera_muxer_start_channel(uint32_t camera_handle,
127         uint32_t ch_id, mm_camera_obj_t *cam_obj);
128 int32_t mm_camera_muxer_stop_channel(uint32_t camera_handle,
129         uint32_t ch_id, mm_camera_obj_t *cam_obj);
130 int32_t mm_camera_muxer_qbuf(uint32_t camera_handle, uint32_t ch_id,
131         mm_camera_buf_def_t *buf, mm_camera_obj_t *cam_obj);
132 int32_t mm_camera_muxer_get_queued_buf_count(uint32_t camera_handle,
133         uint32_t ch_id, uint32_t stream_id,
134         mm_camera_obj_t *cam_obj);
135 int32_t mm_camera_muxer_request_super_buf(uint32_t ch_id,
136         mm_camera_req_buf_t *buf, mm_camera_obj_t *cam_obj);
137 int32_t mm_camera_muxer_cancel_super_buf_request(uint32_t camera_handle,
138         uint32_t ch_id,
139         mm_camera_obj_t *cam_obj);
140 int32_t mm_camera_muxer_flush_super_buf_queue(uint32_t camera_handle,
141         uint32_t ch_id,
142         uint32_t frame_idx, mm_camera_obj_t *cam_obj);
143 int32_t mm_camera_muxer_configure_notify_mode(uint32_t camera_handle,
144         uint32_t ch_id, mm_camera_super_buf_notify_mode_t notify_mode,
145         mm_camera_obj_t *cam_obj);
146 int32_t mm_camera_muxer_process_advanced_capture(uint32_t camera_handle,
147          uint32_t ch_id, mm_camera_advanced_capture_t type,
148          int8_t start_flag, void *in_value, mm_camera_obj_t *cam_obj);
149 int32_t mm_camera_muxer_get_session_id(uint32_t camera_handle,
150         uint32_t* sessionid, mm_camera_obj_t *cam_obj);
151 int32_t mm_camera_muxer_flush(uint32_t camera_handle, mm_camera_obj_t *cam_obj);
152 int32_t mm_camera_muxer_register_stream_buf_cb(uint32_t camera_handle,
153         uint32_t ch_id, uint32_t stream_id, mm_camera_buf_notify_t buf_cb,
154         mm_camera_stream_cb_type cb_type, void *userdata, mm_camera_obj_t *cam_obj);
155 int32_t mm_camera_muxer_reg_frame_sync(mm_camera_obj_t *cam_obj,
156         uint32_t ch_id, uint32_t stream_id,
157         mm_camera_intf_frame_sync_t *sync_attr);
158 int32_t mm_camera_muxer_set_dual_cam_cmd(uint32_t camera_handle,
159         mm_camera_obj_t *cam_obj);
160 
161 /*Muxer internal functions*/
162 void mm_camera_muxer_stream_frame_sync(mm_camera_super_buf_t *super_buf,
163         void *user_data);
164 void mm_camera_muxer_channel_frame_sync(mm_camera_super_buf_t *super_buf,
165         void *user_data);
166 int32_t mm_camera_muxer_do_frame_sync(
167         mm_frame_sync_queue_t *queue, mm_camera_super_buf_t *buffer,
168         mm_frame_sync_queue_node_t *dispatch_buf);
169 void mm_camera_muxer_buf_done(mm_camera_super_buf_t *buffer);
170 int32_t mm_muxer_frame_sync_queue_init(mm_frame_sync_queue_t *queue);
171 int32_t mm_muxer_frame_sync_queue_deinit(mm_frame_sync_queue_t *queue);
172 int32_t mm_camera_muxer_get_stream_bufs(mm_stream_t *my_obj);
173 int32_t mm_camera_muxer_put_stream_bufs(mm_stream_t *my_obj);
174 int32_t mm_camera_muxer_stream_frame_sync_flush(mm_stream_t *str_obj);
175 int32_t mm_camera_muxer_channel_frame_sync_flush(mm_channel_t *my_obj);
176 mm_frame_sync_queue_node_t *mm_camera_muxer_frame_sync_dequeue(
177         mm_frame_sync_queue_t *queue, uint8_t matched_only);
178 int32_t mm_camera_muxer_channel_req_data_cb(mm_camera_req_buf_t *req_buf,
179         mm_channel_t *ch_obj);
180 int32_t mm_camera_map_stream_buf_ops(uint32_t buf_idx,
181         int32_t plane_idx, int fd, size_t size,
182         void *buffer, cam_mapping_buf_type type,
183         void *userdata);
184 int32_t mm_camera_bundled_map_stream_buf_ops(
185         const cam_buf_map_type_list *buf_map_list,
186         void *userdata);
187 int32_t mm_camera_unmap_stream_buf_ops(uint32_t buf_idx,
188         int32_t plane_idx, cam_mapping_buf_type type, void *userdata);
189 
190 #endif /*__MM_CAMERA_MUXER_H */
191