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