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(&param, 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