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 ®_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