1e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li/*
2e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiCopyright (c) 2012-2013, The Linux Foundation. All rights reserved.
3e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
4e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiRedistribution and use in source and binary forms, with or without
5e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Limodification, are permitted provided that the following conditions are
6e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Limet:
7e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    * Redistributions of source code must retain the above copyright
8e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li      notice, this list of conditions and the following disclaimer.
9e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    * Redistributions in binary form must reproduce the above
10e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li      copyright notice, this list of conditions and the following
11e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li      disclaimer in the documentation and/or other materials provided
12e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li      with the distribution.
13e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    * Neither the name of The Linux Foundation nor the names of its
14e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li      contributors may be used to endorse or promote products derived
15e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li      from this software without specific prior written permission.
16e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
17e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua LiIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li*/
29e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
30e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li#include "mm_qcamera_dbg.h"
3140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab#include "mm_qcamera_app.h"
3240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
33e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Listatic uint32_t rdi_len = 0;
34e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
35e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Listatic void mm_app_rdi_dump_frame(mm_camera_buf_def_t *frame,
36e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                  char *name,
37e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                  char *ext,
38e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                  int frame_idx)
3940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab{
40e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    char file_name[64];
4140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int file_fd;
4240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int i;
43a1b773473167e47bcacdd7118854398c54be704cApurva Rajguru
44e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (frame != NULL) {
45a1b773473167e47bcacdd7118854398c54be704cApurva Rajguru
46e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        snprintf(file_name, sizeof(file_name), "/data/%s_%03d.%s", name, frame_idx, ext);
47e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        file_fd = open(file_name, O_RDWR | O_CREAT, 0777);
4840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab        if (file_fd < 0) {
49e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li            CDBG_ERROR("%s: cannot open file %s \n", __func__, file_name);
5040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab        } else {
51e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li            for (i = 0; i < frame->num_planes; i++) {
52e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                write(file_fd,
53e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                      (uint8_t *)frame->buffer + frame->planes[i].data_offset,
54e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                      rdi_len);
55e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li            }
56e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
5740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab            close(file_fd);
58a1b773473167e47bcacdd7118854398c54be704cApurva Rajguru            CDBG("%s: dump rdi frame %s", __func__,file_name);
5940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab        }
6040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
6140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab}
6240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
63e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Listatic void mm_app_rdi_notify_cb(mm_camera_super_buf_t *bufs,
64e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                 void *user_data)
6540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab{
66e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    char file_name[64];
67e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_camera_buf_def_t *frame = bufs->bufs[0];
68e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data;
6940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
70e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    CDBG("%s: BEGIN - length=%d, frame idx = %d stream_id=%d\n",
71e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li         __func__, frame->frame_len, frame->frame_idx, frame->stream_id);
72e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    snprintf(file_name, sizeof(file_name), "RDI_dump_%d", pme->cam->camera_handle);
73e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_app_rdi_dump_frame(frame, file_name, "raw", frame->frame_idx);
7440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
75e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle,
76e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                            bufs->ch_id,
77e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                            frame)) {
78e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s: Failed in RDI Qbuf\n", __func__);
79e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    }
80e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info,
81e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                     ION_IOC_INV_CACHES);
8240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
83e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    CDBG("%s: END\n", __func__);
8440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab}
8540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
86e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Limm_camera_stream_t * mm_app_add_rdi_stream(mm_camera_test_obj_t *test_obj,
87e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                               mm_camera_channel_t *channel,
88e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                               mm_camera_buf_notify_t stream_cb,
89e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                               void *userdata,
90e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                               uint8_t num_bufs,
91e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                               uint8_t num_burst)
9240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab{
9340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int rc = MM_CAMERA_OK;
94e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    int i;
95e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_camera_stream_t *stream = NULL;
96e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    cam_capability_t *cam_cap = (cam_capability_t *)(test_obj->cap_buf.buf.buffer);
97e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    cam_format_t fmt = CAM_FORMAT_MAX;
98e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    cam_stream_buf_plane_info_t *buf_planes;
99e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
100e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream = mm_app_add_stream(test_obj, channel);
101e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (NULL == stream) {
102e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s: add stream failed\n", __func__);
103e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        return NULL;
10440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
10540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
1060ff3e130b0b7ab7cd8c3ed9cc974d4ff4b55d200Mansoor Aftab    CDBG_ERROR("%s: raw_dim w:%d height:%d\n", __func__, cam_cap->raw_dim[0].width, cam_cap->raw_dim[0].height);
107e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    for (i = 0;i < cam_cap->supported_raw_fmt_cnt;i++) {
108e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s: supported_raw_fmts[%d]=%d\n", __func__, i, cam_cap->supported_raw_fmts[i]);
109a1b773473167e47bcacdd7118854398c54be704cApurva Rajguru        if (((CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GBRG <= cam_cap->supported_raw_fmts[i]) &&
110a1b773473167e47bcacdd7118854398c54be704cApurva Rajguru            (CAM_FORMAT_BAYER_MIPI_RAW_12BPP_BGGR >= cam_cap->supported_raw_fmts[i])) ||
111a1b773473167e47bcacdd7118854398c54be704cApurva Rajguru            (cam_cap->supported_raw_fmts[i] == CAM_FORMAT_META_RAW_8BIT) ||
112a1b773473167e47bcacdd7118854398c54be704cApurva Rajguru            (cam_cap->supported_raw_fmts[i] == CAM_FORMAT_JPEG_RAW_8BIT))
113e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        {
114e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li            fmt = cam_cap->supported_raw_fmts[i];
115e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li            CDBG_ERROR("%s: fmt=%d\n", __func__, fmt);
116e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        }
11740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
11840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
119e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (CAM_FORMAT_MAX == fmt) {
120e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s: rdi format not supported\n", __func__);
121e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        return NULL;
12240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
12340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
124e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.mem_vtbl.get_bufs = mm_app_stream_initbuf;
125e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.mem_vtbl.put_bufs = mm_app_stream_deinitbuf;
12669ec352ec47fb5c7cf4b47abeba5c186135731d0Ivan Evlogiev    stream->s_config.mem_vtbl.clean_invalidate_buf =
12769ec352ec47fb5c7cf4b47abeba5c186135731d0Ivan Evlogiev      mm_app_stream_clean_invalidate_buf;
1288ed437436b256947f2e36c355e70761e9b6d9eebEmilian Peev    stream->s_config.mem_vtbl.invalidate_buf = mm_app_stream_invalidate_buf;
129e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.mem_vtbl.user_data = (void *)stream;
130e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.stream_cb = stream_cb;
131e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.userdata = userdata;
132e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->num_of_bufs = num_bufs;
133e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
134e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.stream_info = (cam_stream_info_t *)stream->s_info_buf.buf.buffer;
135e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    memset(stream->s_config.stream_info, 0, sizeof(cam_stream_info_t));
136e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.stream_info->stream_type = CAM_STREAM_TYPE_RAW;
137e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (num_burst == 0) {
138e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS;
139e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    } else {
140e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_BURST;
141e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        stream->s_config.stream_info->num_of_burst = num_burst;
14240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
143e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.stream_info->fmt = fmt;
144a1b773473167e47bcacdd7118854398c54be704cApurva Rajguru    CDBG("%s: RAW: w: %d, h: %d ", __func__,
1450ff3e130b0b7ab7cd8c3ed9cc974d4ff4b55d200Mansoor Aftab       cam_cap->raw_dim[0].width, cam_cap->raw_dim[0].height);
146a1b773473167e47bcacdd7118854398c54be704cApurva Rajguru
1470ff3e130b0b7ab7cd8c3ed9cc974d4ff4b55d200Mansoor Aftab    stream->s_config.stream_info->dim.width = cam_cap->raw_dim[0].width;
1480ff3e130b0b7ab7cd8c3ed9cc974d4ff4b55d200Mansoor Aftab    stream->s_config.stream_info->dim.height = cam_cap->raw_dim[0].height;
149e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.padding_info = cam_cap->padding_info;
150e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
151e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    rc = mm_app_config_stream(test_obj, channel, stream, &stream->s_config);
152e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (MM_CAMERA_OK != rc) {
153e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s:config rdi stream err=%d\n", __func__, rc);
154e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        return NULL;
15540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
15640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
157e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    buf_planes = &stream->s_config.stream_info->buf_planes;
158e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    rdi_len = buf_planes->plane_info.mp[0].len;
159e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    CDBG("%s: plane_info %dx%d len:%d frame_len:%d\n", __func__,
160e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        buf_planes->plane_info.mp[0].stride, buf_planes->plane_info.mp[0].scanline,
161e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        buf_planes->plane_info.mp[0].len, buf_planes->plane_info.frame_len);
16240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
163e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    return stream;
16440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab}
16540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
166e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Limm_camera_stream_t * mm_app_add_rdi_snapshot_stream(mm_camera_test_obj_t *test_obj,
167e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                                mm_camera_channel_t *channel,
168e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                                mm_camera_buf_notify_t stream_cb,
169e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                                void *userdata,
170e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                                uint8_t num_bufs,
171e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                                uint8_t num_burst)
17240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab{
17340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int rc = MM_CAMERA_OK;
174e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_camera_stream_t *stream = NULL;
175e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    cam_capability_t *cam_cap = (cam_capability_t *)(test_obj->cap_buf.buf.buffer);
17640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
177e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream = mm_app_add_stream(test_obj, channel);
178e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (NULL == stream) {
179e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s: add stream failed\n", __func__);
180e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        return NULL;
18140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
18240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
183e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.mem_vtbl.get_bufs = mm_app_stream_initbuf;
184e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.mem_vtbl.put_bufs = mm_app_stream_deinitbuf;
18569ec352ec47fb5c7cf4b47abeba5c186135731d0Ivan Evlogiev    stream->s_config.mem_vtbl.clean_invalidate_buf =
18669ec352ec47fb5c7cf4b47abeba5c186135731d0Ivan Evlogiev      mm_app_stream_clean_invalidate_buf;
1878ed437436b256947f2e36c355e70761e9b6d9eebEmilian Peev    stream->s_config.mem_vtbl.invalidate_buf = mm_app_stream_invalidate_buf;
188e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.mem_vtbl.user_data = (void *)stream;
189e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.stream_cb = stream_cb;
190e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.userdata = userdata;
191e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->num_of_bufs = num_bufs;
192e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
193e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.stream_info = (cam_stream_info_t *)stream->s_info_buf.buf.buffer;
194e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    memset(stream->s_config.stream_info, 0, sizeof(cam_stream_info_t));
195e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.stream_info->stream_type = CAM_STREAM_TYPE_SNAPSHOT;
196e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (num_burst == 0) {
197e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS;
198e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    } else {
199e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_BURST;
200e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        stream->s_config.stream_info->num_of_burst = num_burst;
20140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
202e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.stream_info->fmt = DEFAULT_SNAPSHOT_FORMAT;
203e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.stream_info->dim.width = DEFAULT_SNAPSHOT_WIDTH;
204e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.stream_info->dim.height = DEFAULT_SNAPSHOT_HEIGHT;
205e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream->s_config.padding_info = cam_cap->padding_info;
206e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
207e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    rc = mm_app_config_stream(test_obj, channel, stream, &stream->s_config);
208e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (MM_CAMERA_OK != rc) {
209e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s:config rdi stream err=%d\n", __func__, rc);
210e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        return NULL;
21140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
21240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
213e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    return stream;
214e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li}
21540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
216e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Limm_camera_channel_t * mm_app_add_rdi_channel(mm_camera_test_obj_t *test_obj, uint8_t num_burst)
217e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li{
218e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_camera_channel_t *channel = NULL;
219e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_camera_stream_t *stream = NULL;
220e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
221e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    channel = mm_app_add_channel(test_obj,
222e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                 MM_CHANNEL_TYPE_RDI,
223e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                 NULL,
224e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                 NULL,
225e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                 NULL);
226e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (NULL == channel) {
227e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s: add channel failed", __func__);
228e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        return NULL;
22940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
23040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
231e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    stream = mm_app_add_rdi_stream(test_obj,
232e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                       channel,
233e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                       mm_app_rdi_notify_cb,
234e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                       (void *)test_obj,
235e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                       RDI_BUF_NUM,
236e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                       num_burst);
237e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (NULL == stream) {
238e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s: add stream failed\n", __func__);
239e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        mm_app_del_channel(test_obj, channel);
240e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        return NULL;
24140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
24240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
243e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    CDBG("%s: channel=%d stream=%d\n", __func__, channel->ch_id, stream->s_id);
244e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    return channel;
24540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab}
24640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
247e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Liint mm_app_stop_and_del_rdi_channel(mm_camera_test_obj_t *test_obj,
248e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li                                mm_camera_channel_t *channel)
24940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab{
25040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int rc = MM_CAMERA_OK;
251e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_camera_stream_t *stream = NULL;
252e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    uint8_t i;
25340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
254e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    rc = mm_app_stop_channel(test_obj, channel);
255e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (MM_CAMERA_OK != rc) {
256e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s:Stop RDI failed rc=%d\n", __func__, rc);
25740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
25840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
259e4b5570cd2e0b09b90b54e63836a3cc36292d2d6Dimitar Borisov    if (channel->num_streams <= MAX_STREAM_NUM_IN_BUNDLE) {
260e4b5570cd2e0b09b90b54e63836a3cc36292d2d6Dimitar Borisov        for (i = 0; i < channel->num_streams; i++) {
261e4b5570cd2e0b09b90b54e63836a3cc36292d2d6Dimitar Borisov            stream = &channel->streams[i];
262e4b5570cd2e0b09b90b54e63836a3cc36292d2d6Dimitar Borisov            rc = mm_app_del_stream(test_obj, channel, stream);
263e4b5570cd2e0b09b90b54e63836a3cc36292d2d6Dimitar Borisov            if (MM_CAMERA_OK != rc) {
264e4b5570cd2e0b09b90b54e63836a3cc36292d2d6Dimitar Borisov                CDBG_ERROR("%s:del stream(%d) failed rc=%d\n", __func__, i, rc);
265e4b5570cd2e0b09b90b54e63836a3cc36292d2d6Dimitar Borisov            }
26640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab        }
267e4b5570cd2e0b09b90b54e63836a3cc36292d2d6Dimitar Borisov    } else {
268e4b5570cd2e0b09b90b54e63836a3cc36292d2d6Dimitar Borisov        CDBG_ERROR("%s: num_streams = %d. Should not be more than %d\n",
269e4b5570cd2e0b09b90b54e63836a3cc36292d2d6Dimitar Borisov            __func__, channel->num_streams, MAX_STREAM_NUM_IN_BUNDLE);
27040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
27140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
272e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    rc = mm_app_del_channel(test_obj, channel);
273e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (MM_CAMERA_OK != rc) {
274e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s:delete channel failed rc=%d\n", __func__, rc);
27540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
27640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
27740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    return rc;
27840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab}
27940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
280e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Liint mm_app_start_rdi(mm_camera_test_obj_t *test_obj, uint8_t num_burst)
28140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab{
28240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int rc = MM_CAMERA_OK;
283e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_camera_channel_t *channel = NULL;
28440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
285e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    channel = mm_app_add_rdi_channel(test_obj, num_burst);
286e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (NULL == channel) {
287e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s: add channel failed", __func__);
288e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        return -MM_CAMERA_E_GENERAL;
289e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    }
29040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
291e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    rc = mm_app_start_channel(test_obj, channel);
292e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (MM_CAMERA_OK != rc) {
293e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s:start rdi failed rc=%d\n", __func__, rc);
294e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        mm_app_del_channel(test_obj, channel);
295e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        return rc;
29640f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
297e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
29840f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    return rc;
29940f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab}
30040f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
301e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Liint mm_app_stop_rdi(mm_camera_test_obj_t *test_obj)
30240f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab{
30340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    int rc = MM_CAMERA_OK;
30440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
305e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    mm_camera_channel_t *channel =
306e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_RDI);
30740f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
308e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    rc = mm_app_stop_and_del_rdi_channel(test_obj, channel);
309e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li    if (MM_CAMERA_OK != rc) {
310e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li        CDBG_ERROR("%s:Stop RDI failed rc=%d\n", __func__, rc);
31140f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    }
312e5a736d3a4accd57438c76cc4abc5d7e1f73e9e6Muhua Li
31340f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab    return rc;
31440f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab}
31540f2a8d5488cb10a1a6f30e20f1acb6eee372da0Mansoor Aftab
316