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 // To remove
31 #include <cutils/properties.h>
32
33 // System dependencies
34 #include <pthread.h>
35 #include <errno.h>
36 #include <fcntl.h>
37 #include <stdlib.h>
38 #include <dlfcn.h>
39 #define IOCTL_H <SYSTEM_HEADER_PREFIX/ioctl.h>
40 #include IOCTL_H
41
42 // Camera dependencies
43 #include "cam_semaphore.h"
44 #include "mm_camera_dbg.h"
45 #include "mm_camera_sock.h"
46 #include "mm_camera_interface.h"
47 #include "mm_camera_muxer.h"
48
49 #define MAX_UNMATCHED_FOR_FRAME_SYNC 0
50
51 extern mm_camera_obj_t* mm_camera_util_get_camera_by_handler(uint32_t cam_handler);
52 extern mm_channel_t * mm_camera_util_get_channel_by_handler(mm_camera_obj_t *cam_obj,
53 uint32_t handler);
54 extern mm_stream_t *mm_channel_util_get_stream_by_handler(mm_channel_t *ch_obj,
55 uint32_t handler);
56 extern int32_t mm_camera_util_set_camera_object(uint8_t cam_idx, mm_camera_obj_t *obj);
57
58
59 /*===========================================================================
60 * FUNCTION : mm_camera_util_get_index_by_num
61 *
62 * DESCRIPTION: utility function to get index from handle
63 *
64 * PARAMETERS :
65 * @cam_num : Camera number
66 * @handler: object handle
67 *
68 * RETURN : uint8_t type of index derived from handle
69 *==========================================================================*/
mm_camera_util_get_index_by_num(uint8_t cam_num,uint32_t handler)70 uint8_t mm_camera_util_get_index_by_num(uint8_t cam_num, uint32_t handler)
71 {
72 uint8_t idx = 0;
73 idx = ((mm_camera_util_get_handle_by_num(cam_num, handler) >>
74 (MM_CAMERA_HANDLE_SHIFT_MASK * cam_num))
75 & 0x000000ff);
76 return idx;
77 }
78
79 /*===========================================================================
80 * FUNCTION : mm_camera_util_get_handle_by_num
81 *
82 * DESCRIPTION: utility function to get handle for specific camera
83 *
84 * PARAMETERS :
85 * @cam_num : Camera number
86 * @handler : object handle
87 *
88 * RETURN : return proper handle based on the object num
89 *==========================================================================*/
mm_camera_util_get_handle_by_num(uint8_t cam_num,uint32_t handler)90 uint32_t mm_camera_util_get_handle_by_num(uint8_t cam_num, uint32_t handler)
91 {
92 return (handler & (MM_CAMERA_HANDLE_BIT_MASK <<
93 (MM_CAMERA_HANDLE_SHIFT_MASK * cam_num)));
94 }
95
96 /*===========================================================================
97 * FUNCTION : mm_camera_util_generate_handler_by_num
98 *
99 * DESCRIPTION: utility function to generate handler for camera/channel/stream
100 *
101 * PARAMETERS :
102 * @cam_num : Camera number
103 * @index : index of the object to have handler
104 *
105 * RETURN : uint32_t type of handle that uniquely identify the object
106 *==========================================================================*/
mm_camera_util_generate_handler_by_num(uint8_t cam_num,uint8_t index)107 uint32_t mm_camera_util_generate_handler_by_num(uint8_t cam_num, uint8_t index)
108 {
109 uint32_t handler = mm_camera_util_generate_handler(index);
110 handler = (handler << (MM_CAMERA_HANDLE_SHIFT_MASK * cam_num));
111 return handler;
112 }
113
114 /*===========================================================================
115 * FUNCTION : mm_camera_util_get_dev_name_by_num
116 *
117 * DESCRIPTION: utility function to get device name from camera handle
118 *
119 * PARAMETERS :
120 * @cam_handle: camera handle
121 *
122 * RETURN : char ptr to the device name stored in global variable
123 * NOTE : caller should not free the char ptr
124 *==========================================================================*/
mm_camera_util_get_dev_name_by_num(uint8_t cam_num,uint32_t cam_handle)125 const char *mm_camera_util_get_dev_name_by_num(uint8_t cam_num, uint32_t cam_handle)
126 {
127 uint32_t handle = (cam_handle >> (cam_num * MM_CAMERA_HANDLE_SHIFT_MASK));
128 return mm_camera_util_get_dev_name(handle);
129 }
130
131 /*===========================================================================
132 * FUNCTION : mm_muxer_util_get_camera_by_obj
133 *
134 * DESCRIPTION: utility function to get camera object from object list
135 *
136 * PARAMETERS :
137 * @cam_handle: camera handle
138 * @cam_obj : ptr to a Parent camera object
139 *
140 * RETURN : ptr to the camera object stored in global variable
141 * NOTE : caller should not free the camera object ptr
142 *==========================================================================*/
mm_muxer_util_get_camera_by_obj(uint32_t cam_handle,mm_camera_obj_t * cam_obj)143 mm_camera_obj_t* mm_muxer_util_get_camera_by_obj(uint32_t cam_handle,
144 mm_camera_obj_t *cam_obj)
145 {
146 mm_camera_obj_t *obj = cam_obj;
147 uint8_t i = 0;
148
149 if (cam_handle == cam_obj->my_hdl) {
150 return cam_obj;
151 }
152
153 if (obj->master_cam_obj != NULL) {
154 obj = obj->master_cam_obj;
155 }
156 for (i = 0; i < obj->num_s_cnt; i++) {
157 if (cam_handle == obj->aux_cam_obj[i]->my_hdl) {
158 obj = obj->aux_cam_obj[i];
159 break;
160 }
161 }
162 return obj;
163 }
164
165 /*===========================================================================
166 * FUNCTION : mm_muxer_util_get_channel_by_obj
167 *
168 * DESCRIPTION: utility function to get channel object from camera
169 *
170 * PARAMETERS :
171 * @ch_id: channel handle
172 * @cam_obj : ptr to a Parent camera object
173 *
174 * RETURN : ptr to the camera object stored in global variable
175 * NOTE : caller should not free the camera object ptr
176 *==========================================================================*/
mm_muxer_util_get_channel_by_obj(uint32_t ch_id,mm_camera_obj_t * cam_obj)177 mm_channel_t *mm_muxer_util_get_channel_by_obj(uint32_t ch_id,
178 mm_camera_obj_t *cam_obj)
179 {
180 mm_camera_obj_t *obj = cam_obj;
181 mm_channel_t *ch_obj = NULL;
182 uint8_t i = 0;
183
184 if (obj->master_cam_obj != NULL) {
185 obj = obj->master_cam_obj;
186 }
187 while (obj != NULL) {
188 ch_obj = mm_camera_util_get_channel_by_handler(obj, ch_id);
189 if (ch_obj != NULL) {
190 break;
191 }
192 obj = obj->aux_cam_obj[i++];
193 }
194 return ch_obj;
195 }
196
197 /*===========================================================================
198 * FUNCTION : mm_muxer_util_get_stream_by_obj
199 *
200 * DESCRIPTION: utility function to get stream object from camera
201 *
202 * PARAMETERS :
203 * @stream_id: stream handle
204 * @cam_obj : ptr to a Parent camera object
205 *
206 * RETURN : ptr to the camera object stored in global variable
207 * NOTE : caller should not free the camera object ptr
208 *==========================================================================*/
mm_muxer_util_get_stream_by_obj(uint32_t stream_id,mm_camera_obj_t * cam_obj)209 mm_stream_t *mm_muxer_util_get_stream_by_obj(uint32_t stream_id,
210 mm_camera_obj_t *cam_obj)
211 {
212 mm_camera_obj_t *obj = cam_obj;
213 mm_stream_t *stream_obj = NULL;
214 uint8_t i = 0, j = 0;
215
216 if (obj->master_cam_obj != NULL) {
217 obj = obj->master_cam_obj;
218 }
219
220 while ((obj != NULL) && (stream_obj == NULL)) {
221 for(i = 0; i < MM_CAMERA_CHANNEL_MAX; i++) {
222 stream_obj = mm_channel_util_get_stream_by_handler(
223 &cam_obj->ch[i], stream_id);
224 if (stream_obj == NULL) {
225 break;
226 }
227 }
228 obj = obj->aux_cam_obj[j++];
229 }
230 return stream_obj;
231 }
232
233 /*===========================================================================
234 * FUNCTION : mm_camera_muxer_camera_open
235 *
236 * DESCRIPTION: open a supporting camera by camera index
237 *
238 * PARAMETERS :
239 * @cam_idx : camera index. should within range of 0 to num_of_cameras
240 * @cam_obj : ptr to a Parent camera object
241 *
242 * RETURN : int32_t type of status
243 * 0 -- success
244 * non-zero error code -- failure
245 *==========================================================================*/
mm_camera_muxer_camera_open(uint8_t cam_idx,mm_camera_obj_t * cam_obj)246 int32_t mm_camera_muxer_camera_open(uint8_t cam_idx,
247 mm_camera_obj_t *cam_obj)
248 {
249 int32_t rc = 0;
250 mm_camera_obj_t *my_obj = NULL;
251 uint8_t my_num = 1;
252
253 my_obj = (mm_camera_obj_t *)malloc(sizeof(mm_camera_obj_t));
254 if(NULL == my_obj) {
255 pthread_mutex_unlock(&cam_obj->muxer_lock);
256 LOGE("no mem");
257 return -EINVAL;
258 }
259
260 /* initialize camera obj */
261 memset(my_obj, 0, sizeof(mm_camera_obj_t));
262 my_obj->ctrl_fd = -1;
263 my_obj->ds_fd = -1;
264 my_obj->ref_count++;
265 my_obj->my_num = my_num;
266 my_obj->my_hdl = mm_camera_util_generate_handler_by_num(my_num, cam_idx);
267 pthread_mutex_init(&my_obj->cam_lock, NULL);
268 /* unlock global interface lock, if not, in dual camera use case,
269 * current open will block operation of another opened camera obj*/
270 pthread_mutex_lock(&my_obj->cam_lock);
271 pthread_mutex_unlock(&cam_obj->muxer_lock);
272
273 rc = mm_camera_open(my_obj);
274 pthread_mutex_lock(&cam_obj->muxer_lock);
275 if (rc != 0) {
276 LOGE("mm_camera_open err = %d", rc);
277 pthread_mutex_destroy(&my_obj->cam_lock);
278 free(my_obj);
279 my_obj = NULL;
280 pthread_mutex_unlock(&cam_obj->muxer_lock);
281 return rc;
282 } else {
283 LOGD("Open succeded\n");
284 rc = mm_camera_util_set_camera_object(cam_idx, my_obj);
285 my_obj->vtbl.camera_handle = (cam_obj->my_hdl | my_obj->my_hdl);
286 cam_obj->vtbl.camera_handle = my_obj->vtbl.camera_handle;
287 cam_obj->aux_cam_obj[cam_obj->num_s_cnt++] = my_obj;
288 my_obj->master_cam_obj = cam_obj;
289 cam_obj->master_cam_obj = NULL;
290 pthread_mutex_unlock(&cam_obj->muxer_lock);
291 return rc;
292 }
293 }
294
295 /*===========================================================================
296 * FUNCTION : mm_camera_muxer_query_capability
297 *
298 * DESCRIPTION: query camera capability
299 *
300 * PARAMETERS :
301 * @camera_handle: camera handle
302 * @cam_obj : ptr to a Parent camera object
303 *
304 * RETURN : int32_t type of status
305 * 0 -- success
306 * -1 -- failure
307 *==========================================================================*/
mm_camera_muxer_query_capability(uint32_t camera_handle,mm_camera_obj_t * cam_obj)308 int32_t mm_camera_muxer_query_capability(uint32_t camera_handle,
309 mm_camera_obj_t *cam_obj)
310 {
311 int32_t rc = 0;
312 mm_camera_obj_t *my_obj = NULL;
313
314 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
315 if(my_obj) {
316 pthread_mutex_lock(&my_obj->cam_lock);
317 pthread_mutex_unlock(&cam_obj->muxer_lock);
318 rc = mm_camera_query_capability(my_obj);
319 } else {
320 pthread_mutex_unlock(&cam_obj->muxer_lock);
321 }
322 LOGD(" rc = %d", rc);
323 return rc;
324 }
325
326 /*===========================================================================
327 * FUNCTION : mm_camera_muxer_register_event_notify
328 *
329 * DESCRIPTION: register for event notify
330 *
331 * PARAMETERS :
332 * @camera_handle: camera handle
333 * @evt_cb : callback for event notify
334 * @user_data : user data ptr
335 * @cam_obj : ptr to a Parent camera object
336 *
337 * RETURN : int32_t type of status
338 * 0 -- success
339 * -1 -- failure
340 *==========================================================================*/
mm_camera_muxer_register_event_notify(uint32_t camera_handle,mm_camera_event_notify_t evt_cb,void * user_data,mm_camera_obj_t * cam_obj)341 int32_t mm_camera_muxer_register_event_notify(uint32_t camera_handle,
342 mm_camera_event_notify_t evt_cb,
343 void *user_data, mm_camera_obj_t *cam_obj)
344 {
345 int32_t rc = 0;
346 mm_camera_obj_t *my_obj = NULL;
347
348 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
349 if(my_obj) {
350 pthread_mutex_lock(&my_obj->cam_lock);
351 pthread_mutex_unlock(&cam_obj->muxer_lock);
352 rc = mm_camera_register_event_notify(my_obj, evt_cb, user_data);
353 } else {
354 pthread_mutex_unlock(&cam_obj->muxer_lock);
355 }
356 return rc;
357 }
358
359 /*===========================================================================
360 * FUNCTION : mm_camera_muxer_close_camera
361 *
362 * DESCRIPTION: close a camera by its handle
363 *
364 * PARAMETERS :
365 * @camera_handle: camera handle
366 * @cam_obj : ptr to a Parent camera object
367 *
368 * RETURN : int32_t type of status
369 * 0 -- success
370 * -1 -- failure
371 *==========================================================================*/
mm_camera_muxer_close_camera(uint32_t camera_handle,mm_camera_obj_t * cam_obj)372 int32_t mm_camera_muxer_close_camera(uint32_t camera_handle,
373 mm_camera_obj_t *cam_obj)
374 {
375 int32_t rc = 0;
376 mm_camera_obj_t *my_obj = NULL;
377
378 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
379 if (my_obj){
380 uint8_t cam_idx = mm_camera_util_get_index_by_num(
381 my_obj->my_num, my_obj->my_hdl);
382 my_obj->ref_count--;
383 if(my_obj->ref_count > 0) {
384 LOGD("ref_count=%d\n", my_obj->ref_count);
385 pthread_mutex_unlock(&cam_obj->muxer_lock);
386 rc = 0;
387 } else {
388 rc = mm_camera_util_set_camera_object(cam_idx, NULL);
389 pthread_mutex_lock(&my_obj->cam_lock);
390 pthread_mutex_unlock(&cam_obj->muxer_lock);
391 rc = mm_camera_close(my_obj);
392 pthread_mutex_destroy(&my_obj->cam_lock);
393 free(my_obj);
394 my_obj = NULL;
395 }
396 } else {
397 pthread_mutex_unlock(&cam_obj->muxer_lock);
398 }
399 return rc;
400 }
401
402 /*===========================================================================
403 * FUNCTION : mm_camera_muxer_map_buf
404 *
405 * DESCRIPTION: mapping camera buffer via domain socket to server
406 *
407 * PARAMETERS :
408 * @camera_handle: camera handle
409 * @buf_type : type of buffer to be mapped. could be following values:
410 * CAM_MAPPING_BUF_TYPE_CAPABILITY
411 * CAM_MAPPING_BUF_TYPE_SETPARM_BUF
412 * CAM_MAPPING_BUF_TYPE_GETPARM_BUF
413 * @fd : file descriptor of the buffer
414 * @size : size of the buffer
415 * @cam_obj : ptr to a Parent camera object
416 *
417 * RETURN : int32_t type of status
418 * 0 -- success
419 * -1 -- failure
420 *==========================================================================*/
mm_camera_muxer_map_buf(uint32_t camera_handle,uint8_t buf_type,int fd,size_t size,void * buffer,mm_camera_obj_t * cam_obj)421 int32_t mm_camera_muxer_map_buf(uint32_t camera_handle, uint8_t buf_type,
422 int fd, size_t size, void *buffer, mm_camera_obj_t *cam_obj)
423 {
424 int32_t rc = -1;
425 mm_camera_obj_t * my_obj = NULL;
426 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
427
428 if(my_obj) {
429 pthread_mutex_lock(&my_obj->cam_lock);
430 pthread_mutex_unlock(&cam_obj->muxer_lock);
431 rc = mm_camera_map_buf(my_obj, buf_type, fd, size, buffer);
432 }else{
433 pthread_mutex_unlock(&cam_obj->muxer_lock);
434 }
435 return rc;
436 }
437
438 /*===========================================================================
439 * FUNCTION : mm_camera_muxer_map_bufs
440 *
441 * DESCRIPTION: mapping camera buffer via domain socket to server
442 *
443 * PARAMETERS :
444 * @camera_handle: camera handle
445 * @buf_type : type of buffer to be mapped. could be following values:
446 * CAM_MAPPING_BUF_TYPE_CAPABILITY
447 * CAM_MAPPING_BUF_TYPE_SETPARM_BUF
448 * CAM_MAPPING_BUF_TYPE_GETPARM_BUF
449 * @cam_obj : ptr to a Parent camera object
450 *
451 * RETURN : int32_t type of status
452 * 0 -- success
453 * -1 -- failure
454 *==========================================================================*/
mm_camera_muxer_map_bufs(uint32_t camera_handle,const cam_buf_map_type_list * buf_map_list,mm_camera_obj_t * cam_obj)455 int32_t mm_camera_muxer_map_bufs(uint32_t camera_handle,
456 const cam_buf_map_type_list *buf_map_list,
457 mm_camera_obj_t *cam_obj)
458 {
459 int32_t rc = -1;
460 mm_camera_obj_t * my_obj = NULL;
461 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
462
463 if(my_obj) {
464 pthread_mutex_lock(&my_obj->cam_lock);
465 pthread_mutex_unlock(&cam_obj->muxer_lock);
466 rc = mm_camera_map_bufs(my_obj, buf_map_list);
467 }else{
468 pthread_mutex_unlock(&cam_obj->muxer_lock);
469 }
470 return rc;
471 }
472
473 /*===========================================================================
474 * FUNCTION : mm_camera_muxer_unmap_buf
475 *
476 * DESCRIPTION: unmapping camera buffer via domain socket to server
477 *
478 * PARAMETERS :
479 * @camera_handle: camera handle
480 * @buf_type : type of buffer to be unmapped. could be following values:
481 * CAM_MAPPING_BUF_TYPE_CAPABILITY
482 * CAM_MAPPING_BUF_TYPE_SETPARM_BUF
483 * CAM_MAPPING_BUF_TYPE_GETPARM_BUF
484 * @cam_obj : ptr to a Parent camera object
485 *
486 * RETURN : int32_t type of status
487 * 0 -- success
488 * -1 -- failure
489 *==========================================================================*/
mm_camera_muxer_unmap_buf(uint32_t camera_handle,uint8_t buf_type,mm_camera_obj_t * cam_obj)490 int32_t mm_camera_muxer_unmap_buf(uint32_t camera_handle,
491 uint8_t buf_type, mm_camera_obj_t *cam_obj)
492 {
493 int32_t rc = -1;
494 mm_camera_obj_t * my_obj = NULL;
495 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
496
497 if(my_obj) {
498 pthread_mutex_lock(&my_obj->cam_lock);
499 pthread_mutex_unlock(&cam_obj->muxer_lock);
500 rc = mm_camera_unmap_buf(my_obj, buf_type);
501 }else{
502 pthread_mutex_unlock(&cam_obj->muxer_lock);
503 }
504 return rc;
505 }
506
507 /*===========================================================================
508 * FUNCTION : mm_camera_muxer_set_parms
509 *
510 * DESCRIPTION: set parameters per camera
511 *
512 * PARAMETERS :
513 * @camera_handle: camera handle
514 * @parms : ptr to a param struct to be set to server
515 * @cam_obj : ptr to a Parent camera object
516 *
517 * RETURN : int32_t type of status
518 * 0 -- success
519 * -1 -- failure
520 *==========================================================================*/
mm_camera_muxer_set_parms(uint32_t camera_handle,parm_buffer_t * parms,mm_camera_obj_t * cam_obj)521 int32_t mm_camera_muxer_set_parms(uint32_t camera_handle,
522 parm_buffer_t *parms, mm_camera_obj_t *cam_obj)
523 {
524 int32_t rc = 0;
525 mm_camera_obj_t *my_obj = NULL;
526
527 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
528 if(my_obj) {
529 pthread_mutex_lock(&my_obj->cam_lock);
530 pthread_mutex_unlock(&cam_obj->muxer_lock);
531 rc = mm_camera_set_parms(my_obj, parms);
532 } else {
533 pthread_mutex_unlock(&cam_obj->muxer_lock);
534 }
535 return rc;
536 }
537
538 /*===========================================================================
539 * FUNCTION : mm_camera_muxer_get_parms
540 *
541 * DESCRIPTION: get parameters per camera
542 *
543 * PARAMETERS :
544 * @camera_handle: camera handle
545 * @parms : ptr to a param struct to be get from server
546 * @cam_obj : ptr to a Parent camera object
547 *
548 * RETURN : int32_t type of status
549 * 0 -- success
550 * -1 -- failure
551 *==========================================================================*/
mm_camera_muxer_get_parms(uint32_t camera_handle,parm_buffer_t * parms,mm_camera_obj_t * cam_obj)552 int32_t mm_camera_muxer_get_parms(uint32_t camera_handle,
553 parm_buffer_t *parms, mm_camera_obj_t *cam_obj)
554 {
555 int32_t rc = 0;
556 mm_camera_obj_t *my_obj = NULL;
557
558 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
559 if(my_obj) {
560 pthread_mutex_lock(&my_obj->cam_lock);
561 pthread_mutex_unlock(&cam_obj->muxer_lock);
562 rc = mm_camera_get_parms(my_obj, parms);
563 } else {
564 pthread_mutex_unlock(&cam_obj->muxer_lock);
565 }
566 return rc;
567 }
568
569 /*===========================================================================
570 * FUNCTION : mm_camera_muxer_do_auto_focus
571 *
572 * DESCRIPTION: performing auto focus
573 *
574 * PARAMETERS :
575 * @camera_handle: camera handle
576 * @cam_obj : ptr to a Parent camera object
577 *
578 * RETURN : int32_t type of status
579 * 0 -- success
580 * -1 -- failure
581 *==========================================================================*/
mm_camera_muxer_do_auto_focus(uint32_t camera_handle,mm_camera_obj_t * cam_obj)582 int32_t mm_camera_muxer_do_auto_focus(uint32_t camera_handle,
583 mm_camera_obj_t *cam_obj)
584 {
585 int32_t rc = 0;
586 mm_camera_obj_t *my_obj = NULL;
587
588 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
589 if(my_obj) {
590 pthread_mutex_lock(&my_obj->cam_lock);
591 pthread_mutex_unlock(&cam_obj->muxer_lock);
592 rc = mm_camera_do_auto_focus(my_obj);
593 } else {
594 pthread_mutex_unlock(&cam_obj->muxer_lock);
595 }
596 return rc;
597 }
598
599 /*===========================================================================
600 * FUNCTION : mm_camera_muxer_cancel_auto_focus
601 *
602 * DESCRIPTION: cancel auto focus
603 *
604 * PARAMETERS :
605 * @camera_handle: camera handle
606 * @cam_obj : ptr to a Parent camera object
607 *
608 * RETURN : int32_t type of status
609 * 0 -- success
610 * -1 -- failure
611 *==========================================================================*/
mm_camera_muxer_cancel_auto_focus(uint32_t camera_handle,mm_camera_obj_t * cam_obj)612 int32_t mm_camera_muxer_cancel_auto_focus(uint32_t camera_handle,
613 mm_camera_obj_t *cam_obj)
614 {
615 int32_t rc = 0;
616 mm_camera_obj_t *my_obj = NULL;
617
618 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
619 if(my_obj) {
620 pthread_mutex_lock(&my_obj->cam_lock);
621 pthread_mutex_unlock(&cam_obj->muxer_lock);
622 rc = mm_camera_cancel_auto_focus(my_obj);
623 } else {
624 pthread_mutex_unlock(&cam_obj->muxer_lock);
625 }
626 return rc;
627 }
628
629 /*===========================================================================
630 * FUNCTION : mm_camera_muxer_prepare_snapshot
631 *
632 * DESCRIPTION: prepare hardware for snapshot
633 *
634 * PARAMETERS :
635 * @camera_handle: camera handle
636 * @do_af_flag : flag indicating if AF is needed
637 * @cam_obj : ptr to a Parent camera object
638 *
639 * RETURN : int32_t type of status
640 * 0 -- success
641 * -1 -- failure
642 *==========================================================================*/
mm_camera_muxer_prepare_snapshot(uint32_t camera_handle,int32_t do_af_flag,mm_camera_obj_t * cam_obj)643 int32_t mm_camera_muxer_prepare_snapshot(uint32_t camera_handle,
644 int32_t do_af_flag, mm_camera_obj_t *cam_obj)
645 {
646 int32_t rc = 0;
647 mm_camera_obj_t *my_obj = NULL;
648
649 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
650 if(my_obj) {
651 pthread_mutex_lock(&my_obj->cam_lock);
652 pthread_mutex_unlock(&cam_obj->muxer_lock);
653 rc = mm_camera_prepare_snapshot(my_obj, do_af_flag);
654 } else {
655 pthread_mutex_unlock(&cam_obj->muxer_lock);
656 }
657 return rc;
658 }
659
660 /*===========================================================================
661 * FUNCTION : mm_camera_muxer_start_zsl_snapshot
662 *
663 * DESCRIPTION: Starts zsl snapshot
664 *
665 * PARAMETERS :
666 * @camera_handle: camera handle
667 * @ch_id : channel handle
668 * @cam_obj : ptr to a Parent camera object
669 *
670 * RETURN : int32_t type of status
671 * 0 -- success
672 * -1 -- failure
673 *==========================================================================*/
mm_camera_muxer_start_zsl_snapshot(uint32_t camera_handle,uint32_t ch_id,mm_camera_obj_t * cam_obj)674 int32_t mm_camera_muxer_start_zsl_snapshot(uint32_t camera_handle,
675 uint32_t ch_id, mm_camera_obj_t *cam_obj)
676 {
677 int32_t rc = 0;
678 mm_camera_obj_t *my_obj = NULL;
679
680 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
681 if(my_obj) {
682 uint32_t my_ch_id = mm_camera_util_get_handle_by_num(my_obj->my_num, ch_id);
683 pthread_mutex_lock(&my_obj->cam_lock);
684 pthread_mutex_unlock(&cam_obj->muxer_lock);
685 rc = mm_camera_start_zsl_snapshot_ch(my_obj, my_ch_id);
686 } else {
687 pthread_mutex_unlock(&cam_obj->muxer_lock);
688 }
689 return rc;
690 }
691
692 /*===========================================================================
693 * FUNCTION : mm_camera_muxer_stop_zsl_snapshot
694 *
695 * DESCRIPTION: Starts zsl snapshot
696 *
697 * PARAMETERS :
698 * @camera_handle: camera handle
699 * @ch_id : channel handle
700 * @cam_obj : ptr to a Parent camera object
701 *
702 * RETURN : int32_t type of status
703 * 0 -- success
704 * -1 -- failure
705 *==========================================================================*/
mm_camera_muxer_stop_zsl_snapshot(uint32_t camera_handle,uint32_t ch_id,mm_camera_obj_t * cam_obj)706 int32_t mm_camera_muxer_stop_zsl_snapshot(uint32_t camera_handle,
707 uint32_t ch_id, mm_camera_obj_t *cam_obj)
708 {
709 int32_t rc = 0;
710 mm_camera_obj_t *my_obj = NULL;
711
712 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
713 if(my_obj) {
714 uint32_t my_ch_id = mm_camera_util_get_handle_by_num(my_obj->my_num, ch_id);
715 pthread_mutex_lock(&my_obj->cam_lock);
716 pthread_mutex_unlock(&cam_obj->muxer_lock);
717 rc = mm_camera_stop_zsl_snapshot_ch(my_obj, my_ch_id);
718 } else {
719 pthread_mutex_unlock(&cam_obj->muxer_lock);
720 }
721 return rc;
722 }
723
724 /*===========================================================================
725 * FUNCTION : mm_camera_muxer_add_channel
726 *
727 * DESCRIPTION: add a channel
728 *
729 * PARAMETERS :
730 * @camera_handle: camera handle
731 * @attr : bundle attribute of the channel if needed
732 * @channel_cb : callback function for bundle data notify
733 * @userdata : user data ptr
734 * @cam_obj : ptr to a Parent camera object
735 *
736 * RETURN : uint32_t type of channel handle
737 * 0 -- invalid channel handle, meaning the op failed
738 * >0 -- successfully added a channel with a valid handle
739 *==========================================================================*/
mm_camera_muxer_add_channel(uint32_t camera_handle,mm_camera_channel_attr_t * attr,mm_camera_buf_notify_t channel_cb,void * userdata,uint32_t m_ch_id,mm_camera_obj_t * cam_obj)740 uint32_t mm_camera_muxer_add_channel(uint32_t camera_handle,
741 mm_camera_channel_attr_t *attr, mm_camera_buf_notify_t channel_cb,
742 void *userdata, uint32_t m_ch_id, mm_camera_obj_t *cam_obj)
743 {
744 int32_t ch_id = 0;
745 mm_camera_obj_t *my_obj = NULL;
746
747 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
748 if(my_obj) {
749 pthread_mutex_lock(&my_obj->cam_lock);
750 pthread_mutex_unlock(&cam_obj->muxer_lock);
751 ch_id = mm_camera_add_channel(my_obj, attr, channel_cb, userdata);
752
753 if (ch_id > 0 && m_ch_id > 0) {
754 mm_camera_frame_sync_t frame_sync;
755 memset(&frame_sync, 0, sizeof(frame_sync));
756 frame_sync.a_cam_obj = my_obj;
757 frame_sync.a_ch_id = ch_id;
758 frame_sync.userdata = userdata;
759 frame_sync.a_stream_id = 0;
760 frame_sync.is_res_shared = 1;
761 if (attr != NULL) {
762 frame_sync.attr = *attr;
763 frame_sync.is_active = 1;
764 }
765 pthread_mutex_lock(&cam_obj->cam_lock);
766 mm_camera_reg_frame_sync(cam_obj, m_ch_id,
767 0, &frame_sync);
768 }
769 } else {
770 pthread_mutex_unlock(&cam_obj->muxer_lock);
771 }
772 return ch_id;
773 }
774
775 /*===========================================================================
776 * FUNCTION : mm_camera_muxer_delete_channel
777 *
778 * DESCRIPTION: delete a channel by its handle
779 *
780 * PARAMETERS :
781 * @camera_handle: camera handle
782 * @ch_id : channel handle
783 * @cam_obj : ptr to a Parent camera object
784 *
785 * RETURN : int32_t type of status
786 * 0 -- success
787 * -1 -- failure
788 *==========================================================================*/
mm_camera_muxer_delete_channel(uint32_t camera_handle,uint32_t ch_id,mm_camera_obj_t * cam_obj)789 int32_t mm_camera_muxer_delete_channel(uint32_t camera_handle, uint32_t ch_id,
790 mm_camera_obj_t *cam_obj)
791 {
792 int32_t rc = -1;
793 mm_camera_obj_t *my_obj = NULL;
794
795 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
796 if(my_obj) {
797 pthread_mutex_lock(&my_obj->cam_lock);
798 pthread_mutex_unlock(&cam_obj->muxer_lock);
799 rc = mm_camera_del_channel(my_obj, ch_id);
800 } else {
801 pthread_mutex_unlock(&cam_obj->muxer_lock);
802 }
803 return rc;
804 }
805
806 /*===========================================================================
807 * FUNCTION : mm_camera_muxer_get_bundle_info
808 *
809 * DESCRIPTION: query bundle info of the channel
810 *
811 * PARAMETERS :
812 * @camera_handle: camera handle
813 * @ch_id : channel handle
814 * @bundle_info : bundle info to be filled in
815 * @cam_obj : ptr to a Parent camera object
816 *
817 * RETURN : int32_t type of status
818 * 0 -- success
819 * -1 -- failure
820 *==========================================================================*/
mm_camera_muxer_get_bundle_info(uint32_t camera_handle,uint32_t ch_id,cam_bundle_config_t * bundle_info,mm_camera_obj_t * cam_obj)821 int32_t mm_camera_muxer_get_bundle_info(uint32_t camera_handle, uint32_t ch_id,
822 cam_bundle_config_t *bundle_info, mm_camera_obj_t *cam_obj)
823 {
824 int32_t rc = -1;
825 mm_camera_obj_t *my_obj = NULL;
826
827 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
828 if(my_obj) {
829 pthread_mutex_lock(&my_obj->cam_lock);
830 pthread_mutex_unlock(&cam_obj->muxer_lock);
831 rc = mm_camera_get_bundle_info(my_obj, ch_id, bundle_info);
832 } else {
833 pthread_mutex_unlock(&cam_obj->muxer_lock);
834 }
835 return rc;
836 }
837 /*===========================================================================
838 * FUNCTION : mm_camera_muxer_add_stream
839 *
840 * DESCRIPTION: add a stream into a channel
841 *
842 * PARAMETERS :
843 * @camera_handle: camera handle
844 * @ch_id : channel handle
845 * @src__ch_id : src channel handle
846 * @src_stream_id : src stream handle
847 * @cam_obj : ptr to a Parent camera object
848 *
849 * RETURN : uint32_t type of stream handle
850 * 0 -- invalid stream handle, meaning the op failed
851 * >0 -- successfully added a stream with a valid handle
852 *==========================================================================*/
mm_camera_muxer_add_stream(uint32_t camera_handle,uint32_t ch_id,uint32_t src__ch_id,uint32_t src_stream_id,mm_camera_obj_t * cam_obj)853 uint32_t mm_camera_muxer_add_stream(uint32_t camera_handle,
854 uint32_t ch_id, uint32_t src__ch_id, uint32_t src_stream_id, mm_camera_obj_t *cam_obj)
855 {
856 uint32_t stream_id = 0;
857 int32_t rc = 0;
858 mm_camera_obj_t *my_obj = NULL;
859
860 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
861 if(my_obj) {
862 pthread_mutex_lock(&my_obj->cam_lock);
863 pthread_mutex_unlock(&cam_obj->muxer_lock);
864 stream_id = mm_camera_add_stream(my_obj, ch_id);
865 if (stream_id > 0 && src_stream_id > 0) {
866 mm_camera_frame_sync_t frame_sync;
867 memset(&frame_sync, 0, sizeof(frame_sync));
868 frame_sync.a_cam_obj = my_obj;
869 frame_sync.a_ch_id = ch_id;
870 frame_sync.userdata = NULL;
871 frame_sync.a_stream_id = stream_id;
872 frame_sync.buf_cb = NULL;
873 frame_sync.is_res_shared = 1;
874 frame_sync.is_active = 0;
875 pthread_mutex_lock(&cam_obj->cam_lock);
876 rc = mm_camera_reg_frame_sync(cam_obj, src__ch_id,
877 src_stream_id, &frame_sync);
878 LOGH("Stream frame sync = %d and %d rc = %d",
879 src_stream_id, stream_id, rc);
880 }
881 } else {
882 pthread_mutex_unlock(&cam_obj->muxer_lock);
883 }
884 return stream_id;
885 }
886
887 /*===========================================================================
888 * FUNCTION : mm_camera_muxer_delete_stream
889 *
890 * DESCRIPTION: delete a stream by its handle
891 *
892 * PARAMETERS :
893 * @camera_handle: camera handle
894 * @ch_id : channel handle
895 * @stream_id : stream handle
896 *
897 * RETURN : int32_t type of status
898 * 0 -- success
899 * -1 -- failure
900 *==========================================================================*/
mm_camera_muxer_delete_stream(uint32_t camera_handle,uint32_t ch_id,uint32_t stream_id,mm_camera_obj_t * cam_obj)901 int32_t mm_camera_muxer_delete_stream(uint32_t camera_handle,
902 uint32_t ch_id, uint32_t stream_id,
903 mm_camera_obj_t *cam_obj)
904 {
905 mm_camera_obj_t *my_obj = NULL;
906 int32_t rc = 0;
907
908 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
909 if(my_obj) {
910 pthread_mutex_lock(&my_obj->cam_lock);
911 pthread_mutex_unlock(&cam_obj->muxer_lock);
912 rc = mm_camera_del_stream(my_obj, ch_id, stream_id);
913 } else {
914 pthread_mutex_unlock(&cam_obj->muxer_lock);
915 }
916 return rc;
917 }
918
919 /*===========================================================================
920 * FUNCTION : mm_camera_muxer_link_stream
921 *
922 * DESCRIPTION: link a stream into a new channel
923 *
924 * PARAMETERS :
925 * @camera_handle: camera handle
926 * @ch_id : channel handle
927 * @stream_id : stream id
928 * @linked_ch_id : channel in which the stream will be linked
929 *
930 * RETURN : int32_t type of stream handle
931 * 0 -- invalid stream handle, meaning the op failed
932 * >0 -- successfully linked a stream with a valid handle
933 *==========================================================================*/
mm_camera_muxer_link_stream(uint32_t camera_handle,uint32_t ch_id,uint32_t stream_id,uint32_t linked_ch_id,mm_camera_obj_t * cam_obj)934 int32_t mm_camera_muxer_link_stream(uint32_t camera_handle,
935 uint32_t ch_id, uint32_t stream_id, uint32_t linked_ch_id,
936 mm_camera_obj_t *cam_obj)
937 {
938 uint32_t id = 0;
939 mm_camera_obj_t *my_obj = NULL;
940 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
941
942 if(my_obj) {
943 pthread_mutex_lock(&my_obj->cam_lock);
944 pthread_mutex_unlock(&cam_obj->muxer_lock);
945 id = mm_camera_link_stream(my_obj, ch_id, stream_id, linked_ch_id);
946 } else {
947 pthread_mutex_unlock(&cam_obj->muxer_lock);
948 }
949 return id;
950 }
951
952 /*===========================================================================
953 * FUNCTION : mm_camera_muxer_config_stream
954 *
955 * DESCRIPTION: configure a stream
956 *
957 * PARAMETERS :
958 * @camera_handle: camera handle
959 * @ch_id : channel handle
960 * @stream_id : stream handle
961 * @config : stream configuration
962 *
963 * RETURN : int32_t type of status
964 * 0 -- success
965 * -1 -- failure
966 *==========================================================================*/
mm_camera_muxer_config_stream(uint32_t camera_handle,uint32_t ch_id,uint32_t stream_id,mm_camera_stream_config_t * config,mm_camera_obj_t * cam_obj)967 int32_t mm_camera_muxer_config_stream(uint32_t camera_handle,
968 uint32_t ch_id, uint32_t stream_id, mm_camera_stream_config_t *config,
969 mm_camera_obj_t *cam_obj)
970 {
971 int32_t rc = -1;
972 mm_camera_obj_t * my_obj = NULL;
973 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
974 mm_camera_stream_config_t aux_config = *config;
975 LOGD("mm_camera_intf_config_stream stream_id = %d",stream_id);
976
977 if(my_obj) {
978 pthread_mutex_lock(&my_obj->cam_lock);
979 pthread_mutex_unlock(&cam_obj->muxer_lock);
980 if (config->stream_info->aux_str_info != NULL) {
981 aux_config.stream_info = config->stream_info->aux_str_info;
982 }
983 aux_config.mem_vtbl.get_bufs = NULL;
984 aux_config.mem_vtbl.put_bufs = NULL;
985 aux_config.mem_vtbl.set_config_ops = NULL;
986 rc = mm_camera_config_stream(my_obj, ch_id, stream_id, &aux_config);
987 } else {
988 pthread_mutex_unlock(&cam_obj->muxer_lock);
989 }
990 return rc;
991 }
992
993 /*===========================================================================
994 * FUNCTION : mm_camera_muxer_map_stream_buf
995 *
996 * DESCRIPTION: mapping stream buffer via domain socket to server
997 *
998 * PARAMETERS :
999 * @camera_handle: camera handle
1000 * @ch_id : channel handle
1001 * @s_id : stream handle
1002 * @buf_type : type of buffer to be mapped. could be following values:
1003 * CAM_MAPPING_BUF_TYPE_STREAM_BUF
1004 * CAM_MAPPING_BUF_TYPE_STREAM_INFO
1005 * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
1006 * @buf_idx : index of buffer within the stream buffers, only valid if
1007 * buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or
1008 * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
1009 * @plane_idx : plane index. If all planes share the same fd,
1010 * plane_idx = -1; otherwise, plean_idx is the
1011 * index to plane (0..num_of_planes)
1012 * @fd : file descriptor of the buffer
1013 * @size : size of the buffer
1014 *
1015 * RETURN : int32_t type of status
1016 * 0 -- success
1017 * -1 -- failure
1018 *==========================================================================*/
mm_camera_muxer_map_stream_buf(uint32_t camera_handle,uint32_t ch_id,uint32_t stream_id,uint8_t buf_type,uint32_t buf_idx,int32_t plane_idx,int fd,size_t size,void * buffer,mm_camera_obj_t * cam_obj)1019 int32_t mm_camera_muxer_map_stream_buf(uint32_t camera_handle,
1020 uint32_t ch_id, uint32_t stream_id,
1021 uint8_t buf_type, uint32_t buf_idx, int32_t plane_idx, int fd,
1022 size_t size, void *buffer, mm_camera_obj_t *cam_obj)
1023 {
1024 int32_t rc = -1;
1025 mm_camera_obj_t * my_obj = NULL;
1026 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1027
1028 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1029
1030 LOGD("E camera_handle = %d, ch_id = %d, s_id = %d, buf_idx = %d, plane_idx = %d",
1031 camera_handle, ch_id, stream_id, buf_idx, plane_idx);
1032
1033 if(my_obj) {
1034 pthread_mutex_lock(&my_obj->cam_lock);
1035 pthread_mutex_unlock(&cam_obj->muxer_lock);
1036 rc = mm_camera_map_stream_buf(my_obj, ch_id, stream_id,
1037 buf_type, buf_idx, plane_idx,
1038 fd, size, buffer);
1039 }else{
1040 pthread_mutex_unlock(&cam_obj->muxer_lock);
1041 }
1042 return rc;
1043 }
1044
1045 /*===========================================================================
1046 * FUNCTION : mm_camera_muxer_map_stream_bufs
1047 *
1048 * DESCRIPTION: mapping stream buffers via domain socket to server
1049 *
1050 * PARAMETERS :
1051 * @camera_handle: camera handle
1052 * @ch_id : channel handle
1053 * @buf_map_list : list of buffers to be mapped
1054 *
1055 * RETURN : int32_t type of status
1056 * 0 -- success
1057 * -1 -- failure
1058 *==========================================================================*/
mm_camera_muxer_map_stream_bufs(uint32_t camera_handle,uint32_t ch_id,const cam_buf_map_type_list * buf_map_list,mm_camera_obj_t * cam_obj)1059 int32_t mm_camera_muxer_map_stream_bufs(uint32_t camera_handle,
1060 uint32_t ch_id, const cam_buf_map_type_list *buf_map_list,
1061 mm_camera_obj_t *cam_obj)
1062 {
1063 int32_t rc = -1;
1064 mm_camera_obj_t *my_obj = NULL;
1065 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1066
1067 LOGD("E camera_handle = %d, ch_id = %d",
1068 camera_handle, ch_id);
1069
1070 if(my_obj) {
1071 pthread_mutex_lock(&my_obj->cam_lock);
1072 pthread_mutex_unlock(&cam_obj->muxer_lock);
1073 rc = mm_camera_map_stream_bufs(my_obj, ch_id, buf_map_list);
1074 }else{
1075 pthread_mutex_unlock(&cam_obj->muxer_lock);
1076 }
1077 return rc;
1078 }
1079
1080 /*===========================================================================
1081 * FUNCTION : mm_camera_muxer_unmap_stream_buf
1082 *
1083 * DESCRIPTION: unmapping stream buffer via domain socket to server
1084 *
1085 * PARAMETERS :
1086 * @camera_handle: camera handle
1087 * @ch_id : channel handle
1088 * @s_id : stream handle
1089 * @buf_type : type of buffer to be unmapped. could be following values:
1090 * CAM_MAPPING_BUF_TYPE_STREAM_BUF
1091 * CAM_MAPPING_BUF_TYPE_STREAM_INFO
1092 * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
1093 * @buf_idx : index of buffer within the stream buffers, only valid if
1094 * buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or
1095 * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
1096 * @plane_idx : plane index. If all planes share the same fd,
1097 * plane_idx = -1; otherwise, plean_idx is the
1098 * index to plane (0..num_of_planes)
1099 *
1100 * RETURN : int32_t type of status
1101 * 0 -- success
1102 * -1 -- failure
1103 *==========================================================================*/
mm_camera_muxer_unmap_stream_buf(uint32_t camera_handle,uint32_t ch_id,uint32_t stream_id,uint8_t buf_type,uint32_t buf_idx,int32_t plane_idx,mm_camera_obj_t * cam_obj)1104 int32_t mm_camera_muxer_unmap_stream_buf(uint32_t camera_handle,
1105 uint32_t ch_id, uint32_t stream_id,
1106 uint8_t buf_type, uint32_t buf_idx,
1107 int32_t plane_idx, mm_camera_obj_t *cam_obj)
1108 {
1109 int32_t rc = -1;
1110 mm_camera_obj_t * my_obj = NULL;
1111 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1112
1113 LOGD("E camera_handle = %d, ch_id = %d, s_id = %d, buf_idx = %d, plane_idx = %d",
1114 camera_handle, ch_id, stream_id, buf_idx, plane_idx);
1115
1116 if(my_obj) {
1117 pthread_mutex_lock(&my_obj->cam_lock);
1118 pthread_mutex_unlock(&cam_obj->muxer_lock);
1119 rc = mm_camera_unmap_stream_buf(my_obj, ch_id, stream_id,
1120 buf_type, buf_idx, plane_idx);
1121 } else{
1122 pthread_mutex_unlock(&cam_obj->muxer_lock);
1123 }
1124 return rc;
1125 }
1126
1127 /*===========================================================================
1128 * FUNCTION : mm_camera_muxer_set_stream_parms
1129 *
1130 * DESCRIPTION: set parameters per stream
1131 *
1132 * PARAMETERS :
1133 * @camera_handle: camera handle
1134 * @ch_id : channel handle
1135 * @s_id : stream handle
1136 * @parms : ptr to a param struct to be set to server
1137 *
1138 * RETURN : int32_t type of status
1139 * 0 -- success
1140 * -1 -- failure
1141 *==========================================================================*/
mm_camera_muxer_set_stream_parms(uint32_t camera_handle,uint32_t ch_id,uint32_t s_id,cam_stream_parm_buffer_t * parms,mm_camera_obj_t * cam_obj)1142 int32_t mm_camera_muxer_set_stream_parms(uint32_t camera_handle,
1143 uint32_t ch_id, uint32_t s_id, cam_stream_parm_buffer_t *parms,
1144 mm_camera_obj_t *cam_obj)
1145 {
1146 int32_t rc = 0;
1147 mm_camera_obj_t * my_obj = NULL;
1148 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1149
1150 if(my_obj) {
1151 pthread_mutex_lock(&my_obj->cam_lock);
1152 pthread_mutex_unlock(&cam_obj->muxer_lock);
1153 rc = mm_camera_set_stream_parms(my_obj, ch_id, s_id, parms);
1154 } else{
1155 pthread_mutex_unlock(&cam_obj->muxer_lock);
1156 }
1157 return rc;
1158 }
1159
1160 /*===========================================================================
1161 * FUNCTION : mm_camera_muxer_get_stream_parms
1162 *
1163 * DESCRIPTION: get parameters per stream
1164 *
1165 * PARAMETERS :
1166 * @camera_handle: camera handle
1167 * @ch_id : channel handle
1168 * @s_id : stream handle
1169 * @parms : ptr to a param struct to be get from server
1170 *
1171 * RETURN : int32_t type of status
1172 * 0 -- success
1173 * -1 -- failure
1174 *==========================================================================*/
mm_camera_muxer_get_stream_parms(uint32_t camera_handle,uint32_t ch_id,uint32_t s_id,cam_stream_parm_buffer_t * parms,mm_camera_obj_t * cam_obj)1175 int32_t mm_camera_muxer_get_stream_parms(uint32_t camera_handle,
1176 uint32_t ch_id, uint32_t s_id, cam_stream_parm_buffer_t *parms,
1177 mm_camera_obj_t *cam_obj)
1178 {
1179 int32_t rc = 0;
1180 mm_camera_obj_t * my_obj = NULL;
1181 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1182
1183 if(my_obj) {
1184 pthread_mutex_lock(&my_obj->cam_lock);
1185 pthread_mutex_unlock(&cam_obj->muxer_lock);
1186 rc = mm_camera_get_stream_parms(my_obj, ch_id, s_id, parms);
1187 } else{
1188 pthread_mutex_unlock(&cam_obj->muxer_lock);
1189 }
1190 return rc;
1191 }
1192
1193 /*===========================================================================
1194 * FUNCTION : mm_camera_muxer_start_channel
1195 *
1196 * DESCRIPTION: start a channel, which will start all streams in the channel
1197 *
1198 * PARAMETERS :
1199 * @camera_handle: camera handle
1200 * @ch_id : channel handle
1201 *
1202 * RETURN : int32_t type of status
1203 * 0 -- success
1204 * -1 -- failure
1205 *==========================================================================*/
mm_camera_muxer_start_channel(uint32_t camera_handle,uint32_t ch_id,mm_camera_obj_t * cam_obj)1206 int32_t mm_camera_muxer_start_channel(uint32_t camera_handle,
1207 uint32_t ch_id, mm_camera_obj_t *cam_obj)
1208 {
1209 int32_t rc = 0;
1210 mm_camera_obj_t * my_obj = NULL;
1211 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1212
1213 if(my_obj) {
1214 pthread_mutex_lock(&my_obj->cam_lock);
1215 pthread_mutex_unlock(&cam_obj->muxer_lock);
1216 rc = mm_camera_start_channel(my_obj, ch_id);
1217 } else{
1218 pthread_mutex_unlock(&cam_obj->muxer_lock);
1219 }
1220 return rc;
1221 }
1222
1223 /*===========================================================================
1224 * FUNCTION : mm_camera_muxer_stop_channel
1225 *
1226 * DESCRIPTION: stop a channel, which will stop all streams in the channel
1227 *
1228 * PARAMETERS :
1229 * @camera_handle: camera handle
1230 * @ch_id : channel handle
1231 *
1232 * RETURN : int32_t type of status
1233 * 0 -- success
1234 * -1 -- failure
1235 *==========================================================================*/
mm_camera_muxer_stop_channel(uint32_t camera_handle,uint32_t ch_id,mm_camera_obj_t * cam_obj)1236 int32_t mm_camera_muxer_stop_channel(uint32_t camera_handle,
1237 uint32_t ch_id, mm_camera_obj_t *cam_obj)
1238 {
1239 int32_t rc = 0;
1240 mm_camera_obj_t * my_obj = NULL;
1241 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1242
1243 if(my_obj) {
1244 pthread_mutex_lock(&my_obj->cam_lock);
1245 pthread_mutex_unlock(&cam_obj->muxer_lock);
1246 rc = mm_camera_stop_channel(my_obj, ch_id);
1247 } else{
1248 pthread_mutex_unlock(&cam_obj->muxer_lock);
1249 }
1250 return rc;
1251 }
1252
1253 /*===========================================================================
1254 * FUNCTION : mm_camera_intf_qbuf
1255 *
1256 * DESCRIPTION: enqueue buffer back to kernel
1257 *
1258 * PARAMETERS :
1259 * @camera_handle: camera handle
1260 * @ch_id : channel handle
1261 * @buf : buf ptr to be enqueued
1262 *
1263 * RETURN : int32_t type of status
1264 * 0 -- success
1265 * -1 -- failure
1266 *==========================================================================*/
mm_camera_muxer_qbuf(uint32_t camera_handle,uint32_t ch_id,mm_camera_buf_def_t * buf,mm_camera_obj_t * cam_obj)1267 int32_t mm_camera_muxer_qbuf(uint32_t camera_handle, uint32_t ch_id,
1268 mm_camera_buf_def_t *buf, mm_camera_obj_t *cam_obj)
1269 {
1270 int32_t rc = 0;
1271 mm_camera_obj_t * my_obj = NULL;
1272
1273 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1274 if(my_obj) {
1275 pthread_mutex_lock(&my_obj->cam_lock);
1276 pthread_mutex_unlock(&cam_obj->muxer_lock);
1277 rc = mm_camera_qbuf(my_obj, ch_id, buf);
1278 } else {
1279 pthread_mutex_unlock(&cam_obj->muxer_lock);
1280 }
1281 return rc;
1282 }
1283
1284 /*===========================================================================
1285 * FUNCTION : mm_camera_muxer_get_queued_buf_count
1286 *
1287 * DESCRIPTION: returns the queued buffer count
1288 *
1289 * PARAMETERS :
1290 * @camera_handle: camera handle
1291 * @ch_id : channel handle
1292 * @stream_id : stream id
1293 *
1294 * RETURN : int32_t - queued buffer count
1295 *
1296 *==========================================================================*/
mm_camera_muxer_get_queued_buf_count(uint32_t camera_handle,uint32_t ch_id,uint32_t stream_id,mm_camera_obj_t * cam_obj)1297 int32_t mm_camera_muxer_get_queued_buf_count(uint32_t camera_handle,
1298 uint32_t ch_id, uint32_t stream_id,
1299 mm_camera_obj_t *cam_obj)
1300 {
1301 int32_t rc = 0;
1302 mm_camera_obj_t * my_obj = NULL;
1303
1304 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1305 if(my_obj) {
1306 pthread_mutex_lock(&my_obj->cam_lock);
1307 pthread_mutex_unlock(&cam_obj->muxer_lock);
1308 rc = mm_camera_get_queued_buf_count(my_obj, ch_id, stream_id);
1309 } else {
1310 pthread_mutex_unlock(&cam_obj->muxer_lock);
1311 }
1312 return rc;
1313 }
1314
1315 /*===========================================================================
1316 * FUNCTION : mm_camera_muxer_request_super_buf
1317 *
1318 * DESCRIPTION: for burst mode in bundle, reuqest certain amount of matched
1319 * frames from superbuf queue
1320 *
1321 * PARAMETERS :
1322 * @ch_id : channel handle
1323 * @buf : request buffer info
1324 *
1325 * RETURN : int32_t type of status
1326 * 0 -- success
1327 * -1 -- failure
1328 *==========================================================================*/
mm_camera_muxer_request_super_buf(uint32_t ch_id,mm_camera_req_buf_t * buf,mm_camera_obj_t * cam_obj)1329 int32_t mm_camera_muxer_request_super_buf(uint32_t ch_id,
1330 mm_camera_req_buf_t *buf, mm_camera_obj_t *cam_obj)
1331 {
1332 int32_t rc = 0;
1333 mm_camera_obj_t * my_obj = cam_obj;
1334 uint32_t chID = get_main_camera_handle(ch_id);
1335
1336 if(my_obj && buf) {
1337 pthread_mutex_lock(&my_obj->cam_lock);
1338 pthread_mutex_unlock(&cam_obj->muxer_lock);
1339 buf->type = MM_CAMERA_REQ_FRAME_SYNC_BUF;
1340 rc = mm_camera_request_super_buf (my_obj, chID, buf);
1341 } else {
1342 pthread_mutex_unlock(&cam_obj->muxer_lock);
1343 }
1344 return rc;
1345 }
1346
1347 /*===========================================================================
1348 * FUNCTION : mm_camera_muxer_cancel_super_buf_request
1349 *
1350 * DESCRIPTION: for burst mode in bundle, reuqest certain amount of matched
1351 * frames from superbuf queue
1352 *
1353 * PARAMETERS :
1354 * @camera_handle: camera handle
1355 * @ch_id : channel handle
1356 * @buf : request buffer info
1357 *
1358 * RETURN : int32_t type of status
1359 * 0 -- success
1360 * -1 -- failure
1361 *==========================================================================*/
mm_camera_muxer_cancel_super_buf_request(uint32_t camera_handle,uint32_t ch_id,mm_camera_obj_t * cam_obj)1362 int32_t mm_camera_muxer_cancel_super_buf_request(uint32_t camera_handle,
1363 uint32_t ch_id,
1364 mm_camera_obj_t *cam_obj)
1365 {
1366 int32_t rc = 0;
1367 mm_camera_obj_t * my_obj = NULL;
1368 uint32_t aux_handle = get_aux_camera_handle(camera_handle);
1369 uint32_t aux_chID = get_main_camera_handle(ch_id);
1370
1371 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1372 if(my_obj) {
1373 pthread_mutex_lock(&my_obj->cam_lock);
1374 pthread_mutex_unlock(&cam_obj->muxer_lock);
1375 rc = mm_camera_cancel_super_buf_request(my_obj, ch_id);
1376 } else {
1377 pthread_mutex_unlock(&cam_obj->muxer_lock);
1378 }
1379
1380 my_obj = mm_muxer_util_get_camera_by_obj(aux_handle, cam_obj);
1381 if(my_obj) {
1382 pthread_mutex_lock(&my_obj->cam_lock);
1383 pthread_mutex_unlock(&cam_obj->muxer_lock);
1384 rc = mm_camera_cancel_super_buf_request(my_obj, aux_chID);
1385 } else {
1386 pthread_mutex_unlock(&cam_obj->muxer_lock);
1387 }
1388 return rc;
1389 }
1390
1391 /*===========================================================================
1392 * FUNCTION : mm_camera_muxer_flush_super_buf_queue
1393 *
1394 * DESCRIPTION: flush out all frames in the superbuf queue
1395 *
1396 * PARAMETERS :
1397 * @camera_handle: camera handle
1398 * @ch_id : channel handle
1399 * @frame_idx : frame index
1400 *
1401 * RETURN : int32_t type of status
1402 * 0 -- success
1403 * -1 -- failure
1404 *==========================================================================*/
mm_camera_muxer_flush_super_buf_queue(uint32_t camera_handle,uint32_t ch_id,uint32_t frame_idx,mm_camera_obj_t * cam_obj)1405 int32_t mm_camera_muxer_flush_super_buf_queue(uint32_t camera_handle,
1406 uint32_t ch_id,
1407 uint32_t frame_idx, mm_camera_obj_t *cam_obj)
1408 {
1409 int32_t rc = 0;
1410 mm_camera_obj_t * my_obj = NULL;
1411 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1412
1413 if(my_obj) {
1414 pthread_mutex_lock(&my_obj->cam_lock);
1415 pthread_mutex_unlock(&cam_obj->muxer_lock);
1416 rc = mm_camera_flush_super_buf_queue(my_obj, ch_id, frame_idx);
1417 } else {
1418 pthread_mutex_unlock(&cam_obj->muxer_lock);
1419 }
1420 return rc;
1421 }
1422
1423 /*===========================================================================
1424 * FUNCTION : mm_camera_muxer_configure_notify_mode
1425 *
1426 * DESCRIPTION: Configures channel notification mode
1427 *
1428 * PARAMETERS :
1429 * @camera_handle: camera handle
1430 * @ch_id : channel handle
1431 * @notify_mode : notification mode
1432 *
1433 * RETURN : int32_t type of status
1434 * 0 -- success
1435 * -1 -- failure
1436 *==========================================================================*/
mm_camera_muxer_configure_notify_mode(uint32_t camera_handle,uint32_t ch_id,mm_camera_super_buf_notify_mode_t notify_mode,mm_camera_obj_t * cam_obj)1437 int32_t mm_camera_muxer_configure_notify_mode(uint32_t camera_handle,
1438 uint32_t ch_id, mm_camera_super_buf_notify_mode_t notify_mode,
1439 mm_camera_obj_t *cam_obj)
1440 {
1441 int32_t rc = 0;
1442 mm_camera_obj_t * my_obj = NULL;
1443 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1444
1445 if(my_obj) {
1446 pthread_mutex_lock(&my_obj->cam_lock);
1447 pthread_mutex_unlock(&cam_obj->muxer_lock);
1448 rc = mm_camera_config_channel_notify(my_obj, ch_id, notify_mode);
1449 } else {
1450 pthread_mutex_unlock(&cam_obj->muxer_lock);
1451 }
1452 return rc;
1453 }
1454
1455 /*===========================================================================
1456 * FUNCTION : mm_camera_muxer_process_advanced_capture
1457 *
1458 * DESCRIPTION: Configures channel advanced capture mode
1459 *
1460 * PARAMETERS :
1461 * @camera_handle: camera handle
1462 * @type : advanced capture type
1463 * @ch_id : channel handle
1464 * @trigger : 1 for start and 0 for cancel/stop
1465 * @value : input capture configaration
1466 *
1467 * RETURN : int32_t type of status
1468 * 0 -- success
1469 * -1 -- failure
1470 *==========================================================================*/
mm_camera_muxer_process_advanced_capture(uint32_t camera_handle,uint32_t ch_id,mm_camera_advanced_capture_t type,int8_t start_flag,void * in_value,mm_camera_obj_t * cam_obj)1471 int32_t mm_camera_muxer_process_advanced_capture(uint32_t camera_handle,
1472 uint32_t ch_id, mm_camera_advanced_capture_t type,
1473 int8_t start_flag, void *in_value, mm_camera_obj_t *cam_obj)
1474 {
1475 int32_t rc = 0;
1476 mm_camera_obj_t * my_obj = NULL;
1477
1478 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1479 if(my_obj) {
1480 pthread_mutex_lock(&my_obj->cam_lock);
1481 pthread_mutex_unlock(&cam_obj->muxer_lock);
1482 rc = mm_camera_channel_advanced_capture(my_obj, ch_id, type,
1483 (uint32_t)start_flag, in_value);
1484 } else {
1485 pthread_mutex_unlock(&cam_obj->muxer_lock);
1486 }
1487 return rc;
1488 }
1489
1490 /*===========================================================================
1491 * FUNCTION : mm_camera_muxer_get_session_id
1492 *
1493 * DESCRIPTION: retrieve the session ID from the kernel for this HWI instance
1494 *
1495 * PARAMETERS :
1496 * @camera_handle: camera handle
1497 * @sessionid: session id to be retrieved from server
1498 *
1499 * RETURN : int32_t type of status
1500 * 0 -- success
1501 * -1 -- failure
1502 *==========================================================================*/
mm_camera_muxer_get_session_id(uint32_t camera_handle,uint32_t * sessionid,mm_camera_obj_t * cam_obj)1503 int32_t mm_camera_muxer_get_session_id(uint32_t camera_handle,
1504 uint32_t* sessionid, mm_camera_obj_t *cam_obj)
1505 {
1506 int32_t rc = 0;
1507 mm_camera_obj_t * my_obj = NULL;
1508 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1509
1510 if(my_obj) {
1511 pthread_mutex_lock(&my_obj->cam_lock);
1512 pthread_mutex_unlock(&cam_obj->muxer_lock);
1513 *sessionid = my_obj->sessionid;
1514 pthread_mutex_unlock(&my_obj->cam_lock);
1515 rc = 0;
1516 } else {
1517 pthread_mutex_unlock(&cam_obj->muxer_lock);
1518 }
1519 return rc;
1520 }
1521
1522 /*===========================================================================
1523 * FUNCTION : mm_camera_muxer_flush
1524 *
1525 * DESCRIPTION: flush the current camera state and buffers
1526 *
1527 * PARAMETERS :
1528 * @camera_handle: camera handle
1529 *
1530 * RETURN : int32_t type of status
1531 * 0 -- success
1532 * -1 -- failure
1533 *==========================================================================*/
mm_camera_muxer_flush(uint32_t camera_handle,mm_camera_obj_t * cam_obj)1534 int32_t mm_camera_muxer_flush(uint32_t camera_handle, mm_camera_obj_t *cam_obj)
1535 {
1536 int32_t rc = 0;
1537 mm_camera_obj_t * my_obj = NULL;
1538 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1539
1540 if(my_obj) {
1541 pthread_mutex_lock(&my_obj->cam_lock);
1542 pthread_mutex_unlock(&cam_obj->muxer_lock);
1543 rc = mm_camera_flush(my_obj);
1544 } else {
1545 pthread_mutex_unlock(&cam_obj->muxer_lock);
1546 }
1547 return rc;
1548 }
1549
1550 /*===========================================================================
1551 * FUNCTION : mm_camera_muxer_register_stream_buf_cb
1552 *
1553 * DESCRIPTION: Register special callback for stream buffer
1554 *
1555 * PARAMETERS :
1556 * @camera_handle: camera handle
1557 * @ch_id : channel handle
1558 * @stream_id : stream handle
1559 * @buf_cb : callback function
1560 * @buf_type :SYNC/ASYNC
1561 * @userdata : userdata pointer
1562 *
1563 * RETURN : int32_t type of status
1564 * 0 -- success
1565 * 1 -- failure
1566 *==========================================================================*/
mm_camera_muxer_register_stream_buf_cb(uint32_t camera_handle,uint32_t ch_id,uint32_t stream_id,mm_camera_buf_notify_t buf_cb,mm_camera_stream_cb_type cb_type,void * userdata,mm_camera_obj_t * cam_obj)1567 int32_t mm_camera_muxer_register_stream_buf_cb(uint32_t camera_handle,
1568 uint32_t ch_id, uint32_t stream_id, mm_camera_buf_notify_t buf_cb,
1569 mm_camera_stream_cb_type cb_type, void *userdata, mm_camera_obj_t *cam_obj)
1570 {
1571 int32_t rc = 0;
1572 mm_camera_obj_t * my_obj = NULL;
1573 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1574
1575 if(my_obj) {
1576 pthread_mutex_lock(&my_obj->cam_lock);
1577 pthread_mutex_unlock(&cam_obj->muxer_lock);
1578 rc = mm_camera_reg_stream_buf_cb(my_obj, ch_id, stream_id,
1579 buf_cb, cb_type, userdata);
1580 } else {
1581 pthread_mutex_unlock(&cam_obj->muxer_lock);
1582 }
1583 return rc;
1584 }
1585
1586 /*===========================================================================
1587 * FUNCTION : mm_camera_muxer_reg_frame_sync
1588 *
1589 * DESCRIPTION: Configure for frame sync.
1590 *
1591 * PARAMETERS :
1592 * @camera_handle: camera handle
1593 * @ch_id : channel handle
1594 * @stream_id : stream handle
1595 * @sync_attr : Attributes for frame sync
1596 *
1597 * RETURN : int32_t type of status
1598 * 0 -- success
1599 * 1 -- failure
1600 *==========================================================================*/
mm_camera_muxer_reg_frame_sync(mm_camera_obj_t * cam_obj,uint32_t ch_id,uint32_t stream_id,mm_camera_intf_frame_sync_t * sync_attr)1601 int32_t mm_camera_muxer_reg_frame_sync(mm_camera_obj_t *cam_obj,
1602 uint32_t ch_id, uint32_t stream_id,
1603 mm_camera_intf_frame_sync_t *sync_attr)
1604 {
1605 int32_t rc = 0;
1606 mm_camera_obj_t *a_cam_obj = NULL;
1607
1608 mm_camera_frame_sync_t frame_sync;
1609 if (sync_attr == NULL || cam_obj == NULL) {
1610 pthread_mutex_unlock(&cam_obj->muxer_lock);
1611 return rc;
1612 }
1613
1614 uint32_t chid = get_main_camera_handle(ch_id);
1615 uint32_t aux_handle = get_aux_camera_handle(sync_attr->camera_handle);
1616 uint32_t aux_chid = get_aux_camera_handle(sync_attr->ch_id);
1617 uint32_t strid = 0;
1618 uint32_t aux_strid = 0;
1619 if (stream_id) {
1620 LOGD("Stream frame sync enabled");
1621 strid = get_main_camera_handle(stream_id);
1622 aux_strid = get_aux_camera_handle(sync_attr->stream_id);
1623 if(aux_strid == 0) {
1624 aux_handle = get_main_camera_handle(sync_attr->camera_handle);
1625 aux_chid = get_main_camera_handle(sync_attr->ch_id);
1626 aux_strid = get_main_camera_handle(sync_attr->stream_id);
1627 }
1628 } else {
1629 LOGD("Channel frame sync enabled");
1630 if(aux_chid == 0) {
1631 aux_chid = get_main_camera_handle(sync_attr->ch_id);
1632 }
1633 }
1634 a_cam_obj = mm_muxer_util_get_camera_by_obj(aux_handle, cam_obj);
1635
1636 if(a_cam_obj) {
1637 memset(&frame_sync, 0, sizeof(frame_sync));
1638 frame_sync.a_cam_obj = a_cam_obj;
1639 frame_sync.a_stream_id = aux_strid;
1640 frame_sync.a_ch_id = aux_chid;
1641 frame_sync.userdata = sync_attr->userdata;
1642 frame_sync.buf_cb = sync_attr->buf_cb;
1643 frame_sync.attr = sync_attr->attr;
1644 pthread_mutex_lock(&cam_obj->cam_lock);
1645 pthread_mutex_unlock(&cam_obj->muxer_lock);
1646 rc = mm_camera_reg_frame_sync(cam_obj, chid, strid, &frame_sync);
1647 } else {
1648 pthread_mutex_unlock(&cam_obj->muxer_lock);
1649 }
1650 return rc;
1651 }
1652
1653 /*===========================================================================
1654 * FUNCTION : mm_camera_muxer_set_dual_cam_cmd
1655 *
1656 * DESCRIPTION: send event to trigger read on dual camera cmd buffer
1657 *
1658 * PARAMETERS :
1659 * @camera_handle: camera handle
1660 * @cam_obj : header object
1661 *
1662 * RETURN : int32_t type of status
1663 * 0 -- success
1664 * 1 -- failure
1665 *==========================================================================*/
mm_camera_muxer_set_dual_cam_cmd(uint32_t camera_handle,mm_camera_obj_t * cam_obj)1666 int32_t mm_camera_muxer_set_dual_cam_cmd(uint32_t camera_handle,
1667 mm_camera_obj_t *cam_obj)
1668 {
1669 int32_t rc = 0;
1670 mm_camera_obj_t * my_obj = NULL;
1671 my_obj = mm_muxer_util_get_camera_by_obj(camera_handle, cam_obj);
1672
1673 if(my_obj) {
1674 pthread_mutex_lock(&my_obj->cam_lock);
1675 pthread_mutex_unlock(&cam_obj->muxer_lock);
1676 rc = mm_camera_set_dual_cam_cmd(my_obj);
1677 } else {
1678 pthread_mutex_unlock(&cam_obj->muxer_lock);
1679 }
1680 return rc;
1681 }
1682
1683 /*===========================================================================
1684 * FUNCTION : mm_camera_muxer_stream_frame_sync
1685 *
1686 * DESCRIPTION: Handle stream buffers for frame sync
1687 *
1688 * PARAMETERS :
1689 * @super_buf: Stream buffers
1690 * @user_data : Stream object
1691 *
1692 * RETURN : none
1693 *==========================================================================*/
mm_camera_muxer_stream_frame_sync(mm_camera_super_buf_t * super_buf,void * user_data)1694 void mm_camera_muxer_stream_frame_sync(mm_camera_super_buf_t *super_buf,
1695 void *user_data)
1696 {
1697 int32_t rc = 0, i = 0;
1698 mm_stream_t *my_obj = (mm_stream_t *)user_data;
1699 mm_frame_sync_queue_node_t dispatch_buf;
1700
1701 if ((super_buf == NULL) || (super_buf->num_bufs == 0)) {
1702 return;
1703 }
1704
1705 if (my_obj->master_str_obj != NULL) {
1706 my_obj = my_obj->master_str_obj;
1707 }
1708
1709 memset(&dispatch_buf, 0, sizeof(dispatch_buf));
1710 rc = mm_camera_muxer_do_frame_sync(&my_obj->frame_sync.superbuf_queue,
1711 super_buf, &dispatch_buf);
1712 if (rc < 0) {
1713 LOGE("frame sync failed");
1714 return;
1715 }
1716
1717 if (my_obj->frame_sync.super_buf_notify_cb && dispatch_buf.num_objs > 0) {
1718 mm_camera_super_buf_t super_buf;
1719 memset(&super_buf, 0, sizeof(super_buf));
1720 for (i = 0; i < MAX_OBJS_FOR_FRAME_SYNC; i++) {
1721 if (dispatch_buf.super_buf[i].num_bufs == 1) {
1722 super_buf.bufs[super_buf.num_bufs++] =
1723 dispatch_buf.super_buf[i].bufs[0];
1724 super_buf.camera_handle = my_obj->ch_obj->cam_obj->my_hdl;
1725 super_buf.ch_id = my_obj->ch_obj->my_hdl;
1726 }
1727 }
1728 pthread_mutex_lock(&my_obj->cb_lock);
1729 my_obj->frame_sync.super_buf_notify_cb(&super_buf,
1730 my_obj->frame_sync.user_data);
1731 pthread_mutex_unlock(&my_obj->cb_lock);
1732 }
1733 }
1734
1735 /*===========================================================================
1736 * FUNCTION : mm_camera_muxer_channel_frame_sync
1737 *
1738 * DESCRIPTION: Handle channel super buffers for frame sync
1739 *
1740 * PARAMETERS :
1741 * @super_buf: channel buffers
1742 * @user_data : channel object
1743 *
1744 * RETURN : none
1745 *==========================================================================*/
mm_camera_muxer_channel_frame_sync(mm_camera_super_buf_t * super_buf,void * user_data)1746 void mm_camera_muxer_channel_frame_sync(mm_camera_super_buf_t *super_buf,
1747 void *user_data)
1748 {
1749 int32_t rc = 0;
1750 mm_channel_t *ch_obj = (mm_channel_t *)user_data;
1751 mm_channel_t *m_obj = ch_obj;
1752
1753 if ((super_buf == NULL) || (super_buf->num_bufs == 0)) {
1754 return;
1755 }
1756
1757 if (m_obj->master_ch_obj != NULL) {
1758 m_obj = m_obj->master_ch_obj;
1759 }
1760
1761 rc = mm_camera_muxer_do_frame_sync(&m_obj->frame_sync.superbuf_queue,
1762 super_buf, NULL);
1763 mm_camera_muxer_channel_req_data_cb(NULL,
1764 ch_obj);
1765 }
1766
1767
1768 /*===========================================================================
1769 * FUNCTION : mm_camera_muxer_channel_req_data_cb
1770 *
1771 * DESCRIPTION: Issue super buffer callback based on request setting
1772 *
1773 * PARAMETERS :
1774 * @req_buf: buffer request setting
1775 * @ch_obj : channel object
1776 *
1777 * RETURN : none
1778 *==========================================================================*/
mm_camera_muxer_channel_req_data_cb(mm_camera_req_buf_t * req_buf,mm_channel_t * ch_obj)1779 int32_t mm_camera_muxer_channel_req_data_cb(mm_camera_req_buf_t *req_buf,
1780 mm_channel_t *ch_obj)
1781 {
1782 int32_t rc = 0, i;
1783 mm_channel_t *m_obj = (mm_channel_t *)ch_obj;
1784 mm_frame_sync_queue_node_t* super_obj = NULL;
1785 mm_frame_sync_t *frame_sync = NULL;
1786 uint8_t trigger_cb = 0;
1787
1788 if (m_obj->master_ch_obj != NULL) {
1789 m_obj = m_obj->master_ch_obj;
1790 }
1791
1792 frame_sync = &m_obj->frame_sync;
1793 if (req_buf != NULL) {
1794 frame_sync->req_buf.num_buf_requested +=
1795 req_buf->num_buf_requested;
1796 frame_sync->req_buf.type = req_buf->type;
1797 }
1798
1799 while ((frame_sync->req_buf.num_buf_requested > 0)
1800 || (frame_sync->superbuf_queue.attr.notify_mode ==
1801 MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS)) {
1802 super_obj = mm_camera_muxer_frame_sync_dequeue(
1803 &frame_sync->superbuf_queue, frame_sync->req_buf.type);
1804 if (super_obj == NULL) {
1805 break;
1806 }
1807 if (frame_sync->super_buf_notify_cb && super_obj->num_objs != 0) {
1808 if (frame_sync->req_buf.type == MM_CAMERA_REQ_FRAME_SYNC_BUF) {
1809 for (i = 0; i < MAX_OBJS_FOR_FRAME_SYNC; i++) {
1810 if (super_obj->super_buf[i].num_bufs != 0) {
1811 frame_sync->super_buf_notify_cb(
1812 &super_obj->super_buf[i],
1813 frame_sync->user_data);
1814 }
1815 }
1816 trigger_cb = 1;
1817 } else {
1818 for (i = 0; i < MAX_OBJS_FOR_FRAME_SYNC; i++) {
1819 if (super_obj->super_buf[i].num_bufs != 0) {
1820 if (super_obj->super_buf[i].ch_id ==
1821 ch_obj->my_hdl) {
1822 frame_sync->super_buf_notify_cb(
1823 &super_obj->super_buf[i],
1824 frame_sync->user_data);
1825 trigger_cb = 1;
1826 } else {
1827 mm_camera_muxer_buf_done(&super_obj->super_buf[i]);
1828 }
1829 }
1830 }
1831 }
1832 if ((m_obj->frame_sync.req_buf.num_buf_requested > 0)
1833 && trigger_cb) {
1834 m_obj->frame_sync.req_buf.num_buf_requested--;
1835 }
1836 }
1837 free(super_obj);
1838 }
1839 return rc;
1840 }
1841
1842 /*===========================================================================
1843 * FUNCTION : mm_camera_muxer_frame_sync_dequeue
1844 *
1845 * DESCRIPTION: dequeue object from frame sync queue
1846 *
1847 * PARAMETERS :
1848 * @queue: ptr to queue to dequeue object
1849 *
1850 * RETURN : ptr to a node from superbuf queue
1851 *==========================================================================*/
mm_camera_muxer_frame_sync_dequeue(mm_frame_sync_queue_t * queue,uint8_t matched_only)1852 mm_frame_sync_queue_node_t *mm_camera_muxer_frame_sync_dequeue(
1853 mm_frame_sync_queue_t *queue, uint8_t matched_only)
1854 {
1855 cam_node_t* node = NULL;
1856 struct cam_list *head = NULL;
1857 struct cam_list *pos = NULL;
1858 mm_frame_sync_queue_node_t* super_buf = NULL;
1859
1860 pthread_mutex_lock(&queue->que.lock);
1861 head = &queue->que.head.list;
1862 pos = head->next;
1863 if (pos != head) {
1864 /* get the first node */
1865 node = member_of(pos, cam_node_t, list);
1866 super_buf = (mm_frame_sync_queue_node_t*)node->data;
1867 if ( (NULL != super_buf) &&
1868 (matched_only == TRUE) &&
1869 (super_buf->matched == FALSE) ) {
1870 super_buf = NULL;
1871 }
1872
1873 if (NULL != super_buf) {
1874 queue->que.size--;
1875 cam_list_del_node(&node->list);
1876 free(node);
1877 if (super_buf->matched) {
1878 queue->match_cnt--;
1879 }
1880 }
1881 }
1882 pthread_mutex_unlock(&queue->que.lock);
1883 return super_buf;
1884 }
1885
1886 /*===========================================================================
1887 * FUNCTION : mm_camera_muxer_do_frame_sync
1888 *
1889 * DESCRIPTION: function to process object buffers and match with existing frames.
1890 *
1891 * PARAMETERS :
1892 * @queue: ptr to queue to dequeue object
1893 * @buffer: Input buffer to match and insert
1894 * @dispatch_buf : Ptr to carry matched node
1895 *
1896 * RETURN : int32_t type of status
1897 * 0 -- success
1898 * 1 -- failure
1899 *==========================================================================*/
mm_camera_muxer_do_frame_sync(mm_frame_sync_queue_t * queue,mm_camera_super_buf_t * buffer,mm_frame_sync_queue_node_t * dispatch_buf)1900 int32_t mm_camera_muxer_do_frame_sync(
1901 mm_frame_sync_queue_t *queue, mm_camera_super_buf_t *buffer,
1902 mm_frame_sync_queue_node_t *dispatch_buf)
1903 {
1904 cam_node_t* node = NULL;
1905 uint8_t buf_s_idx, i, found_super_buf, unmatched_bundles;
1906 struct cam_list *head = NULL;
1907 struct cam_list *pos = NULL;
1908 mm_frame_sync_queue_node_t* super_obj = NULL;
1909 struct cam_list *last_buf = NULL, *insert_before_buf = NULL;
1910
1911 if (buffer == NULL || buffer->num_bufs == 0) {
1912 LOGW("Ivalid Argument");
1913 return -1;
1914 }
1915
1916 for (buf_s_idx = 0; buf_s_idx < queue->num_objs; buf_s_idx++) {
1917 if ((buffer->ch_id == queue->bundled_objs[buf_s_idx]) ||
1918 (buffer->bufs[0]->stream_id == queue->bundled_objs[buf_s_idx])) {
1919 break;
1920 }
1921 }
1922 if (buf_s_idx == queue->num_objs) {
1923 LOGE("buf from stream (%d) not bundled", buffer->bufs[0]->stream_id);
1924 mm_camera_muxer_buf_done(buffer);
1925 return -1;
1926 }
1927
1928 if (buffer->bufs[0]->frame_idx <= queue->expected_frame_id) {
1929 LOGD("old frame. Need to release");
1930 mm_camera_muxer_buf_done(buffer);
1931 return 0;
1932 }
1933
1934 pthread_mutex_lock(&queue->que.lock);
1935 head = &queue->que.head.list;
1936 pos = head->next;
1937 found_super_buf = 0;
1938 unmatched_bundles = 0;
1939 last_buf = NULL;
1940 insert_before_buf = NULL;
1941
1942 while (pos != head) {
1943 node = member_of(pos, cam_node_t, list);
1944 super_obj = (mm_frame_sync_queue_node_t *)node->data;
1945 if (NULL != super_obj) {
1946 if (super_obj->matched == 1) {
1947 /* find a matched super buf, move to next one */
1948 pos = pos->next;
1949 continue;
1950 } else if (buffer->bufs[0]->frame_idx == super_obj->frame_idx) {
1951 found_super_buf = 1;
1952 break;
1953 } else if ((buffer->bufs[0]->frame_idx >= super_obj->frame_idx)
1954 && (queue->attr.priority ==
1955 MM_CAMERA_SUPER_BUF_PRIORITY_LOW)) {
1956 found_super_buf = 1;
1957 break;
1958 } else {
1959 unmatched_bundles++;
1960 if ( NULL == last_buf ) {
1961 if ( super_obj->frame_idx < buffer->bufs[0]->frame_idx) {
1962 last_buf = pos;
1963 }
1964 }
1965 if ( NULL == insert_before_buf ) {
1966 if ( super_obj->frame_idx > buffer->bufs[0]->frame_idx) {
1967 insert_before_buf = pos;
1968 }
1969 }
1970 pos = pos->next;
1971 }
1972 }
1973 }
1974
1975 LOGD("found_super_buf = %d id = %d unmatched = %d max = %d", found_super_buf,
1976 buffer->bufs[0]->frame_idx, unmatched_bundles,
1977 queue->attr.max_unmatched_frames);
1978 if (found_super_buf) {
1979 super_obj->super_buf[buf_s_idx] = *buffer;
1980 super_obj->num_objs++;
1981 if (super_obj->num_objs == queue->num_objs) {
1982 super_obj->matched = 1;
1983 queue->expected_frame_id = super_obj->frame_idx;
1984 if (dispatch_buf != NULL) {
1985 *dispatch_buf = *super_obj;
1986 queue->que.size--;
1987 cam_list_del_node(&node->list);
1988 free(node);
1989 free(super_obj);
1990 } else {
1991 queue->match_cnt++;
1992 }
1993 }
1994 /* Any older unmatched buffer need to be released */
1995 if ( last_buf ) {
1996 while (last_buf != pos ) {
1997 node = member_of(last_buf, cam_node_t, list);
1998 super_obj = (mm_frame_sync_queue_node_t*)node->data;
1999 if (NULL != super_obj) {
2000 for (i = 0; i < MAX_OBJS_FOR_FRAME_SYNC; i++) {
2001 if (super_obj->super_buf[i].num_bufs != 0) {
2002 mm_camera_muxer_buf_done(&super_obj->super_buf[i]);
2003 }
2004 }
2005 queue->que.size--;
2006 last_buf = last_buf->next;
2007 cam_list_del_node(&node->list);
2008 free(node);
2009 free(super_obj);
2010 }
2011 }
2012 }
2013 } else {
2014 if ((queue->attr.max_unmatched_frames < unmatched_bundles)
2015 && (NULL == last_buf)) {
2016 //incoming frame is older than the last bundled one
2017 mm_camera_muxer_buf_done(buffer);
2018 pthread_mutex_unlock(&queue->que.lock);
2019 return 0;
2020 } else if (queue->attr.max_unmatched_frames < unmatched_bundles) {
2021 //dispatch old buffer. Cannot sync for configured unmatch value
2022 node = member_of(last_buf, cam_node_t, list);
2023 super_obj = (mm_frame_sync_queue_node_t*)node->data;
2024 queue->expected_frame_id = super_obj->frame_idx;
2025 if (dispatch_buf != NULL && super_obj != NULL) {
2026 //Dispatch unmatched buffer
2027 *dispatch_buf = *super_obj;
2028 } else if (super_obj != NULL){
2029 //release unmatched buffers
2030 for (i = 0; i < MAX_OBJS_FOR_FRAME_SYNC; i++) {
2031 if (super_obj->super_buf[i].num_bufs != 0) {
2032 mm_camera_muxer_buf_done(&super_obj->super_buf[i]);
2033 }
2034 }
2035 }
2036 queue->que.size--;
2037 cam_list_del_node(&node->list);
2038 free(node);
2039 free(super_obj);
2040 }
2041
2042 //insert the new frame at the appropriate position.
2043 mm_frame_sync_queue_node_t *new_buf = NULL;
2044 cam_node_t* new_node = NULL;
2045 new_buf = (mm_frame_sync_queue_node_t *)
2046 malloc(sizeof(mm_frame_sync_queue_node_t));
2047 if (NULL != new_buf) {
2048 memset(new_buf, 0, sizeof(mm_frame_sync_queue_node_t));
2049 new_buf->super_buf[buf_s_idx] = *buffer;
2050 new_buf->num_objs++;
2051 new_buf->frame_idx = buffer->bufs[0]->frame_idx;
2052 new_buf->matched = 0;
2053 if (new_buf->num_objs == queue->num_objs) {
2054 new_buf->matched = 1;
2055 queue->expected_frame_id = super_obj->frame_idx;
2056 if (dispatch_buf != NULL) {
2057 *dispatch_buf = *new_buf;
2058 queue->que.size--;
2059 free(new_buf);
2060 free(new_node);
2061 } else {
2062 queue->match_cnt++;
2063 }
2064 } else {
2065 /* enqueue */
2066 new_node = (cam_node_t *)malloc(sizeof(cam_node_t));
2067 if (new_node != NULL) {
2068 memset(new_node, 0, sizeof(cam_node_t));
2069 new_node->data = (void *)new_buf;
2070 if ( insert_before_buf ) {
2071 cam_list_insert_before_node(&new_node->list, insert_before_buf);
2072 } else {
2073 cam_list_add_tail_node(&new_node->list, &queue->que.head.list);
2074 }
2075 queue->que.size++;
2076 } else {
2077 LOGE("Out of memory");
2078 free(new_buf);
2079 mm_camera_muxer_buf_done(buffer);
2080 }
2081 }
2082 } else {
2083 if (NULL != new_buf) {
2084 free(new_buf);
2085 }
2086 mm_camera_muxer_buf_done(buffer);
2087 }
2088 }
2089 pthread_mutex_unlock(&queue->que.lock);
2090
2091 /* bufdone overflowed bufs */
2092 while (queue->match_cnt > queue->attr.water_mark) {
2093 super_obj = mm_camera_muxer_frame_sync_dequeue(queue, FALSE);
2094 if (NULL != super_obj) {
2095 for (i = 0; i < MAX_OBJS_FOR_FRAME_SYNC; i++) {
2096 if (super_obj->super_buf[i].num_bufs != 0) {
2097 mm_camera_muxer_buf_done(&super_obj->super_buf[i]);
2098 }
2099 }
2100 free(super_obj);
2101 }
2102 }
2103 return 0;
2104 }
2105
2106 /*===========================================================================
2107 * FUNCTION : mm_camera_muxer_buf_done
2108 *
2109 * DESCRIPTION: function release super buffer.
2110 *
2111 * PARAMETERS :
2112 * @buffer: ptr to super buffer to release.
2113 *
2114 * RETURN : int32_t type of status
2115 * 0 -- success
2116 * 1 -- failure
2117 *==========================================================================*/
mm_camera_muxer_buf_done(mm_camera_super_buf_t * buffer)2118 void mm_camera_muxer_buf_done(mm_camera_super_buf_t *buffer)
2119 {
2120 uint8_t i;
2121 mm_camera_obj_t *my_obj = NULL;
2122
2123 if (buffer == NULL) {
2124 LOGW("Null buffer");
2125 return;
2126 }
2127
2128 my_obj = mm_camera_util_get_camera_by_handler(buffer->camera_handle);
2129 if (my_obj != NULL) {
2130 for (i=0; i < buffer->num_bufs; i++) {
2131 if (buffer->bufs[i] != NULL) {
2132 pthread_mutex_lock(&my_obj->cam_lock);
2133 mm_camera_qbuf(my_obj, buffer->ch_id, buffer->bufs[i]);
2134 }
2135 }
2136 }
2137 }
2138
2139 /*===========================================================================
2140 * FUNCTION : mm_muxer_frame_sync_queue_init
2141 *
2142 * DESCRIPTION: Inittialize frame sync queue
2143 *
2144 * PARAMETERS :
2145 * @queue: ptr to frame sync queue
2146 *
2147 * RETURN : int32_t type of status
2148 * 0 -- success
2149 * 1 -- failure
2150 *==========================================================================*/
mm_muxer_frame_sync_queue_init(mm_frame_sync_queue_t * queue)2151 int32_t mm_muxer_frame_sync_queue_init(mm_frame_sync_queue_t *queue)
2152 {
2153 int32_t rc = 0;
2154 queue->expected_frame_id = 0;
2155 queue->match_cnt = 0;
2156 queue->num_objs = 0;
2157 memset(&queue->bundled_objs, 0, sizeof(queue->bundled_objs));
2158 rc = cam_queue_init(&queue->que);
2159 return rc;
2160 }
2161
2162 /*===========================================================================
2163 * FUNCTION : mm_muxer_frame_sync_queue_deinit
2164 *
2165 * DESCRIPTION: Inittialize frame sync queue
2166 *
2167 * PARAMETERS :
2168 * @queue: ptr to frame sync queue
2169 *
2170 * RETURN : int32_t type of status
2171 * 0 -- success
2172 * 1 -- failure
2173 *==========================================================================*/
mm_muxer_frame_sync_queue_deinit(mm_frame_sync_queue_t * queue)2174 int32_t mm_muxer_frame_sync_queue_deinit(mm_frame_sync_queue_t *queue)
2175 {
2176 int32_t rc = 0;
2177 rc = cam_queue_deinit(&queue->que);
2178 return rc;
2179 }
2180
2181 /*===========================================================================
2182 * FUNCTION : mm_camera_muxer_frame_sync_flush
2183 *
2184 * DESCRIPTION: function to flush frame sync queue
2185 *
2186 * PARAMETERS :
2187 * @queue: ptr to frame sync queue
2188 *
2189 * RETURN : int32_t type of status
2190 * 0 -- success
2191 * 1 -- failure
2192 *==========================================================================*/
mm_camera_muxer_frame_sync_flush(mm_frame_sync_queue_t * queue)2193 int32_t mm_camera_muxer_frame_sync_flush(mm_frame_sync_queue_t *queue)
2194 {
2195 int32_t rc = 0, i = 0;
2196 mm_frame_sync_queue_node_t *super_obj = NULL;
2197
2198 super_obj = mm_camera_muxer_frame_sync_dequeue(queue, FALSE);
2199 while (super_obj != NULL) {
2200 for (i = 0; i < MAX_OBJS_FOR_FRAME_SYNC; i++) {
2201 if (super_obj->super_buf[i].num_bufs != 0) {
2202 mm_camera_muxer_buf_done(&super_obj->super_buf[i]);
2203 }
2204 }
2205 free(super_obj);
2206 super_obj = NULL;
2207 super_obj = mm_camera_muxer_frame_sync_dequeue(queue, FALSE);
2208 }
2209 return rc;
2210 }
2211
2212 /*===========================================================================
2213 * FUNCTION : mm_camera_muxer_stream_frame_sync_flush
2214 *
2215 * DESCRIPTION: function to flush frame sync queue
2216 *
2217 * PARAMETERS :
2218 * @queue: ptr to frame sync queue
2219 *
2220 * RETURN : int32_t type of status
2221 * 0 -- success
2222 * 1 -- failure
2223 *==========================================================================*/
mm_camera_muxer_stream_frame_sync_flush(mm_stream_t * str_obj)2224 int32_t mm_camera_muxer_stream_frame_sync_flush(mm_stream_t *str_obj)
2225 {
2226 int32_t rc = 0;
2227 mm_stream_t *my_obj = str_obj;
2228
2229 if (my_obj->master_str_obj) {
2230 my_obj = my_obj->master_str_obj;
2231 }
2232
2233 rc = mm_camera_muxer_frame_sync_flush(&my_obj->frame_sync.superbuf_queue);
2234 return rc;
2235 }
2236
2237 /*===========================================================================
2238 * FUNCTION : mm_camera_muxer_channel_frame_sync_flush
2239 *
2240 * DESCRIPTION: function to flush frame sync queue
2241 *
2242 * PARAMETERS :
2243 * @queue: ptr to frame sync queue
2244 *
2245 * RETURN : int32_t type of status
2246 * 0 -- success
2247 * 1 -- failure
2248 *==========================================================================*/
mm_camera_muxer_channel_frame_sync_flush(mm_channel_t * ch_obj)2249 int32_t mm_camera_muxer_channel_frame_sync_flush(mm_channel_t *ch_obj)
2250 {
2251 int32_t rc = 0;
2252 mm_channel_t *my_obj = ch_obj;
2253
2254 if (ch_obj->master_ch_obj != NULL) {
2255 my_obj = ch_obj->master_ch_obj;
2256 }
2257
2258 rc = mm_camera_muxer_frame_sync_flush(&my_obj->frame_sync.superbuf_queue);
2259 return rc;
2260 }
2261
2262 /*===========================================================================
2263 * FUNCTION : mm_camera_muxer_get_stream_buf_cnt
2264 *
2265 * DESCRIPTION: function to calculate buffer count for auxillary streams.
2266 *
2267 * PARAMETERS :
2268 * @queue: ptr to frame sync queue
2269 *
2270 * RETURN : int32_t type of status
2271 * 0 -- success
2272 * 1 -- failure
2273 *==========================================================================*/
mm_camera_muxer_get_stream_buf_cnt(mm_stream_t * str_obj)2274 uint32_t mm_camera_muxer_get_stream_buf_cnt(mm_stream_t *str_obj)
2275 {
2276 uint32_t buf_cnt = 0;
2277 uint8_t i = 0;
2278 mm_stream_t *my_obj = str_obj;
2279
2280 if (str_obj->master_str_obj != NULL) {
2281 my_obj = str_obj->master_str_obj;
2282 }
2283
2284 buf_cnt = my_obj->buf_num;
2285 for (i = 0; i < my_obj->num_s_cnt; i++) {
2286 if (my_obj->aux_str_obj[i]->is_res_shared) {
2287 buf_cnt += my_obj->aux_str_obj[i]->buf_num;
2288 }
2289 }
2290 if (buf_cnt > CAM_MAX_NUM_BUFS_PER_STREAM) {
2291 buf_cnt = CAM_MAX_NUM_BUFS_PER_STREAM;
2292 }
2293 return buf_cnt;
2294 }
2295
2296 /*===========================================================================
2297 * FUNCTION : mm_camera_muxer_get_stream_bufs
2298 *
2299 * DESCRIPTION: function to assign buffers for auxillary streams.
2300 *
2301 * PARAMETERS :
2302 * @queue: ptr to frame sync queue
2303 *
2304 * RETURN : int32_t type of status
2305 * 0 -- success
2306 * 1 -- failure
2307 *==========================================================================*/
mm_camera_muxer_get_stream_bufs(mm_stream_t * my_obj)2308 int32_t mm_camera_muxer_get_stream_bufs(mm_stream_t *my_obj)
2309 {
2310 int32_t rc = 0;
2311 uint32_t i = 0;
2312 mm_stream_t *master_obj = NULL;
2313
2314 if (my_obj == NULL || my_obj->master_str_obj == NULL
2315 || !my_obj->is_res_shared) {
2316 LOGE("Invalid argument");
2317 return rc;
2318 }
2319 master_obj = my_obj->master_str_obj;
2320
2321 if (master_obj->total_buf_cnt == 0) {
2322 my_obj->buf_idx = 0;
2323 return rc;
2324 }
2325
2326 if ((master_obj->total_buf_cnt -
2327 (master_obj->buf_idx + master_obj->buf_num))
2328 <= 0) {
2329 LOGE("No enough buffer available %d num_bufs = %d",
2330 master_obj->total_buf_cnt, master_obj->buf_num);
2331 return rc;
2332 }
2333
2334 my_obj->total_buf_cnt = master_obj->total_buf_cnt;
2335 my_obj->buf_idx = master_obj->buf_idx + master_obj->buf_num;
2336 if ((my_obj->buf_idx + my_obj->buf_num) > my_obj->total_buf_cnt) {
2337 my_obj->buf_num = my_obj->total_buf_cnt - my_obj->buf_idx;
2338 }
2339
2340 my_obj->buf = master_obj->buf;
2341 for (i = my_obj->buf_idx; i < (my_obj->buf_idx + my_obj->buf_num); i++) {
2342 my_obj->buf_status[i].initial_reg_flag =
2343 master_obj->buf_status[i].initial_reg_flag;
2344 }
2345 LOGH("Buffer total = %d buf_cnt = %d offsset = %d",my_obj->total_buf_cnt,
2346 my_obj->buf_num, my_obj->buf_idx);
2347 return 0;
2348 }
2349
2350 /*===========================================================================
2351 * FUNCTION : mm_camera_muxer_put_stream_bufs
2352 *
2353 * DESCRIPTION: function to release buffers for auxillary streams.
2354 *
2355 * PARAMETERS :
2356 * @queue: ptr to frame sync queue
2357 *
2358 * RETURN : int32_t type of status
2359 * 0 -- success
2360 * 1 -- failure
2361 *==========================================================================*/
mm_camera_muxer_put_stream_bufs(mm_stream_t * my_obj)2362 int32_t mm_camera_muxer_put_stream_bufs(mm_stream_t *my_obj)
2363 {
2364 int32_t rc = -1;
2365
2366 if (my_obj == NULL || !my_obj->is_res_shared) {
2367 LOGE("Invalid argument");
2368 return rc;
2369 }
2370 my_obj->total_buf_cnt = 0;
2371 return 0;
2372 }
2373
2374 /*===========================================================================
2375 * FUNCTION : mm_camera_map_stream_buf_ops
2376 *
2377 * DESCRIPTION: ops for mapping stream buffer via domain socket to server.
2378 * This function will be passed to upper layer as part of ops table
2379 * to be used by upper layer when allocating stream buffers and mapping
2380 * buffers to server via domain socket.
2381 *
2382 * PARAMETERS :
2383 * @frame_idx : index of buffer within the stream buffers, only valid if
2384 * buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or
2385 * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
2386 * @plane_idx : plane index. If all planes share the same fd,
2387 * plane_idx = -1; otherwise, plean_idx is the
2388 * index to plane (0..num_of_planes)
2389 * @fd : file descriptor of the buffer
2390 * @size : size of the buffer
2391 * @userdata : user data ptr (stream object)
2392 *
2393 * RETURN : int32_t type of status
2394 * 0 -- success
2395 * -1 -- failure
2396 *==========================================================================*/
mm_camera_map_stream_buf_ops(uint32_t buf_idx,int32_t plane_idx,int fd,size_t size,void * buffer,cam_mapping_buf_type type,void * userdata)2397 int32_t mm_camera_map_stream_buf_ops(uint32_t buf_idx,
2398 int32_t plane_idx, int fd, size_t size,
2399 void *buffer, cam_mapping_buf_type type,
2400 void *userdata)
2401 {
2402 int32_t rc = 0;
2403 mm_stream_t *my_obj = (mm_stream_t *)userdata;
2404 int32_t i = 0;
2405
2406 switch (type) {
2407 case CAM_MAPPING_BUF_TYPE_STREAM_INFO:
2408 case CAM_MAPPING_BUF_TYPE_MISC_BUF:
2409 if (buf_idx != 0 && my_obj->aux_str_obj[buf_idx] != NULL) {
2410 my_obj = my_obj->aux_str_obj[buf_idx];
2411 }
2412 break;
2413 case CAM_MAPPING_BUF_TYPE_STREAM_BUF:
2414 case CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF:
2415 case CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF:
2416 case CAM_MAPPING_BUF_TYPE_STREAM_USER_BUF:
2417 for(i = 0; i < my_obj->num_s_cnt; i++) {
2418 if (my_obj->aux_str_obj[i] != NULL) {
2419 rc = mm_stream_map_buf(my_obj->aux_str_obj[i],
2420 type, buf_idx, plane_idx, fd, size, buffer);
2421 }
2422 }
2423 break;
2424 default:
2425 LOGE("Not buffer for stream : %d", type);
2426 rc = -1;
2427 break;
2428 }
2429
2430 if (rc == 0) {
2431 rc = mm_stream_map_buf(my_obj,
2432 type, buf_idx, plane_idx, fd, size, buffer);
2433 }
2434 return rc;
2435 }
2436
2437 /*===========================================================================
2438 * FUNCTION : mm_camera_muxer_bundled_map_buf_ops
2439 *
2440 * DESCRIPTION: ops for mapping bundled stream buffers via domain socket to server.
2441 * This function will be passed to upper layer as part of ops table
2442 * to be used by upper layer when allocating stream buffers and mapping
2443 * buffers to server via domain socket.
2444 *
2445 * PARAMETERS :
2446 * @buf_map_list : list of buffer mapping information
2447 * @userdata : user data ptr (stream object)
2448 *
2449 * RETURN : int32_t type of status
2450 * 0 -- success
2451 * -1 -- failure
2452 *==========================================================================*/
mm_camera_bundled_map_stream_buf_ops(const cam_buf_map_type_list * buf_map_list,void * userdata)2453 int32_t mm_camera_bundled_map_stream_buf_ops(
2454 const cam_buf_map_type_list *buf_map_list,
2455 void *userdata)
2456 {
2457 int32_t rc = 0;
2458 mm_stream_t *my_obj = (mm_stream_t *)userdata;
2459 uint32_t i = 0;
2460
2461 if (buf_map_list == NULL || buf_map_list->length == 0) {
2462 LOGW("Invalid argument");
2463 return rc;
2464 }
2465
2466 uint32_t buf_idx;
2467 cam_mapping_buf_type type = buf_map_list->buf_maps[0].type;
2468 switch (type) {
2469 case CAM_MAPPING_BUF_TYPE_STREAM_INFO:
2470 case CAM_MAPPING_BUF_TYPE_MISC_BUF:
2471 buf_idx = buf_map_list->buf_maps[0].frame_idx;
2472 if (buf_idx == 0) {
2473 rc = mm_stream_map_buf(my_obj,
2474 type, buf_idx,
2475 buf_map_list->buf_maps[0].plane_idx,
2476 buf_map_list->buf_maps[0].fd,
2477 buf_map_list->buf_maps[0].size,
2478 buf_map_list->buf_maps[0].buffer);
2479 if (rc != 0) {
2480 LOGE("Failed rc = %d", rc);
2481 }
2482 }
2483 for (i = 1; i < buf_map_list->length; i++) {
2484 buf_idx = buf_map_list->buf_maps[i].frame_idx;
2485 if ((i == buf_idx)
2486 && (my_obj->aux_str_obj[i] != NULL)) {
2487 rc = mm_stream_map_buf(my_obj->aux_str_obj[i],
2488 type, buf_idx,
2489 buf_map_list->buf_maps[i].plane_idx,
2490 buf_map_list->buf_maps[i].fd,
2491 buf_map_list->buf_maps[i].size,
2492 buf_map_list->buf_maps[i].buffer);
2493 }
2494 }
2495 break;
2496 case CAM_MAPPING_BUF_TYPE_STREAM_BUF:
2497 case CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF:
2498 case CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF:
2499 case CAM_MAPPING_BUF_TYPE_STREAM_USER_BUF:
2500 rc = mm_stream_map_bufs(my_obj, buf_map_list);
2501 for(i = 0; i < my_obj->num_s_cnt; i++) {
2502 if (my_obj->aux_str_obj[i] != NULL) {
2503 rc = mm_stream_map_bufs(my_obj->aux_str_obj[i],
2504 buf_map_list);
2505 }
2506 }
2507 break;
2508 default:
2509 LOGE("Not buffer for stream : %d", type);
2510 rc = -1;
2511 break;
2512 }
2513 return rc;
2514 }
2515
2516 /*===========================================================================
2517 * FUNCTION : mm_camera_muxer_unmap_buf_ops
2518 *
2519 * DESCRIPTION: ops for unmapping stream buffer via domain socket to server.
2520 * This function will be passed to upper layer as part of ops table
2521 * to be used by upper layer when allocating stream buffers and unmapping
2522 * buffers to server via domain socket.
2523 *
2524 * PARAMETERS :
2525 * @frame_idx : index of buffer within the stream buffers, only valid if
2526 * buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or
2527 * CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
2528 * @plane_idx : plane index. If all planes share the same fd,
2529 * plane_idx = -1; otherwise, plean_idx is the
2530 * index to plane (0..num_of_planes)
2531 * @userdata : user data ptr (stream object)
2532 *
2533 * RETURN : int32_t type of status
2534 * 0 -- success
2535 * -1 -- failure
2536 *==========================================================================*/
mm_camera_unmap_stream_buf_ops(uint32_t buf_idx,int32_t plane_idx,cam_mapping_buf_type type,void * userdata)2537 int32_t mm_camera_unmap_stream_buf_ops(uint32_t buf_idx,
2538 int32_t plane_idx, cam_mapping_buf_type type, void *userdata)
2539 {
2540 int32_t rc = 0;
2541 mm_stream_t *my_obj = (mm_stream_t *)userdata;
2542 int32_t i = 0;
2543
2544 switch (type) {
2545 case CAM_MAPPING_BUF_TYPE_STREAM_INFO:
2546 case CAM_MAPPING_BUF_TYPE_MISC_BUF:
2547 if (buf_idx != 0 && my_obj->aux_str_obj[buf_idx] != NULL) {
2548 my_obj = my_obj->aux_str_obj[buf_idx];
2549 }
2550 break;
2551 case CAM_MAPPING_BUF_TYPE_STREAM_BUF:
2552 case CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF:
2553 case CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF:
2554 case CAM_MAPPING_BUF_TYPE_STREAM_USER_BUF:
2555 for(i = 0; i < my_obj->num_s_cnt; i++) {
2556 if (my_obj->aux_str_obj[i] != NULL) {
2557 rc = mm_stream_unmap_buf(my_obj->aux_str_obj[i],
2558 type, buf_idx, plane_idx);
2559 }
2560 }
2561 break;
2562 default:
2563 LOGE("Not buffer for stream : %d", type);
2564 rc = -1;
2565 break;
2566 }
2567
2568 if (rc == 0) {
2569 rc = mm_stream_unmap_buf(my_obj,
2570 type, buf_idx, plane_idx);
2571 }
2572 return rc;
2573 }
2574
2575
2576