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