166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Redistribution and use in source and binary forms, with or without 466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * modification, are permitted provided that the following conditions are 566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * met: 666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * * Redistributions of source code must retain the above copyright 766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * notice, this list of conditions and the following disclaimer. 866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * * Redistributions in binary form must reproduce the above 966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * copyright notice, this list of conditions and the following 1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * disclaimer in the documentation and/or other materials provided 1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * with the distribution. 1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * * Neither the name of The Linux Foundation nor the names of its 1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * contributors may be used to endorse or promote products derived 1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * from this software without specific prior written permission. 1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */ 2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies 3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <pthread.h> 3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <fcntl.h> 3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies 3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "cam_semaphore.h" 3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h" 3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_interface.h" 3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera.h" 3959c9b8b72e3bcfcb70694fb9e6a6291311d53e98Shuzhen Wang#include "cam_cond.h" 4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern mm_camera_obj_t* mm_camera_util_get_camera_by_handler(uint32_t cam_handler); 4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern mm_channel_t * mm_camera_util_get_channel_by_handler(mm_camera_obj_t * cam_obj, 4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t handler); 4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Static frame sync info used between different camera channels*/ 4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic mm_channel_frame_sync_info_t fs = { .num_cam =0, .pos = 0}; 4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Frame sync info access lock */ 4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic pthread_mutex_t fs_lock = PTHREAD_MUTEX_INITIALIZER; 4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* internal function declare goes here */ 5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_qbuf(mm_channel_t *my_obj, 5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *buf); 52680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Anandaint32_t mm_channel_cancel_buf(mm_channel_t *my_obj, 53680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda uint32_t stream_id, uint32_t buf_idx); 5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_init(mm_channel_t *my_obj, 5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_channel_attr_t *attr, 5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_notify_t channel_cb, 5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata); 5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_channel_release(mm_channel_t *my_obj); 5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t mm_channel_add_stream(mm_channel_t *my_obj); 6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_del_stream(mm_channel_t *my_obj, 6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t stream_id); 6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t mm_channel_link_stream(mm_channel_t *my_obj, 6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_stream_link_t *stream_link); 6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_config_stream(mm_channel_t *my_obj, 6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t stream_id, 6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_stream_config_t *config); 6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_get_bundle_info(mm_channel_t *my_obj, 6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_bundle_config_t *bundle_info); 6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_start(mm_channel_t *my_obj); 7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_stop(mm_channel_t *my_obj); 7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_request_super_buf(mm_channel_t *my_obj, 7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_req_buf_t *buf); 7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_cancel_super_buf_request(mm_channel_t *my_obj); 7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_flush_super_buf_queue(mm_channel_t *my_obj, 7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t frame_idx, 7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t stream_type); 7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_config_notify_mode(mm_channel_t *my_obj, 7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_notify_mode_t notify_mode); 7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_start_zsl_snapshot(mm_channel_t *my_obj); 8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_stop_zsl_snapshot(mm_channel_t *my_obj); 8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_flush(mm_channel_t* my_obj, 8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue, cam_stream_type_t cam_type); 8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_set_stream_parm(mm_channel_t *my_obj, 8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_set_get_stream_parms_t *payload); 8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_get_queued_buf_count(mm_channel_t *my_obj, 8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t stream_id); 8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_get_stream_parm(mm_channel_t *my_obj, 8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_set_get_stream_parms_t *payload); 9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_do_stream_action(mm_channel_t *my_obj, 9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_do_stream_action_t *payload); 9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_map_stream_buf(mm_channel_t *my_obj, 9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_map_type *payload); 9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_map_stream_bufs(mm_channel_t *my_obj, 9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_map_type_list *payload); 9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_unmap_stream_buf(mm_channel_t *my_obj, 9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_unmap_type *payload); 9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* state machine function declare */ 10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_fsm_fn_notused(mm_channel_t *my_obj, 10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_evt_type_t evt, 10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * in_val, 10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * out_val); 10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_fsm_fn_stopped(mm_channel_t *my_obj, 10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_evt_type_t evt, 10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * in_val, 10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * out_val); 10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_fsm_fn_active(mm_channel_t *my_obj, 10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_evt_type_t evt, 11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * in_val, 11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * out_val); 11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_fsm_fn_paused(mm_channel_t *my_obj, 11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_evt_type_t evt, 11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * in_val, 11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * out_val); 11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* channel super queue functions */ 11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_queue_init(mm_channel_queue_t * queue); 11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_queue_deinit(mm_channel_queue_t * queue); 12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_comp_and_enqueue(mm_channel_t *ch_obj, 12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue, 12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_info_t *buf); 12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_channel_queue_node_t* mm_channel_superbuf_dequeue( 12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue, mm_channel_t *ch_obj); 12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_bufdone_overflow(mm_channel_t *my_obj, 12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t *queue); 12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_skip(mm_channel_t *my_obj, 12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t *queue); 12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic int32_t mm_channel_proc_general_cmd(mm_channel_t *my_obj, 13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_generic_cmd_t *p_gen_cmd); 13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_flush_matched(mm_channel_t* my_obj, 13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue); 13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Start of Frame Sync util methods */ 13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_frame_sync_reset(); 13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_frame_sync_register_channel(mm_channel_t *ch_obj); 13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_frame_sync_unregister_channel(mm_channel_t *ch_obj); 13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_frame_sync_add(uint32_t frame_id, mm_channel_t *ch_obj); 14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_frame_sync_remove(uint32_t frame_id); 14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t mm_frame_sync_find_matched(uint8_t oldest); 14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint8_t mm_frame_sync_find_frame_index(uint32_t frame_id); 14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_frame_sync_lock_queues(); 14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_frame_sync_unlock_queues(); 14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_channel_node_qbuf(mm_channel_t *ch_obj, mm_channel_queue_node_t *node); 14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* End of Frame Sync Util methods */ 14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_channel_send_super_buf(mm_channel_node_info_t *info); 14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_channel_queue_node_t* mm_channel_superbuf_dequeue_frame_internal( 14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue, uint32_t frame_idx); 15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_util_get_stream_by_handler 15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: utility function to get a stream object from its handle 15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_obj: ptr to a channel object 15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @handler: stream handle 15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : ptr to a stream object. 16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NULL if failed. 16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_stream_t * mm_channel_util_get_stream_by_handler( 16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_t * ch_obj, 16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t handler) 16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int i; 16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t *s_obj = NULL; 16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for(i = 0; i < MAX_STREAM_NUM_IN_BUNDLE; i++) { 17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((MM_STREAM_STATE_NOTUSED != ch_obj->streams[i].state) && 17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (handler == ch_obj->streams[i].my_hdl)) { 17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_obj = &ch_obj->streams[i]; 17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return s_obj; 17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_dispatch_super_buf 18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: dispatch super buffer of bundle to registered user 18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cmd_cb : ptr storing matched super buf information 18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata: user data ptr 18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic void mm_channel_dispatch_super_buf(mm_camera_cmdcb_t *cmd_cb, 19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void* user_data) 19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_t * my_obj = (mm_channel_t *)user_data; 19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == my_obj) { 19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (MM_CAMERA_CMD_TYPE_SUPER_BUF_DATA_CB != cmd_cb->cmd_type) { 20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Wrong cmd_type (%d) for super buf dataCB", 20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cmd_cb->cmd_type); 20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (my_obj->bundle.super_buf_notify_cb) { 20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.super_buf_notify_cb(&cmd_cb->u.superbuf, my_obj->bundle.user_data); 20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_process_stream_buf 21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: handle incoming buffer from stream in a bundle. In this function, 21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * matching logic will be performed on incoming stream frames. 21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Will depends on the bundle attribute, either storing matched frames 21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * in the superbuf queue, or sending matched superbuf frames to upper 21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * layer through registered callback. 21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cmd_cb : ptr storing matched super buf information 22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata: user data ptr 22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic void mm_channel_process_stream_buf(mm_camera_cmdcb_t * cmd_cb, 22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *user_data) 22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_notify_mode_t notify_mode; 22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t *node = NULL; 23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_t *ch_obj = (mm_channel_t *)user_data; 23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t i = 0; 23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Set expected frame id to a future frame idx, large enough to wait 23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * for good_frame_idx_range, and small enough to still capture an image */ 23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t needStartZSL = FALSE; 23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == ch_obj) { 23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (MM_CAMERA_CMD_TYPE_DATA_CB == cmd_cb->cmd_type) { 24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* comp_and_enqueue */ 24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_comp_and_enqueue( 24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj, 24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &ch_obj->bundle.superbuf_queue, 24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &cmd_cb->u.buf); 24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (MM_CAMERA_CMD_TYPE_REQ_DATA_CB == cmd_cb->cmd_type) { 24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* skip frames if needed */ 24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->pending_cnt = cmd_cb->u.req_buf.num_buf_requested; 24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->pending_retro_cnt = cmd_cb->u.req_buf.num_retro_buf_requested; 24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->req_type = cmd_cb->u.req_buf.type; 25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bWaitForPrepSnapshotDone = 0; 25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("pending cnt (%d), retro count (%d)" 25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "req_type (%d) is_primary (%d)", 25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->pending_cnt, ch_obj->pending_retro_cnt, 25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->req_type, cmd_cb->u.req_buf.primary_only); 25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!ch_obj->pending_cnt || (ch_obj->pending_retro_cnt > ch_obj->pending_cnt)) { 25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->pending_retro_cnt = ch_obj->pending_cnt; 25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->pending_retro_cnt > 0) { 26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL("Resetting need Led Flash!!!"); 26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->needLEDFlash = 0; 26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->stopZslSnapshot = 0; 26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->unLockAEC = 0; 26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_skip(ch_obj, &ch_obj->bundle.superbuf_queue); 26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (MM_CAMERA_CMD_TYPE_START_ZSL == cmd_cb->cmd_type) { 26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->manualZSLSnapshot = TRUE; 27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_start_zsl_snapshot(ch_obj->cam_obj); 27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (MM_CAMERA_CMD_TYPE_STOP_ZSL == cmd_cb->cmd_type) { 27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->manualZSLSnapshot = FALSE; 27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_stop_zsl_snapshot(ch_obj->cam_obj); 27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (MM_CAMERA_CMD_TYPE_CONFIG_NOTIFY == cmd_cb->cmd_type) { 27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bundle.superbuf_queue.attr.notify_mode = cmd_cb->u.notify_mode; 27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (MM_CAMERA_CMD_TYPE_FLUSH_QUEUE == cmd_cb->cmd_type) { 27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bundle.superbuf_queue.expected_frame_id = cmd_cb->u.flush_cmd.frame_idx; 27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_flush(ch_obj, 27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &ch_obj->bundle.superbuf_queue, cmd_cb->u.flush_cmd.stream_type); 28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&(ch_obj->cmd_thread.sync_sem)); 28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (MM_CAMERA_CMD_TYPE_GENERAL == cmd_cb->cmd_type) { 28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("MM_CAMERA_CMD_TYPE_GENERAL"); 28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (cmd_cb->u.gen_cmd.type) { 28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CAMERA_GENERIC_CMD_TYPE_AE_BRACKETING: 28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CAMERA_GENERIC_CMD_TYPE_AF_BRACKETING: { 28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t start = cmd_cb->u.gen_cmd.payload[0]; 28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("MM_CAMERA_GENERIC_CMDTYPE_AF_BRACKETING %u", 28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin start); 29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_flush(ch_obj, 29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &ch_obj->bundle.superbuf_queue, CAM_STREAM_TYPE_DEFAULT); 29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (start) { 29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("need AE bracketing, start zsl snapshot"); 29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bracketingState = MM_CHANNEL_BRACKETING_STATE_WAIT_GOOD_FRAME_IDX; 29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bracketingState = MM_CHANNEL_BRACKETING_STATE_OFF; 29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CAMERA_GENERIC_CMD_TYPE_FLASH_BRACKETING: { 30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t start = cmd_cb->u.gen_cmd.payload[0]; 30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("MM_CAMERA_GENERIC_CMDTYPE_FLASH_BRACKETING %u", 30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin start); 30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_flush(ch_obj, 30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &ch_obj->bundle.superbuf_queue, CAM_STREAM_TYPE_DEFAULT); 30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (start) { 30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("need flash bracketing"); 31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->isFlashBracketingEnabled = TRUE; 31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->isFlashBracketingEnabled = FALSE; 31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CAMERA_GENERIC_CMD_TYPE_ZOOM_1X: { 31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t start = cmd_cb->u.gen_cmd.payload[0]; 31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("MM_CAMERA_GENERIC_CMD_TYPE_ZOOM_1X %u", 31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin start); 32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_flush(ch_obj, 32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &ch_obj->bundle.superbuf_queue, CAM_STREAM_TYPE_DEFAULT); 32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (start) { 32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("need zoom 1x frame"); 32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->isZoom1xFrameRequested = TRUE; 32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->isZoom1xFrameRequested = FALSE; 32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CAMERA_GENERIC_CMD_TYPE_CAPTURE_SETTING: { 33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t start = cmd_cb->u.gen_cmd.payload[0]; 33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("MM_CAMERA_GENERIC_CMD_TYPE_CAPTURE_SETTING %u num_batch = %d", 33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin start, cmd_cb->u.gen_cmd.frame_config.num_batch); 33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (start) { 33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&ch_obj->frameConfig, 0, sizeof(cam_capture_frame_config_t)); 33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < cmd_cb->u.gen_cmd.frame_config.num_batch; i++) { 33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cmd_cb->u.gen_cmd.frame_config.configs[i].type 34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin != CAM_CAPTURE_RESET) { 34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->frameConfig.configs[ 34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->frameConfig.num_batch] = 34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cmd_cb->u.gen_cmd.frame_config.configs[i]; 34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->frameConfig.num_batch++; 34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("capture setting frame = %d type = %d", 34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin i,ch_obj->frameConfig.configs[ 34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->frameConfig.num_batch].type); 34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Capture setting Batch Count %d", 35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->frameConfig.num_batch); 35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->isConfigCapture = TRUE; 35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->isConfigCapture = FALSE; 35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&ch_obj->frameConfig, 0, sizeof(cam_capture_frame_config_t)); 35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->cur_capture_idx = 0; 35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(ch_obj->capture_frame_id, 0, sizeof(uint8_t) * MAX_CAPTURE_BATCH_NUM); 35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error: Invalid command"); 36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin notify_mode = ch_obj->bundle.superbuf_queue.attr.notify_mode; 36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*Handle use case which does not need start ZSL even in unified case*/ 36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((ch_obj->pending_cnt > 0) 37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (ch_obj->isConfigCapture) 37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (ch_obj->manualZSLSnapshot == FALSE) 37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (ch_obj->startZSlSnapshotCalled == FALSE)) { 37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin needStartZSL = TRUE; 37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = ch_obj->cur_capture_idx; 37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin i < ch_obj->frameConfig.num_batch; 37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin i++) { 37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capture_type type = ch_obj->frameConfig.configs[i].type; 37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (((type == CAM_CAPTURE_FLASH) && (!ch_obj->needLEDFlash)) 37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || ((type == CAM_CAPTURE_LOW_LIGHT) && (!ch_obj->needLowLightZSL))) { 38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*For flash and low light capture, start ZSL is triggered only if needed*/ 38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin needStartZSL = FALSE; 38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((ch_obj->isConfigCapture) 38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (needStartZSL)) { 38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = ch_obj->cur_capture_idx; 39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin i < ch_obj->frameConfig.num_batch; 39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin i++) { 39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->capture_frame_id[i] = 39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bundle.superbuf_queue.expected_frame_id 39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + MM_CAMERA_MAX_FUTURE_FRAME_WAIT; 39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Need to Flush the queue and trigger frame config */ 39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_flush(ch_obj, 39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &ch_obj->bundle.superbuf_queue, CAM_STREAM_TYPE_DEFAULT); 40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("TRIGGER Start ZSL"); 40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_start_zsl_snapshot(ch_obj->cam_obj); 40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->startZSlSnapshotCalled = TRUE; 40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->burstSnapNum = ch_obj->pending_cnt; 40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bWaitForPrepSnapshotDone = 0; 40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if ((ch_obj->pending_cnt > 0) 40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && ((ch_obj->needLEDFlash == TRUE) || 40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (MM_CHANNEL_BRACKETING_STATE_OFF != ch_obj->bracketingState)) 40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (ch_obj->manualZSLSnapshot == FALSE) 40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && ch_obj->startZSlSnapshotCalled == FALSE) { 41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("TRIGGER Start ZSL for Flash"); 41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_start_zsl_snapshot(ch_obj->cam_obj); 41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->startZSlSnapshotCalled = TRUE; 41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->burstSnapNum = ch_obj->pending_cnt; 41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bWaitForPrepSnapshotDone = 0; 41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (((ch_obj->pending_cnt == 0) || (ch_obj->stopZslSnapshot == 1)) 41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (ch_obj->manualZSLSnapshot == FALSE) 41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (ch_obj->startZSlSnapshotCalled == TRUE)) { 41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("TRIGGER Stop ZSL for cancel picture"); 42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_stop_zsl_snapshot(ch_obj->cam_obj); 42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Unlock AEC 42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->startZSlSnapshotCalled = FALSE; 42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->needLEDFlash = FALSE; 42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->burstSnapNum = 0; 42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->stopZslSnapshot = 0; 42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bWaitForPrepSnapshotDone = 0; 42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->unLockAEC = 1; 42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bracketingState = MM_CHANNEL_BRACKETING_STATE_OFF; 42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->isConfigCapture = FALSE; 43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* bufdone for overflowed bufs */ 43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_bufdone_overflow(ch_obj, &ch_obj->bundle.superbuf_queue); 43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Super Buffer received, pending_cnt=%d queue cnt = %d expected = %d", 43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->pending_cnt, ch_obj->bundle.superbuf_queue.match_cnt, 43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bundle.superbuf_queue.expected_frame_id); 43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* dispatch frame if pending_cnt>0 or is in continuous streaming mode */ 43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (((ch_obj->pending_cnt > 0) || 44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS == notify_mode)) && 44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (!ch_obj->bWaitForPrepSnapshotDone)) { 44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* dequeue */ 44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_node_info_t info; 44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&info, 0x0, sizeof(info)); 44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->req_type == MM_CAMERA_REQ_FRAME_SYNC_BUF) { 44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Lock the Queues 44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_frame_sync_lock_queues(); 45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t match_frame = mm_frame_sync_find_matched(FALSE); 45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (match_frame) { 45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t j = 0; 45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (j = 0; j < MAX_NUM_CAMERA_PER_BUNDLE; j++) { 45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.ch_obj[j]) { 45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t *ch_queue = 45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &fs.ch_obj[j]->bundle.superbuf_queue; 45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_queue == NULL) { 45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Channel queue is NULL"); 45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = mm_channel_superbuf_dequeue_frame_internal( 46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_queue, match_frame); 46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (node != NULL) { 46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin info.ch_obj[info.num_nodes] = fs.ch_obj[j]; 46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin info.node[info.num_nodes] = node; 46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin info.num_nodes++; 46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Added ch(%p) to node ,num nodes %d", 46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.ch_obj[j], info.num_nodes); 46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_frame_sync_remove(match_frame); 47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("match frame %d", match_frame); 47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (info.num_nodes != fs.num_cam) { 47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("num node %d != num cam (%d) Debug this", 47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin info.num_nodes, fs.num_cam); 47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t j = 0; 47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // free super buffers from various nodes 47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (j = 0; j < info.num_nodes; j++) { 48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (info.node[j]) { 48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_node_qbuf(info.ch_obj[j], info.node[j]); 48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(info.node[j]); 48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // we should not use it as matched dual camera frames 48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin info.num_nodes = 0; 48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_frame_sync_unlock_queues(); 49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = mm_channel_superbuf_dequeue(&ch_obj->bundle.superbuf_queue, ch_obj); 49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (node != NULL) { 49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->isConfigCapture && 49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((node->frame_idx < 49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->capture_frame_id[ch_obj->cur_capture_idx]))) { 49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t i; 49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Not expected super buffer. frameID = %d expected = %d", 49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->frame_idx, ch_obj->capture_frame_id[ch_obj->cur_capture_idx]); 49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < node->num_of_bufs; i++) { 50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, node->super_buf[i].buf); 50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin info.num_nodes = 1; 50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin info.ch_obj[0] = ch_obj; 50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin info.node[0] = node; 50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (info.num_nodes > 0) { 51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* decrease pending_cnt */ 51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (MM_CAMERA_SUPER_BUF_NOTIFY_BURST == notify_mode) { 51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->pending_cnt--; 51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->pending_retro_cnt > 0) { 51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->pending_retro_cnt == 1) { 51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bWaitForPrepSnapshotDone = 1; 51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->pending_retro_cnt--; 51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (((ch_obj->pending_cnt == 0) || 52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (ch_obj->stopZslSnapshot == 1)) && 52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (ch_obj->manualZSLSnapshot == FALSE) && 52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->startZSlSnapshotCalled == TRUE) { 52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("TRIGGER Stop ZSL. All frame received"); 52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_stop_zsl_snapshot(ch_obj->cam_obj); 52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->startZSlSnapshotCalled = FALSE; 52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->burstSnapNum = 0; 52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->stopZslSnapshot = 0; 53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->unLockAEC = 1; 53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->needLEDFlash = FALSE; 53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bracketingState = MM_CHANNEL_BRACKETING_STATE_OFF; 53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->isConfigCapture = FALSE; 53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->isConfigCapture) { 53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->frameConfig.configs[ch_obj->cur_capture_idx].num_frames != 0) { 53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->frameConfig.configs[ch_obj->cur_capture_idx].num_frames--; 53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Invalid frame config batch index %d max batch = %d", 54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->cur_capture_idx, ch_obj->frameConfig.num_batch); 54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->frameConfig.configs[ch_obj->cur_capture_idx].num_frames == 0) { 54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Received all frames for current batch 54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->cur_capture_idx++; 54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bundle.superbuf_queue.expected_frame_id = 54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->capture_frame_id[ch_obj->cur_capture_idx]; 549780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch ch_obj->bundle.superbuf_queue.good_frame_id = 550780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch ch_obj->capture_frame_id[ch_obj->cur_capture_idx]; 55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Need %d frames more for batch %d", 55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->frameConfig.configs[ch_obj->cur_capture_idx].num_frames, 55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->cur_capture_idx); 55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* dispatch superbuf */ 55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_send_super_buf(&info); 56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* no superbuf avail, break the loop */ 56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_send_super_buf 56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Send super buffers to HAL 57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @info : Info of super buffers to be sent in callback 57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_channel_send_super_buf(mm_channel_node_info_t *info) 57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!info || !info->num_nodes){ 58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("X Error!! Info invalid"); 58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t *node = NULL; 58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("num nodes %d to send", info->num_nodes); 58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t idx = 0; 58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_t *ch_obj = NULL; 58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (idx = 0; idx < info->num_nodes; idx++) { 58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = info->node[idx]; 59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj = info->ch_obj[idx]; 59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((ch_obj) && (NULL != ch_obj->bundle.super_buf_notify_cb) && node) { 59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmdcb_t* cb_node = NULL; 59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Send superbuf to HAL, pending_cnt=%d", 59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->pending_cnt); 59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* send cam_sem_post to wake up cb thread to dispatch super buffer */ 59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb_node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t)); 59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != cb_node) { 59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(cb_node, 0, sizeof(mm_camera_cmdcb_t)); 59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb_node->cmd_type = MM_CAMERA_CMD_TYPE_SUPER_BUF_DATA_CB; 60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb_node->u.superbuf.num_bufs = node->num_of_bufs; 60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t i = 0; 60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < node->num_of_bufs; i++) { 60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb_node->u.superbuf.bufs[i] = node->super_buf[i].buf; 60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb_node->u.superbuf.camera_handle = ch_obj->cam_obj->my_hdl; 60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb_node->u.superbuf.ch_id = ch_obj->my_hdl; 60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb_node->u.superbuf.bReadyForPrepareSnapshot = 60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bWaitForPrepSnapshotDone; 60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->unLockAEC == 1) { 61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb_node->u.superbuf.bUnlockAEC = 1; 61166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Unlocking AEC"); 61266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->unLockAEC = 0; 61366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 61466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* enqueue to cb thread */ 61566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_queue_enq(&(ch_obj->cb_thread.cmd_queue), cb_node); 61666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* wake up cb thread */ 61766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&(ch_obj->cb_thread.cmd_sem)); 61866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Sent super buf for node[%d] ", idx); 61966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 62066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 62166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for mm_camera_node_t"); 62266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* buf done with the unused super buf */ 62366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t i = 0; 62466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < node->num_of_bufs; i++) { 62566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, node->super_buf[i].buf); 62666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 62766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 62866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 62966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if ((ch_obj != NULL) && (node != NULL)) { 63066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* buf done with the unused super buf */ 63166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t i; 63266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < node->num_of_bufs; i++) { 63366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, node->super_buf[i].buf); 63466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 63566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 63666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 63766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("node is NULL, debug this"); 63866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 63966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 64066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 64166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 64266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 64366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_reg_stream_buf_cb 64466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 64566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Register callback for stream buffer 64666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 64766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 64866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : Channel object 64966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_id : stream that will be linked 65066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @buf_cb : special callback needs to be registered for stream buffer 65166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 65266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 65366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 65466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 65566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 65666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_reg_stream_buf_cb (mm_channel_t* my_obj, 65766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t stream_id, mm_stream_data_cb_t buf_cb) 65866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 65966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 66066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t* s_obj = mm_channel_util_get_stream_by_handler(my_obj, 66166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_id); 66266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 66366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 66466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_obj->ch_obj != my_obj) { 66566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* No op. on linked streams */ 66666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 66766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 66866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_reg_buf_cb(s_obj, buf_cb); 66966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 67066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 67166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 67266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 67366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 67466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 67566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 67666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_fsm_fn 67766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 67866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: channel finite state machine entry function. Depends on channel 67966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * state, incoming event will be handled differently. 68066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 68166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 68266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : ptr to a channel object 68366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt : channel event to be processed 68466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @in_val : input event payload. Can be NULL if not needed. 68566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @out_val : output payload, Can be NULL if not needed. 68666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 68766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 68866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 68966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 69066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 69166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_fsm_fn(mm_channel_t *my_obj, 69266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_evt_type_t evt, 69366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * in_val, 69466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * out_val) 69566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 69666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 69766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 69866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E state = %d", my_obj->state); 69966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (my_obj->state) { 70066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_STATE_NOTUSED: 70166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_fsm_fn_notused(my_obj, evt, in_val, out_val); 70266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 70366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_STATE_STOPPED: 70466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_fsm_fn_stopped(my_obj, evt, in_val, out_val); 70566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 70666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_STATE_ACTIVE: 70766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_fsm_fn_active(my_obj, evt, in_val, out_val); 70866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 70966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_STATE_PAUSED: 71066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_fsm_fn_paused(my_obj, evt, in_val, out_val); 71166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 71266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 71366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Not a valid state (%d)", my_obj->state); 71466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 71566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 71666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 71766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* unlock ch_lock */ 71866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&my_obj->ch_lock); 71966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X rc = %d", rc); 72066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 72166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 72266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 72366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 72466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_fsm_fn_notused 72566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 72666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: channel finite state machine function to handle event 72766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * in NOT_USED state. 72866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 72966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 73066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : ptr to a channel object 73166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt : channel event to be processed 73266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @in_val : input event payload. Can be NULL if not needed. 73366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @out_val : output payload, Can be NULL if not needed. 73466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 73566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 73666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 73766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 73866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 73966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_fsm_fn_notused(mm_channel_t *my_obj, 74066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_evt_type_t evt, 74166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * in_val, 74266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * out_val) 74366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 74466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 74566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 74666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (evt) { 74766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 74866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("invalid state (%d) for evt (%d), in(%p), out(%p)", 74966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->state, evt, in_val, out_val); 75066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 75166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 75266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 75366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 75466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 75566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 75666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 75766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_fsm_fn_stopped 75866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 75966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: channel finite state machine function to handle event 76066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * in STOPPED state. 76166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 76266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 76366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : ptr to a channel object 76466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt : channel event to be processed 76566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @in_val : input event payload. Can be NULL if not needed. 76666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @out_val : output payload, Can be NULL if not needed. 76766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 76866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 76966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 77066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 77166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 77266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_fsm_fn_stopped(mm_channel_t *my_obj, 77366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_evt_type_t evt, 77466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * in_val, 77566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * out_val) 77666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 77766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 77866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E evt = %d", evt); 77966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (evt) { 78066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_ADD_STREAM: 78166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 78266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t s_hdl = 0; 78366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_hdl = mm_channel_add_stream(my_obj); 78466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *((uint32_t*)out_val) = s_hdl; 78566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = 0; 78666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 78766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 78866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_LINK_STREAM: 78966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 79066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_stream_link_t *stream_link = NULL; 79166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t s_hdl = 0; 79266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_link = (mm_camera_stream_link_t *) in_val; 79366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_hdl = mm_channel_link_stream(my_obj, stream_link); 79466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *((uint32_t*)out_val) = s_hdl; 79566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = 0; 79666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 79766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 79866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_DEL_STREAM: 79966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 80066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t s_id = *((uint32_t *)in_val); 80166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_del_stream(my_obj, s_id); 80266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 80366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 80466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_START: 80566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 80666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_start(my_obj); 80766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* first stream started in stopped state 80866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * move to active state */ 80966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 == rc) { 81066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->state = MM_CHANNEL_STATE_ACTIVE; 81166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 81266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 81366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 81466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_CONFIG_STREAM: 81566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 81666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_config_stream_t *payload = 81766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_evt_paylod_config_stream_t *)in_val; 81866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_config_stream(my_obj, 81966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->stream_id, 82066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->config); 82166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 82266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 82366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_GET_BUNDLE_INFO: 82466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 82566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_bundle_config_t *payload = 82666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cam_bundle_config_t *)in_val; 82766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_get_bundle_info(my_obj, payload); 82866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 82966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 83066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_DELETE: 83166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 83266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_release(my_obj); 83366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = 0; 83466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 83566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 83666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_SET_STREAM_PARM: 83766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 83866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_set_get_stream_parms_t *payload = 83966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_evt_paylod_set_get_stream_parms_t *)in_val; 84066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_set_stream_parm(my_obj, payload); 84166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 84266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 84366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_GET_STREAM_QUEUED_BUF_COUNT: 84466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 84566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t stream_id = *((uint32_t *)in_val); 84666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_get_queued_buf_count(my_obj, stream_id); 84766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 84866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 84966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_GET_STREAM_PARM: 85066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 85166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_set_get_stream_parms_t *payload = 85266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_evt_paylod_set_get_stream_parms_t *)in_val; 85366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_get_stream_parm(my_obj, payload); 85466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 85566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 85666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_DO_STREAM_ACTION: 85766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 85866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_do_stream_action_t *payload = 85966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_evt_paylod_do_stream_action_t *)in_val; 86066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_do_stream_action(my_obj, payload); 86166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 86266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 86366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_MAP_STREAM_BUF: 86466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 86566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_map_type *payload = 86666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cam_buf_map_type *)in_val; 86766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_map_stream_buf(my_obj, payload); 86866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 86966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 87066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_MAP_STREAM_BUFS: 87166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 87266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_map_type_list *payload = 87366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cam_buf_map_type_list *)in_val; 87466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_map_stream_bufs(my_obj, payload); 87566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 87666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 87766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_UNMAP_STREAM_BUF: 87866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 87966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_unmap_type *payload = 88066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cam_buf_unmap_type *)in_val; 88166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_unmap_stream_buf(my_obj, payload); 88266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 88366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 88466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_REG_STREAM_BUF_CB: 88566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 88666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_reg_stream_buf_cb *payload = 88766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_evt_paylod_reg_stream_buf_cb *)in_val; 88866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_reg_stream_buf_cb (my_obj, 88966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->stream_id, payload->buf_cb); 89066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 89166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 89266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 89341e4f74f68a65533875e2b6f4e430d949f96651aRanjith Kagathi Ananda LOGW("invalid state (%d) for evt (%d)", 89466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->state, evt); 89566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 89666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 89766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E rc = %d", rc); 89866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 89966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 90066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 90166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 90266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_fsm_fn_active 90366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 90466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: channel finite state machine function to handle event 90566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * in ACTIVE state. 90666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 90766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 90866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : ptr to a channel object 90966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt : channel event to be processed 91066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @in_val : input event payload. Can be NULL if not needed. 91166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @out_val : output payload, Can be NULL if not needed. 91266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 91366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 91466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 91566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 91666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 91766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_fsm_fn_active(mm_channel_t *my_obj, 91866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_evt_type_t evt, 91966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * in_val, 92066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * out_val) 92166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 92266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 92366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 92466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E evt = %d", evt); 92566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (evt) { 92666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_STOP: 92766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 92866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_stop(my_obj); 92966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->state = MM_CHANNEL_STATE_STOPPED; 93066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 93166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 93266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_REQUEST_SUPER_BUF: 93366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 93466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_req_buf_t *payload = 93566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_camera_req_buf_t *)in_val; 93666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_request_super_buf(my_obj, payload); 93766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 93866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 93966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_CANCEL_REQUEST_SUPER_BUF: 94066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 94166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_cancel_super_buf_request(my_obj); 94266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 94366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 94466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_FLUSH_SUPER_BUF_QUEUE: 94566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 94666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t frame_idx = *((uint32_t *)in_val); 94766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_flush_super_buf_queue(my_obj, frame_idx, CAM_STREAM_TYPE_DEFAULT); 94866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 94966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 95066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_START_ZSL_SNAPSHOT: 95166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 95266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_start_zsl_snapshot(my_obj); 95366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 95466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 95566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_STOP_ZSL_SNAPSHOT: 95666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 95766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_stop_zsl_snapshot(my_obj); 95866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 95966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 96066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_CONFIG_NOTIFY_MODE: 96166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 96266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_notify_mode_t notify_mode = 96366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *((mm_camera_super_buf_notify_mode_t *)in_val); 96466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_config_notify_mode(my_obj, notify_mode); 96566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 96666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 96766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_SET_STREAM_PARM: 96866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 96966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_set_get_stream_parms_t *payload = 97066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_evt_paylod_set_get_stream_parms_t *)in_val; 97166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_set_stream_parm(my_obj, payload); 97266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 97366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 97466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_GET_STREAM_QUEUED_BUF_COUNT: 97566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 97666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t stream_id = *((uint32_t *)in_val); 97766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_get_queued_buf_count(my_obj, stream_id); 97866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 97966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 98066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_GET_STREAM_PARM: 98166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 98266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_set_get_stream_parms_t *payload = 98366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_evt_paylod_set_get_stream_parms_t *)in_val; 98466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_get_stream_parm(my_obj, payload); 98566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 98666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 98766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_DO_STREAM_ACTION: 98866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 98966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_do_stream_action_t *payload = 99066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_evt_paylod_do_stream_action_t *)in_val; 99166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_do_stream_action(my_obj, payload); 99266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 99366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 99466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_MAP_STREAM_BUF: 99566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 99666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_map_type *payload = 99766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cam_buf_map_type *)in_val; 99866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (payload != NULL) { 99966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t type = payload->type; 100066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((type == CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF) || 100166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (type == CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF)) { 100266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_map_stream_buf(my_obj, payload); 100366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 100466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 100566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot map regualr stream buf in active state"); 100666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 100766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 100866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 100966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_MAP_STREAM_BUFS: 101066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 101166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_map_type_list *payload = 101266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cam_buf_map_type_list *)in_val; 101366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((payload != NULL) && (payload->length > 0)) { 101466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t type = payload->buf_maps[0].type; 101566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((type == CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF) || 101666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (type == CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF)) { 101766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_map_stream_bufs(my_obj, payload); 101866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 101966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 102066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot map regualr stream buf in active state"); 102166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 102266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 102366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 102466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_UNMAP_STREAM_BUF: 102566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 102666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_unmap_type *payload = 102766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cam_buf_unmap_type *)in_val; 102866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (payload != NULL) { 102966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t type = payload->type; 103066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((type == CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF) || 103166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (type == CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF)) { 103266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_unmap_stream_buf(my_obj, payload); 103366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 103466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 103566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot unmap regualr stream buf in active state"); 103666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 103766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 103866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 103966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_AF_BRACKETING: 104066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 104166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("MM_CHANNEL_EVT_AF_BRACKETING"); 104266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t start_flag = *((uint32_t *)in_val); 104366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_generic_cmd_t gen_cmd; 104466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.type = MM_CAMERA_GENERIC_CMD_TYPE_AF_BRACKETING; 104566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.payload[0] = start_flag; 104666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_proc_general_cmd(my_obj, &gen_cmd); 104766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 104866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 104966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_AE_BRACKETING: 105066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 105166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("MM_CHANNEL_EVT_AE_BRACKETING"); 105266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t start_flag = *((uint32_t *)in_val); 105366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_generic_cmd_t gen_cmd; 105466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.type = MM_CAMERA_GENERIC_CMD_TYPE_AE_BRACKETING; 105566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.payload[0] = start_flag; 105666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_proc_general_cmd(my_obj, &gen_cmd); 105766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 105866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 105966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_FLASH_BRACKETING: 106066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 106166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("MM_CHANNEL_EVT_FLASH_BRACKETING"); 106266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t start_flag = *((uint32_t *)in_val); 106366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_generic_cmd_t gen_cmd; 106466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.type = MM_CAMERA_GENERIC_CMD_TYPE_FLASH_BRACKETING; 106566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.payload[0] = start_flag; 106666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_proc_general_cmd(my_obj, &gen_cmd); 106766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 106866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 106966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_ZOOM_1X: 107066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 107166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("MM_CHANNEL_EVT_ZOOM_1X"); 107266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t start_flag = *((uint32_t *)in_val); 107366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_generic_cmd_t gen_cmd; 107466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.type = MM_CAMERA_GENERIC_CMD_TYPE_ZOOM_1X; 107566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.payload[0] = start_flag; 107666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_proc_general_cmd(my_obj, &gen_cmd); 107766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 107866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 107966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CAMERA_EVT_CAPTURE_SETTING: 108066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 108166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_generic_cmd_t gen_cmd; 108266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capture_frame_config_t *input; 108366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.type = MM_CAMERA_GENERIC_CMD_TYPE_CAPTURE_SETTING; 108466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("MM_CAMERA_EVT_CAPTURE_SETTING"); 108566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (in_val == NULL) { 108666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.payload[0] = 0; 108766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&gen_cmd.frame_config, 0, sizeof(cam_capture_frame_config_t)); 108866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 108966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.payload[0] = 1; 109066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin input = (cam_capture_frame_config_t *)in_val; 109166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gen_cmd.frame_config = *input; 109266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 109366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_proc_general_cmd(my_obj, &gen_cmd); 109466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 109566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 109666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case MM_CHANNEL_EVT_REG_STREAM_BUF_CB: 109766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 109866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_reg_stream_buf_cb *payload = 109966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_evt_paylod_reg_stream_buf_cb *)in_val; 110066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_reg_stream_buf_cb (my_obj, 110166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->stream_id, payload->buf_cb); 110266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 110366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 110466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 110566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("invalid state (%d) for evt (%d), in(%p), out(%p)", 110666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->state, evt, in_val, out_val); 110766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 110866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 110966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X rc = %d", rc); 111066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 111166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 111266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 111366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 111466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_fsm_fn_paused 111566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 111666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: channel finite state machine function to handle event 111766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * in PAUSED state. 111866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 111966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 112066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : ptr to a channel object 112166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt : channel event to be processed 112266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @in_val : input event payload. Can be NULL if not needed. 112366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @out_val : output payload, Can be NULL if not needed. 112466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 112566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 112666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 112766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 112866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 112966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_fsm_fn_paused(mm_channel_t *my_obj, 113066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_evt_type_t evt, 113166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * in_val, 113266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * out_val) 113366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 113466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 113566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 113666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* currently we are not supporting pause/resume channel */ 113766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("invalid state (%d) for evt (%d), in(%p), out(%p)", 113866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->state, evt, in_val, out_val); 113966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 114066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 114166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 114266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 114366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 114466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_init 114566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 114666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: initialize a channel 114766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 114866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 114966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object be to initialized 115066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @attr : bundle attribute of the channel if needed 115166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @channel_cb : callback function for bundle data notify 115266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 115366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 115466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 115566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 115666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 115766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : if no bundle data notify is needed, meaning each stream in the 115866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * channel will have its own stream data notify callback, then 115966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * attr, channel_cb, and userdata can be NULL. In this case, 116066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * no matching logic will be performed in channel for the bundling. 116166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 116266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_init(mm_channel_t *my_obj, 116366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_channel_attr_t *attr, 116466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_notify_t channel_cb, 116566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 116666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 116766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 116866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 116966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.super_buf_notify_cb = channel_cb; 117066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.user_data = userdata; 117166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != attr) { 117266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.superbuf_queue.attr = *attr; 117366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 117466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 117566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Launch data poll thread in channel open"); 117666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(my_obj->poll_thread[0].threadName, THREAD_NAME_SIZE, "CAM_dataPoll"); 117766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_poll_thread_launch(&my_obj->poll_thread[0], 117866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_CAMERA_POLL_TYPE_DATA); 117966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 118066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* change state to stopped state */ 118166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->state = MM_CHANNEL_STATE_STOPPED; 118266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 118366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 118466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 118566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 118666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_release 118766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 118866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: release a channel resource. Channel state will move to UNUSED 118966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * state after this call. 119066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 119166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 119266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 119366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 119466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 119566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 119666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_channel_release(mm_channel_t *my_obj) 119766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 119866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* stop data poll thread */ 119966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_poll_thread_release(&my_obj->poll_thread[0]); 120066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 120166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* memset bundle info */ 120266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&my_obj->bundle, 0, sizeof(mm_channel_bundle_t)); 120366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 120466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* change state to notused state */ 120566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->state = MM_CHANNEL_STATE_NOTUSED; 120666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 120766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 120866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 120966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_link_stream 121066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 121166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: link a stream from external channel into this channel 121266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 121366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 121466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 121566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_link : channel and stream to be linked 121666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 121766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : uint32_t type of stream handle 121866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- invalid stream handle, meaning the op failed 121966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * >0 -- successfully added a stream with a valid handle 122066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 122166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t mm_channel_link_stream(mm_channel_t *my_obj, 122266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_stream_link_t *stream_link) 122366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 122466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t idx = 0; 122566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t s_hdl = 0; 122666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t *stream_obj = NULL; 122766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t *stream = NULL; 122866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 122966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == stream_link) { 123066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid stream link"); 123166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 123266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 123366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 123466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream = mm_channel_util_get_stream_by_handler(stream_link->ch, 123566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_link->stream_id); 123666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == stream) { 123766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 123866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 123966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 124066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* check available stream */ 124166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (idx = 0; idx < MAX_STREAM_NUM_IN_BUNDLE; idx++) { 124266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (MM_STREAM_STATE_NOTUSED == my_obj->streams[idx].state) { 124366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj = &my_obj->streams[idx]; 124466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 124566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 124666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 124766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == stream_obj) { 124866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("streams reach max, no more stream allowed to add"); 124966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return s_hdl; 125066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 125166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 125266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* initialize stream object */ 125366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *stream_obj = *stream; 125466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj->linked_stream = stream; 125566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_hdl = stream->my_hdl; 125666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 125766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("stream handle = %d", s_hdl); 125866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return s_hdl; 125966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 126066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 126166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 126266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_add_stream 126366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 126466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a stream into the channel 126566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 126666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 126766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 126866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 126966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : uint32_t type of stream handle 127066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- invalid stream handle, meaning the op failed 127166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * >0 -- successfully added a stream with a valid handle 127266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 127366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t mm_channel_add_stream(mm_channel_t *my_obj) 127466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 127566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 127666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t idx = 0; 127766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t s_hdl = 0; 127866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t *stream_obj = NULL; 127966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 128066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 128166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* check available stream */ 128266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (idx = 0; idx < MAX_STREAM_NUM_IN_BUNDLE; idx++) { 128366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (MM_STREAM_STATE_NOTUSED == my_obj->streams[idx].state) { 128466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj = &my_obj->streams[idx]; 128566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 128666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 128766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 128866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == stream_obj) { 128966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("streams reach max, no more stream allowed to add"); 129066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return s_hdl; 129166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 129266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 129366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* initialize stream object */ 129466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(stream_obj, 0, sizeof(mm_stream_t)); 129566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj->fd = -1; 129666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj->my_hdl = mm_camera_util_generate_handler(idx); 129766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj->ch_obj = my_obj; 129866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_init(&stream_obj->buf_lock, NULL); 129966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_init(&stream_obj->cb_lock, NULL); 130066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_init(&stream_obj->cmd_lock, NULL); 130159c9b8b72e3bcfcb70694fb9e6a6291311d53e98Shuzhen Wang PTHREAD_COND_INIT(&stream_obj->buf_cond); 130266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(stream_obj->buf_status, 0, 130366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sizeof(stream_obj->buf_status)); 130466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj->state = MM_STREAM_STATE_INITED; 130566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 130666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* acquire stream */ 130766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(stream_obj, MM_STREAM_EVT_ACQUIRE, NULL, NULL); 130866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 == rc) { 130966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_hdl = stream_obj->my_hdl; 131066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 131166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* error during acquire, de-init */ 131266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_destroy(&stream_obj->buf_cond); 131366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_destroy(&stream_obj->buf_lock); 131466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_destroy(&stream_obj->cb_lock); 131566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_destroy(&stream_obj->cmd_lock); 131666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(stream_obj, 0, sizeof(mm_stream_t)); 131766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 131866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("stream handle = %d", s_hdl); 131966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return s_hdl; 132066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 132166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 132266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 132366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_del_stream 132466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 132566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: delete a stream from the channel bu its handle 132666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 132766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 132866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 132966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_id : stream handle 133066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 133166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 133266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 133366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 133466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : assume steam is stooped before it can be deleted 133566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 133666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_del_stream(mm_channel_t *my_obj, 133766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t stream_id) 133866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 133966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = -1; 134066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t * stream_obj = NULL; 134166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj = mm_channel_util_get_stream_by_handler(my_obj, stream_id); 134266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 134366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == stream_obj) { 134466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid Stream Object for stream_id = %d", stream_id); 134566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 134666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 134766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 134866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream_obj->ch_obj != my_obj) { 134966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Only unlink stream */ 135066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&stream_obj->linked_stream->buf_lock); 135166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj->linked_stream->is_linked = 0; 135266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj->linked_stream->linked_obj = NULL; 135366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&stream_obj->linked_stream->buf_lock); 135466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(stream_obj, 0, sizeof(mm_stream_t)); 135566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 135666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 135766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 135866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 135966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(stream_obj, 136066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_RELEASE, 136166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 136266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 136366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 136466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 136566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 136666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 136766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 136866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_config_stream 136966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 137066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: configure a stream 137166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 137266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 137366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 137466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_id : stream handle 137566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @config : stream configuration 137666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 137766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 137866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 137966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 138066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 138166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_config_stream(mm_channel_t *my_obj, 138266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t stream_id, 138366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_stream_config_t *config) 138466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 138566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = -1; 138666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t * stream_obj = NULL; 138766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E stream ID = %d", stream_id); 138866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj = mm_channel_util_get_stream_by_handler(my_obj, stream_id); 138966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 139066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == stream_obj) { 139166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid Stream Object for stream_id = %d", stream_id); 139266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 139366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 139466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 139566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream_obj->ch_obj != my_obj) { 139666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* No op. on linked streams */ 139766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 139866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 139966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 140066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* set stream fmt */ 140166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(stream_obj, 140266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_SET_FMT, 140366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)config, 140466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 140566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X rc = %d",rc); 140666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 140766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 140866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 140966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 141066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_get_bundle_info 141166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 141266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query bundle info of the channel, which should include all 141366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * streams within this channel 141466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 141566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 141666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 141766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @bundle_info : bundle info to be filled in 141866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 141966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 142066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 142166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 142266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 142366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_get_bundle_info(mm_channel_t *my_obj, 142466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_bundle_config_t *bundle_info) 142566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 142666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int i; 142766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t *s_obj = NULL; 142866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t stream_type = CAM_STREAM_TYPE_DEFAULT; 142966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 143066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 143166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(bundle_info, 0, sizeof(cam_bundle_config_t)); 143266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bundle_info->bundle_id = my_obj->my_hdl; 143366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bundle_info->num_of_streams = 0; 143466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < MAX_STREAM_NUM_IN_BUNDLE; i++) { 143566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (my_obj->streams[i].my_hdl > 0) { 143666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_obj = mm_channel_util_get_stream_by_handler(my_obj, 143766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->streams[i].my_hdl); 143866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 143966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_type = s_obj->stream_info->stream_type; 144066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((CAM_STREAM_TYPE_METADATA != stream_type) && 144166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (s_obj->ch_obj == my_obj)) { 144266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bundle_info->stream_ids[bundle_info->num_of_streams++] = 144366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_obj->server_stream_id; 144466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 144566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 144666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot find stream obj (%d) by handler (%d)", 144766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin i, my_obj->streams[i].my_hdl); 144866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 144966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 145066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 145466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* error, reset to 0 */ 145566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(bundle_info, 0, sizeof(cam_bundle_config_t)); 145666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 145866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 145966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 146066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 146166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_start 146266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 146366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start a channel, which will start all streams in the channel 146466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 146566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 146666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 146766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 146866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 146966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 147066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 147166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 147266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_start(mm_channel_t *my_obj) 147366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 147466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 147566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int i = 0, j = 0; 147666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t *s_objs[MAX_STREAM_NUM_IN_BUNDLE] = {NULL}; 147766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t num_streams_to_start = 0; 147866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t num_streams_in_bundle_queue = 0; 147966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t *s_obj = NULL; 148066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int meta_stream_idx = 0; 148166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t stream_type = CAM_STREAM_TYPE_DEFAULT; 148266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 148366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < MAX_STREAM_NUM_IN_BUNDLE; i++) { 148466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (my_obj->streams[i].my_hdl > 0) { 148566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_obj = mm_channel_util_get_stream_by_handler(my_obj, 148666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->streams[i].my_hdl); 148766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 148866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_type = s_obj->stream_info->stream_type; 148966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* remember meta data stream index */ 149066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((stream_type == CAM_STREAM_TYPE_METADATA) && 149166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (s_obj->ch_obj == my_obj)) { 149266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_stream_idx = num_streams_to_start; 149366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 149466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[num_streams_to_start++] = s_obj; 149566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 149666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!s_obj->stream_info->noFrameExpected) { 149766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin num_streams_in_bundle_queue++; 149866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 149966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 150066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 150166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 150266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 150366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (meta_stream_idx > 0 ) { 150466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* always start meta data stream first, so switch the stream object with the first one */ 150566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_obj = s_objs[0]; 150666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[0] = s_objs[meta_stream_idx]; 150766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[meta_stream_idx] = s_obj; 150866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 150966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 151066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != my_obj->bundle.super_buf_notify_cb) { 151166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* need to send up cb, therefore launch thread */ 151266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* init superbuf queue */ 151366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_queue_init(&my_obj->bundle.superbuf_queue); 151466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.superbuf_queue.num_streams = num_streams_in_bundle_queue; 1515d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch my_obj->bundle.superbuf_queue.expected_frame_id = 1516d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch my_obj->bundle.superbuf_queue.attr.user_expected_frame_id; 151766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.superbuf_queue.expected_frame_id_without_led = 0; 151866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.superbuf_queue.led_off_start_frame_id = 0; 151966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.superbuf_queue.led_on_start_frame_id = 0; 152066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.superbuf_queue.led_on_num_frames = 0; 1521780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch my_obj->bundle.superbuf_queue.good_frame_id = 0; 152266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 152366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < num_streams_to_start; i++) { 152466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Only bundle streams that belong to the channel */ 152566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(!(s_objs[i]->stream_info->noFrameExpected)) { 152666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_objs[i]->ch_obj == my_obj) { 152766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* set bundled flag to streams */ 152866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[i]->is_bundled = 1; 152966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 153066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.superbuf_queue.bundled_streams[j++] = s_objs[i]->my_hdl; 153166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 153266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 153366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 153466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* launch cb thread for dispatching super buf through cb */ 153566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(my_obj->cb_thread.threadName, THREAD_NAME_SIZE, "CAM_SuperBuf"); 153666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmd_thread_launch(&my_obj->cb_thread, 153766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_dispatch_super_buf, 153866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void*)my_obj); 153966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 154066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* launch cmd thread for super buf dataCB */ 154166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(my_obj->cmd_thread.threadName, THREAD_NAME_SIZE, "CAM_SuperBufCB"); 154266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmd_thread_launch(&my_obj->cmd_thread, 154366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_process_stream_buf, 154466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void*)my_obj); 154566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 154666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* set flag to TRUE */ 154766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.is_active = TRUE; 154866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 154966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 155066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* link any streams first before starting the rest of the streams */ 155166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < num_streams_to_start; i++) { 155266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_objs[i]->ch_obj != my_obj) { 155366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&s_objs[i]->linked_stream->buf_lock); 155466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[i]->linked_stream->linked_obj = my_obj; 155566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[i]->linked_stream->is_linked = 1; 155666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&s_objs[i]->linked_stream->buf_lock); 155766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 155866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 155966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 156066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 156166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < num_streams_to_start; i++) { 156266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_objs[i]->ch_obj != my_obj) { 156366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 156466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 156566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* all streams within a channel should be started at the same time */ 156666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_objs[i]->state == MM_STREAM_STATE_ACTIVE) { 156766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("stream already started idx(%d)", i); 156866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 156966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 157066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 157166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 157266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* allocate buf */ 157366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(s_objs[i], 157466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_GET_BUF, 157566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 157666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 157766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 != rc) { 157866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("get buf failed at idx(%d)", i); 157966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 158066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 158166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 158266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* reg buf */ 158366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(s_objs[i], 158466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_REG_BUF, 158566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 158666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 158766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 != rc) { 158866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("reg buf failed at idx(%d)", i); 158966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 159066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 159166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 159266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* start stream */ 159366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(s_objs[i], 159466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_START, 159566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 159666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 159766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 != rc) { 159866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("start stream failed at idx(%d)", i); 159966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 160066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 160166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 160266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 160366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* error handling */ 160466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 != rc) { 160566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* unlink the streams first */ 160666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (j = 0; j < num_streams_to_start; j++) { 160766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_objs[j]->ch_obj != my_obj) { 160866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&s_objs[j]->linked_stream->buf_lock); 160966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[j]->linked_stream->is_linked = 0; 161066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[j]->linked_stream->linked_obj = NULL; 161166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&s_objs[j]->linked_stream->buf_lock); 161266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 161366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (TRUE == my_obj->bundle.is_active) { 161466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_flush_super_buf_queue(my_obj, 0, 161566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[i]->stream_info->stream_type); 161666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 161766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(s_objs[j], 0, sizeof(mm_stream_t)); 161866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 161966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 162066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 162166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 162266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (j = 0; j <= i; j++) { 162366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL == s_objs[j]) || (s_objs[j]->ch_obj != my_obj)) { 162466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 162566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 162666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* stop streams*/ 162766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_fsm_fn(s_objs[j], 162866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_STOP, 162966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 163066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 163166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 163266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* unreg buf */ 163366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_fsm_fn(s_objs[j], 163466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_UNREG_BUF, 163566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 163666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 163766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 163866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* put buf back */ 163966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_fsm_fn(s_objs[j], 164066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_PUT_BUF, 164166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 164266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 164366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 164466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 164566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* destroy super buf cmd thread */ 164666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (TRUE == my_obj->bundle.is_active) { 164766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* first stop bundle thread */ 164866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmd_thread_release(&my_obj->cmd_thread); 164966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmd_thread_release(&my_obj->cb_thread); 165066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 165166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* deinit superbuf queue */ 165266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_queue_deinit(&my_obj->bundle.superbuf_queue); 165366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 165466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* memset super buffer queue info */ 165566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.is_active = 0; 165666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&my_obj->bundle.superbuf_queue, 0, sizeof(mm_channel_queue_t)); 165766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 165866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 165966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bWaitForPrepSnapshotDone = 0; 166066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (my_obj->bundle.superbuf_queue.attr.enable_frame_sync) { 166166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("registering Channel obj %p", my_obj); 166266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_frame_sync_register_channel(my_obj); 166366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 166466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 166566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 166666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 166766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 166866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_stop 166966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 167066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop a channel, which will stop all streams in the channel 167166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 167266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 167366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 167466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 167566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 167666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 167766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 167866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 167966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_stop(mm_channel_t *my_obj) 168066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 168166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 168266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int i; 168366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t *s_objs[MAX_STREAM_NUM_IN_BUNDLE] = {NULL}; 168466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t num_streams_to_stop = 0; 168566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t *s_obj = NULL; 168666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int meta_stream_idx = 0; 168766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t stream_type = CAM_STREAM_TYPE_DEFAULT; 168866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 168966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (my_obj->bundle.superbuf_queue.attr.enable_frame_sync) { 169066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_frame_sync_unregister_channel(my_obj); 169166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 169266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 169366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < MAX_STREAM_NUM_IN_BUNDLE; i++) { 169466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (my_obj->streams[i].my_hdl > 0) { 169566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_obj = mm_channel_util_get_stream_by_handler(my_obj, 169666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->streams[i].my_hdl); 169766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 169866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_obj->ch_obj == my_obj) { 169966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_type = s_obj->stream_info->stream_type; 170066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* remember meta data stream index */ 170166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream_type == CAM_STREAM_TYPE_METADATA) { 170266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_stream_idx = num_streams_to_stop; 170366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 170466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 170566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[num_streams_to_stop++] = s_obj; 170666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 170766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 170866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 170966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 171066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (meta_stream_idx < num_streams_to_stop - 1 ) { 171166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* always stop meta data stream last, so switch the stream object with the last one */ 171266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_obj = s_objs[num_streams_to_stop - 1]; 171366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[num_streams_to_stop - 1] = s_objs[meta_stream_idx]; 171466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[meta_stream_idx] = s_obj; 171566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 171666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 171766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < num_streams_to_stop; i++) { 171866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* stream that are linked to this channel should not be stopped */ 171966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_objs[i]->ch_obj != my_obj) { 172066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 172166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 172266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 172366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* stream off */ 172466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_fsm_fn(s_objs[i], 172566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_STOP, 172666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 172766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 172866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 172966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* unreg buf at kernel */ 173066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_fsm_fn(s_objs[i], 173166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_UNREG_BUF, 173266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 173366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 173466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 173566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 173666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < num_streams_to_stop; i++) { 173766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_objs[i]->ch_obj != my_obj) { 173866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Only unlink stream */ 173966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&s_objs[i]->linked_stream->buf_lock); 174066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[i]->linked_stream->is_linked = 0; 174166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin s_objs[i]->linked_stream->linked_obj = NULL; 174266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&s_objs[i]->linked_stream->buf_lock); 174366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 174466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 174566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 174666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* destroy super buf cmd thread */ 174766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (TRUE == my_obj->bundle.is_active) { 1748d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mm_channel_flush_super_buf_queue(my_obj, 0, CAM_STREAM_TYPE_DEFAULT); 174966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* first stop bundle thread */ 175066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmd_thread_release(&my_obj->cmd_thread); 175166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmd_thread_release(&my_obj->cb_thread); 175266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 175366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* deinit superbuf queue */ 175466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_queue_deinit(&my_obj->bundle.superbuf_queue); 175566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 175666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* reset few fields in the bundle info */ 175766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.is_active = 0; 175866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.superbuf_queue.expected_frame_id = 0; 1759780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch my_obj->bundle.superbuf_queue.good_frame_id = 0; 176066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin my_obj->bundle.superbuf_queue.match_cnt = 0; 176166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 176266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 176366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* since all streams are stopped, we are safe to 176466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * release all buffers allocated in stream */ 176566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < num_streams_to_stop; i++) { 176666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_objs[i]->ch_obj != my_obj) { 176766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 176866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 176966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* put buf back */ 177066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_fsm_fn(s_objs[i], 177166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_PUT_BUF, 177266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 177366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 177466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 177566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 177666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < num_streams_to_stop; i++) { 177766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_objs[i]->ch_obj != my_obj) { 177866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(s_objs[i], 0, sizeof(mm_stream_t)); 177966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 178066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 178166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 178266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 178366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 178466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 178566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 178666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 178766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 178866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_request_super_buf 178966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 179066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: for burst mode in bundle, reuqest certain amount of matched 179166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * frames from superbuf queue 179266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 179366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 179466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 179566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @num_buf_requested : number of matched frames needed 179666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @num_retro_buf_requested : number of retro frames needed 179766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 179866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 179966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 180066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 180166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 180266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_request_super_buf(mm_channel_t *my_obj, 180366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_req_buf_t *buf) 180466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 180566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 180666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmdcb_t* node = NULL; 180766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 180866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(!buf) { 180966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Request info buf is NULL"); 181066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 181166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 181266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 181366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* set pending_cnt 181466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * will trigger dispatching super frames if pending_cnt > 0 */ 181566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* send cam_sem_post to wake up cmd thread to dispatch super buffer */ 181666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t)); 181766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node) { 181866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(node, 0, sizeof(mm_camera_cmdcb_t)); 181966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->cmd_type = MM_CAMERA_CMD_TYPE_REQ_DATA_CB; 182066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->u.req_buf = *buf; 182166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 182266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* enqueue to cmd thread */ 182366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_queue_enq(&(my_obj->cmd_thread.cmd_queue), node); 182466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 182566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* wake up cmd thread */ 182666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&(my_obj->cmd_thread.cmd_sem)); 182766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 182866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for mm_camera_node_t"); 182966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 183066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 183166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 183266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 183366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 183466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 183566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 183666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_cancel_super_buf_request 183766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 183866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: for burst mode in bundle, cancel the reuqest for certain amount 183966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * of matched frames from superbuf queue 184066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 184166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 184266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 184366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 184466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 184566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 184666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 184766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 184866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_cancel_super_buf_request(mm_channel_t *my_obj) 184966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 185066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 185166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* reset pending_cnt */ 185266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_req_buf_t buf; 185366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&buf, 0x0, sizeof(buf)); 185466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.type = MM_CAMERA_REQ_SUPER_BUF; 185566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf.num_buf_requested = 0; 185666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_channel_request_super_buf(my_obj, &buf); 185766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 185866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 185966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 186066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 186166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_flush_super_buf_queue 186266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 186366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush superbuf queue 186466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 186566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 186666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 186766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame_idx : frame idx until which to flush all superbufs 186866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 186966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 187066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 187166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 187266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 187366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_flush_super_buf_queue(mm_channel_t *my_obj, uint32_t frame_idx, 187466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t stream_type) 187566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 187666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 187766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmdcb_t* node = NULL; 187866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 187966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t)); 188066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node) { 188166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(node, 0, sizeof(mm_camera_cmdcb_t)); 188266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->cmd_type = MM_CAMERA_CMD_TYPE_FLUSH_QUEUE; 188366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->u.flush_cmd.frame_idx = frame_idx; 188466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->u.flush_cmd.stream_type = stream_type; 188566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 188666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* enqueue to cmd thread */ 188766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_queue_enq(&(my_obj->cmd_thread.cmd_queue), node); 188866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 188966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* wake up cmd thread */ 189066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&(my_obj->cmd_thread.cmd_sem)); 189166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 189266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* wait for ack from cmd thread */ 189366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_wait(&(my_obj->cmd_thread.sync_sem)); 189466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 189566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for mm_camera_node_t"); 189666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 189766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 189866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 189966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 190066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 190166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 190266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 190366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_config_notify_mode 190466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 190566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: configure notification mode 190666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 190766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 190866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 190966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @notify_mode : notification mode 191066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 191166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 191266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 191366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 191466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 191566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_config_notify_mode(mm_channel_t *my_obj, 191666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_notify_mode_t notify_mode) 191766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 191866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 191966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmdcb_t* node = NULL; 192066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 192166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t)); 192266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node) { 192366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(node, 0, sizeof(mm_camera_cmdcb_t)); 192466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->u.notify_mode = notify_mode; 192566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->cmd_type = MM_CAMERA_CMD_TYPE_CONFIG_NOTIFY; 192666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 192766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* enqueue to cmd thread */ 192866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_queue_enq(&(my_obj->cmd_thread.cmd_queue), node); 192966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 193066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* wake up cmd thread */ 193166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&(my_obj->cmd_thread.cmd_sem)); 193266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 193366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for mm_camera_node_t"); 193466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 193566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 193666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 193766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 193866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 193966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 194066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 194166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_start_zsl_snapshot 194266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 194366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start zsl snapshot 194466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 194566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 194666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 194766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 194866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 194966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 195066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 195166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 195266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_start_zsl_snapshot(mm_channel_t *my_obj) 195366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 195466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 195566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmdcb_t* node = NULL; 195666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 195766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t)); 195866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node) { 195966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(node, 0, sizeof(mm_camera_cmdcb_t)); 196066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->cmd_type = MM_CAMERA_CMD_TYPE_START_ZSL; 196166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 196266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* enqueue to cmd thread */ 196366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_queue_enq(&(my_obj->cmd_thread.cmd_queue), node); 196466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 196566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* wake up cmd thread */ 196666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&(my_obj->cmd_thread.cmd_sem)); 196766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 196866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for mm_camera_node_t"); 196966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 197066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 197166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 197266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 197366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 197466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 197566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 197666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_stop_zsl_snapshot 197766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 197866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop zsl snapshot 197966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 198066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 198166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 198266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 198366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 198466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 198566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 198666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 198766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_stop_zsl_snapshot(mm_channel_t *my_obj) 198866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 198966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 199066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmdcb_t* node = NULL; 199166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 199266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t)); 199366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node) { 199466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(node, 0, sizeof(mm_camera_cmdcb_t)); 199566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->cmd_type = MM_CAMERA_CMD_TYPE_STOP_ZSL; 199666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 199766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* enqueue to cmd thread */ 199866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_queue_enq(&(my_obj->cmd_thread.cmd_queue), node); 199966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 200066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* wake up cmd thread */ 200166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&(my_obj->cmd_thread.cmd_sem)); 200266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 200366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for mm_camera_node_t"); 200466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 200566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 200666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 200766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 200866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 200966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 201066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 201166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_qbuf 201266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 201366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: enqueue buffer back to kernel 201466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 201566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 201666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 201766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @buf : buf ptr to be enqueued 201866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 201966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 202066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 202166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 202266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 202366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_qbuf(mm_channel_t *my_obj, 202466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *buf) 202566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 202666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 202766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t* s_obj = mm_channel_util_get_stream_by_handler(my_obj, buf->stream_id); 202866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 202966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 203066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_obj->ch_obj != my_obj) { 203166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Redirect to linked stream */ 203266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(s_obj->linked_stream, 203366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_QBUF, 203466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)buf, 203566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 203666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 203766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(s_obj, 203866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_QBUF, 203966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)buf, 204066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 204166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 204266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 204366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 204466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 204566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 204666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 204766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 2048680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * FUNCTION : mm_channel_cancel_buf 2049680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * 2050680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * DESCRIPTION: Get back buffer already sent to kernel 2051680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * 2052680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * PARAMETERS : 2053680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * @my_obj : channel object 2054680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * @buf : buf ptr to be enqueued 2055680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * 2056680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * RETURN : int32_t type of status 2057680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * 0 -- success 2058680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda * -1 -- failure 2059680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda *==========================================================================*/ 2060680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Anandaint32_t mm_channel_cancel_buf(mm_channel_t *my_obj, 2061680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda uint32_t stream_id, uint32_t buf_idx) 2062680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda{ 2063680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda int32_t rc = -1; 2064680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda mm_stream_t* s_obj = mm_channel_util_get_stream_by_handler(my_obj, stream_id); 2065680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda 2066680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda if (NULL != s_obj) { 2067680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda if (s_obj->ch_obj != my_obj) { 2068680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda /* Redirect to linked stream */ 2069680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda rc = mm_stream_fsm_fn(s_obj->linked_stream, 2070680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda MM_STREAM_EVT_CANCEL_BUF, 2071680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda (void *)&buf_idx, 2072680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda NULL); 2073680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda } else { 2074680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda rc = mm_stream_fsm_fn(s_obj, 2075680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda MM_STREAM_EVT_CANCEL_BUF, 2076680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda (void *)&buf_idx, 2077680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda NULL); 2078680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda } 2079680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda } 2080680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda 2081680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda return rc; 2082680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda} 2083680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda 2084680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda 2085680bcf0eb45cb33e82564f4748eb02f1063b6e54Ranjith Kagathi Ananda/*=========================================================================== 208666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_get_queued_buf_count 208766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 208866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return queued buffer count 208966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 209066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 209166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 209266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_id : steam_id 209366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 209466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : queued buffer count 209566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 209666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_get_queued_buf_count(mm_channel_t *my_obj, uint32_t stream_id) 209766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 209866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 209966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t* s_obj = mm_channel_util_get_stream_by_handler(my_obj, stream_id); 210066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 210166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 210266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_obj->ch_obj != my_obj) { 210366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Redirect to linked stream */ 210466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(s_obj->linked_stream, 210566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_GET_QUEUED_BUF_COUNT, 210666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 210766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 210866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 210966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(s_obj, 211066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_GET_QUEUED_BUF_COUNT, 211166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 211266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 211366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 211466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 211566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 211666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 211766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 211866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 211966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 212066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_set_stream_parms 212166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 212266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set parameters per stream 212366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 212466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 212566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 212666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @s_id : stream handle 212766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @parms : ptr to a param struct to be set to server 212866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 212966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 213066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 213166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 213266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : Assume the parms struct buf is already mapped to server via 213366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * domain socket. Corresponding fields of parameters to be set 213466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * are already filled in by upper layer caller. 213566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 213666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_set_stream_parm(mm_channel_t *my_obj, 213766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_set_get_stream_parms_t *payload) 213866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 213966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 214066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t* s_obj = mm_channel_util_get_stream_by_handler(my_obj, 214166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->stream_id); 214266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 214366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_obj->ch_obj != my_obj) { 214466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* No op. on linked streams */ 214566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 214666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 214766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 214866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(s_obj, 214966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_SET_PARM, 215066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)payload, 215166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 215266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 215366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 215466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 215566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 215666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 215766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 215866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_get_stream_parms 215966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 216066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get parameters per stream 216166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 216266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 216366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 216466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @s_id : stream handle 216566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @parms : ptr to a param struct to be get from server 216666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 216766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 216866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 216966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 217066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : Assume the parms struct buf is already mapped to server via 217166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * domain socket. Parameters to be get from server are already 217266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * filled in by upper layer caller. After this call, corresponding 217366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * fields of requested parameters will be filled in by server with 217466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * detailed information. 217566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 217666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_get_stream_parm(mm_channel_t *my_obj, 217766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_set_get_stream_parms_t *payload) 217866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 217966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 218066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t* s_obj = mm_channel_util_get_stream_by_handler(my_obj, 218166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->stream_id); 218266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 218366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_obj->ch_obj != my_obj) { 218466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* No op. on linked streams */ 218566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 218666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 218766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 218866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(s_obj, 218966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_GET_PARM, 219066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)payload, 219166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 219266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 219366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 219466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 219566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 219666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 219766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 219866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_do_stream_action 219966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 220066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request server to perform stream based action. Maybe removed later 220166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * if the functionality is included in mm_camera_set_parms 220266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 220366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 220466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 220566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @s_id : stream handle 220666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @actions : ptr to an action struct buf to be performed by server 220766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 220866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 220966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 221066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 221166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : Assume the action struct buf is already mapped to server via 221266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * domain socket. Actions to be performed by server are already 221366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * filled in by upper layer caller. 221466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 221566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_do_stream_action(mm_channel_t *my_obj, 221666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_evt_paylod_do_stream_action_t *payload) 221766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 221866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 221966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t* s_obj = mm_channel_util_get_stream_by_handler(my_obj, 222066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->stream_id); 222166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 222266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_obj->ch_obj != my_obj) { 222366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* No op. on linked streams */ 222466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 222566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 222666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 222766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_fsm_fn(s_obj, 222866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin MM_STREAM_EVT_DO_ACTION, 222966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void *)payload, 223066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 223166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 223266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 223366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 223466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 223566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 223666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 223766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_map_stream_buf 223866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 223966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: mapping stream buffer via domain socket to server 224066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 224166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 224266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 224366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @payload : ptr to payload for mapping 224466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 224566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 224666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 224766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 224866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 224966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_map_stream_buf(mm_channel_t *my_obj, 225066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_map_type *payload) 225166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 225266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 225366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t* s_obj = mm_channel_util_get_stream_by_handler(my_obj, 2254c90a6a8f890acfc51343f58e7f9befe6276d2629Ranjith Kagathi Ananda payload->stream_id); 225566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 225666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_obj->ch_obj != my_obj) { 225766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* No op. on linked streams */ 225866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 225966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 226066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_map_buf(s_obj, 2261c90a6a8f890acfc51343f58e7f9befe6276d2629Ranjith Kagathi Ananda payload->type, payload->frame_idx, 2262c90a6a8f890acfc51343f58e7f9befe6276d2629Ranjith Kagathi Ananda payload->plane_idx, payload->fd, 2263c90a6a8f890acfc51343f58e7f9befe6276d2629Ranjith Kagathi Ananda payload->size, payload->buffer); 226466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 226566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 226666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 226766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 226866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 226966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 227066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_map_stream_bufs 227166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 227266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: mapping stream buffers via domain socket to server 227366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 227466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 227566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 227666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @payload : ptr to payload for mapping 227766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 227866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 227966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 228066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 228166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 228266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_map_stream_bufs(mm_channel_t *my_obj, 228366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_map_type_list *payload) 228466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 228566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 228666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((payload == NULL) || (payload->length == 0)) { 228766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 228866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 228966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 229066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t* s_obj = mm_channel_util_get_stream_by_handler(my_obj, 229166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->buf_maps[0].stream_id); 229266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 229366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_obj->ch_obj != my_obj) { 229466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* No op. on linked streams */ 229566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 229666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 229766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 229866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_map_bufs(s_obj, payload); 229966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 230066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 230166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 230266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 230366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 230466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 230566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_unmap_stream_buf 230666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 230766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: unmapping stream buffer via domain socket to server 230866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 230966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 231066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 231166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @payload : ptr to unmap payload 231266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 231366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 231466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 231566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 231666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 231766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_unmap_stream_buf(mm_channel_t *my_obj, 231866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_unmap_type *payload) 231966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 232066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = -1; 232166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t* s_obj = mm_channel_util_get_stream_by_handler(my_obj, 232266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->stream_id); 232366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != s_obj) { 232466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (s_obj->ch_obj != my_obj) { 232566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* No op. on linked streams */ 232666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 232766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 232866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 232966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mm_stream_unmap_buf(s_obj, payload->type, 233066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->frame_idx, payload->plane_idx); 233166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 233266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 233366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 233466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 233566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 233666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 233766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_superbuf_queue_init 233866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 233966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: initialize superbuf queue in the channel 234066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 234166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 234266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : ptr to superbuf queue to be initialized 234366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 234466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 234566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 234666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 234766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 234866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_queue_init(mm_channel_queue_t * queue) 234966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 235066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return cam_queue_init(&queue->que); 235166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 235266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 235366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 235466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_superbuf_queue_deinit 235566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 235666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: deinitialize superbuf queue in the channel 235766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 235866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 235966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : ptr to superbuf queue to be deinitialized 236066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 236166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 236266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 236366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 236466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 236566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_queue_deinit(mm_channel_queue_t * queue) 236666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 236766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return cam_queue_deinit(&queue->que); 236866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 236966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 237066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 237166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_util_seq_comp_w_rollover 237266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 237366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: utility function to handle sequence number comparison with rollover 237466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 237566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 237666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @v1 : first value to be compared 237766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @v2 : second value to be compared 237866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 237966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int8_t type of comparison result 238066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * >0 -- v1 larger than v2 238166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * =0 -- vi equal to v2 238266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * <0 -- v1 smaller than v2 238366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 238466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint8_t mm_channel_util_seq_comp_w_rollover(uint32_t v1, 238566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t v2) 238666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 238766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int8_t ret = 0; 238866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 238966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* TODO: need to handle the case if v2 roll over to 0 */ 239066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (v1 > v2) { 239166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = 1; 239266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (v1 < v2) { 239366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = -1; 239466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 239566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 239666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 239766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 239866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 239966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 2400780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * FUNCTION : mm_channel_validate_super_buf. 2401780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * 2402780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * DESCRIPTION: Validate incoming buffer with existing super buffer. 2403780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * 2404780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * PARAMETERS : 2405780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * @ch_obj : channel object 2406780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * @queue : superbuf queue 2407780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * @buf_info: new buffer from stream 2408780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * 2409780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * RETURN : int8_t type of validation result 2410780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * >0 -- Valid frame 2411780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * =0 -- Cannot validate 2412780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch * <0 -- Invalid frame. Can be freed 2413780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch *==========================================================================*/ 2414780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetschint8_t mm_channel_validate_super_buf(__unused mm_channel_t* ch_obj, 2415780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch mm_channel_queue_t *queue, mm_camera_buf_info_t *buf_info) 2416780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch{ 2417780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch int8_t ret = 0; 2418780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch cam_node_t* node = NULL; 2419780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch struct cam_list *head = NULL; 2420780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch struct cam_list *pos = NULL; 2421780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch mm_channel_queue_node_t* super_buf = NULL; 2422780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch 2423c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch (void)ch_obj; 2424c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch 2425780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch /* comp */ 2426780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch pthread_mutex_lock(&queue->que.lock); 2427780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch head = &queue->que.head.list; 2428780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch /* get the last one in the queue which is possibly having no matching */ 2429780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch pos = head->next; 2430780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch while (pos != head) { 2431780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch node = member_of(pos, cam_node_t, list); 2432780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch super_buf = (mm_channel_queue_node_t*)node->data; 2433780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch if (NULL != super_buf) { 2434780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch if ((super_buf->expected_frame) && 2435780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch (buf_info->frame_idx == super_buf->frame_idx)) { 2436780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch //This is good frame. Expecting more frames. Keeping this frame. 2437780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch ret = 1; 2438780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch break; 2439780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch } else { 2440780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch pos = pos->next; 2441780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch continue; 2442780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch } 2443780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch } 2444780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch } 2445780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch pthread_mutex_unlock(&queue->que.lock); 2446780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch return ret; 2447780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch} 2448780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch 2449780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch/*=========================================================================== 245066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_handle_metadata 245166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 245266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Handle frame matching logic change due to metadata 245366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 245466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 245566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_obj : channel object 245666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : superbuf queue 245766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @buf_info: new buffer from stream 245866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 245966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 246066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 246166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 246266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 246366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_handle_metadata( 246466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_t* ch_obj, 246566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue, 246666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_info_t *buf_info) 246766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 246866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 246966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = 0 ; 247066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_stream_t* stream_obj = NULL; 247166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_obj = mm_channel_util_get_stream_by_handler(ch_obj, 247266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_info->stream_id); 247366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t is_prep_snapshot_done_valid = 0; 247466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t is_good_frame_idx_range_valid = 0; 247566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t prep_snapshot_done_state = 0; 247666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_frame_idx_range_t good_frame_idx_range; 247766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t is_crop_1x_found = 0; 247866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t snapshot_stream_id = 0; 247966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t i; 248066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Set expected frame id to a future frame idx, large enough to wait 248166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * for good_frame_idx_range, and small enough to still capture an image */ 248266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const uint32_t max_future_frame_offset = MM_CAMERA_MAX_FUTURE_FRAME_WAIT; 248366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 248466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&good_frame_idx_range, 0, sizeof(good_frame_idx_range)); 248566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 248666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == stream_obj) { 248766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid Stream Object for stream_id = %d", 248866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_info->stream_id); 248966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 249066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 249166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 249266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == stream_obj->stream_info) { 249366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL stream info for stream_id = %d", 249466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_info->stream_id); 249566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 249666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 249766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 249866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 249966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((CAM_STREAM_TYPE_METADATA == stream_obj->stream_info->stream_type) && 250066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((stream_obj->ch_obj == ch_obj) || 250166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((stream_obj->linked_stream != NULL) && 250266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (stream_obj->linked_stream->linked_obj == ch_obj)))) { 250366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const metadata_buffer_t *metadata; 250466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata = (const metadata_buffer_t *)buf_info->buf->buffer; 250566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 250666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == metadata) { 250766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("NULL metadata buffer for metadata stream"); 250866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 250966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 251066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 251166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL("E , expected frame id: %d", queue->expected_frame_id); 251266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 251366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(const int32_t, p_prep_snapshot_done_state, 251466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_PREP_SNAPSHOT_DONE, metadata) { 251566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin prep_snapshot_done_state = *p_prep_snapshot_done_state; 251666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin is_prep_snapshot_done_valid = 1; 251766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("prepare snapshot done valid "); 251866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 251966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(const cam_frame_idx_range_t, p_good_frame_idx_range, 252066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_GOOD_FRAME_IDX_RANGE, metadata) { 252166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range = *p_good_frame_idx_range; 252266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin is_good_frame_idx_range_valid = 1; 252366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("good_frame_idx_range : min: %d, max: %d , num frames = %d", 252466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.min_frame_idx, 252566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.max_frame_idx, good_frame_idx_range.num_led_on_frames); 252666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 252766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(const cam_crop_data_t, p_crop_data, 252866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_CROP_DATA, metadata) { 252966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_crop_data_t crop_data = *p_crop_data; 253066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 253166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < ARRAY_SIZE(ch_obj->streams); i++) { 253266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (MM_STREAM_STATE_NOTUSED == ch_obj->streams[i].state) { 253366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 253466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 253566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (CAM_STREAM_TYPE_SNAPSHOT == 253666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->streams[i].stream_info->stream_type) { 253766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snapshot_stream_id = ch_obj->streams[i].server_stream_id; 253866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 253966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 254066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 254166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 254266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i=0; i<crop_data.num_of_streams; i++) { 254366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (snapshot_stream_id == crop_data.crop_info[i].stream_id) { 254466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!crop_data.crop_info[i].crop.left && 254566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !crop_data.crop_info[i].crop.top) { 254666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin is_crop_1x_found = 1; 254766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 254866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 254966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 255066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 255166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 255266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 255366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(const cam_buf_divert_info_t, p_divert_info, 255466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_BUF_DIVERT_INFO, metadata) { 255566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_buf_divert_info_t divert_info = *p_divert_info; 255666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (divert_info.frame_id >= buf_info->frame_idx) { 255766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->diverted_frame_id = divert_info.frame_id; 255866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 255966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->diverted_frame_id = 0; 256066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 256166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 256266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 256366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->isZoom1xFrameRequested) { 256466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (is_crop_1x_found) { 256566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->isZoom1xFrameRequested = 0; 256666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id = buf_info->frame_idx + 1; 256766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 256866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id += max_future_frame_offset; 256966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Flush unwanted frames */ 257066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_flush_matched(ch_obj, queue); 257166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 257366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 257566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->startZSlSnapshotCalled && is_good_frame_idx_range_valid) { 257666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("frameID = %d, expected = %d good_frame_idx = %d", 257766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_info->frame_idx, queue->expected_frame_id, 257866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.min_frame_idx); 257966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 258066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 258166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (is_prep_snapshot_done_valid) { 258266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bWaitForPrepSnapshotDone = 0; 258366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (prep_snapshot_done_state == NEED_FUTURE_FRAME) { 258466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id += max_future_frame_offset; 258566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("PreFlash Done. Need Main Flash"); 258666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 258766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_flush(ch_obj, 258866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue, CAM_STREAM_TYPE_DEFAULT); 258966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 259066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->needLEDFlash = TRUE; 259166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 259266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->needLEDFlash = FALSE; 259366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (is_good_frame_idx_range_valid) { 259666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id = 259766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.min_frame_idx; 2598780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch queue->good_frame_id = good_frame_idx_range.min_frame_idx; 2599780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch if((ch_obj->needLEDFlash == TRUE) && (ch_obj->burstSnapNum > 1)) { 260066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->led_on_start_frame_id = 260166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.min_frame_idx; 260266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->led_off_start_frame_id = 260366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.max_frame_idx; 260466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->once = 0; 260566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->led_on_num_frames = 260666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.num_led_on_frames; 260766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->frame_skip_count = good_frame_idx_range.frame_skip_count; 260866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Need Flash, expected frame id = %d," 260966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin " led_on start = %d, led off start = %d, led on frames = %d ", 261066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id, queue->led_on_start_frame_id, 261166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->led_off_start_frame_id, queue->led_on_num_frames); 261266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 261366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("No flash, expected frame id = %d ", 261466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id); 261566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 261666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if ((MM_CHANNEL_BRACKETING_STATE_WAIT_GOOD_FRAME_IDX == ch_obj->bracketingState) && 261766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !is_prep_snapshot_done_valid) { 261866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Flush unwanted frames */ 261966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_superbuf_flush_matched(ch_obj, queue); 262066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id += max_future_frame_offset; 262166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 262266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->isFlashBracketingEnabled && 262366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin is_good_frame_idx_range_valid) { 262466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Flash bracketing needs two frames, with & without led flash. 262566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * in valid range min frame is with led flash and max frame is 262666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * without led flash */ 262766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id = 2628780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch good_frame_idx_range.min_frame_idx; 262966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* max frame is without led flash */ 263066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id_without_led = 2631780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch good_frame_idx_range.max_frame_idx; 2632780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch queue->good_frame_id = 2633780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch good_frame_idx_range.min_frame_idx; 263466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (is_good_frame_idx_range_valid) { 263566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id = 263666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.min_frame_idx; 263766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->bracketingState = MM_CHANNEL_BRACKETING_STATE_ACTIVE; 2638780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch queue->good_frame_id = 2639780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch good_frame_idx_range.min_frame_idx; 264066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 264166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 264266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->isConfigCapture && is_good_frame_idx_range_valid 264366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (good_frame_idx_range.config_batch_idx < ch_obj->frameConfig.num_batch)) { 264466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 264566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Frame Config: Expcted ID = %d batch index = %d", 264666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.min_frame_idx, good_frame_idx_range.config_batch_idx); 264766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->capture_frame_id[good_frame_idx_range.config_batch_idx] = 264866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.min_frame_idx; 264966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 265066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->cur_capture_idx == good_frame_idx_range.config_batch_idx) { 265166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id = 265266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin good_frame_idx_range.min_frame_idx; 265366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 265466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id = 265566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->capture_frame_id[ch_obj->cur_capture_idx]; 265666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 2657780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch queue->good_frame_id = queue->expected_frame_id; 265866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 265966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 266066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((ch_obj->burstSnapNum > 1) && (ch_obj->needLEDFlash == TRUE) 266166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && !ch_obj->isFlashBracketingEnabled 266266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (MM_CHANNEL_BRACKETING_STATE_OFF == ch_obj->bracketingState) 266366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && !ch_obj->isConfigCapture) { 266466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if((buf_info->frame_idx >= queue->led_off_start_frame_id) 266566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && !queue->once) { 266666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Burst snap num = %d ", 266766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->burstSnapNum); 266866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Skip frames from LED OFF frame to get a good frame 266966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id = queue->led_off_start_frame_id + 267066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->frame_skip_count; 267166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->once = 1; 267266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->stopZslSnapshot = 1; 267366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->needLEDFlash = FALSE; 267466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Reached max led on frames = %d , expected id = %d", 267566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_info->frame_idx, queue->expected_frame_id); 267666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 267766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 267866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 267966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(const cam_low_light_mode_t, low_light_level, 268066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_LOW_LIGHT, metadata) { 268166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->needLowLightZSL = *low_light_level; 268266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 2683d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 2684d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // For the instant capture case, if AEC settles before expected frame ID from user, 2685d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // reset the expected frame ID to current frame index. 2686d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (queue->attr.user_expected_frame_id > 0) { 2687d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (queue->attr.user_expected_frame_id > buf_info->frame_idx) { 2688d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch IF_META_AVAILABLE(const cam_3a_params_t, ae_params, 2689d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch CAM_INTF_META_AEC_INFO, metadata) { 2690d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (ae_params->settled) { 2691d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch queue->expected_frame_id = buf_info->frame_idx; 2692d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // Reset the expected frame ID from HAL to 0 2693d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch queue->attr.user_expected_frame_id = 0; 2694d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGD("AEC settled, reset expected frame ID from user"); 2695d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 2696d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 2697d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } else { 2698d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // Reset the expected frame ID from HAL to 0 after 2699d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // current frame index is greater than expected id. 2700d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch queue->attr.user_expected_frame_id = 0; 2701d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGD("reset expected frame ID from user as it reached the bound"); 2702d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 2703d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 270466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 270566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinend: 270666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 270766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 270866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 270966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 271066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_superbuf_comp_and_enqueue 271166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 271266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: implementation for matching logic for superbuf 271366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 271466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 271566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_obj : channel object 271666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : superbuf queue 271766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @buf_info: new buffer from stream 271866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 271966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 272066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 272166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 272266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 272366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_comp_and_enqueue( 272466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_t* ch_obj, 272566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t *queue, 272666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_info_t *buf_info) 272766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 272866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_node_t* node = NULL; 272966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *head = NULL; 273066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *pos = NULL; 273166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t* super_buf = NULL; 273266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t buf_s_idx, i, found_super_buf, unmatched_bundles; 273366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *last_buf, *insert_before_buf, *last_buf_ptr; 273466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 273566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 273666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 273766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (buf_s_idx = 0; buf_s_idx < queue->num_streams; buf_s_idx++) { 273866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (buf_info->stream_id == queue->bundled_streams[buf_s_idx]) { 273966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 274066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 274166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 274266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 274366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (buf_s_idx == queue->num_streams) { 274466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("buf from stream (%d) not bundled", buf_info->stream_id); 274566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 274666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 274766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 274866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(buf_info->frame_idx == 0) { 274966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, buf_info->buf); 275066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 275166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 275266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 275366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mm_channel_handle_metadata(ch_obj, queue, buf_info) < 0) { 275466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, buf_info->buf); 275566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 275666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 275766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 2758780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch if ((mm_channel_util_seq_comp_w_rollover(buf_info->frame_idx, 2759780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch queue->expected_frame_id) < 0) && 2760780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch (mm_channel_validate_super_buf(ch_obj, queue, buf_info) <= 0)) { 276166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("incoming buf id(%d) is older than expected buf id(%d), will discard it", 276266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_info->frame_idx, queue->expected_frame_id); 276366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, buf_info->buf); 276466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 276566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 276666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 276766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* comp */ 276866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&queue->que.lock); 276966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin head = &queue->que.head.list; 277066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* get the last one in the queue which is possibly having no matching */ 277166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = head->next; 277266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 277366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin found_super_buf = 0; 277466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unmatched_bundles = 0; 277566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin last_buf = NULL; 277666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin insert_before_buf = NULL; 277766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin last_buf_ptr = NULL; 277866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 277966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (pos != head) { 278066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(pos, cam_node_t, list); 278166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = (mm_channel_queue_node_t*)node->data; 278266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 278366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf) { 278466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_buf->matched) { 278566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* find a matched super buf, move to next one */ 278666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = pos->next; 278766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 2788c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch } else if (( buf_info->frame_idx == super_buf->frame_idx ) 278966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*Pick metadata greater than available frameID*/ 2790d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch || ((queue->attr.priority == MM_CAMERA_SUPER_BUF_PRIORITY_LOW) 279166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (super_buf->super_buf[buf_s_idx].frame_idx == 0) 2792d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch && (buf_info->buf->stream_type == CAM_STREAM_TYPE_METADATA) 2793d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch && (super_buf->frame_idx < buf_info->frame_idx)) 279466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*Pick available metadata closest to frameID*/ 279566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || ((queue->attr.priority == MM_CAMERA_SUPER_BUF_PRIORITY_LOW) 279666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (buf_info->buf->stream_type != CAM_STREAM_TYPE_METADATA) 279766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (super_buf->super_buf[buf_s_idx].frame_idx == 0) 2798c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch && (super_buf->unmatched_meta_idx > buf_info->frame_idx))){ 279966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*super buffer frame IDs matching OR In low priority bundling 280066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata frameID greater than avialbale super buffer frameID OR 280166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata frame closest to incoming frameID will be bundled*/ 280266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin found_super_buf = 1; 2803c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch /* If we are filling into a 'meta only' superbuf, make sure to reset 2804c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch the super_buf frame_idx so that missing streams in this superbuf 2805c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch are filled as per matching frame id logic. Note that, in low priority 2806c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch queue, only meta frame id need not match (closest suffices) but 2807c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch the other streams in this superbuf should have same frame id. */ 2808c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch if (super_buf->unmatched_meta_idx > 0) { 2809c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch super_buf->unmatched_meta_idx = 0; 2810c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch super_buf->frame_idx = buf_info->frame_idx; 2811c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch } 281266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 281366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 281466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unmatched_bundles++; 281566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == last_buf ) { 281666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( super_buf->frame_idx < buf_info->frame_idx ) { 281766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin last_buf = pos; 281866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 281966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 282066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == insert_before_buf ) { 282166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( super_buf->frame_idx > buf_info->frame_idx ) { 282266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin insert_before_buf = pos; 282366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 282466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 282566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = pos->next; 282666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 282766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 282866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 282966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 283066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( found_super_buf ) { 283166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(super_buf->super_buf[buf_s_idx].frame_idx != 0) { 283266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //This can cause frame drop. We are overwriting same memory. 283366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&queue->que.lock); 283466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Warning: frame is already in camera ZSL queue"); 283566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, buf_info->buf); 283666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 283766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 283866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 283966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*Insert incoming buffer to super buffer*/ 284066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf->super_buf[buf_s_idx] = *buf_info; 284166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 284266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* check if superbuf is all matched */ 284366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf->matched = 1; 284466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i=0; i < super_buf->num_of_bufs; i++) { 284566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_buf->super_buf[i].frame_idx == 0) { 284666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf->matched = 0; 284766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 284866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 284966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 285066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 285166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_buf->matched) { 285266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(ch_obj->isFlashBracketingEnabled) { 285366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id = 285466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id_without_led; 285566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (buf_info->frame_idx >= 285666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id_without_led) { 285766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->isFlashBracketingEnabled = FALSE; 285866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 285966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 286066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id = buf_info->frame_idx 286166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + queue->attr.post_frame_skip; 286266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 286366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 2864780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch super_buf->expected_frame = FALSE; 286566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 286666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("curr = %d, skip = %d , Expected Frame ID: %d", 286766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_info->frame_idx, 286866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->attr.post_frame_skip, queue->expected_frame_id); 286966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 287066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->match_cnt++; 287166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->bundle.superbuf_queue.attr.enable_frame_sync) { 287266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&fs_lock); 287366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_frame_sync_add(buf_info->frame_idx, ch_obj); 287466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&fs_lock); 287566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 287666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Any older unmatched buffer need to be released */ 287766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( last_buf ) { 287866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while ( last_buf != pos ) { 287966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(last_buf, cam_node_t, list); 288066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = (mm_channel_queue_node_t*)node->data; 288166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf) { 288266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i=0; i<super_buf->num_of_bufs; i++) { 288366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_buf->super_buf[i].frame_idx != 0) { 288466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, super_buf->super_buf[i].buf); 288566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 288666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 288766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->que.size--; 288866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin last_buf = last_buf->next; 288966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_del_node(&node->list); 289066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 289166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_buf); 289266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 289366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid superbuf in queue!"); 289466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 289566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 289666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 289766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 289866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin }else { 289966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->diverted_frame_id == buf_info->frame_idx) { 2900780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch super_buf->expected_frame = TRUE; 290166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->diverted_frame_id = 0; 290266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 290366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 290466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 290566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((queue->attr.max_unmatched_frames < unmatched_bundles) 290666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && ( NULL == last_buf )) { 290766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* incoming frame is older than the last bundled one */ 290866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, buf_info->buf); 290966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 291066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin last_buf_ptr = last_buf; 291166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 291266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Loop to remove unmatched frames */ 291366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while ((queue->attr.max_unmatched_frames < unmatched_bundles) 291466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (last_buf_ptr != NULL && last_buf_ptr != pos)) { 291566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(last_buf_ptr, cam_node_t, list); 291666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = (mm_channel_queue_node_t*)node->data; 2917780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch if (NULL != super_buf && super_buf->expected_frame == FALSE 291866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (&node->list != insert_before_buf)) { 291966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i=0; i<super_buf->num_of_bufs; i++) { 292066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_buf->super_buf[i].frame_idx != 0) { 292166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, super_buf->super_buf[i].buf); 292266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 292366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 292466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->que.size--; 292566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_del_node(&node->list); 292666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 292766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_buf); 292866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unmatched_bundles--; 292966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 293066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin last_buf_ptr = last_buf_ptr->next; 293166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 293266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 293366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (queue->attr.max_unmatched_frames < unmatched_bundles) { 293466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(last_buf, cam_node_t, list); 293566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = (mm_channel_queue_node_t*)node->data; 293666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i=0; i<super_buf->num_of_bufs; i++) { 293766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_buf->super_buf[i].frame_idx != 0) { 293866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, super_buf->super_buf[i].buf); 293966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 294066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 294166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->que.size--; 294266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_del_node(&node->list); 294366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 294466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_buf); 294566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 294666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 294766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* insert the new frame at the appropriate position. */ 294866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 294966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t *new_buf = NULL; 295066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_node_t* new_node = NULL; 295166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 295266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new_buf = (mm_channel_queue_node_t*)malloc(sizeof(mm_channel_queue_node_t)); 295366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new_node = (cam_node_t*)malloc(sizeof(cam_node_t)); 295466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != new_buf && NULL != new_node) { 295566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(new_buf, 0, sizeof(mm_channel_queue_node_t)); 295666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(new_node, 0, sizeof(cam_node_t)); 295766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new_node->data = (void *)new_buf; 295866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new_buf->num_of_bufs = queue->num_streams; 295966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new_buf->super_buf[buf_s_idx] = *buf_info; 296066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new_buf->frame_idx = buf_info->frame_idx; 296166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 2962780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch if ((ch_obj->diverted_frame_id == buf_info->frame_idx) 2963780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch || (buf_info->frame_idx == queue->good_frame_id)) { 2964780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch new_buf->expected_frame = TRUE; 296566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_obj->diverted_frame_id = 0; 296666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 296766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 296866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* enqueue */ 296966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( insert_before_buf ) { 297066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_insert_before_node(&new_node->list, insert_before_buf); 297166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 297266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_add_tail_node(&new_node->list, &queue->que.head.list); 297366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 297466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->que.size++; 297566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 297666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(queue->num_streams == 1) { 297766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new_buf->matched = 1; 2978780f5c100c6751462ddc0f5360b1db75a7c819b3Steve Pfetsch new_buf->expected_frame = FALSE; 297966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->expected_frame_id = buf_info->frame_idx + queue->attr.post_frame_skip; 298066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->match_cnt++; 298166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->bundle.superbuf_queue.attr.enable_frame_sync) { 298266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&fs_lock); 298366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_frame_sync_add(buf_info->frame_idx, ch_obj); 298466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&fs_lock); 298566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 298666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 2987c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch /* In low priority queue, this will become a 'meta only' superbuf. Set the 2988c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch unmatched_frame_idx so that the upcoming stream buffers (other than meta) 2989c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch can be filled into this which are nearest to this idx. */ 2990c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch if ((queue->attr.priority == MM_CAMERA_SUPER_BUF_PRIORITY_LOW) 2991c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch && (buf_info->buf->stream_type == CAM_STREAM_TYPE_METADATA)) { 2992c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch new_buf->unmatched_meta_idx = buf_info->frame_idx; 2993c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch } 299466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 299566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* No memory */ 299666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != new_buf) { 299766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(new_buf); 299866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 299966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != new_node) { 300066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(new_node); 300166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 300266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* qbuf the new buf since we cannot enqueue */ 300366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, buf_info->buf); 300466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 300566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 300666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 300766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 300866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&queue->que.lock); 300966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 301066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 301166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 301266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 301366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 301466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_superbuf_dequeue_internal 301566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 301666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: internal implementation for dequeue from the superbuf queue 301766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 301866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 301966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : superbuf queue 302066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @matched_only : if dequeued buf should be matched 302166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_obj : channel object 302266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 302366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : ptr to a node from superbuf queue 302466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 302566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_channel_queue_node_t* mm_channel_superbuf_dequeue_internal( 302666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue, 302766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t matched_only, mm_channel_t *ch_obj) 302866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 302966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_node_t* node = NULL; 303066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *head = NULL; 303166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *pos = NULL; 303266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t* super_buf = NULL; 303366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 303466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin head = &queue->que.head.list; 303566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = head->next; 303666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pos != head) { 303766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* get the first node */ 303866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(pos, cam_node_t, list); 303966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = (mm_channel_queue_node_t*)node->data; 304066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( (NULL != super_buf) && 304166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (matched_only == TRUE) && 304266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (super_buf->matched == FALSE) ) { 304366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* require to dequeue matched frame only, but this superbuf is not matched, 304466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin simply set return ptr to NULL */ 304566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = NULL; 304666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 304766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf) { 304866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* remove from the queue */ 304966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_del_node(&node->list); 305066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->que.size--; 305166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_buf->matched == TRUE) { 305266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->match_cnt--; 305366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_obj->bundle.superbuf_queue.attr.enable_frame_sync) { 305466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&fs_lock); 305566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_frame_sync_remove(super_buf->frame_idx); 305666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&fs_lock); 305766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 305866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 305966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 306066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 306166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 306266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 306366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return super_buf; 306466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 306566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 306666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 306766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_superbuf_dequeue_frame_internal 306866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 306966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: internal implementation for dequeue based on frame index 307066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * from the superbuf queue 307166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 307266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 307366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : superbuf queue 307466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame_idx : frame index to be dequeued 307566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 307666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : ptr to a node from superbuf queue with matched frame index 307766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * : NULL if not found 307866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 307966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_channel_queue_node_t* mm_channel_superbuf_dequeue_frame_internal( 308066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue, uint32_t frame_idx) 308166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 308266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_node_t* node = NULL; 308366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *head = NULL; 308466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *pos = NULL; 308566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t* super_buf = NULL; 308666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 308766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!queue) { 308866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("queue is NULL"); 308966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 309066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 309166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 309266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin head = &queue->que.head.list; 309366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = head->next; 309466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL("Searching for match frame %d", frame_idx); 309566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while ((pos != head) && (pos != NULL)) { 309666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* get the first node */ 309766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(pos, cam_node_t, list); 309866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = (mm_channel_queue_node_t*)node->data; 309966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_buf && super_buf->matched && 310066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (super_buf->frame_idx == frame_idx)) { 310166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* remove from the queue */ 310266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_del_node(&node->list); 310366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->que.size--; 310466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->match_cnt--; 310566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Found match frame %d", frame_idx); 310666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 310766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 310866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 310966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else { 311066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("match frame not found %d", frame_idx); 311166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = NULL; 311266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 311366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = pos->next; 311466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 311566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return super_buf; 311666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 311766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 311866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 311966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 312066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_superbuf_dequeue 312166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 312266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: dequeue from the superbuf queue 312366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 312466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 312566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : superbuf queue 312666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_obj : channel object 312766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 312866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : ptr to a node from superbuf queue 312966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 313066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_channel_queue_node_t* mm_channel_superbuf_dequeue( 313166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue, mm_channel_t *ch_obj) 313266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 313366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t* super_buf = NULL; 313466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 313566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&queue->que.lock); 313666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = mm_channel_superbuf_dequeue_internal(queue, TRUE, ch_obj); 313766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&queue->que.lock); 313866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 313966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return super_buf; 314066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 314166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 314266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 314366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_superbuf_bufdone_overflow 314466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 314566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: keep superbuf queue no larger than watermark set by upper layer 314666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * via channel attribute 314766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 314866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 314966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 315066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : superbuf queue 315166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 315266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 315366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 315466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 315566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 315666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_bufdone_overflow(mm_channel_t* my_obj, 315766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue) 315866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 315966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0, i; 316066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t* super_buf = NULL; 316166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS == queue->attr.notify_mode) { 316266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* for continuous streaming mode, no overflow is needed */ 316366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 316466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 316566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 316666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("before match_cnt=%d, water_mark=%d", 316766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->match_cnt, queue->attr.water_mark); 316866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* bufdone overflowed bufs */ 316966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&queue->que.lock); 317066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (queue->match_cnt > queue->attr.water_mark) { 317166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = mm_channel_superbuf_dequeue_internal(queue, TRUE, my_obj); 317266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf) { 317366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i=0; i<super_buf->num_of_bufs; i++) { 317466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf->super_buf[i].buf) { 317566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(my_obj, super_buf->super_buf[i].buf); 317666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 317766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 317866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_buf); 317966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 318066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 318166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&queue->que.lock); 318266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("after match_cnt=%d, water_mark=%d", 318366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin queue->match_cnt, queue->attr.water_mark); 318466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 318566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 318666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 318766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 318866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 318966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_superbuf_skip 319066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 319166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: depends on the lookback configuration of the channel attribute, 319266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * unwanted superbufs will be removed from the superbuf queue. 319366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 319466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 319566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 319666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : superbuf queue 319766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 319866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 319966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 320066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 320166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 320266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_skip(mm_channel_t* my_obj, 320366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue) 320466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 320566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0, i; 320666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t* super_buf = NULL; 320766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS == queue->attr.notify_mode) { 320866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* for continuous streaming mode, no skip is needed */ 320966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 321066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 321166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 321266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* bufdone overflowed bufs */ 321366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&queue->que.lock); 321466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (queue->match_cnt > queue->attr.look_back) { 321566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = mm_channel_superbuf_dequeue_internal(queue, TRUE, my_obj); 321666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf) { 321766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i=0; i<super_buf->num_of_bufs; i++) { 321866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf->super_buf[i].buf) { 321966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(my_obj, super_buf->super_buf[i].buf); 322066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 322166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 322266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_buf); 322366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 322466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 322566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&queue->que.lock); 322666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 322766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 322866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 322966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 323066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 323166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_superbuf_flush 323266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 323366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush the superbuf queue. 323466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 323566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 323666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 323766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : superbuf queue 323866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_type: flush only particular type (default flushes all) 323966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 324066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 324166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 324266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 324366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 324466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_flush(mm_channel_t* my_obj, 324566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue, cam_stream_type_t cam_type) 324666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 324766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0, i; 324866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t* super_buf = NULL; 324966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t stream_type = CAM_STREAM_TYPE_DEFAULT; 325066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 325166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* bufdone bufs */ 325266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&queue->que.lock); 325366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = mm_channel_superbuf_dequeue_internal(queue, FALSE, my_obj); 325466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (super_buf != NULL) { 325566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i=0; i<super_buf->num_of_bufs; i++) { 325666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf->super_buf[i].buf) { 325766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_type = super_buf->super_buf[i].buf->stream_type; 325866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((CAM_STREAM_TYPE_DEFAULT == cam_type) || 325966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cam_type == stream_type)) { 326066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(my_obj, super_buf->super_buf[i].buf); 326166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 326266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 326366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 326466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_buf); 326566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = mm_channel_superbuf_dequeue_internal(queue, FALSE, my_obj); 326666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 326766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&queue->que.lock); 326866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 326966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 327066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 327166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 327266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 327366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_proc_general_cmd 327466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 327566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process general command 327666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 327766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 327866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 327966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @notify_mode : notification mode 328066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 328166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 328266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 328366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 328466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 328566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_proc_general_cmd(mm_channel_t *my_obj, 328666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_generic_cmd_t *p_gen_cmd) 328766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 328866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 328966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 329066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_cmdcb_t* node = NULL; 329166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 329266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t)); 329366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node) { 329466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(node, 0, sizeof(mm_camera_cmdcb_t)); 329566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->u.gen_cmd = *p_gen_cmd; 329666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->cmd_type = MM_CAMERA_CMD_TYPE_GENERAL; 329766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 329866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* enqueue to cmd thread */ 329966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_queue_enq(&(my_obj->cmd_thread.cmd_queue), node); 330066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 330166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* wake up cmd thread */ 330266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&(my_obj->cmd_thread.cmd_sem)); 330366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 330466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for mm_camera_node_t"); 330566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 330666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 330766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 330866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 330966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 331066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 331166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 331266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 331366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_superbuf_flush_matched 331466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 331566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush matched buffers from the superbuf queue. 331666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 331766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 331866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @my_obj : channel object 331966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @queue : superbuf queue 332066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 332166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 332266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 332366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 332466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 332566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_channel_superbuf_flush_matched(mm_channel_t* my_obj, 332666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t * queue) 332766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 332866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0, i; 332966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_node_t* super_buf = NULL; 333066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 333166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* bufdone bufs */ 333266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&queue->que.lock); 333366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = mm_channel_superbuf_dequeue_internal(queue, TRUE, my_obj); 333466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (super_buf != NULL) { 333566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i=0; i<super_buf->num_of_bufs; i++) { 333666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf->super_buf[i].buf) { 333766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(my_obj, super_buf->super_buf[i].buf); 333866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 333966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 334066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_buf); 334166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf = mm_channel_superbuf_dequeue_internal(queue, TRUE, my_obj); 334266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 334366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&queue->que.lock); 334466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 334566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 334666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 334766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 334866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 334966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 335066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_frame_sync_reset 335166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 335266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Reset Frame sync info 335366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 335466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 335566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 335666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_frame_sync_reset() { 335766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&fs, 0x0, sizeof(fs)); 335866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Reset Done"); 335966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 336066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 336166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 336266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_frame_sync_register_channel 336366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 336466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Register Channel for frame sync 336566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 336666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 336766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_obj : channel object 336866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 336966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 337066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 337166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 337266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 337366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_frame_sync_register_channel(mm_channel_t *ch_obj) { 337466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Lock frame sync info 337566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&fs_lock); 337666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((fs.num_cam >= MAX_NUM_CAMERA_PER_BUNDLE) || (!ch_obj)) { 337766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error!! num cam(%d) is out of range ", 337866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.num_cam); 337966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&fs_lock); 338066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 338166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 338266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.num_cam == 0) { 338366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("First channel registering!!"); 338466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_frame_sync_reset(); 338566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 338666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t i = 0; 338766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < MAX_NUM_CAMERA_PER_BUNDLE; i++) { 338866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.ch_obj[i] == NULL) { 338966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.ch_obj[i] = ch_obj; 339066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.cb[i] = ch_obj->bundle.super_buf_notify_cb; 339166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.num_cam++; 339266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("DBG_FS index %d", i); 339366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 339466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 339566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 339666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (i >= MAX_NUM_CAMERA_PER_BUNDLE) { 339766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X, DBG_FS Cannot register channel!!"); 339866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&fs_lock); 339966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 340066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 340166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("num_cam %d ", fs.num_cam); 340266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&fs_lock); 340366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 340466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 340566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 340666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 340766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_frame_sync_unregister_channel 340866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 340966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: un-register Channel for frame sync 341066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 341166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 341266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_obj : channel object 341366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 341466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 341566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 341666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 341766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 341866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_frame_sync_unregister_channel(mm_channel_t *ch_obj) { 341966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t i = 0; 342066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Lock frame sync info 342166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&fs_lock); 342266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!fs.num_cam || !ch_obj) { 342366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X, DBG_FS: channel not found !!"); 342466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Lock frame sync info 342566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&fs_lock); 342666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 342766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 342866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < MAX_NUM_CAMERA_PER_BUNDLE; i++) { 342966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.ch_obj[i] == ch_obj) { 343066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("found ch_obj at i (%d) ", i); 343166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 343266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 343366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 343466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (i < MAX_NUM_CAMERA_PER_BUNDLE) { 343566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("remove channel info "); 343666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.ch_obj[i] = NULL; 343766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.cb[i] = NULL; 343866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.num_cam--; 343966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 344066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("DBG_FS Channel not found "); 344166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 344266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.num_cam == 0) { 344366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_frame_sync_reset(); 344466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 344566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X, fs.num_cam %d", fs.num_cam); 344666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&fs_lock); 344766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 344866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 344966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 345066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 345166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 345266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_frame_sync_add 345366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 345466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Add frame info into frame sync nodes 345566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 345666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 345766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame_id : frame id to be added 345866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_obj : channel object 345966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 346066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 346166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 346266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 346366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 346466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_frame_sync_add(uint32_t frame_id, mm_channel_t *ch_obj) { 346566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 346666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E, frame id %d ch_obj %p", frame_id, ch_obj); 346766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!frame_id || !ch_obj) { 346866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X : Error, cannot add sync frame !!"); 346966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 347066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 347166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 347266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int8_t ch_idx = -1; 347366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t i = 0; 347466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < MAX_NUM_CAMERA_PER_BUNDLE; i++) { 347566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.ch_obj[i] == ch_obj) { 347666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch_idx = i; 347766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("ch id %d ", ch_idx); 347866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 347966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 348066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 348166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_idx < 0) { 348266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X : DBG_FS ch not found!!"); 348366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 348466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 348566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int8_t index = mm_frame_sync_find_frame_index(frame_id); 348666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((index >= 0) && (index < MM_CAMERA_FRAME_SYNC_NODES)) { 348766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.node[index].frame_valid[ch_idx] = 1; 348866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (index < 0) { 348966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.pos >= MM_CAMERA_FRAME_SYNC_NODES) { 349066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.pos = 0; 349166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 349266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin index = fs.pos; 349366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&fs.node[index], 0x00, sizeof(mm_channel_sync_node_t)); 349466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.pos++; 349566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.node[index].frame_idx = frame_id; 349666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.node[index].frame_valid[ch_idx] = 1; 349766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.num_cam == 1) { 349866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Single camera frame %d , matched ", frame_id); 349966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.node[index].matched = 1; 350066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 350166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 350266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t frames_valid = 0; 350366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!fs.node[index].matched) { 350466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < MAX_NUM_CAMERA_PER_BUNDLE; i++) { 350566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.node[index].frame_valid[i]) { 350666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frames_valid++; 350766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 350866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 350966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frames_valid == fs.num_cam) { 351066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fs.node[index].matched = 1; 351166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("dual camera frame %d , matched ", 351266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame_id); 351366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 351466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 351566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 351666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 351766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 351866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 351966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_frame_sync_remove 352066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 352166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Remove frame info from frame sync nodes 352266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 352366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 352466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame_id : frame id to be removed 352566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 352666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 352766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- success 352866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- failure 352966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 353066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t mm_frame_sync_remove(uint32_t frame_id) { 353166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int8_t index = -1; 353266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 353366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E, frame_id %d", frame_id); 353466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!frame_id) { 353566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("X, DBG_FS frame id invalid"); 353666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 353766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 353866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 353966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin index = mm_frame_sync_find_frame_index(frame_id); 354066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((index >= 0) && (index < MM_CAMERA_FRAME_SYNC_NODES)) { 354166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Removing sync frame %d", frame_id); 354266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&fs.node[index], 0x00, sizeof(mm_channel_sync_node_t)); 354366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 354466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X "); 354566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 354666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 354766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 354866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 354966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_frame_sync_find_matched 355066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 355166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Find a matched sync frame from the node array 355266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 355366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 355466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @oldest : If enabled, find oldest matched frame., 355566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * If not enabled, get the first matched frame found 355666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 355766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : unt32_t type of status 355866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 0 -- If no matched frames found 355966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * frame index: inf matched frame found 356066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 356166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t mm_frame_sync_find_matched(uint8_t oldest) { 356266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E, oldest %d ", oldest); 356366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t i = 0; 356466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t frame_idx = 0; 356566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t curr_frame_idx = 0; 356666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < MM_CAMERA_FRAME_SYNC_NODES; i++) { 356766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.node[i].matched) { 356866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin curr_frame_idx = fs.node[i].frame_idx; 356966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!frame_idx) { 357066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame_idx = curr_frame_idx; 357166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 357266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!oldest) { 357366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 357466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (frame_idx > curr_frame_idx) { 357566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame_idx = curr_frame_idx; 357666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 357766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 357866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 357966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X, oldest %d frame idx %d", oldest, frame_idx); 358066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return frame_idx; 358166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 358266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 358366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 358466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_frame_sync_find_frame_index 358566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 358666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Find sync frame index if present 358766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 358866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 358966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame_id : frame id to be searched 359066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 359166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int8_t type of status 359266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * -1 -- If desired frame not found 359366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * index: node array index if frame is found 359466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 359566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint8_t mm_frame_sync_find_frame_index(uint32_t frame_id) { 359666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 359766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E, frame_id %d", frame_id); 359866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int8_t index = -1, i = 0; 359966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < MM_CAMERA_FRAME_SYNC_NODES; i++) { 360066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.node[i].frame_idx == frame_id) { 360166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin index = i; 360266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 360366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 360466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 360566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X index :%d", index); 360666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return index; 360766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 360866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 360966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 361066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_frame_sync_lock_queues 361166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 361266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Lock all channel queues present in node info 361366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 361466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 361566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 361666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_frame_sync_lock_queues() { 361766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t j = 0; 361866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E "); 361966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (j = 0; j < MAX_NUM_CAMERA_PER_BUNDLE; j++) { 362066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.ch_obj[j]) { 362166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t *ch_queue = 362266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &fs.ch_obj[j]->bundle.superbuf_queue; 362366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_queue) { 362466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&ch_queue->que.lock); 362566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL("Done locking fs.ch_obj[%d] ", j); 362666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 362766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 362866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 362966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&fs_lock); 363066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X "); 363166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 363266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 363366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 363466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_frame_sync_unlock_queues 363566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 363666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Unlock all channel queues 363766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 363866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 363966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 364066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_frame_sync_unlock_queues() { 364166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Unlock all queues 364266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t j = 0; 364366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E "); 364466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&fs_lock); 364566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL("Done unlocking fs "); 364666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (j = 0; j < MAX_NUM_CAMERA_PER_BUNDLE; j++) { 364766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fs.ch_obj[j]) { 364866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_queue_t *ch_queue = 364966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &fs.ch_obj[j]->bundle.superbuf_queue; 365066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ch_queue) { 365166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&ch_queue->que.lock); 365266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL("Done unlocking fs.ch_obj[%d] ", j); 365366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 365466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 365566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 365666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X "); 365766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 365866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 365966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 366066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : mm_channel_node_qbuf 366166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 366266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: qbuf all buffers in a node 366366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 366466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 366566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch_obj : Channel info 366666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @node : node to qbuf 366766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 366866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 366966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 367066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_channel_node_qbuf(mm_channel_t *ch_obj, mm_channel_queue_node_t *node) { 367166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t i; 367266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!ch_obj || !node) { 367366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 367466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 367566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < node->num_of_bufs; i++) { 367666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_channel_qbuf(ch_obj, node->super_buf[i].buf); 367766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 367866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 367966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 3680