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, &notify_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, &notify_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