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