13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* 23d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelCopyright (c) 2012-2014, 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// Camera dependencies 313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_qcamera_app.h" 323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_qcamera_dbg.h" 333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic void mm_app_reprocess_notify_cb(mm_camera_super_buf_t *bufs, 353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *user_data) 363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = bufs->bufs[0]; 383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; 393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *channel = NULL; 403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_stream_t *m_stream = NULL; 413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *m_frame = NULL; 423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *src_frame; 433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int i = 0; 443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rc = 0; 453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" BEGIN - length=%zu, frame idx = %d\n", 473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->frame_len, frame->frame_idx); 483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* find channel */ 503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) { 513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->channels[i].ch_id == bufs->ch_id) { 523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel = &pme->channels[i]; 533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == channel) { 573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" Wrong channel id (%d)", bufs->ch_id); 583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // We have only one stream and buffer 623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // in the reprocess channel. 633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_stream = &channel->streams[0]; 643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_frame = bufs->bufs[0]; 653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( pme->encodeJpeg ) { 673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->jpeg_buf.buf.buffer = (uint8_t *)malloc(m_frame->frame_len); 683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL == pme->jpeg_buf.buf.buffer ) { 693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" error allocating jpeg output buffer"); 703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel goto exit; 713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->jpeg_buf.buf.frame_len = m_frame->frame_len; 743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* create a new jpeg encoding session */ 753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = createEncodingSession(pme, m_stream, m_frame); 763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (0 != rc) { 773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" error creating jpeg session"); 783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(pme->jpeg_buf.buf.buffer); 793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel goto exit; 803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* start jpeg encoding job */ 833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Encoding reprocessed frame!!"); 843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = encodeData(pme, bufs, m_stream); 853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->encodeJpeg = 0; 863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle, 883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bufs->ch_id, 893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame)) { 903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" Failed in Reprocess Qbuf\n"); 913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info, 933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ION_IOC_INV_CACHES); 943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelexit: 973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Release source frame 993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel src_frame = ( mm_camera_super_buf_t * ) mm_qcamera_queue_dequeue(&pme->pp_frames, 1); 1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL != src_frame ) { 1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_release_ppinput((void *) src_frame, (void *) pme); 1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" END\n"); 1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmm_camera_stream_t * mm_app_add_reprocess_stream_from_source(mm_camera_test_obj_t *test_obj, 1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *channel, 1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_stream_t *source, 1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_notify_t stream_cb, 1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_pp_feature_config_t pp_config, 1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata, 1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t num_bufs) 1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rc = MM_CAMERA_OK; 1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_stream_t *stream = NULL; 1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_capability_t *cam_cap = NULL; 1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_info_t *source_stream_info; 1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ( NULL == test_obj ) || 1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( NULL == channel ) || 1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( NULL == source ) ) { 1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" Invalid input\n"); 1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_cap = (cam_capability_t *)(test_obj->cap_buf.buf.buffer); 1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream = mm_app_add_stream(test_obj, channel); 1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == stream) { 1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" add stream failed\n"); 1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.get_bufs = mm_app_stream_initbuf; 1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.put_bufs = mm_app_stream_deinitbuf; 1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.clean_invalidate_buf = 1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_stream_clean_invalidate_buf; 1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.invalidate_buf = mm_app_stream_invalidate_buf; 140295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel stream->s_config.mem_vtbl.clean_buf = mm_app_stream_clean_buf; 1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.mem_vtbl.user_data = (void *)stream; 1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_cb = stream_cb; 1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_cb_sync = NULL; 1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.userdata = userdata; 1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->num_of_bufs = num_bufs; 1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info = (cam_stream_info_t *)stream->s_info_buf.buf.buffer; 1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel source_stream_info = (cam_stream_info_t *) source->s_info_buf.buf.buffer; 1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(stream->s_config.stream_info, 0, sizeof(cam_stream_info_t)); 1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC; 1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->fmt = source_stream_info->fmt; 1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->dim = source_stream_info->dim; 1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.padding_info = cam_cap->padding_info; 155cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel stream->s_config.stream_info->num_bufs = num_bufs; 1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->reprocess_config.pp_type = CAM_ONLINE_REPROCESS_TYPE; 1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->reprocess_config.online.input_stream_id = source->s_config.stream_info->stream_svr_id; 1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->reprocess_config.online.input_stream_type = source->s_config.stream_info->stream_type; 1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->s_config.stream_info->reprocess_config.pp_feature_config = pp_config; 1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_app_config_stream(test_obj, channel, stream, &stream->s_config); 1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("config preview stream err=%d\n", rc); 1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return stream; 1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmm_camera_channel_t * mm_app_add_reprocess_channel(mm_camera_test_obj_t *test_obj, 1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_stream_t *source_stream) 1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *channel = NULL; 1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_stream_t *stream = NULL; 1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL == source_stream ) { 1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" add reprocess stream failed\n"); 1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel = mm_app_add_channel(test_obj, 1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel MM_CHANNEL_TYPE_REPROCESS, 1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NULL, 1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NULL, 1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NULL); 1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == channel) { 1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" add channel failed"); 1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // pp feature config 1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_pp_feature_config_t pp_config; 1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_capability_t *caps = ( cam_capability_t * ) ( test_obj->cap_buf.buf.buffer ); 1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (caps->qcom_supported_feature_mask & CAM_QCOM_FEATURE_SHARPNESS) { 1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS; 1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pp_config.sharpness = test_obj->reproc_sharpness; 2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (test_obj->reproc_wnr.denoise_enable) { 2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D; 2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pp_config.denoise2d = test_obj->reproc_wnr; 2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (test_obj->enable_CAC) { 2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pp_config.feature_mask |= CAM_QCOM_FEATURE_CAC; 2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pp_config.feature_mask |= CAM_QCOM_FEATURE_FLIP; 21254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t minStreamBufNum = source_stream->num_of_bufs; 2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream = mm_app_add_reprocess_stream_from_source(test_obj, 2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel, 2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel source_stream, 2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_reprocess_notify_cb, 2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pp_config, 2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (void *)test_obj, 2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel minStreamBufNum); 2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == stream) { 2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" add reprocess stream failed\n"); 2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_del_channel(test_obj, channel); 2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel test_obj->reproc_stream = stream; 2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return channel; 2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint mm_app_start_reprocess(mm_camera_test_obj_t *test_obj) 2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rc = MM_CAMERA_OK; 2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *r_ch = NULL; 2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_queue_init(&test_obj->pp_frames, 2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_release_ppinput, 2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( void * ) test_obj); 2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel r_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_REPROCESS); 2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" No initialized reprocess channel d rc=%d\n", rc); 2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_app_start_channel(test_obj, r_ch); 2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("start reprocess failed rc=%d\n", rc); 2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_del_channel(test_obj, r_ch); 2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint mm_app_stop_reprocess(mm_camera_test_obj_t *test_obj) 2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rc = MM_CAMERA_OK; 2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *r_ch = NULL; 2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel r_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_REPROCESS); 2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" No initialized reprocess channel d rc=%d\n", rc); 2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mm_app_stop_and_del_channel(test_obj, r_ch); 2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Stop Preview failed rc=%d\n", rc); 2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_qcamera_queue_release(&test_obj->pp_frames); 2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel test_obj->reproc_stream = NULL; 2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint mm_app_do_reprocess(mm_camera_test_obj_t *test_obj, 2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame, 2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t meta_idx, 2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *super_buf, 2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_stream_t *src_meta) 2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rc = MM_CAMERA_OK; 2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_channel_t *r_ch = NULL; 2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *src_buf = NULL; 2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ( NULL == test_obj ) || 2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( NULL == frame ) || 2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( NULL == super_buf )) { 2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" Invalid input rc=%d\n", rc); 2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL == test_obj->reproc_stream ) { 2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" No reprocess stream rc=%d\n", rc); 2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel r_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_REPROCESS); 3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != rc) { 3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" No reprocess channel rc=%d\n", rc); 3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel src_buf = ( mm_camera_super_buf_t * ) malloc(sizeof(mm_camera_super_buf_t)); 3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL == src_buf ) { 3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" No resources for src frame rc=%d\n", rc); 3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return -1; 3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy(src_buf, super_buf, sizeof(mm_camera_super_buf_t)); 3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_qcamera_queue_enqueue(&test_obj->pp_frames, src_buf); 3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_parm_buffer_t param; 3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.buf_index = frame->buf_idx; 3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.frame_idx = frame->frame_idx; 3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (src_meta != NULL) { 3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.meta_present = 1; 3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.meta_stream_handle = src_meta->s_config.stream_info->stream_svr_id; 3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.meta_buf_index = meta_idx; 3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" No metadata source stream rc=%d\n", rc); 3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel test_obj->reproc_stream->s_config.stream_info->parm_buf = param; 3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = test_obj->cam->ops->set_stream_parms(test_obj->cam->camera_handle, 3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel r_ch->ch_id, 3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel test_obj->reproc_stream->s_id, 3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &test_obj->reproc_stream->s_config.stream_info->parm_buf); 3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid mm_app_release_ppinput(void *data, void *user_data) 3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t i = 0; 3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *recvd_frame = ( mm_camera_super_buf_t * ) data; 3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data; 3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for ( i = 0 ; i < recvd_frame->num_bufs ; i++) { 3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle, 3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel recvd_frame->ch_id, 3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel recvd_frame->bufs[i])) { 3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE(" Failed in Qbuf\n"); 3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_app_cache_ops((mm_camera_app_meminfo_t *) recvd_frame->bufs[i]->mem_info, 3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ION_IOC_INV_CACHES); 3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 353