16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * Redistribution and use in source and binary forms, with or without
46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * modification, are permitted provided that the following conditions are
56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * met:
66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Redistributions of source code must retain the above copyright
76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       notice, this list of conditions and the following disclaimer.
86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Redistributions in binary form must reproduce the above
96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       copyright notice, this list of conditions and the following
106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       disclaimer in the documentation and/or other materials provided
116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       with the distribution.
126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Neither the name of The Linux Foundation nor the names of its
136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       contributors may be used to endorse or promote products derived
146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       from this software without specific prior written permission.
156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev */
296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <pthread.h>
316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <errno.h>
326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/ioctl.h>
336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/types.h>
346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/stat.h>
356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <fcntl.h>
366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <poll.h>
376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <time.h>
386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <cam_semaphore.h>
396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#ifdef VENUS_PRESENT
406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <media/msm_media_info.h>
416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif
426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "mm_camera_dbg.h"
446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "mm_camera_interface.h"
456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "mm_camera.h"
466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* internal function decalre */
486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_qbuf(mm_stream_t *my_obj,
496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       mm_camera_buf_def_t *buf);
506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_set_ext_mode(mm_stream_t * my_obj);
516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_set_fmt(mm_stream_t * my_obj);
526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_sync_info(mm_stream_t *my_obj);
536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_init_bufs(mm_stream_t * my_obj);
546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_deinit_bufs(mm_stream_t * my_obj);
556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_request_buf(mm_stream_t * my_obj);
566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_unreg_buf(mm_stream_t * my_obj);
576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_release(mm_stream_t *my_obj);
586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_set_parm(mm_stream_t *my_obj,
596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           cam_stream_parm_buffer_t *value);
606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_get_parm(mm_stream_t *my_obj,
616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           cam_stream_parm_buffer_t *value);
626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_do_action(mm_stream_t *my_obj,
636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            void *in_value);
646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_streamon(mm_stream_t *my_obj);
656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_streamoff(mm_stream_t *my_obj);
666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_read_msm_frame(mm_stream_t * my_obj,
676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                 mm_camera_buf_info_t* buf_info,
686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                 uint8_t num_planes);
696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_config(mm_stream_t *my_obj,
706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                         mm_camera_stream_config_t *config);
716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_reg_buf(mm_stream_t * my_obj);
726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_buf_done(mm_stream_t * my_obj,
736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           mm_camera_buf_def_t *frame);
746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset(mm_stream_t *my_obj);
756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_preview(cam_format_t fmt,
766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                      cam_dimension_t *dim,
776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                      cam_stream_buf_plane_info_t *buf_planes);
786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_snapshot(cam_format_t fmt,
796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_dimension_t *dim,
806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_padding_info_t *padding,
816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_stream_buf_plane_info_t *buf_planes);
826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_raw(cam_format_t fmt,
836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  cam_dimension_t *dim,
846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  cam_padding_info_t *padding,
856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  cam_stream_buf_plane_info_t *buf_planes);
866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_video(cam_dimension_t *dim,
876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                    cam_stream_buf_plane_info_t *buf_planes);
886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_metadata(cam_dimension_t *dim,
896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_padding_info_t *padding,
906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_stream_buf_plane_info_t *buf_planes);
916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_postproc(cam_stream_info_t *stream_info,
926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_padding_info_t *padding,
936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_stream_buf_plane_info_t *buf_planes);
946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* state machine function declare */
976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_inited(mm_stream_t * my_obj,
986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             mm_stream_evt_type_t evt,
996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * in_val,
1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * out_val);
1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_acquired(mm_stream_t * my_obj,
1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               mm_stream_evt_type_t evt,
1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               void * in_val,
1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               void * out_val);
1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_cfg(mm_stream_t * my_obj,
1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          mm_stream_evt_type_t evt,
1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          void * in_val,
1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          void * out_val);
1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_buffed(mm_stream_t * my_obj,
1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             mm_stream_evt_type_t evt,
1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * in_val,
1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * out_val);
1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_reg(mm_stream_t * my_obj,
1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          mm_stream_evt_type_t evt,
1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          void * in_val,
1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          void * out_val);
1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_active(mm_stream_t * my_obj,
1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             mm_stream_evt_type_t evt,
1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * in_val,
1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * out_val);
1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevuint32_t mm_stream_get_v4l2_fmt(cam_format_t fmt);
1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_handle_rcvd_buf
1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to handle newly received stream buffer
1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cam_obj : stream object
1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_info: ptr to struct storing buffer information
1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid mm_stream_handle_rcvd_buf(mm_stream_t *my_obj,
1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               mm_camera_buf_info_t *buf_info,
1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               uint8_t has_cb)
1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* enqueue to super buf thread */
1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (my_obj->is_bundled) {
1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mm_camera_cmdcb_t* node = NULL;
1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* send cam_sem_post to wake up channel cmd thread to enqueue to super buffer */
1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t));
1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (NULL != node) {
1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            memset(node, 0, sizeof(mm_camera_cmdcb_t));
1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            node->cmd_type = MM_CAMERA_CMD_TYPE_DATA_CB;
1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            node->u.buf = *buf_info;
1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* enqueue to cmd thread */
1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            cam_queue_enq(&(my_obj->ch_obj->cmd_thread.cmd_queue), node);
1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* wake up cmd thread */
1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            cam_sem_post(&(my_obj->ch_obj->cmd_thread.cmd_sem));
1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            CDBG_ERROR("%s: No memory for mm_camera_node_t", __func__);
1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(has_cb) {
1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mm_camera_cmdcb_t* node = NULL;
1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* send cam_sem_post to wake up cmd thread to dispatch dataCB */
1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t));
1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (NULL != node) {
1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            memset(node, 0, sizeof(mm_camera_cmdcb_t));
1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            node->cmd_type = MM_CAMERA_CMD_TYPE_DATA_CB;
1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            node->u.buf = *buf_info;
1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* enqueue to cmd thread */
1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            cam_queue_enq(&(my_obj->cmd_thread.cmd_queue), node);
1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* wake up cmd thread */
1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            cam_sem_post(&(my_obj->cmd_thread.cmd_sem));
1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            CDBG_ERROR("%s: No memory for mm_camera_node_t", __func__);
1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_data_notify
1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: callback to handle data notify from kernel
1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @user_data : user data ptr (stream object)
1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic void mm_stream_data_notify(void* user_data)
1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_stream_t *my_obj = (mm_stream_t*)user_data;
1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t idx = -1, i, rc;
1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t has_cb = 0;
1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_buf_info_t buf_info;
2006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == my_obj) {
2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (MM_STREAM_STATE_ACTIVE != my_obj->state) {
2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* this Cb will only received in active_stream_on state
2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         * if not so, return here */
2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: ERROR!! Wrong state (%d) to receive data notify!",
2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, my_obj->state);
2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&buf_info, 0, sizeof(mm_camera_buf_info_t));
2166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mm_stream_read_msm_frame(my_obj, &buf_info, my_obj->frame_offset.num_planes);
2176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != 0) {
2186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
2196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    idx = buf_info.buf->buf_idx;
2216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&my_obj->cb_lock);
2236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (i = 0; i < MM_CAMERA_STREAM_BUF_CB_MAX; i++) {
2246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if(NULL != my_obj->buf_cb[i].cb) {
2256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* for every CB, add ref count */
2266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            has_cb = 1;
2276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            break;
2286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
2296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&my_obj->cb_lock);
2316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&my_obj->buf_lock);
2336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* update buffer location */
2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->buf_status[idx].in_kernel = 0;
2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* update buf ref count */
2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (my_obj->is_bundled) {
2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* need to add into super buf since bundled, add ref count */
2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->buf_status[idx].buf_refcnt++;
2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->buf_status[idx].buf_refcnt += has_cb;
2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&my_obj->buf_lock);
2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_stream_handle_rcvd_buf(my_obj, &buf_info, has_cb);
2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_dispatch_app_data
2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: dispatch stream buffer to registered users
2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cmd_cb  : ptr storing stream buffer information
2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @userdata: user data ptr (stream object)
2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic void mm_stream_dispatch_app_data(mm_camera_cmdcb_t *cmd_cb,
2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        void* user_data)
2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int i;
2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_stream_t * my_obj = (mm_stream_t *)user_data;
2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_buf_info_t* buf_info = NULL;
2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_super_buf_t super_buf;
2656a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab    mm_camera_cmd_thread_name("mm_cam_stream");
2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == my_obj) {
2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
2696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (MM_CAMERA_CMD_TYPE_DATA_CB != cmd_cb->cmd_type) {
2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: Wrong cmd_type (%d) for dataCB",
2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, cmd_cb->cmd_type);
2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_info = &cmd_cb->u.buf;
2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&super_buf, 0, sizeof(mm_camera_super_buf_t));
2816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    super_buf.num_bufs = 1;
2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    super_buf.bufs[0] = buf_info->buf;
2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    super_buf.camera_handle = my_obj->ch_obj->cam_obj->my_hdl;
2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    super_buf.ch_id = my_obj->ch_obj->my_hdl;
2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&my_obj->cb_lock);
2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for(i = 0; i < MM_CAMERA_STREAM_BUF_CB_MAX; i++) {
2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if(NULL != my_obj->buf_cb[i].cb) {
2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (my_obj->buf_cb[i].cb_count != 0) {
2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                /* if <0, means infinite CB
2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                 * if >0, means CB for certain times
2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                 * both case we need to call CB */
2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                /* increase buf ref cnt */
2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                pthread_mutex_lock(&my_obj->buf_lock);
2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                my_obj->buf_status[buf_info->buf->buf_idx].buf_refcnt++;
2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                pthread_mutex_unlock(&my_obj->buf_lock);
2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                /* callback */
3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                my_obj->buf_cb[i].cb(&super_buf,
3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                     my_obj->buf_cb[i].user_data);
3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
3036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* if >0, reduce count by 1 every time we called CB until reaches 0
3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev             * when count reach 0, reset the buf_cb to have no CB */
3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (my_obj->buf_cb[i].cb_count > 0) {
3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                my_obj->buf_cb[i].cb_count--;
3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (0 == my_obj->buf_cb[i].cb_count) {
3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    my_obj->buf_cb[i].cb = NULL;
3106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    my_obj->buf_cb[i].user_data = NULL;
3116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&my_obj->cb_lock);
3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* do buf_done since we increased refcnt by one when has_cb */
3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_stream_buf_done(my_obj, buf_info->buf);
3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_fsm_fn
3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stream finite state machine entry function. Depends on stream
3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              state, incoming event will be handled differently.
3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
3286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj   : ptr to a stream object
3296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : stream event to be processed
3306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @in_val   : input event payload. Can be NULL if not needed.
3316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @out_val  : output payload, Can be NULL if not needed.
3326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
3346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
3356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
3366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
3376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_fn(mm_stream_t *my_obj,
3386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                         mm_stream_evt_type_t evt,
3396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                         void * in_val,
3406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                         void * out_val)
3416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = -1;
3436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
3456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
3466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (my_obj->state) {
3476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_STATE_NOTUSED:
3486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG("%s: Not handling evt in unused state", __func__);
3496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_STATE_INITED:
3516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_fsm_inited(my_obj, evt, in_val, out_val);
3526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_STATE_ACQUIRED:
3546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_fsm_acquired(my_obj, evt, in_val, out_val);
3556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_STATE_CFG:
3576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_fsm_cfg(my_obj, evt, in_val, out_val);
3586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_STATE_BUFFED:
3606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_fsm_buffed(my_obj, evt, in_val, out_val);
3616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_STATE_REG:
3636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_fsm_reg(my_obj, evt, in_val, out_val);
3646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_STATE_ACTIVE:
3666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_fsm_active(my_obj, evt, in_val, out_val);
3676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
3696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG("%s: Not a valid state (%d)", __func__, my_obj->state);
3706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
3716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s : X rc =%d",__func__,rc);
3736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
3746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
3776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_fsm_inited
3786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stream finite state machine function to handle event in INITED
3806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              state.
3816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
3836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj   : ptr to a stream object
3846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : stream event to be processed
3856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @in_val   : input event payload. Can be NULL if not needed.
3866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @out_val  : output payload, Can be NULL if not needed.
3876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
3896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
3906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
3916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
3926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_inited(mm_stream_t *my_obj,
3936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             mm_stream_evt_type_t evt,
3946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * in_val,
3956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * out_val)
3966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
3986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    char dev_name[MM_CAMERA_DEV_NAME_LEN];
3996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
4016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
4026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch(evt) {
4036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_ACQUIRE:
4046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if ((NULL == my_obj->ch_obj) || (NULL == my_obj->ch_obj->cam_obj)) {
4056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            CDBG_ERROR("%s: NULL channel or camera obj\n", __func__);
4066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = -1;
4076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            break;
4086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        snprintf(dev_name, sizeof(dev_name), "/dev/%s",
4116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                 mm_camera_util_get_dev_name(my_obj->ch_obj->cam_obj->my_hdl));
4126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->fd = open(dev_name, O_RDWR | O_NONBLOCK);
4146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (my_obj->fd <= 0) {
4156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            CDBG_ERROR("%s: open dev returned %d\n", __func__, my_obj->fd);
4166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = -1;
4176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            break;
4186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG("%s: open dev fd = %d\n", __func__, my_obj->fd);
4206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_set_ext_mode(my_obj);
4216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (0 == rc) {
4226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->state = MM_STREAM_STATE_ACQUIRED;
4236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
4246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* failed setting ext_mode
4256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev             * close fd */
4266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            close(my_obj->fd);
4276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->fd = 0;
4286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            break;
4296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
4326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: invalid state (%d) for evt (%d), in(%p), out(%p)",
4336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, my_obj->state, evt, in_val, out_val);
4346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
4376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_fsm_acquired
4416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stream finite state machine function to handle event in AQUIRED
4436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              state.
4446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
4466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj   : ptr to a stream object
4476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : stream event to be processed
4486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @in_val   : input event payload. Can be NULL if not needed.
4496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @out_val  : output payload, Can be NULL if not needed.
4506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
4526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
4536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
4546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_acquired(mm_stream_t *my_obj,
4566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               mm_stream_evt_type_t evt,
4576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               void * in_val,
4586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               void * out_val)
4596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
4616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
4636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
4646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch(evt) {
4656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_SET_FMT:
4666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_camera_stream_config_t *config =
4686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_camera_stream_config_t *)in_val;
4696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_config(my_obj, config);
4716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* change state to configed */
4736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->state = MM_STREAM_STATE_CFG;
4746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            break;
4766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_RELEASE:
4786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_release(my_obj);
4796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* change state to not used */
4806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         my_obj->state = MM_STREAM_STATE_NOTUSED;
4816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_SET_PARM:
4836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_evt_paylod_set_get_stream_parms_t *payload =
4856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_evt_paylod_set_get_stream_parms_t *)in_val;
4866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_set_parm(my_obj, payload->parms);
4876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_GET_PARM:
4906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
4916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_evt_paylod_set_get_stream_parms_t *payload =
4926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_evt_paylod_set_get_stream_parms_t *)in_val;
4936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_get_parm(my_obj, payload->parms);
4946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
4956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
4966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
4976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: invalid state (%d) for evt (%d), in(%p), out(%p)",
4986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, my_obj->state, evt, in_val, out_val);
4996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s :X rc = %d", __func__, rc);
5016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
5026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_fsm_cfg
5066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stream finite state machine function to handle event in CONFIGURED
5086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              state.
5096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
5116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj   : ptr to a stream object
5126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : stream event to be processed
5136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @in_val   : input event payload. Can be NULL if not needed.
5146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @out_val  : output payload, Can be NULL if not needed.
5156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
5176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
5186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
5196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_cfg(mm_stream_t * my_obj,
5216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          mm_stream_evt_type_t evt,
5226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          void * in_val,
5236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          void * out_val)
5246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
5266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
5276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
5286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch(evt) {
5296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_SET_FMT:
5306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
5316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_camera_stream_config_t *config =
5326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_camera_stream_config_t *)in_val;
5336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_config(my_obj, config);
5356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* change state to configed */
5376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->state = MM_STREAM_STATE_CFG;
5386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            break;
5406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_RELEASE:
5426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_release(my_obj);
5436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->state = MM_STREAM_STATE_NOTUSED;
5446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
5456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_SET_PARM:
5466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
5476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_evt_paylod_set_get_stream_parms_t *payload =
5486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_evt_paylod_set_get_stream_parms_t *)in_val;
5496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_set_parm(my_obj, payload->parms);
5506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
5526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_GET_PARM:
5536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
5546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_evt_paylod_set_get_stream_parms_t *payload =
5556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_evt_paylod_set_get_stream_parms_t *)in_val;
5566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_get_parm(my_obj, payload->parms);
5576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
5596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_GET_BUF:
5606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_init_bufs(my_obj);
5616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* change state to buff allocated */
5626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if(0 == rc) {
5636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->state = MM_STREAM_STATE_BUFFED;
5646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
5666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
5676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: invalid state (%d) for evt (%d), in(%p), out(%p)",
5686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, my_obj->state, evt, in_val, out_val);
5696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s :X rc = %d", __func__, rc);
5716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
5726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_fsm_buffed
5766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stream finite state machine function to handle event in BUFFED
5786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              state.
5796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
5816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj   : ptr to a stream object
5826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : stream event to be processed
5836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @in_val   : input event payload. Can be NULL if not needed.
5846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @out_val  : output payload, Can be NULL if not needed.
5856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
5876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
5886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
5896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_buffed(mm_stream_t * my_obj,
5916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             mm_stream_evt_type_t evt,
5926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * in_val,
5936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * out_val)
5946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
5966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
5976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
5986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch(evt) {
5996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_PUT_BUF:
6006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_deinit_bufs(my_obj);
6016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* change state to configed */
6026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if(0 == rc) {
6036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->state = MM_STREAM_STATE_CFG;
6046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_REG_BUF:
6076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_reg_buf(my_obj);
6086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* change state to regged */
6096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if(0 == rc) {
6106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->state = MM_STREAM_STATE_REG;
6116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_SET_PARM:
6146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
6156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_evt_paylod_set_get_stream_parms_t *payload =
6166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_evt_paylod_set_get_stream_parms_t *)in_val;
6176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_set_parm(my_obj, payload->parms);
6186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_GET_PARM:
6216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
6226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_evt_paylod_set_get_stream_parms_t *payload =
6236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_evt_paylod_set_get_stream_parms_t *)in_val;
6246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_get_parm(my_obj, payload->parms);
6256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
6286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: invalid state (%d) for evt (%d), in(%p), out(%p)",
6296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, my_obj->state, evt, in_val, out_val);
6306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s :X rc = %d", __func__, rc);
6326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
6336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
6346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
6366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_fsm_reg
6376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stream finite state machine function to handle event in REGGED
6396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              state.
6406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
6426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj   : ptr to a stream object
6436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : stream event to be processed
6446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @in_val   : input event payload. Can be NULL if not needed.
6456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @out_val  : output payload, Can be NULL if not needed.
6466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
6486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
6496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
6506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
6516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_reg(mm_stream_t * my_obj,
6526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          mm_stream_evt_type_t evt,
6536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          void * in_val,
6546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          void * out_val)
6556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
6566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
6576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
6586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
6596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch(evt) {
6616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_UNREG_BUF:
6626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_unreg_buf(my_obj);
6636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* change state to buffed */
6656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->state = MM_STREAM_STATE_BUFFED;
6666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_START:
6686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
6696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            uint8_t has_cb = 0;
6706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            uint8_t i;
6716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* launch cmd thread if CB is not null */
6726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pthread_mutex_lock(&my_obj->cb_lock);
6736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            for (i = 0; i < MM_CAMERA_STREAM_BUF_CB_MAX; i++) {
6746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if(NULL != my_obj->buf_cb[i].cb) {
6756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    has_cb = 1;
6766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    break;
6776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
6786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
6796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pthread_mutex_unlock(&my_obj->cb_lock);
6806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (has_cb) {
6826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                mm_camera_cmd_thread_launch(&my_obj->cmd_thread,
6836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            mm_stream_dispatch_app_data,
6846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            (void *)my_obj);
6856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
6866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->state = MM_STREAM_STATE_ACTIVE;
6886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_streamon(my_obj);
6896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (0 != rc) {
6906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                /* failed stream on, need to release cmd thread if it's launched */
6916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (has_cb) {
6926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    mm_camera_cmd_thread_release(&my_obj->cmd_thread);
6936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
6946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                my_obj->state = MM_STREAM_STATE_REG;
6956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
6966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
6976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
6996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_SET_PARM:
7006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_evt_paylod_set_get_stream_parms_t *payload =
7026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_evt_paylod_set_get_stream_parms_t *)in_val;
7036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_set_parm(my_obj, payload->parms);
7046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_GET_PARM:
7076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_evt_paylod_set_get_stream_parms_t *payload =
7096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_evt_paylod_set_get_stream_parms_t *)in_val;
7106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_get_parm(my_obj, payload->parms);
7116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
7146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: invalid state (%d) for evt (%d), in(%p), out(%p)",
7156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, my_obj->state, evt, in_val, out_val);
7166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s :X rc = %d", __func__, rc);
7186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
7196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_fsm_active
7236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stream finite state machine function to handle event in ACTIVE
7256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              state.
7266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
7286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj   : ptr to a stream object
7296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt      : stream event to be processed
7306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @in_val   : input event payload. Can be NULL if not needed.
7316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @out_val  : output payload, Can be NULL if not needed.
7326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
7346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
7356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
7366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
7376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_fsm_active(mm_stream_t * my_obj,
7386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             mm_stream_evt_type_t evt,
7396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * in_val,
7406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void * out_val)
7416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
7426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
7436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
7446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
7456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch(evt) {
7466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_QBUF:
7476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_buf_done(my_obj, (mm_camera_buf_def_t *)in_val);
7486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_STOP:
7506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            uint8_t has_cb = 0;
7526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            uint8_t i;
7536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_streamoff(my_obj);
7546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pthread_mutex_lock(&my_obj->cb_lock);
7566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            for (i = 0; i < MM_CAMERA_STREAM_BUF_CB_MAX; i++) {
7576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if(NULL != my_obj->buf_cb[i].cb) {
7586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    has_cb = 1;
7596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    break;
7606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
7616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
7626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pthread_mutex_unlock(&my_obj->cb_lock);
7636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (has_cb) {
7656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                mm_camera_cmd_thread_release(&my_obj->cmd_thread);
7666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
7676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->state = MM_STREAM_STATE_REG;
7686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_SET_PARM:
7716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_evt_paylod_set_get_stream_parms_t *payload =
7736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_evt_paylod_set_get_stream_parms_t *)in_val;
7746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_set_parm(my_obj, payload->parms);
7756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_GET_PARM:
7786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
7796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mm_evt_paylod_set_get_stream_parms_t *payload =
7806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (mm_evt_paylod_set_get_stream_parms_t *)in_val;
7816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_get_parm(my_obj, payload->parms);
7826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case MM_STREAM_EVT_DO_ACTION:
7856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_do_action(my_obj, in_val);
7866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
7876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
7886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: invalid state (%d) for evt (%d), in(%p), out(%p)",
7896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, my_obj->state, evt, in_val, out_val);
7906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s :X rc = %d", __func__, rc);
7926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
7936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_config
7976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: configure a stream
7996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
8016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
8026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @config       : stream configuration
8036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
8056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
8066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
8076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
8086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_config(mm_stream_t *my_obj,
8096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                         mm_camera_stream_config_t *config)
8106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
8116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
8126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
8136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
8146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->stream_info = config->stream_info;
8156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->buf_num = 0;
8166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->mem_vtbl = config->mem_vtbl;
8176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->padding_info = config->padding_info;
8186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* cd through intf always palced at idx 0 of buf_cb */
8196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->buf_cb[0].cb = config->stream_cb;
8206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->buf_cb[0].user_data = config->userdata;
8216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->buf_cb[0].cb_count = -1; /* infinite by default */
8226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mm_stream_sync_info(my_obj);
8246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == 0) {
8256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_set_fmt(my_obj);
8266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
8286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
8296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
8316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_release
8326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: release a stream resource
8346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
8366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
8376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
8396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
8406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
8416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
8426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_release(mm_stream_t *my_obj)
8436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
8446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
8456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
8466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* close fd */
8486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(my_obj->fd > 0)
8496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    {
8506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        close(my_obj->fd);
8516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* destroy mutex */
8546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_destroy(&my_obj->buf_lock);
8556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_destroy(&my_obj->cb_lock);
8566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* reset stream obj */
8586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(my_obj, 0, sizeof(mm_stream_t));
8596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return 0;
8616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
8626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
8646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_streamon
8656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stream on a stream. sending v4l2 request to kernel
8676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
8696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
8706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
8726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
8736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
8746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
8756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_streamon(mm_stream_t *my_obj)
8766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
8776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc;
8786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    enum v4l2_buf_type buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
8796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
8816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
882b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab
8836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = ioctl(my_obj->fd, VIDIOC_STREAMON, &buf_type);
8846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc < 0) {
8856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: ioctl VIDIOC_STREAMON failed: rc=%d\n",
8866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, rc);
8876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* remove fd from data poll thread in case of failure */
888b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        mm_camera_poll_thread_del_poll_fd(&my_obj->ch_obj->poll_thread[0], my_obj->my_hdl, mm_camera_sync_call);
8896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s :X rc = %d",__func__,rc);
8916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
8926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
8936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
8956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_streamoff
8966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stream off a stream. sending v4l2 request to kernel
8986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
9006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
9016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
9036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
9046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
9056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
9066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_streamoff(mm_stream_t *my_obj)
9076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
9086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc;
9096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    enum v4l2_buf_type buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
9106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
9116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
9126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* step1: remove fd from data poll thread */
914b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab    mm_camera_poll_thread_del_poll_fd(&my_obj->ch_obj->poll_thread[0], my_obj->my_hdl, mm_camera_sync_call);
9156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* step2: stream off */
9176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = ioctl(my_obj->fd, VIDIOC_STREAMOFF, &buf_type);
9186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc < 0) {
9196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: STREAMOFF failed: %s\n",
9206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                __func__, strerror(errno));
9216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
9226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s :X rc = %d",__func__,rc);
9236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
9246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
9256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
9276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_read_msm_frame
9286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: dequeue a stream buffer from kernel queue
9306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
9326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
9336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_info     : ptr to a struct storing buffer information
9346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @num_planes   : number of planes in the buffer
9356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
9376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
9386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
9396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
9406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_read_msm_frame(mm_stream_t * my_obj,
9416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                 mm_camera_buf_info_t* buf_info,
9426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                 uint8_t num_planes)
9436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
9446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
9456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct v4l2_buffer vb;
9466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct v4l2_plane planes[VIDEO_MAX_PLANES];
9476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
9486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
9496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&vb,  0,  sizeof(vb));
9516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    vb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
9526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    vb.memory = V4L2_MEMORY_USERPTR;
9536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    vb.m.planes = &planes[0];
9546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    vb.length = num_planes;
9556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = ioctl(my_obj->fd, VIDIOC_DQBUF, &vb);
9576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc < 0) {
9586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: VIDIOC_DQBUF ioctl call failed (rc=%d)\n",
9596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, rc);
9606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
961b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        pthread_mutex_lock(&my_obj->buf_lock);
962b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        my_obj->queued_buffer_count--;
963b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        if(my_obj->queued_buffer_count == 0) {
964b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab            CDBG_HIGH("%s: Stoping poll on stream %p type :%d", __func__, my_obj, my_obj->stream_info->stream_type);
965b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab            mm_camera_poll_thread_del_poll_fd(&my_obj->ch_obj->poll_thread[0], my_obj->my_hdl, mm_camera_async_call);
966b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab            CDBG_HIGH("%s: Stopped poll on stream %p type :%d", __func__, my_obj, my_obj->stream_info->stream_type);
967b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        }
968b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        pthread_mutex_unlock(&my_obj->buf_lock);
9696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        int8_t idx = vb.index;
9706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_info->buf = &my_obj->buf[idx];
9716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_info->frame_idx = vb.sequence;
9726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_info->stream_id = my_obj->my_hdl;
9736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_info->buf->stream_id = my_obj->my_hdl;
9756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_info->buf->buf_idx = idx;
9766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_info->buf->frame_idx = vb.sequence;
9776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_info->buf->ts.tv_sec  = vb.timestamp.tv_sec;
9786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_info->buf->ts.tv_nsec = vb.timestamp.tv_usec * 1000;
979013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab        CDBG("%s: VIDIOC_DQBUF buf_index %d, frame_idx %d, stream type %d\n",
9806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev             __func__, vb.index, buf_info->buf->frame_idx, my_obj->stream_info->stream_type);
981634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev        if ( NULL != my_obj->mem_vtbl.clean_invalidate_buf ) {
982634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev            rc = my_obj->mem_vtbl.clean_invalidate_buf(idx,
983634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev                                                       my_obj->mem_vtbl.user_data);
984634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev            if ( 0 > rc ) {
985634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev                CDBG_ERROR("%s: Clean invalidate cache failed on buffer index: %d",
986634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev                           __func__,
987634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev                           idx);
988634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev                return rc;
989634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev            }
990634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev        } else {
991634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev            CDBG_ERROR(" %s : Clean invalidate cache op not supported\n", __func__);
992634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev        }
9936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
9946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s :X rc = %d",__func__,rc);
9966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
9976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
9986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
10006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_set_parms
10016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set parameters per stream
10036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
10056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
10066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @in_value     : ptr to a param struct to be set to server
10076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
10096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
10106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
10116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE       : Assume the parms struct buf is already mapped to server via
10126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              domain socket. Corresponding fields of parameters to be set
10136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              are already filled in by upper layer caller.
10146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
10156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_set_parm(mm_stream_t *my_obj,
10166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           cam_stream_parm_buffer_t *in_value)
10176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
10186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = -1;
10196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t value = 0;
10206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (in_value != NULL) {
10216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_camera_util_s_ctrl(my_obj->fd, CAM_PRIV_STREAM_PARM, &value);
10226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
10246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
10256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
10276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_get_parms
10286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get parameters per stream
10306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
10326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
10336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @in_value     : ptr to a param struct to be get from server
10346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
10366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
10376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
10386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE       : Assume the parms struct buf is already mapped to server via
10396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              domain socket. Corresponding fields of parameters to be get
10406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              are already filled in by upper layer caller.
10416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
10426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_get_parm(mm_stream_t *my_obj,
10436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           cam_stream_parm_buffer_t *in_value)
10446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
10456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = -1;
10466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t value = 0;
10476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (in_value != NULL) {
10486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_camera_util_g_ctrl(my_obj->fd, CAM_PRIV_STREAM_PARM, &value);
10496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
10516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
10526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
10546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_do_actions
10556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: request server to perform stream based actions
10576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
10596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
10606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @in_value     : ptr to a struct of actions to be performed by the server
10616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
10636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
10646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
10656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE       : Assume the action struct buf is already mapped to server via
10666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              domain socket. Corresponding fields of actions to be performed
10676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              are already filled in by upper layer caller.
10686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
10696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_do_action(mm_stream_t *my_obj,
10706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            void *in_value)
10716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
10726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = -1;
10736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t value = 0;
10746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (in_value != NULL) {
10756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_camera_util_s_ctrl(my_obj->fd, CAM_PRIV_STREAM_PARM, &value);
10766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
10786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
10796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
10816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_set_ext_mode
10826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set stream extended mode to server via v4l2 ioctl
10846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
10866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
10876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
10896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
10906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
10916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE       : Server will return a server stream id that uniquely identify
10926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              this stream on server side. Later on communication to server
10936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              per stream should use this server stream id.
10946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
10956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_set_ext_mode(mm_stream_t * my_obj)
10966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
10976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
10986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct v4l2_streamparm s_parm;
10996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
11006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
11016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&s_parm, 0, sizeof(s_parm));
11036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    s_parm.type =  V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
11046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = ioctl(my_obj->fd, VIDIOC_S_PARM, &s_parm);
11066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s:stream fd=%d, rc=%d, extended_mode=%d\n",
11076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->fd, rc, s_parm.parm.capture.extendedmode);
11086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == 0) {
11096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* get server stream id */
11106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->server_stream_id = s_parm.parm.capture.extendedmode;
11116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
11126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
11136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
11146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
11166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_qbuf
11176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enqueue buffer back to kernel queue for furture use
11196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
11216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
11226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf          : ptr to a struct storing buffer information
11236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
11256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
11266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
11276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
11286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_qbuf(mm_stream_t *my_obj, mm_camera_buf_def_t *buf)
11296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
11306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
11316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct v4l2_buffer buffer;
1132634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev    struct v4l2_plane planes[VIDEO_MAX_PLANES];
11336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
11346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
11356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1136634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev    memcpy(planes, buf->planes, sizeof(planes));
11376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&buffer, 0, sizeof(buffer));
11386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
11396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buffer.memory = V4L2_MEMORY_USERPTR;
11406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buffer.index = buf->buf_idx;
11416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buffer.m.planes = &planes[0];
11426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buffer.length = buf->num_planes;
11436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s:plane 0: stream_hdl=%d,fd=%d,frame idx=%d,num_planes = %d, offset = %d, data_offset = %d\n", __func__,
11456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         buf->stream_id, buf->fd, buffer.index, buffer.length, buf->planes[0].reserved[0], buf->planes[0].data_offset);
1146634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev    CDBG("%s:plane 1: stream_hdl=%d,fd=%d,frame idx=%d,num_planes = %d, offset = %d, data_offset = %d\n", __func__,
11476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         buf->stream_id, buf->fd, buffer.index, buffer.length, buf->planes[1].reserved[0], buf->planes[1].data_offset);
11486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1149634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev    if ( NULL != my_obj->mem_vtbl.invalidate_buf ) {
1150634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev        rc = my_obj->mem_vtbl.invalidate_buf(buffer.index,
1151634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev                                             my_obj->mem_vtbl.user_data);
1152634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev        if ( 0 > rc ) {
1153634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev            CDBG_ERROR("%s: Cache invalidate failed on buffer index: %d",
1154634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev                       __func__,
1155634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev                       buffer.index);
1156634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev            return rc;
1157634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev        }
1158634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev    } else {
1159634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev        CDBG_ERROR("%s: Cache invalidate op not added", __func__);
1160634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev    }
1161634d42519c54c3effadde23cfe03ca1e03888a96Emilian Peev
1162b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab    my_obj->queued_buffer_count++;
1163b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab    if(my_obj->queued_buffer_count == 1) {
1164b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        /* Add fd to data poll thread */
1165b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        CDBG_HIGH("%s: Starting poll on stream %p type :%d", __func__, my_obj,my_obj->stream_info->stream_type);
1166b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        rc = mm_camera_poll_thread_add_poll_fd(&my_obj->ch_obj->poll_thread[0],
1167b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab                my_obj->my_hdl,
1168b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab                my_obj->fd,
1169b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab                mm_stream_data_notify,
117050906e4f6b6c8058ae8d2c59eccf142918621904Shuzhen Wang                (void*)my_obj,
117150906e4f6b6c8058ae8d2c59eccf142918621904Shuzhen Wang                mm_camera_async_call);
1172b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        CDBG_HIGH("%s: Started poll on stream %p type :%d", __func__, my_obj,my_obj->stream_info->stream_type);
1173b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        if (rc < 0) {
1174742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang            CDBG_ERROR("%s: add poll fd error", __func__);
1175b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab            return rc;
1176b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab        }
1177b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab    }
1178b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab
11796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = ioctl(my_obj->fd, VIDIOC_QBUF, &buffer);
11806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: qbuf idx:%d, rc:%d", __func__, buffer.index, rc);
11816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
11826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
11836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
11856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_request_buf
11866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: This function let kernel know the amount of buffers need to
11886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              be registered via v4l2 ioctl.
11896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
11916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
11926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
11946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
11956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
11966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
11976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_request_buf(mm_stream_t * my_obj)
11986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
11996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
12006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct v4l2_requestbuffers bufreq;
12016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t buf_num = my_obj->buf_num;
12026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
12036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
12046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(buf_num > MM_CAMERA_MAX_NUM_FRAMES) {
12066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: buf num %d > max limit %d\n",
12076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, buf_num, MM_CAMERA_MAX_NUM_FRAMES);
12086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return -1;
12096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
12106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&bufreq, 0, sizeof(bufreq));
12126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    bufreq.count = buf_num;
12136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    bufreq.type  = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
12146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    bufreq.memory = V4L2_MEMORY_USERPTR;
12156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = ioctl(my_obj->fd, VIDIOC_REQBUFS, &bufreq);
12166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc < 0) {
12176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      CDBG_ERROR("%s: fd=%d, ioctl VIDIOC_REQBUFS failed: rc=%d\n",
12186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev           __func__, my_obj->fd, rc);
12196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
12206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s :X rc = %d",__func__,rc);
12216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
12226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
12236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
12256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_map_buf
12266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: mapping stream buffer via domain socket to server
12286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
12306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
12316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_type     : type of buffer to be mapped. could be following values:
12326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   CAM_MAPPING_BUF_TYPE_STREAM_BUF
12336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   CAM_MAPPING_BUF_TYPE_STREAM_INFO
12346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
12356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @frame_idx    : index of buffer within the stream buffers, only valid if
12366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or
12376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
12386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @plane_idx    : plane index. If all planes share the same fd,
12396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   plane_idx = -1; otherwise, plean_idx is the
12406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   index to plane (0..num_of_planes)
12416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @fd           : file descriptor of the buffer
12426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @size         : size of the buffer
12436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
12456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
12466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
12476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
12486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_map_buf(mm_stream_t * my_obj,
12496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          uint8_t buf_type,
12506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          uint32_t frame_idx,
12516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          int32_t plane_idx,
12526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          int fd,
12536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          uint32_t size)
12546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
12556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == my_obj || NULL == my_obj->ch_obj || NULL == my_obj->ch_obj->cam_obj) {
12566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: NULL obj of stream/channel/camera", __func__);
12576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return -1;
12586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
12596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_sock_packet_t packet;
12616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&packet, 0, sizeof(cam_sock_packet_t));
12626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.msg_type = CAM_MAPPING_TYPE_FD_MAPPING;
12636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.payload.buf_map.type = buf_type;
12646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.payload.buf_map.fd = fd;
12656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.payload.buf_map.size = size;
12666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.payload.buf_map.stream_id = my_obj->server_stream_id;
12676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.payload.buf_map.frame_idx = frame_idx;
12686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.payload.buf_map.plane_idx = plane_idx;
12696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mm_camera_util_sendmsg(my_obj->ch_obj->cam_obj,
12706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  &packet,
12716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  sizeof(cam_sock_packet_t),
12726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  fd);
12736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
12746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
12766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_unmap_buf
12776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: unmapping stream buffer via domain socket to server
12796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
12816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
12826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_type     : type of buffer to be unmapped. could be following values:
12836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   CAM_MAPPING_BUF_TYPE_STREAM_BUF
12846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   CAM_MAPPING_BUF_TYPE_STREAM_INFO
12856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
12866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @frame_idx    : index of buffer within the stream buffers, only valid if
12876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or
12886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
12896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @plane_idx    : plane index. If all planes share the same fd,
12906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   plane_idx = -1; otherwise, plean_idx is the
12916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   index to plane (0..num_of_planes)
12926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
12946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
12956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
12966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
12976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_unmap_buf(mm_stream_t * my_obj,
12986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            uint8_t buf_type,
12996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            uint32_t frame_idx,
13006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            int32_t plane_idx)
13016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
13026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == my_obj || NULL == my_obj->ch_obj || NULL == my_obj->ch_obj->cam_obj) {
13036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: NULL obj of stream/channel/camera", __func__);
13046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return -1;
13056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
13066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_sock_packet_t packet;
13086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&packet, 0, sizeof(cam_sock_packet_t));
13096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.msg_type = CAM_MAPPING_TYPE_FD_UNMAPPING;
13106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.payload.buf_unmap.type = buf_type;
13116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.payload.buf_unmap.stream_id = my_obj->server_stream_id;
13126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.payload.buf_unmap.frame_idx = frame_idx;
13136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    packet.payload.buf_unmap.plane_idx = plane_idx;
13146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mm_camera_util_sendmsg(my_obj->ch_obj->cam_obj,
13156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  &packet,
13166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  sizeof(cam_sock_packet_t),
13176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  0);
13186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
13196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
13216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_map_buf_ops
13226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: ops for mapping stream buffer via domain socket to server.
13246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              This function will be passed to upper layer as part of ops table
13256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              to be used by upper layer when allocating stream buffers and mapping
13266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              buffers to server via domain socket.
13276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
13296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @frame_idx    : index of buffer within the stream buffers, only valid if
13306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or
13316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
13326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @plane_idx    : plane index. If all planes share the same fd,
13336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   plane_idx = -1; otherwise, plean_idx is the
13346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   index to plane (0..num_of_planes)
13356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @fd           : file descriptor of the buffer
13366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @size         : size of the buffer
13376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @userdata     : user data ptr (stream object)
13386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
13406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
13416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
13426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
13436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic int32_t mm_stream_map_buf_ops(uint32_t frame_idx,
13446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                     int32_t plane_idx,
13456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                     int fd,
13466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                     uint32_t size,
13476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                     void *userdata)
13486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
13496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_stream_t *my_obj = (mm_stream_t *)userdata;
13506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mm_stream_map_buf(my_obj,
13516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             CAM_MAPPING_BUF_TYPE_STREAM_BUF,
13526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             frame_idx, plane_idx, fd, size);
13536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
13546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
13566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_unmap_buf_ops
13576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: ops for unmapping stream buffer via domain socket to server.
13596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              This function will be passed to upper layer as part of ops table
13606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              to be used by upper layer when allocating stream buffers and unmapping
13616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              buffers to server via domain socket.
13626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
13646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @frame_idx    : index of buffer within the stream buffers, only valid if
13656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   buf_type is CAM_MAPPING_BUF_TYPE_STREAM_BUF or
13666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF
13676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @plane_idx    : plane index. If all planes share the same fd,
13686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   plane_idx = -1; otherwise, plean_idx is the
13696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   index to plane (0..num_of_planes)
13706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @userdata     : user data ptr (stream object)
13716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
13736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
13746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
13756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
13766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic int32_t mm_stream_unmap_buf_ops(uint32_t frame_idx,
13776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       int32_t plane_idx,
13786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       void *userdata)
13796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
13806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_stream_t *my_obj = (mm_stream_t *)userdata;
13816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mm_stream_unmap_buf(my_obj,
13826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               CAM_MAPPING_BUF_TYPE_STREAM_BUF,
13836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               frame_idx,
13846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               plane_idx);
13856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
13866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
13886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_init_bufs
13896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: initialize stream buffers needed. This function will request
13916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              buffers needed from upper layer through the mem ops table passed
13926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              during configuration stage.
13936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
13956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj  : stream object
13966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
13986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
13996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
14006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
14016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_init_bufs(mm_stream_t * my_obj)
14026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
14036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t i, rc = 0;
14046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t *reg_flags = NULL;
14056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_map_unmap_ops_tbl_t ops_tbl;
14066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
14076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
14086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* deinit buf if it's not NULL*/
14106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL != my_obj->buf) {
14116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mm_stream_deinit_bufs(my_obj);
14126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
14136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ops_tbl.map_ops = mm_stream_map_buf_ops;
14156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ops_tbl.unmap_ops = mm_stream_unmap_buf_ops;
14166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ops_tbl.userdata = my_obj;
14176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = my_obj->mem_vtbl.get_bufs(&my_obj->frame_offset,
14196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                   &my_obj->buf_num,
14206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                   &reg_flags,
14216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                   &my_obj->buf,
14226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                   &ops_tbl,
14236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                   my_obj->mem_vtbl.user_data);
14246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (0 != rc) {
14266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: Error get buf, rc = %d\n", __func__, rc);
14276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
14286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
14296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->buf_status =
14316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        (mm_stream_buf_status_t *)malloc(sizeof(mm_stream_buf_status_t) * my_obj->buf_num);
14326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == my_obj->buf_status) {
14346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: No memory for buf_status", __func__);
14356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mm_stream_deinit_bufs(my_obj);
14366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        free(reg_flags);
14376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return -1;
14386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
14396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(my_obj->buf_status, 0, sizeof(mm_stream_buf_status_t) * my_obj->buf_num);
14416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (i = 0; i < my_obj->buf_num; i++) {
14426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->buf_status[i].initial_reg_flag = reg_flags[i];
14436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->buf[i].stream_id = my_obj->my_hdl;
14446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->buf[i].stream_type = my_obj->stream_info->stream_type;
14456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
14466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    free(reg_flags);
14486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    reg_flags = NULL;
14496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
14516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
14526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
14546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_deinit_bufs
14556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
14566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return stream buffers to upper layer through the mem ops table
14576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              passed during configuration stage.
14586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
14596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
14606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj  : stream object
14616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
14626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
14636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
14646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
14656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
14666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_deinit_bufs(mm_stream_t * my_obj)
14676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
14686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
14696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_map_unmap_ops_tbl_t ops_tbl;
14706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
14716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
14726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == my_obj->buf) {
14746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG("%s: Buf is NULL, no need to deinit", __func__);
14756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
14766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
14776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* release bufs */
14796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ops_tbl.map_ops = mm_stream_map_buf_ops;
14806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ops_tbl.unmap_ops = mm_stream_unmap_buf_ops;
14816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ops_tbl.userdata = my_obj;
14826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = my_obj->mem_vtbl.put_bufs(&ops_tbl,
14846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                   my_obj->mem_vtbl.user_data);
14856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    free(my_obj->buf);
14876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->buf = NULL;
14886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (my_obj->buf_status != NULL) {
14896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        free(my_obj->buf_status);
14906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->buf_status = NULL;
14916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
14926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
14946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
14956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
14976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_reg_buf
14986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
14996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: register buffers with kernel by calling v4l2 ioctl QBUF for
15006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              each buffer in the stream
15016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
15036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj  : stream object
15046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
15066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
15076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
15086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
15096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_reg_buf(mm_stream_t * my_obj)
15106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
15116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
15126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t i;
15136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
15146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
15156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mm_stream_request_buf(my_obj);
15176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != 0) {
15186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
15196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
15206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&my_obj->buf_lock);
15226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for(i = 0; i < my_obj->buf_num; i++){
15236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* check if need to qbuf initially */
15246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (my_obj->buf_status[i].initial_reg_flag) {
15256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_qbuf(my_obj, &my_obj->buf[i]);
15266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc != 0) {
15276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                CDBG_ERROR("%s: VIDIOC_QBUF rc = %d\n", __func__, rc);
15286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
15296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
15306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->buf_status[i].buf_refcnt = 0;
15316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->buf_status[i].in_kernel = 1;
15326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
15336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            /* the buf is held by upper layer, will not queue into kernel.
15346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev             * add buf reference count */
15356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->buf_status[i].buf_refcnt = 1;
15366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->buf_status[i].in_kernel = 0;
15376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
15386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
15396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&my_obj->buf_lock);
15406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
15426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
15436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
15456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_unreg buf
15466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: unregister all stream buffers from kernel
15486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
15506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj  : stream object
15516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
15536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
15546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
15556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
15566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_unreg_buf(mm_stream_t * my_obj)
15576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
15586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct v4l2_requestbuffers bufreq;
15596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t i, rc = 0;
15606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
15616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
15626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* unreg buf to kernel */
15646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    bufreq.count = 0;
15656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    bufreq.type  = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
15666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    bufreq.memory = V4L2_MEMORY_USERPTR;
15676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = ioctl(my_obj->fd, VIDIOC_REQBUFS, &bufreq);
15686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc < 0) {
15696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: fd=%d, VIDIOC_REQBUFS failed, rc=%d\n",
15706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev              __func__, my_obj->fd, rc);
15716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
15726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* reset buf reference count */
15746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&my_obj->buf_lock);
15756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL != my_obj->buf_status) {
15766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        for(i = 0; i < my_obj->buf_num; i++){
15776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->buf_status[i].buf_refcnt = 0;
15786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->buf_status[i].in_kernel = 0;
15796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
15806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
15816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&my_obj->buf_lock);
15826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
15846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
15856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
15876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_get_v4l2_fmt
15886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: translate camera image format into FOURCC code
15906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
15926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @fmt     : camera image format
15936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : FOURCC code for image format
15956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
15966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevuint32_t mm_stream_get_v4l2_fmt(cam_format_t fmt)
15976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
15986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t val;
15996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch(fmt) {
16006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_420_NV12:
16016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        val = V4L2_PIX_FMT_NV12;
16026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_420_NV21:
16046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        val = V4L2_PIX_FMT_NV21;
16056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG:
16076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GRBG:
16086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_10BPP_RGGB:
16096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_10BPP_BGGR:
16106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        val= V4L2_PIX_FMT_SBGGR10;
16116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_422_NV61:
16136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        val= V4L2_PIX_FMT_NV61;
16146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_RAW_8BIT_YUYV:
16166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        val= V4L2_PIX_FMT_YUYV;
16176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_RAW_8BIT_YVYU:
16196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        val= V4L2_PIX_FMT_YVYU;
16206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_RAW_8BIT_UYVY:
16226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        val= V4L2_PIX_FMT_UYVY;
16236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_RAW_8BIT_VYUY:
16256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        val= V4L2_PIX_FMT_VYUY;
16266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_420_YV12:
16286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        val= V4L2_PIX_FMT_NV12;
16296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16307fde32d818742141a39fda194e66b84109182affEmilian Peev    case CAM_FORMAT_YUV_422_NV16:
16317fde32d818742141a39fda194e66b84109182affEmilian Peev        val= V4L2_PIX_FMT_NV16;
16327fde32d818742141a39fda194e66b84109182affEmilian Peev        break;
16336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
16346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        val = 0;
16356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: Unknown fmt=%d", __func__, fmt);
16366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
16386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: fmt=%d, val =%d", __func__, fmt, val);
16396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return val;
16406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
16416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
16436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_calc_offset_preview
16446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: calculate preview/postview frame offset based on format and
16466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              padding information
16476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
16496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @fmt     : image format
16506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @dim     : image dimension
16516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_planes : [out] buffer plane information
16526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
16546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
16556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
16566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
16576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_preview(cam_format_t fmt,
16586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                      cam_dimension_t *dim,
16596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                      cam_stream_buf_plane_info_t *buf_planes)
16606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
16616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
16626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int stride = 0, scanline = 0;
16636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (fmt) {
16656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_420_NV12:
16666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_420_NV21:
16676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* 2 planes: Y + CbCr */
16686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 2;
16696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width, CAM_PAD_TO_16);
16716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline = PAD_TO_SIZE(dim->height, CAM_PAD_TO_2);
16726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
16736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len = stride * scanline;
16746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x = 0;
16756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
16766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
16776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
16786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width, CAM_PAD_TO_16);
16806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline = PAD_TO_SIZE(dim->height / 2, CAM_PAD_TO_2);
16816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset = 0;
16826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].len =
16836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stride * scanline;
16846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_x = 0;
16856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_y = 0;
16866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].stride = stride;
16876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].scanline = scanline;
16886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
16906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len +
16916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        buf_planes->plane_info.mp[1].len,
16926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAM_PAD_TO_4K);
16936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
16946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_420_NV21_ADRENO:
16956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* 2 planes: Y + CbCr */
16966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 2;
16976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width, CAM_PAD_TO_32);
16996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline = PAD_TO_SIZE(dim->height, CAM_PAD_TO_32);
17006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
17016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
17026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline,
17036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAM_PAD_TO_4K);
17046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x = 0;
17056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
17066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
17076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
17086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width / 2, CAM_PAD_TO_32) * 2;
17106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline = PAD_TO_SIZE(dim->height / 2, CAM_PAD_TO_32);
17116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset = 0;
17126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].len =
17136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline,
17146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAM_PAD_TO_4K);
17156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_x = 0;
17166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_y = 0;
17176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].stride = stride;
17186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].scanline = scanline;
17196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
17216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len +
17226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        buf_planes->plane_info.mp[1].len,
17236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAM_PAD_TO_4K);
17246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_420_YV12:
17266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* 3 planes: Y + Cr + Cb */
17276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 3;
17286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width, CAM_PAD_TO_16);
17306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline = PAD_TO_SIZE(dim->height, CAM_PAD_TO_2);
17316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
17326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len = stride * scanline;
17336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x = 0;
17346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
17356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
17366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
17376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(stride / 2, CAM_PAD_TO_16);
17396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline = scanline / 2;
17406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset = 0;
17416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].len =
17426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stride * scanline;
17436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_x = 0;
17446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_y = 0;
17456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].stride = stride;
17466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].scanline = scanline;
17476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].offset = 0;
17496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].len =
17506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stride * scanline;
17516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].offset_x = 0;
17526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].offset_y = 0;
17536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].stride = stride;
17546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].scanline = scanline;
17556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
17576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len +
17586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        buf_planes->plane_info.mp[1].len +
17596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        buf_planes->plane_info.mp[2].len,
17606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAM_PAD_TO_4K);
17616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_422_NV16:
17636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_422_NV61:
17646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* 2 planes: Y + CbCr */
17656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 2;
17666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width, CAM_PAD_TO_16);
17686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline = dim->height;
17696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
17706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len = stride * scanline;
17716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x = 0;
17726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
17736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
17746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
17756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset = 0;
17776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].len = stride * scanline;
17786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_x = 0;
17796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_y = 0;
17806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].stride = stride;
17816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].scanline = scanline;
17826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
17846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len +
17856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        buf_planes->plane_info.mp[1].len,
17866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAM_PAD_TO_4K);
17876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
17896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: Invalid cam_format for preview %d",
17906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, fmt);
17916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = -1;
17926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
17946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
17966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
17976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
17996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_calc_offset_snapshot
18006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
18016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: calculate snapshot/postproc frame offset based on format and
18026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              padding information
18036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
18046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
18056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @fmt     : image format
18066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @dim     : image dimension
18076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @padding : padding information
18086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_planes : [out] buffer plane information
18096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
18106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
18116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
18126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
18136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
18146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_snapshot(cam_format_t fmt,
18156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_dimension_t *dim,
18166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_padding_info_t *padding,
18176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_stream_buf_plane_info_t *buf_planes)
18186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
18196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
18206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t isAFamily = mm_camera_util_chip_is_a_family();
18216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int offset_x = 0, offset_y = 0;
18226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int stride = 0, scanline = 0;
18236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (isAFamily) {
18256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = dim->width;
1826b2b7907666ba95f2aa4aa19ad8533b265fdc7d0eShuzhen Wang        scanline = PAD_TO_SIZE(dim->height, CAM_PAD_TO_16);
18276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        offset_x = 0;
18286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        offset_y = scanline - dim->height;
18296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline += offset_y; /* double padding */
18306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
18316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width,
18326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             padding->width_padding);
18336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline = PAD_TO_SIZE(dim->height,
18346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               padding->height_padding);
18356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        offset_x = 0;
18366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        offset_y = 0;
18376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
18386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (fmt) {
18406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_420_NV12:
18416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_420_NV21:
18426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* 2 planes: Y + CbCr */
18436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 2;
18446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
18466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline,
18476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        padding->plane_padding);
18486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset =
18496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(offset_x + stride * offset_y,
18506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        padding->plane_padding);
18516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x = offset_x;
18526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = offset_y;
18536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
18546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
18556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline = scanline / 2;
18576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].len =
18586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline,
18596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        padding->plane_padding);
18606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset =
18616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(offset_x + stride * offset_y,
18626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        padding->plane_padding);
18636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_x = offset_x;
18646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_y = offset_y;
18656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].stride = stride;
18666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].scanline = scanline;
18676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
18696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len +
18706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        buf_planes->plane_info.mp[1].len,
18716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAM_PAD_TO_4K);
18726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_420_YV12:
18746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* 3 planes: Y + Cr + Cb */
18756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 3;
18766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset =
18786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(offset_x + stride * offset_y,
18796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        padding->plane_padding);
18806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
18816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline, padding->plane_padding);
18826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x = offset_x;
18836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = offset_y;
18846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
18856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
18866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(stride / 2, CAM_PAD_TO_16);
18886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        scanline = scanline / 2;
18896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset =
18906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(offset_x + stride * offset_y,
18916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        padding->plane_padding);
18926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].len =
18936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline, padding->plane_padding);
18946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_x = offset_x;
18956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_y = offset_y;
18966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].stride = stride;
18976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].scanline = scanline;
18986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].offset =
19006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(offset_x + stride * offset_y,
19016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        padding->plane_padding);
19026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].len =
19036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline, padding->plane_padding);
19046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].offset_x = offset_x;
19056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].offset_y = offset_y;
19066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].stride = stride;
19076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[2].scanline = scanline;
19086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
19106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len +
19116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        buf_planes->plane_info.mp[1].len +
19126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        buf_planes->plane_info.mp[2].len,
19136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAM_PAD_TO_4K);
19146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_422_NV16:
19166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_422_NV61:
19176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* 2 planes: Y + CbCr */
19186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 2;
19196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
19206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline, padding->plane_padding);
19216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset =
19226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(offset_x + stride * offset_y,
19236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        padding->plane_padding);
19246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x = offset_x;
19256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = offset_y;
19266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
19276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
19286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].len =
19306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline, padding->plane_padding);
19316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset =
19326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(offset_x + stride * offset_y,
19336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        padding->plane_padding);
19346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_x = offset_x;
19356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].offset_y = offset_y;
19366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].stride = stride;
19376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[1].scanline = scanline;
19386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len = PAD_TO_SIZE(
19406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            buf_planes->plane_info.mp[0].len + buf_planes->plane_info.mp[1].len,
19416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            CAM_PAD_TO_4K);
19426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
19446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: Invalid cam_format for snapshot %d",
19456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, fmt);
19466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = -1;
19476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
19496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
19516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
19526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
19546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_calc_offset_raw
19556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
19566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: calculate raw frame offset based on format and padding information
19576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
19586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
19596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @fmt     : image format
19606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @dim     : image dimension
19616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @padding : padding information
19626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_planes : [out] buffer plane information
19636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
19646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
19656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
19666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
19676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
19686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_raw(cam_format_t fmt,
19696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  cam_dimension_t *dim,
19706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  cam_padding_info_t *padding,
19716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  cam_stream_buf_plane_info_t *buf_planes)
19726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
19736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
19746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int stride = 0;
19756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int scanline = dim->height;
19766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (fmt) {
19786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_RAW_8BIT_YUYV:
19796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_RAW_8BIT_YVYU:
19806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_RAW_8BIT_UYVY:
19816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_YUV_RAW_8BIT_VYUY:
19824b5791669581534e633ee7ac4b37a5215437f4f4Muhua Li    case CAM_FORMAT_JPEG_RAW_8BIT:
19834b5791669581534e633ee7ac4b37a5215437f4f4Muhua Li    case CAM_FORMAT_META_RAW_8BIT:
19846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* 1 plane */
19856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* Every 16 pixels occupy 16 bytes */
19866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width, CAM_PAD_TO_16);
19876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 1;
19886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
19896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
19906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline * 2, padding->plane_padding);
19916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
19926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len, CAM_PAD_TO_4K);
19936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x =0;
19946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
19956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
19966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
19976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
19986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GBRG:
19996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_8BPP_GRBG:
20006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_8BPP_RGGB:
20016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_8BPP_BGGR:
20026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GBRG:
20036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GRBG:
20046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_8BPP_RGGB:
20056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_8BPP_BGGR:
20066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GBRG:
20076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_GRBG:
20086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_RGGB:
20096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_8BPP_BGGR:
20106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GBRG:
20116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_GRBG:
20126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_RGGB:
20136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_8BPP_BGGR:
20146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GBRG:
20156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_GRBG:
20166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_RGGB:
20176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN8_8BPP_BGGR:
20186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* 1 plane */
20196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* Every 16 pixels occupy 16 bytes */
20206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width, CAM_PAD_TO_16);
20216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 1;
20226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
20236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
20246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline, padding->plane_padding);
20256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
20266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len, CAM_PAD_TO_4K);
20276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x =0;
20286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
20296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
20306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
20316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GBRG:
20336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_10BPP_GRBG:
20346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_10BPP_RGGB:
20356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_10BPP_BGGR:
20366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GBRG:
20376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_GRBG:
20386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_RGGB:
20396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_10BPP_BGGR:
20406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* Every 12 pixels occupy 16 bytes */
20416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = (dim->width + 11)/12 * 12;
20426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 1;
20436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
20446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
20456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline * 8 / 6, padding->plane_padding);
20466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
20476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len, CAM_PAD_TO_4K);
20486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x =0;
20496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
20506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
20516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
20526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GBRG:
20546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_12BPP_GRBG:
20556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_12BPP_RGGB:
20566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_QCOM_RAW_12BPP_BGGR:
20576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GBRG:
20586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_GRBG:
20596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_RGGB:
20606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_QCOM_12BPP_BGGR:
20616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* Every 10 pixels occupy 16 bytes */
20626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = (dim->width + 9)/10 * 10;
20636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 1;
20646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
20656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
20666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline * 8 / 5, padding->plane_padding);
20676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
20686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len, CAM_PAD_TO_4K);
20696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x =0;
20706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
20716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
20726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
20736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG:
20756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GRBG:
20766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_10BPP_RGGB:
20776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_10BPP_BGGR:
20786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GBRG:
20796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_GRBG:
20806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_RGGB:
20816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_10BPP_BGGR:
20826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* Every 64 pixels occupy 80 bytes */
20836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width * 5 / 4, CAM_PAD_TO_8);
20846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 1;
20856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
20866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
20876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline, padding->plane_padding);
20886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
20896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len, CAM_PAD_TO_4K);
20906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x =0;
20916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
20926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
20936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
20946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
20956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GBRG:
20966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_12BPP_GRBG:
20976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_12BPP_RGGB:
20986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_MIPI_RAW_12BPP_BGGR:
20996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GBRG:
21006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_GRBG:
21016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_RGGB:
21026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_MIPI_12BPP_BGGR:
21036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* Every 32 pixels occupy 48 bytes */
21046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width, CAM_PAD_TO_32);
21056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 1;
21066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
21076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
21086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline * 3 / 2, padding->plane_padding);
21096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
21106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len, CAM_PAD_TO_4K);
21116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x =0;
21126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
21136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
21146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
21156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GBRG:
21176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_GRBG:
21186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_RGGB:
21196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_8BPP_BGGR:
21206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GBRG:
21216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_GRBG:
21226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_RGGB:
21236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_10BPP_BGGR:
21246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GBRG:
21256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_GRBG:
21266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_RGGB:
21276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FORMAT_BAYER_IDEAL_RAW_PLAIN16_12BPP_BGGR:
21286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* Every 8 pixels occupy 16 bytes */
21296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stride = PAD_TO_SIZE(dim->width, CAM_PAD_TO_8);
21306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.num_planes = 1;
21316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset = 0;
21326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len =
21336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(stride * scanline * 2, padding->plane_padding);
21346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len =
21356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            PAD_TO_SIZE(buf_planes->plane_info.mp[0].len, CAM_PAD_TO_4K);
21366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_x =0;
21376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].offset_y = 0;
21386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].stride = stride;
21396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].scanline = scanline;
21406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
21426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: Invalid cam_format %d for raw stream",
21436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, fmt);
21446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = -1;
21456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
21476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
21496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
21506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
21526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_calc_offset_video
21536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
21546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: calculate video frame offset based on format and
21556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              padding information
21566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
21576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
21586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @dim     : image dimension
21596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_planes : [out] buffer plane information
21606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
21616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
21626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
21636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
21646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
21656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#ifdef VENUS_PRESENT
21666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_video(cam_dimension_t *dim,
21676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                    cam_stream_buf_plane_info_t *buf_planes)
21686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
21696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int stride = 0, scanline = 0;
21706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // using Venus
21726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, dim->width);
21736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    scanline = VENUS_Y_SCANLINES(COLOR_FMT_NV12, dim->height);
21746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.frame_len =
21766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        VENUS_BUFFER_SIZE(COLOR_FMT_NV12, dim->width, dim->height);
21776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.num_planes = 2;
21786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].len = stride * scanline;
21796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].offset = 0;
21806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].offset_x =0;
21816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].offset_y = 0;
21826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].stride = stride;
21836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].scanline = scanline;
21846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    stride = VENUS_UV_STRIDE(COLOR_FMT_NV12, dim->width);
21856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    scanline = VENUS_UV_SCANLINES(COLOR_FMT_NV12, dim->height);
21866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].len =
21876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.frame_len - buf_planes->plane_info.mp[0].len;
21886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].offset = 0;
21896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].offset_x =0;
21906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].offset_y = 0;
21916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].stride = stride;
21926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].scanline = scanline;
21936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return 0;
21956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
21966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#else
21976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_video(cam_dimension_t *dim,
21986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                    cam_stream_buf_plane_info_t *buf_planes)
21996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
22006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int stride = 0, scanline = 0;
22016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.num_planes = 2;
22036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    stride = dim->width;
22056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    scanline = dim->height;
22066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].len =
22076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        PAD_TO_SIZE(stride * scanline, CAM_PAD_TO_2K);
22086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].offset = 0;
22096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].offset_x =0;
22106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].offset_y = 0;
22116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].stride = stride;
22126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].scanline = scanline;
22136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    stride = dim->width;
22156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    scanline = dim->height / 2;
22166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].len =
22176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        PAD_TO_SIZE(stride * scanline, CAM_PAD_TO_2K);
22186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].offset = 0;
22196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].offset_x =0;
22206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].offset_y = 0;
22216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].stride = stride;
22226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[1].scanline = scanline;
22236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.frame_len =
22256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        PAD_TO_SIZE(buf_planes->plane_info.mp[0].len +
22266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    buf_planes->plane_info.mp[1].len,
22276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    CAM_PAD_TO_4K);
22286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return 0;
22306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
22316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif
22326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
22346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_calc_offset_metadata
22356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: calculate metadata frame offset based on format and
22376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              padding information
22386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
22406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @dim     : image dimension
22416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @padding : padding information
22426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_planes : [out] buffer plane information
22436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
22456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
22466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
22476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
22486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_metadata(cam_dimension_t *dim,
22496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_padding_info_t *padding,
22506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_stream_buf_plane_info_t *buf_planes)
22516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
22526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
22536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.num_planes = 1;
22546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].offset = 0;
22556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].len =
22566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        PAD_TO_SIZE(dim->width * dim->height, padding->plane_padding);
22576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.frame_len =
22586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        buf_planes->plane_info.mp[0].len;
22596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].offset_x =0;
22616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].offset_y = 0;
22626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].stride = dim->width;
22636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buf_planes->plane_info.mp[0].scanline = dim->height;
22646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
22656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
22666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
22686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_calc_offset_postproc
22696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: calculate postprocess frame offset
22716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
22736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @stream_info: ptr to stream info
22746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @padding : padding information
22756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_planes : [out] buffer plane information
22766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
22786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
22796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
22806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
22816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset_postproc(cam_stream_info_t *stream_info,
22826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_padding_info_t *padding,
22836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       cam_stream_buf_plane_info_t *buf_planes)
22846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
22856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
22866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (stream_info->reprocess_config.pp_type == CAM_OFFLINE_REPROCESS_TYPE) {
2287744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        if (buf_planes->plane_info.frame_len == 0) {
2288744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            // take offset from input source
2289744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            *buf_planes = stream_info->reprocess_config.offline.input_buf_planes;
22906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
2291744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        return rc;
22926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
22936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (stream_info->reprocess_config.online.input_stream_type) {
22956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_PREVIEW:
2296025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy    case CAM_STREAM_TYPE_CALLBACK:
22976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_POSTVIEW:
22986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_calc_offset_preview(stream_info->fmt,
2299744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                           &stream_info->dim,
23006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                           buf_planes);
23016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_SNAPSHOT:
2303025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy    case CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT:
23046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_calc_offset_snapshot(stream_info->fmt,
2305744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                            &stream_info->dim,
23066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            padding,
23076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            buf_planes);
23086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_VIDEO:
2310744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        rc = mm_stream_calc_offset_video(&stream_info->dim,
23116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                         buf_planes);
23126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_RAW:
23146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_calc_offset_raw(stream_info->fmt,
2315744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                                       &stream_info->dim,
23166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       padding,
23176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       buf_planes);
23186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_METADATA:
2320744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy        rc = mm_stream_calc_offset_metadata(&stream_info->dim,
23216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            padding,
23226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            buf_planes);
23236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
23256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: not supported for stream type %d",
23266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, stream_info->reprocess_config.online.input_stream_type);
23276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = -1;
23286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
23306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
23316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
23326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
23336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
23346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_calc_offset
23356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: calculate frame offset based on format and padding information
23376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
23396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj  : stream object
23406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
23426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
23436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
23446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
23456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_calc_offset(mm_stream_t *my_obj)
23466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
23476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
23486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
23496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_dimension_t dim = my_obj->stream_info->dim;
23506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (my_obj->stream_info->pp_config.feature_mask & CAM_QCOM_FEATURE_ROTATION) {
23516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (my_obj->stream_info->pp_config.rotation == ROTATE_90 ||
23526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->stream_info->pp_config.rotation == ROTATE_270) {
23536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // rotated by 90 or 270, need to switch width and height
23546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            dim.width = my_obj->stream_info->dim.height;
23556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            dim.height = my_obj->stream_info->dim.width;
23566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
23586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
23596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (my_obj->stream_info->stream_type) {
23606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_PREVIEW:
2361025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy    case CAM_STREAM_TYPE_CALLBACK:
23626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_POSTVIEW:
23636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_calc_offset_preview(my_obj->stream_info->fmt,
23646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                           &dim,
23656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                           &my_obj->stream_info->buf_planes);
23666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_SNAPSHOT:
2368025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy    case CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT:
23696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_calc_offset_snapshot(my_obj->stream_info->fmt,
23706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            &dim,
23716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            &my_obj->padding_info,
23726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            &my_obj->stream_info->buf_planes);
23736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_OFFLINE_PROC:
23756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_calc_offset_postproc(my_obj->stream_info,
23766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            &my_obj->padding_info,
23776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            &my_obj->stream_info->buf_planes);
23786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_VIDEO:
23806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_calc_offset_video(&dim,
23816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                         &my_obj->stream_info->buf_planes);
23826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_RAW:
23846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_calc_offset_raw(my_obj->stream_info->fmt,
23856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       &dim,
23866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       &my_obj->padding_info,
23876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       &my_obj->stream_info->buf_planes);
23886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_METADATA:
23906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_stream_calc_offset_metadata(&dim,
23916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            &my_obj->padding_info,
23926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            &my_obj->stream_info->buf_planes);
23936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
23956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: not supported for stream type %d",
23966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, my_obj->stream_info->stream_type);
23976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = -1;
23986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
23996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
24006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->frame_offset = my_obj->stream_info->buf_planes.plane_info;
24026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
24036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
24046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
24066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_sync_info
24076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: synchronize stream information with server
24096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
24116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj  : stream object
24126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
24146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
24156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
24166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE       : assume stream info buffer is mapped to server and filled in with
24176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              stream information by upper layer. This call will let server to
24186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              synchornize the stream information with HAL. If server find any
24196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              fields that need to be changed accroding to hardware configuration,
24206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              server will modify corresponding fields so that HAL could know
24216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              about it.
24226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
24236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_sync_info(mm_stream_t *my_obj)
24246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
24256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
24266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t value = 0;
24276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    my_obj->stream_info->stream_svr_id = my_obj->server_stream_id;
24286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mm_stream_calc_offset(my_obj);
24296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == 0) {
24316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mm_camera_util_s_ctrl(my_obj->fd,
24326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                   CAM_PRIV_STREAM_INFO_SYNC,
24336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                   &value);
24346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
24356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
24366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
24376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
24396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_set_fmt
24406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set stream format to kernel via v4l2 ioctl
24426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
24446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj  : stream object
24456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
24476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
24486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
24496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
24506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_set_fmt(mm_stream_t *my_obj)
24516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
24526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
24536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct v4l2_format fmt;
24546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct msm_v4l2_format_data msm_fmt;
24556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int i;
24566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
24586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
24596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (my_obj->stream_info->dim.width == 0 ||
24616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->stream_info->dim.height == 0) {
24626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s:invalid input[w=%d,h=%d,fmt=%d]\n",
24636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__,
24646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   my_obj->stream_info->dim.width,
24656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   my_obj->stream_info->dim.height,
24666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   my_obj->stream_info->fmt);
24676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return -1;
24686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
24696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&fmt, 0, sizeof(fmt));
24716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&msm_fmt, 0, sizeof(msm_fmt));
24726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
24736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    msm_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
24746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    msm_fmt.width = my_obj->stream_info->dim.width;
24756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    msm_fmt.height = my_obj->stream_info->dim.height;
24766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    msm_fmt.pixelformat = mm_stream_get_v4l2_fmt(my_obj->stream_info->fmt);
24776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    msm_fmt.num_planes = my_obj->frame_offset.num_planes;
24786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (i = 0; i < msm_fmt.num_planes; i++) {
24796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        msm_fmt.plane_sizes[i] = my_obj->frame_offset.mp[i].len;
24806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
24816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memcpy(fmt.fmt.raw_data, &msm_fmt, sizeof(msm_fmt));
24836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = ioctl(my_obj->fd, VIDIOC_S_FMT, &fmt);
24846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
24856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
24866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
24886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_buf_done
24896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enqueue buffer back to kernel
24916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
24936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
24946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @frame        : frame to be enqueued back to kernel
24956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
24976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
24986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
24996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
25006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_buf_done(mm_stream_t * my_obj,
25016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           mm_camera_buf_def_t *frame)
25026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
25036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
25046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
25056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
25066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&my_obj->buf_lock);
25086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(my_obj->buf_status[frame->buf_idx].buf_refcnt == 0) {
25096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG("%s: Error Trying to free second time?(idx=%d) count=%d\n",
25106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   __func__, frame->buf_idx,
25116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   my_obj->buf_status[frame->buf_idx].buf_refcnt);
25126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = -1;
25136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }else{
25146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        my_obj->buf_status[frame->buf_idx].buf_refcnt--;
25156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (0 == my_obj->buf_status[frame->buf_idx].buf_refcnt) {
25167ee407aa1024789089aad411c372c79423699976Ajay Dudani            CDBG("<DEBUG> : Buf done for buffer:%d, stream:%d", frame->buf_idx, frame->stream_type);
25176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mm_stream_qbuf(my_obj, frame);
25186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if(rc < 0) {
25196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                CDBG_ERROR("%s: mm_camera_stream_qbuf(idx=%d) err=%d\n",
25206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           __func__, frame->buf_idx, rc);
25216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
25226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                my_obj->buf_status[frame->buf_idx].in_kernel = 1;
25236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
25246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }else{
25256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            CDBG("<DEBUG> : Still ref count pending count :%d",
25266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                 my_obj->buf_status[frame->buf_idx].buf_refcnt);
25276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            CDBG("<DEBUG> : for buffer:%p:%d",
25286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                 my_obj, frame->buf_idx);
25296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
25306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
25316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&my_obj->buf_lock);
25326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
25336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
25346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
25366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : mm_stream_reg_buf_cb
25376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Allow other stream to register dataCB at this stream.
25396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
25416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @my_obj       : stream object
25426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @val          : ptr to info about the callback to be registered
25436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
25456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0  -- success
25466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              -1 -- failure
25476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
25486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_stream_reg_buf_cb(mm_stream_t *my_obj,
25496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             mm_stream_data_cb_t *val)
25506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
25516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = -1;
25526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t i;
25536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG("%s: E, my_handle = 0x%x, fd = %d, state = %d",
25546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         __func__, my_obj->my_hdl, my_obj->fd, my_obj->state);
25556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&my_obj->cb_lock);
25576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (i=0 ;i < MM_CAMERA_STREAM_BUF_CB_MAX; i++) {
25586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if(NULL == my_obj->buf_cb[i].cb) {
25596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            my_obj->buf_cb[i] = *val;
25606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = 0;
25616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            break;
25626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
25636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
25646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&my_obj->cb_lock);
25656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
25676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2568