13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* 23d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelCopyright (c) 2012-2016, The Linux Foundation. All rights reserved. 33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 43d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelRedistribution and use in source and binary forms, with or without 53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmodification, are permitted provided that the following conditions are 63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmet: 73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Redistributions of source code must retain the above copyright 83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel notice, this list of conditions and the following disclaimer. 93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Redistributions in binary form must reproduce the above 103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel copyright notice, this list of conditions and the following 113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel disclaimer in the documentation and/or other materials provided 123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel with the distribution. 133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Neither the name of The Linux Foundation nor the names of its 143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel contributors may be used to endorse or promote products derived 153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel from this software without specific prior written permission. 163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 173d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 183d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 193d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 203d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 213d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 223d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 233d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 243d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 253d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 263d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 273d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*/ 293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies 313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <fcntl.h> 32b1d46b55398885f2ed8442fff842119f2b30f72aJiyong Park#include <unistd.h> 333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies 353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_qcamera_app.h" 363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_qcamera_dbg.h" 373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic uint32_t rdi_len = 0; 393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic void mm_app_rdi_dump_frame(mm_camera_buf_def_t *frame, 413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char *name, 423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char *ext, 433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frame_idx) 443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char file_name[FILENAME_MAX]; 463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int file_fd; 473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int i; 483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame != NULL) { 503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(file_name, sizeof(file_name), 513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCAMERA_DUMP_FRM_LOCATION"%s_%03u.%s", name, frame_idx, ext); 523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel file_fd = open(file_name, O_RDWR | O_CREAT, 0777); 533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (file_fd < 0) { 543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" cannot open file %s \n", file_name); 553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < frame->planes_buf.num_planes; i++) { 573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel write(file_fd, 583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (uint8_t *)frame->buffer + frame->planes_buf.planes[i].data_offset, 593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rdi_len); 603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(file_fd); 633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD(" dump rdi frame %s", file_name); 643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic void mm_app_rdi_notify_cb(mm_camera_super_buf_t *bufs, 693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *user_data) 703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char file_name[FILENAME_MAX]; 723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = bufs->bufs[0]; 733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; 743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD(" BEGIN - length=%zu, frame idx = %d stream_id=%d\n", 763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->frame_len, frame->frame_idx, frame->stream_id); 773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(file_name, sizeof(file_name), "RDI_dump_%d", pme->cam->camera_handle); 783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_rdi_dump_frame(frame, file_name, "raw", frame->frame_idx); 793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, 813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bufs->ch_id, 823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame)) { 833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" Failed in RDI Qbuf\n"); 843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info, 863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ION_IOC_INV_CACHES); 873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD(" END\n"); 893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmm_camera_stream_t * mm_app_add_rdi_stream(mm_camera_test_obj_t *test_obj, 923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *channel, 933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_notify_t stream_cb, 943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata, 953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t num_bufs, 963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t num_burst) 973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rc = MM_CAMERA_OK; 993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t i; 1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_stream_t *stream = NULL; 1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_capability_t *cam_cap = (cam_capability_t *)(test_obj->cap_buf.buf.buffer); 1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_format_t fmt = CAM_FORMAT_MAX; 1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_buf_plane_info_t *buf_planes; 1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_size_info_t abc ; 1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset (&abc , 0, sizeof (cam_stream_size_info_t)); 1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" raw_dim w:%d height:%d\n", cam_cap->raw_dim[0].width, cam_cap->raw_dim[0].height); 1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0;i < cam_cap->supported_raw_fmt_cnt;i++) { 1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" supported_raw_fmts[%zd]=%d\n", 1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel i, (int)cam_cap->supported_raw_fmts[i]); 1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (((CAM_FORMAT_BAYER_MIPI_RAW_8BPP_GBRG <= cam_cap->supported_raw_fmts[i]) && 1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (CAM_FORMAT_BAYER_MIPI_RAW_12BPP_BGGR >= cam_cap->supported_raw_fmts[i])) || 1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (cam_cap->supported_raw_fmts[i] == CAM_FORMAT_META_RAW_8BIT) || 1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (cam_cap->supported_raw_fmts[i] == CAM_FORMAT_JPEG_RAW_8BIT) || 1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (cam_cap->supported_raw_fmts[i] == CAM_FORMAT_BAYER_MIPI_RAW_14BPP_BGGR)) 1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fmt = cam_cap->supported_raw_fmts[i]; 1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" fmt=%d\n", fmt); 1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (CAM_FORMAT_MAX == fmt) { 1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" rdi format not supported\n"); 1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel abc.num_streams = 1; 1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel abc.postprocess_mask[0] = 0; 1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel abc.stream_sizes[0].width = cam_cap->raw_dim[0].width; 1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel abc.stream_sizes[0].height = cam_cap->raw_dim[0].height; 1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel abc.type[0] = CAM_STREAM_TYPE_RAW; 1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel abc.buffer_info.min_buffers = num_bufs; 1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel abc.buffer_info.max_buffers = num_bufs; 1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel abc.is_type[0] = IS_TYPE_NONE; 1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = setmetainfoCommand(test_obj, &abc); 1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != MM_CAMERA_OK) { 1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" meta info command failed\n"); 1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream = mm_app_add_stream(test_obj, channel); 1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == stream) { 1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" add stream failed\n"); 1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.get_bufs = mm_app_stream_initbuf; 1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.put_bufs = mm_app_stream_deinitbuf; 1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.clean_invalidate_buf = 1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_stream_clean_invalidate_buf; 1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.invalidate_buf = mm_app_stream_invalidate_buf; 154295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel stream->s_config.mem_vtbl.clean_buf = mm_app_stream_clean_buf; 1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.user_data = (void *)stream; 1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_cb = stream_cb; 1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_cb_sync = NULL; 1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.userdata = userdata; 1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->num_of_bufs = num_bufs; 1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info = (cam_stream_info_t *)stream->s_info_buf.buf.buffer; 1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(stream->s_config.stream_info, 0, sizeof(cam_stream_info_t)); 1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->stream_type = CAM_STREAM_TYPE_RAW; 1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (num_burst == 0) { 1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_BURST; 1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->num_of_burst = num_burst; 1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->fmt = DEFAULT_RAW_FORMAT; 171cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel stream->s_config.stream_info->num_bufs = num_bufs; 1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD(" RAW: w: %d, h: %d ", 1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_cap->raw_dim[0].width, cam_cap->raw_dim[0].height); 1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->dim.width = cam_cap->raw_dim[0].width; 1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->dim.height = cam_cap->raw_dim[0].height; 1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.padding_info = cam_cap->padding_info; 1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_app_config_stream(test_obj, channel, stream, &stream->s_config); 1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("config rdi stream err=%d\n", rc); 1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buf_planes = &stream->s_config.stream_info->buf_planes; 1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rdi_len = buf_planes->plane_info.mp[0].len; 1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD(" plane_info %dx%d len:%d frame_len:%d\n", 1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buf_planes->plane_info.mp[0].stride, buf_planes->plane_info.mp[0].scanline, 1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buf_planes->plane_info.mp[0].len, buf_planes->plane_info.frame_len); 1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return stream; 1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmm_camera_stream_t * mm_app_add_rdi_snapshot_stream(mm_camera_test_obj_t *test_obj, 1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *channel, 1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_notify_t stream_cb, 1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata, 1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t num_bufs, 1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t num_burst) 2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rc = MM_CAMERA_OK; 2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_stream_t *stream = NULL; 2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_capability_t *cam_cap = (cam_capability_t *)(test_obj->cap_buf.buf.buffer); 2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream = mm_app_add_stream(test_obj, channel); 2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == stream) { 2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" add stream failed\n"); 2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.get_bufs = mm_app_stream_initbuf; 2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.put_bufs = mm_app_stream_deinitbuf; 2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.clean_invalidate_buf = 2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_stream_clean_invalidate_buf; 2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.invalidate_buf = mm_app_stream_invalidate_buf; 216295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel stream->s_config.mem_vtbl.clean_buf = mm_app_stream_clean_buf; 2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.user_data = (void *)stream; 2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_cb = stream_cb; 2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_cb_sync = NULL; 2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.userdata = userdata; 2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->num_of_bufs = num_bufs; 2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info = (cam_stream_info_t *)stream->s_info_buf.buf.buffer; 2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(stream->s_config.stream_info, 0, sizeof(cam_stream_info_t)); 2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->stream_type = CAM_STREAM_TYPE_SNAPSHOT; 2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (num_burst == 0) { 2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_BURST; 2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->num_of_burst = num_burst; 2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 232cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel stream->s_config.stream_info->num_bufs = num_bufs; 2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->fmt = DEFAULT_SNAPSHOT_FORMAT; 2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->dim.width = DEFAULT_SNAPSHOT_WIDTH; 2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->dim.height = DEFAULT_SNAPSHOT_HEIGHT; 2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.padding_info = cam_cap->padding_info; 2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_app_config_stream(test_obj, channel, stream, &stream->s_config); 2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("config rdi stream err=%d\n", rc); 2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return stream; 2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmm_camera_channel_t * mm_app_add_rdi_channel(mm_camera_test_obj_t *test_obj, uint8_t num_burst) 2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *channel = NULL; 2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_stream_t *stream = NULL; 2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel = mm_app_add_channel(test_obj, 2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel MM_CHANNEL_TYPE_RDI, 2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NULL, 2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NULL, 2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NULL); 2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == channel) { 2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" add channel failed"); 2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream = mm_app_add_rdi_stream(test_obj, 2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel, 2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_rdi_notify_cb, 2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (void *)test_obj, 2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel RDI_BUF_NUM, 2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel num_burst); 2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == stream) { 2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" add stream failed\n"); 2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_del_channel(test_obj, channel); 2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD(" channel=%d stream=%d\n", channel->ch_id, stream->s_id); 2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return channel; 2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint mm_app_stop_and_del_rdi_channel(mm_camera_test_obj_t *test_obj, 2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *channel) 2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rc = MM_CAMERA_OK; 2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_stream_t *stream = NULL; 2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t i; 2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_size_info_t abc ; 2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset (&abc , 0, sizeof (cam_stream_size_info_t)); 2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_app_stop_channel(test_obj, channel); 2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Stop RDI failed rc=%d\n", rc); 2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (channel->num_streams <= MAX_STREAM_NUM_IN_BUNDLE) { 2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < channel->num_streams; i++) { 2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream = &channel->streams[i]; 2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_app_del_stream(test_obj, channel, stream); 2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("del stream(%d) failed rc=%d\n", i, rc); 2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" num_streams = %d. Should not be more than %d\n", 3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel->num_streams, MAX_STREAM_NUM_IN_BUNDLE); 3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = setmetainfoCommand(test_obj, &abc); 3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != MM_CAMERA_OK) { 3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" meta info command failed\n"); 3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_app_del_channel(test_obj, channel); 3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("delete channel failed rc=%d\n", rc); 3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint mm_app_start_rdi(mm_camera_test_obj_t *test_obj, uint8_t num_burst) 3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rc = MM_CAMERA_OK; 3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *channel = NULL; 3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel = mm_app_add_rdi_channel(test_obj, num_burst); 3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == channel) { 3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" add channel failed"); 3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return -MM_CAMERA_E_GENERAL; 3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_app_start_channel(test_obj, channel); 3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("start rdi failed rc=%d\n", rc); 3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_del_channel(test_obj, channel); 3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint mm_app_stop_rdi(mm_camera_test_obj_t *test_obj) 3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rc = MM_CAMERA_OK; 3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *channel = 3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_RDI); 3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_app_stop_and_del_rdi_channel(test_obj, channel); 3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Stop RDI failed rc=%d\n", rc); 3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 352