1e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* 2c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen WangCopyright (c) 2011-2012,2015, The Linux Foundation. All rights reserved. 3e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 4e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevRedistribution and use in source and binary forms, with or without 5e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevmodification, are permitted provided that the following conditions are 6e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevmet: 7e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev * Redistributions of source code must retain the above copyright 8e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev notice, this list of conditions and the following disclaimer. 9e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev * Redistributions in binary form must reproduce the above 10e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev copyright notice, this list of conditions and the following 11e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev disclaimer in the documentation and/or other materials provided 12e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev with the distribution. 13e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev * Neither the name of The Linux Foundation nor the names of its 14e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev contributors may be used to endorse or promote products derived 15e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev from this software without specific prior written permission. 16e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 17e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev*/ 29e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 30e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <pthread.h> 31e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include "mm_camera_dbg.h" 32e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <errno.h> 33e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <linux/msm_ion.h> 34e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <sys/ioctl.h> 35e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <sys/types.h> 36e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <sys/stat.h> 37e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <fcntl.h> 38e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <poll.h> 39e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include "mm_camera_interface2.h" 40e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include "mm_camera.h" 41e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 42e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#if 0 43e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#undef CDBG 44e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define CDBG ALOGV 45e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#endif 46e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* static functions prototype declarations */ 47e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int mm_camera_channel_skip_frames(mm_camera_obj_t *my_obj, 48e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_queue_t *mq, 49e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_queue_t *sq, 50e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *mstream, 51e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *sstream, 52e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_attr_buffering_frame_t *frame_attr); 53e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int mm_camera_channel_get_starting_frame(mm_camera_obj_t *my_obj, 54e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_ch_t *ch, 55e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *mstream, 56e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *sstream, 57e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_queue_t *mq, 58e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_queue_t *sq, 59e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_t **mframe, 60e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_t **sframe); 61e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int mm_camera_ch_search_frame_based_on_time(mm_camera_obj_t *my_obj, 62e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_ch_t *ch, 63e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *mstream, 64e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *sstream, 65e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_queue_t *mq, 66e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_queue_t *sq, 67e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_t **mframe, 68e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_t **sframe); 69e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 70e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 71e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 72e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevint mm_camera_ch_util_get_num_stream(mm_camera_obj_t * my_obj,mm_camera_channel_type_t ch_type) 73e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 74e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int num = 0; 75e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev switch(ch_type) { 76e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_RAW: 77e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev num = 1; 78e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 79e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_PREVIEW: 80e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev num = 1; 81e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 82e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_VIDEO: 83e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev num = 1; 84e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(my_obj->ch[ch_type].video.has_main) { 85e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev num += 1; 86e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 87e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 88e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_SNAPSHOT: 89e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev num = 2; 90e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 91e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev default: 92e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 93e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 94e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return num; 95e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 96e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 97e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid mm_camera_ch_util_get_stream_objs(mm_camera_obj_t * my_obj, 98e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type, 99e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t **stream1, 100e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t **stream2) 101e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 102e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev *stream1 = NULL; 103e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev *stream2 = NULL; 104e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 105e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev switch(ch_type) { 106e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_RAW: 107e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev *stream1 = &my_obj->ch[ch_type].raw.stream; 108e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 109e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_PREVIEW: 110e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev *stream1 = &my_obj->ch[ch_type].preview.stream; 111e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 112e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_VIDEO: 113e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev *stream1 = &my_obj->ch[ch_type].video.video; 114e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(my_obj->ch[ch_type].video.has_main) { 115e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev *stream2 = &my_obj->ch[ch_type].video.main; 116e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 117e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 118e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_SNAPSHOT: 119e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev *stream1 = &my_obj->ch[ch_type].snapshot.main; 120e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if (!my_obj->full_liveshot) 121e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev *stream2 = &my_obj->ch[ch_type].snapshot.thumbnail; 122e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 123e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev default: 124e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 125e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 126e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 127e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 128e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int32_t mm_camera_ch_util_set_fmt(mm_camera_obj_t * my_obj, 129e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type, 130e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_ch_image_fmt_parm_t *fmt) 131e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 132e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int32_t rc = MM_CAMERA_OK; 133e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *stream1 = NULL; 134e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *stream2 = NULL; 135e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_image_fmt_t *fmt1 = NULL; 136e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_image_fmt_t *fmt2 = NULL; 137e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 138e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev switch(ch_type) { 139e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_RAW: 140e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream1 = &my_obj->ch[ch_type].raw.stream; 141e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev fmt1 = &fmt->def; 142e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 143e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_PREVIEW: 144e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream1 = &my_obj->ch[ch_type].preview.stream; 145e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev fmt1 = &fmt->def; 146e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 147e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_VIDEO: 148e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream1 = &my_obj->ch[ch_type].video.video; 149e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev fmt1 = &fmt->video.video; 150e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(my_obj->ch[ch_type].video.has_main) { 151e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("%s:video channel has main image stream\n", __func__); 152e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream2 = &my_obj->ch[ch_type].video.main; 153e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev fmt2 = &fmt->video.main; 154e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 155e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 156e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_SNAPSHOT: 157e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream1 = &my_obj->ch[ch_type].snapshot.main; 158e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev fmt1 = &fmt->snapshot.main; 159e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if (!my_obj->full_liveshot) { 160e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream2 = &my_obj->ch[ch_type].snapshot.thumbnail; 161e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev fmt2 = &fmt->snapshot.thumbnail; 162e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 163e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 164e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev default: 165e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = -1; 166e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 167e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 168e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("%s:ch=%d, streams[0x%x,0x%x]\n", __func__, ch_type, 169e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev (uint32_t)stream1, (uint32_t)stream2); 170e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(stream1) 171e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, stream1, 172e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev MM_CAMERA_STATE_EVT_SET_FMT, fmt1); 173e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(stream2 && !rc) 174e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, stream2, 175e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev MM_CAMERA_STATE_EVT_SET_FMT, fmt2); 176e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return rc; 177e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 178e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 179e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int32_t mm_camera_ch_util_acquire(mm_camera_obj_t * my_obj, 180e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type) 181e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 182e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int32_t rc = MM_CAMERA_OK; 183e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *stream1 = NULL; 184e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *stream2 = NULL; 185e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_type_t type1; 186e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_type_t type2; 187e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 188e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(my_obj->ch[ch_type].acquired) { 189e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = MM_CAMERA_OK; 190e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev goto end; 191e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 192e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev pthread_mutex_init(&my_obj->ch[ch_type].mutex, NULL); 193e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev switch(ch_type) { 194e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_RAW: 195e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream1 = &my_obj->ch[ch_type].raw.stream; 196e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev type1 = MM_CAMERA_STREAM_RAW; 197e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 198e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_PREVIEW: 199e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream1 = &my_obj->ch[ch_type].preview.stream; 200e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev type1 = MM_CAMERA_STREAM_PREVIEW; 201e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 202e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_VIDEO: 203e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream1 = &my_obj->ch[ch_type].video.video; 204e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev type1 = MM_CAMERA_STREAM_VIDEO; 205e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev /* no full image live shot by default */ 206e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev my_obj->ch[ch_type].video.has_main = FALSE; 207e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 208e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_SNAPSHOT: 209e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream1 = &my_obj->ch[ch_type].snapshot.main; 210e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev type1 = MM_CAMERA_STREAM_SNAPSHOT; 211e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if (!my_obj->full_liveshot) { 212e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream2 = &my_obj->ch[ch_type].snapshot.thumbnail; 213e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev type2 = MM_CAMERA_STREAM_THUMBNAIL; 214e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 215e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 216e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev default: 217e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return -1; 218e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 219e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 220e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(stream1) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, stream1, 221e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev MM_CAMERA_STATE_EVT_ACQUIRE, &type1); 222e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(stream2 && !rc) rc = mm_camera_stream_fsm_fn_vtbl(my_obj, stream2, 223e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev MM_CAMERA_STATE_EVT_ACQUIRE, &type2); 224e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(rc == MM_CAMERA_OK) { 225e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(!my_obj->ch[ch_type].acquired) my_obj->ch[ch_type].acquired = TRUE; 226e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 227e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 228e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend: 229e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return rc; 230e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 231e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 232e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int32_t mm_camera_ch_util_release(mm_camera_obj_t * my_obj, 233e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type, 234e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_state_evt_type_t evt) 235e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 236e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *stream1, *stream2; 237e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 238e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(!my_obj->ch[ch_type].acquired) return MM_CAMERA_OK; 239e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 240e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_ch_util_get_stream_objs(my_obj,ch_type, &stream1, &stream2); 241e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(stream1) 242e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_fsm_fn_vtbl(my_obj, stream1, evt, NULL); 243e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(stream2) 244e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_fsm_fn_vtbl(my_obj, stream2, evt, NULL); 245e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev pthread_mutex_destroy(&my_obj->ch[ch_type].mutex); 246e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev memset(&my_obj->ch[ch_type],0,sizeof(my_obj->ch[ch_type])); 247e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return 0; 248e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 249e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 250e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int32_t mm_camera_ch_util_stream_null_val(mm_camera_obj_t * my_obj, 251e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type, 252e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_state_evt_type_t evt, void *val) 253e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 254e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int32_t rc = 0; 255e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev switch(ch_type) { 256e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_RAW: 257e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].raw.stream, 258e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev evt, NULL); 259e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 260e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_PREVIEW: 261e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, &my_obj->ch[ch_type].preview.stream, 262e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev evt, NULL); 263e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 264e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_VIDEO: 265e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 266e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].video.video, evt, 267e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev NULL); 268e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(!rc && my_obj->ch[ch_type].video.main.fd) 269e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 270e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].video.main, evt, 271e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev NULL); 272e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 273e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_SNAPSHOT: 274e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev my_obj->ch[ch_type].snapshot.expected_matching_id = 0; 275e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 276e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].snapshot.main, evt, 277e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev NULL); 278e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(!rc && !my_obj->full_liveshot) 279e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 280e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].snapshot.thumbnail, evt, 281e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev NULL); 282e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 283e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev default: 284e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG_ERROR("%s: Invalid ch_type=%d", __func__, ch_type); 285e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = -1; 286e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 287e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 288e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return rc; 289e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 290e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 291e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int32_t mm_camera_ch_util_reg_buf(mm_camera_obj_t * my_obj, 292e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type, 293e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_state_evt_type_t evt, void *val) 294e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 295e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int32_t rc = 0; 296e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev switch(ch_type) { 297e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_RAW: 298e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 299e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].raw.stream, evt, 300e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev (mm_camera_buf_def_t *)val); 301e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 302e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_PREVIEW: 303e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 304e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].preview.stream, evt, 305e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev (mm_camera_buf_def_t *)val); 306e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 307e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_VIDEO: 308e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev { 309e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_buf_video_t * buf = (mm_camera_buf_video_t *)val; 310e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 311e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].video.video, evt, 312e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &buf->video); 313e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(!rc && my_obj->ch[ch_type].video.has_main) { 314e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 315e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].video.main, evt, 316e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &buf->main); 317e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 318e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 319e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 320e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_SNAPSHOT: 321e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev { 322e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_buf_snapshot_t * buf = (mm_camera_buf_snapshot_t *)val; 323e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 324e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].snapshot.main, evt, 325e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &buf->main); 326e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(!rc && !my_obj->full_liveshot) { 327e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 328e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].snapshot.thumbnail, evt, 329e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev & buf->thumbnail); 330e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 331e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 332e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 333e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev default: 334e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return -1; 335e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 336e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 337e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return rc; 338e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 339e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 340e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int32_t mm_camera_ch_util_attr(mm_camera_obj_t *my_obj, 341e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type, 342e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_attr_t *val) 343e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 344e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int rc = -MM_CAMERA_E_NOT_SUPPORTED; 345e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev /*if(ch_type != MM_CAMERA_CH_RAW) { 346e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("%s: attr type %d not support for ch %d\n", __func__, val->type, ch_type); 347e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return rc; 348e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev }*/ 349e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(my_obj->ch[ch_type].acquired== 0) { 350e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG_ERROR("%s Channel %d not yet acquired ", __func__, ch_type); 351e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return -MM_CAMERA_E_INVALID_OPERATION; 352e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 353e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev switch(val->type) { 354e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_ATTR_RAW_STREAMING_TYPE: 355e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(val->raw_streaming_mode == MM_CAMERA_RAW_STREAMING_CAPTURE_SINGLE) { 356e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev my_obj->ch[ch_type].raw.mode = val->raw_streaming_mode; 357e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = MM_CAMERA_OK; 358e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 359e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 360e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_ATTR_BUFFERING_FRAME: 361e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev /* it's good to check the stream state. TBD later */ 362e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev memcpy(&my_obj->ch[ch_type].buffering_frame, &val->buffering_frame, sizeof(val->buffering_frame)); 363e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 364e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev default: 365e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 366e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 367e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return MM_CAMERA_OK; 368e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 369e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 370e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int32_t mm_camera_ch_util_reg_buf_cb(mm_camera_obj_t *my_obj, 371e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type, 372e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_buf_cb_t *val) 373e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 374e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev /* TODOhere: Need to return failure in case of MAX Cb registered 375e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev * but in order to return fail case need to set up rc. 376e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev * but the rc value needs to be thread safe 377e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev */ 378e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int i; 379e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev ALOGV("%s: Trying to register",__func__); 380e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// pthread_mutex_lock(&my_obj->ch[ch_type].mutex); 381e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev for( i=0 ;i < MM_CAMERA_BUF_CB_MAX; i++ ) { 382e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(my_obj->ch[ch_type].buf_cb[i].cb==NULL) { 383e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev memcpy(&my_obj->ch[ch_type].buf_cb[i],val,sizeof(mm_camera_buf_cb_t)); 384e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 385e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 386e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 387e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// pthread_mutex_unlock(&my_obj->ch[ch_type].mutex); 388e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev ALOGV("%s: Done register",__func__); 389e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return MM_CAMERA_OK; 390e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 391e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 392e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int32_t mm_camera_ch_util_qbuf(mm_camera_obj_t *my_obj, 393e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type, 394e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_state_evt_type_t evt, 395e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_ch_data_buf_t *val) 396e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 397e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int32_t rc = -1; 398e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *stream; 399e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev struct ion_flush_data cache_inv_data; 400e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev struct ion_custom_data custom_data; 401e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int ion_fd; 402e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev struct msm_frame *cache_frame; 403e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev struct msm_frame *cache_frame1 = NULL; 404e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 405e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("<DEBUG>: %s:ch_type:%d",__func__,ch_type); 406e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev switch(ch_type) { 407e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_RAW: 408e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 409e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].raw.stream, evt, 410e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &val->def); 411e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_frame = val->def.frame; 412e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 413e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_PREVIEW: 414e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 415e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].preview.stream, evt, 416e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &val->def); 417e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_frame = val->def.frame; 418e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("buffer fd = %d, length = %d, vaddr = %p\n", 419e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev val->def.frame->fd, val->def.frame->ion_alloc.len, val->def.frame->buffer); 420e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 421e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_VIDEO: 422e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev { 423e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 424e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].video.video, evt, 425e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &val->video.video); 426e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_frame = val->video.video.frame; 427e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("buffer fd = %d, length = %d, vaddr = %p\n", 428e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev val->video.video.frame->fd, val->video.video.frame->ion_alloc.len, val->video.video.frame->buffer); 429e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 430e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(!rc && val->video.main.frame) { 431e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 432e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].video.main, evt, 433e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &val->video.main); 434e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_frame1 = val->video.main.frame; 435e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 436e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 437e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 438e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_SNAPSHOT: 439e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev { 440e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 441e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].snapshot.main, evt, 442e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &val->snapshot.main); 443e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_frame = val->snapshot.main.frame; 444e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("buffer fd = %d, length = %d, vaddr = %p\n", 445e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev val->snapshot.main.frame->fd, val->snapshot.main.frame->ion_alloc.len, val->snapshot.main.frame->buffer); 446edda38bcd3d3a3344e09925e7bb629b9e1361a36Mekala Natarajan if(!rc && (!my_obj->full_liveshot)) { 447e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if (my_obj->op_mode == MM_CAMERA_OP_MODE_ZSL) 448e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream; 449e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev else 450e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream = &my_obj->ch[ch_type].snapshot.thumbnail; 451e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 452e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream, evt, 453e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &val->snapshot.thumbnail); 454e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_frame1 = val->snapshot.thumbnail.frame; 455e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("buffer fd = %d, length = %d, vaddr = %p\n", 456e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev val->snapshot.thumbnail.frame->fd, val->snapshot.thumbnail.frame->ion_alloc.len, val->snapshot.thumbnail.frame->buffer); 457e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 458e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 459e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 460e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev default: 461e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return -1; 462e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 463e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 464e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#ifdef USE_ION 465e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_inv_data.vaddr = cache_frame->buffer; 466e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_inv_data.fd = cache_frame->fd; 467e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_inv_data.handle = cache_frame->fd_data.handle; 468e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_inv_data.length = cache_frame->ion_alloc.len; 469e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev custom_data.cmd = ION_IOC_INV_CACHES; 470e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev custom_data.arg = &cache_inv_data; 471e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev ion_fd = cache_frame->ion_dev_fd; 472e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(ion_fd > 0) { 473e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(ioctl(ion_fd, ION_IOC_CUSTOM, &custom_data) < 0) 474e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG_ERROR("%s: Cache Invalidate failed\n", __func__); 475e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev else { 476e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("%s: Successful cache invalidate\n", __func__); 477e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(cache_frame1) { 478e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev ion_fd = cache_frame1->ion_dev_fd; 479e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_inv_data.vaddr = cache_frame1->buffer; 480e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_inv_data.fd = cache_frame1->fd; 481e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_inv_data.handle = cache_frame1->fd_data.handle; 482e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev cache_inv_data.length = cache_frame1->ion_alloc.len; 483e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev custom_data.cmd = ION_IOC_INV_CACHES; 484e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev custom_data.arg = &cache_inv_data; 485e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(ioctl(ion_fd, ION_IOC_CUSTOM, &custom_data) < 0) 486e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG_ERROR("%s: Cache Invalidate failed\n", __func__); 487e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev else 488e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("%s: Successful cache invalidate\n", __func__); 489e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 490e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 491e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 492e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#endif 493e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 494e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return rc; 495e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 496e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 497e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int mm_camera_ch_util_get_crop(mm_camera_obj_t *my_obj, 498e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type, 499e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_state_evt_type_t evt, 500e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_ch_crop_t *crop) 501e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 502e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int rc = MM_CAMERA_OK; 503e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev switch(ch_type) { 504e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_RAW: 505e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 506e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].raw.stream, evt, 507e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &crop->crop); 508e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 509e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_PREVIEW: 510e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 511e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].preview.stream, evt, 512e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &crop->crop); 513e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 514e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_VIDEO: 515e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 516e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].video.video, evt, 517e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &crop->crop); 518e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 519e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_CH_SNAPSHOT: 520e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev { 521e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 522e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].snapshot.main, evt, 523e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &crop->snapshot.main_crop); 524e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(!rc && !my_obj->full_liveshot) { 525e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev ALOGV("%s: should not come here for Live Shot", __func__); 526e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_stream_fsm_fn_vtbl(my_obj, 527e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &my_obj->ch[ch_type].snapshot.thumbnail, evt, 528e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev &crop->snapshot.thumbnail_crop); 529e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 530e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 531e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 532e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev default: 533e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return -1; 534e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 535e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 536e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return rc; 537e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 538e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 539e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int mm_camera_ch_util_dispatch_buffered_frame(mm_camera_obj_t *my_obj, 540e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type) 541e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 542e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return mm_camera_poll_dispatch_buffered_frames(my_obj, ch_type); 543e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 544e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 545e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevint mm_camera_channel_get_time_diff(struct timespec *cur_ts, int usec_target, struct timespec *frame_ts) 546e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 547e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int dtusec = (cur_ts->tv_nsec - frame_ts->tv_nsec)/1000; 548e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev dtusec += (cur_ts->tv_sec - frame_ts->tv_sec)*1000000 - usec_target; 549e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return dtusec; 550e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 551e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 552e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic int mm_camera_channel_skip_frames(mm_camera_obj_t *my_obj, 553e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_queue_t *mq, 554e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_queue_t *sq, 555e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *mstream, 556e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *sstream, 557e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_attr_buffering_frame_t *frame_attr) 558e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 559e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int count = 0; 560e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int i = 0; 561e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_t *mframe = NULL, *sframe = NULL; 562e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_notify_frame_t notify_frame; 563e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 564e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev count = mm_camera_stream_frame_get_q_cnt(mq); 565e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(count < mm_camera_stream_frame_get_q_cnt(sq)) 566e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev count = mm_camera_stream_frame_get_q_cnt(sq); 567e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("%s: Q-size=%d, look_back =%d, M_match=%d, T_match=%d", __func__, 568e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev count, frame_attr->look_back, mq->match_cnt, sq->match_cnt); 569e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 570e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev count -= frame_attr->look_back; 571e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("count=%d, frame_attr->look_back=%d,mq->match_cnt=%d, sq->match_cnt=%d", 572e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev count, frame_attr->look_back, mq->match_cnt,sq->match_cnt); 573e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev for(i=0; i < count; i++) { 574e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mframe = mm_camera_stream_frame_deq(mq); 575e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev sframe = mm_camera_stream_frame_deq(sq); 576e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(mframe && sframe && mframe->frame.frame_id == 577e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev sframe->frame.frame_id) { 578e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mq->match_cnt--; 579e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev sq->match_cnt--; 580e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 581e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(mframe) { 582e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev notify_frame.frame = &mframe->frame; 583e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev notify_frame.idx = mframe->idx; 584e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_util_buf_done(my_obj, mstream, ¬ify_frame); 585e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 586e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(sframe) { 587e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev notify_frame.frame = &sframe->frame; 588e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev notify_frame.idx = sframe->idx; 589e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_util_buf_done(my_obj, sstream, ¬ify_frame); 590e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 591e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 592e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 593e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("Post %s: Q-size=%d, look_back =%d, M_match=%d, T_match=%d", __func__, 594e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev count, frame_attr->look_back, mq->match_cnt, sq->match_cnt); 595e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return MM_CAMERA_OK; 596e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 597e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 598e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/*for ZSL mode to send the image pair to client*/ 599e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid mm_camera_dispatch_buffered_frames(mm_camera_obj_t *my_obj, 600e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type) 601e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 602e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int mcnt, i, rc = MM_CAMERA_E_GENERAL, scnt; 603e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int num_of_req_frame = 0; 604e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int j; 605e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_ch_data_buf_t data; 606e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_t *mframe = NULL, *sframe = NULL; 607e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_t *qmframe = NULL, *qsframe = NULL; 608e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_ch_t *ch = &my_obj->ch[ch_type]; 609e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_queue_t *mq = NULL; 610e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_frame_queue_t *sq = NULL; 611e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *stream1 = NULL; 612e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_t *stream2 = NULL; 613e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev ALOGV("%s: E", __func__); 614e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_ch_util_get_stream_objs(my_obj, ch_type, &stream1, &stream2); 615e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev stream2 = &my_obj->ch[MM_CAMERA_CH_PREVIEW].preview.stream; 616e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(stream1) { 617e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mq = &stream1->frame.readyq; 618e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 619e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(stream2) { 620e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev sq = &stream2->frame.readyq; 621e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 622e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("mq=%p, sq=%p, stream1=%p, stream2=%p", mq, sq, stream1, stream2); 623e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev pthread_mutex_lock(&my_obj->ch[MM_CAMERA_CH_PREVIEW].mutex); 624e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev pthread_mutex_lock(&my_obj->ch[MM_CAMERA_CH_SNAPSHOT].mutex); 625e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if (mq && sq && stream1 && stream2) { 626e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_channel_skip_frames(my_obj, mq, sq, stream1, stream2, &ch->buffering_frame); 627e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(rc != MM_CAMERA_OK) { 628e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG_ERROR("%s: Error getting right frame!", __func__); 629e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev goto end; 630e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 631e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev num_of_req_frame = my_obj->snap_burst_num_by_user; 632e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev ch->snapshot.pending_cnt = num_of_req_frame; 633e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 634e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("num_of_req_frame =%d", num_of_req_frame); 635e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev for(i = 0; i < num_of_req_frame; i++) { 636e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mframe = mm_camera_stream_frame_deq(mq); 637e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev sframe = mm_camera_stream_frame_deq(sq); 638e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(mframe && sframe) { 639e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("%s: frame_id = 0x%x|0x%x, main idx = %d, thumbnail idx = %d", __func__, 640e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mframe->frame.frame_id, sframe->frame.frame_id, mframe->idx, sframe->idx); 641e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(mframe->frame.frame_id != sframe->frame.frame_id) { 642e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG_ERROR("%s: ZSL algorithm error, main and thumbnail " 643e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev "frame_ids not same. Need bug fix", __func__); 644e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 645e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev memset(&data, 0, sizeof(data)); 646e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev data.type = ch_type; 647e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev data.snapshot.main.frame = &mframe->frame; 648e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev data.snapshot.main.idx = mframe->idx; 649e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev data.snapshot.thumbnail.frame = &sframe->frame; 650e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev data.snapshot.thumbnail.idx = sframe->idx; 651e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev ch->snapshot.pending_cnt--; 652e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mq->match_cnt--; 653e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev sq->match_cnt--; 654e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev for(j=0;j<MM_CAMERA_BUF_CB_MAX;j++) { 655e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if( ch->buf_cb[j].cb!=NULL ) 656e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev ch->buf_cb[j].cb(&data, ch->buf_cb[j].user_data); 657e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 658e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } else { 659e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG_ERROR("%s: mframe %p, sframe = %p", __func__, mframe, sframe); 660e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev qmframe = mframe; 661e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev qsframe = sframe; 662e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = -1; 663e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 664e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 665e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 666e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(qmframe) { 667e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_frame_enq(mq, &stream1->frame.frame[qmframe->idx]); 668e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev qmframe = NULL; 669e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 670e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(qsframe) { 671e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_stream_frame_enq(sq, &stream2->frame.frame[qsframe->idx]); 672e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev qsframe = NULL; 673e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 674e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } else { 675e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG_ERROR(" mq =%p sq =%p stream1 =%p stream2 =%p", mq, sq , stream1 , stream2); 676e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 677e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 678e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("%s: burst number: %d, pending_count: %d", __func__, 679e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev my_obj->snap_burst_num_by_user, ch->snapshot.pending_cnt); 680e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend: 681e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_SNAPSHOT].mutex); 682e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev pthread_mutex_unlock(&my_obj->ch[MM_CAMERA_CH_PREVIEW].mutex); 683e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev /* If we are done sending callbacks for all the requested number of snapshots 684e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev send data delivery done event*/ 685e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if((rc == MM_CAMERA_OK) && (!ch->snapshot.pending_cnt)) { 686e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_event_t data; 687e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev data.event_type = MM_CAMERA_EVT_TYPE_CH; 688e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev data.e.ch.evt = MM_CAMERA_CH_EVT_DATA_DELIVERY_DONE; 689e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev data.e.ch.ch = ch_type; 690e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_poll_send_ch_event(my_obj, &data); 691e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 692e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 693e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 694e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevint32_t mm_camera_ch_fn(mm_camera_obj_t * my_obj, 695e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_channel_type_t ch_type, 696e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_state_evt_type_t evt, void *val) 697e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{ 698e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev int32_t rc = MM_CAMERA_OK; 699e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev 700e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("%s:ch = %d, evt=%d\n", __func__, ch_type, evt); 701e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev switch(evt) { 702e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_ACQUIRE: 703e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_acquire(my_obj, ch_type); 704e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 705e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_RELEASE: 706e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev /* safe code in case no stream off before release. */ 707e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev //mm_camera_poll_thread_release(my_obj, ch_type); 708e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_release(my_obj, ch_type, evt); 709e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 710e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_ATTR: 711e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_attr(my_obj, ch_type, 712e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev (mm_camera_channel_attr_t *)val); 713e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 714e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_REG_BUF_CB: 715e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_reg_buf_cb(my_obj, ch_type, 716e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev (mm_camera_buf_cb_t *)val); 717e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 718e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_SET_FMT: 719e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_set_fmt(my_obj, ch_type, 720e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev (mm_camera_ch_image_fmt_parm_t *)val); 721e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 722e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_REG_BUF: 723e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_REQUEST_BUF: 724e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_reg_buf(my_obj, ch_type, evt, val); 725e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 726e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_UNREG_BUF: 727e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_stream_null_val(my_obj, ch_type, evt, NULL); 728e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 729e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_STREAM_ON: { 730e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(ch_type == MM_CAMERA_CH_RAW && 731e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev my_obj->ch[ch_type].raw.mode == MM_CAMERA_RAW_STREAMING_CAPTURE_SINGLE) { 732e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if( MM_CAMERA_OK != (rc = mm_camera_util_s_ctrl(my_obj->ctrl_fd, 733e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev MSM_V4L2_PID_CAM_MODE, MSM_V4L2_CAM_OP_RAW))) { 734e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG("%s:set MM_CAMERA_RAW_STREAMING_CAPTURE_SINGLE err=%d\n", __func__, rc); 735e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 736e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 737e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 738e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_poll_thread_add_ch(my_obj, ch_type); 739e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_stream_null_val(my_obj, ch_type, evt, NULL); 740e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev if(rc < 0) { 741e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev CDBG_ERROR("%s: Failed in STREAM ON", __func__); 742e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_poll_thread_release(my_obj, ch_type); 743e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 744e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 745e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 746e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_STREAM_OFF: { 747e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev mm_camera_poll_thread_del_ch(my_obj, ch_type); 748e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_stream_null_val(my_obj, ch_type, evt, NULL); 749e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 750e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 751e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_QBUF: 752e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_qbuf(my_obj, ch_type, evt, 753e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev (mm_camera_ch_data_buf_t *)val); 754e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 755e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_GET_CROP: 756e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_get_crop(my_obj, ch_type, evt, 757e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev (mm_camera_ch_crop_t *)val); 758e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 759e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev case MM_CAMERA_STATE_EVT_DISPATCH_BUFFERED_FRAME: 760e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev rc = mm_camera_ch_util_dispatch_buffered_frame(my_obj, ch_type); 761e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 762e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev default: 763e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev break; 764e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev } 765e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev return rc; 766e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev} 767