166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*
266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinCopyright (c) 2012-2014, 2016, The Linux Foundation. All rights reserved.
366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinRedistribution and use in source and binary forms, with or without
566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmodification, are permitted provided that the following conditions are
666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmet:
766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    * Redistributions of source code must retain the above copyright
866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      notice, this list of conditions and the following disclaimer.
966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    * Redistributions in binary form must reproduce the above
1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      copyright notice, this list of conditions and the following
1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      disclaimer in the documentation and/or other materials provided
1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      with the distribution.
1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    * Neither the name of The Linux Foundation nor the names of its
1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      contributors may be used to endorse or promote products derived
1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      from this software without specific prior written permission.
1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
1766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1966f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
2066f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2166f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*/
2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies
3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_qcamera_app.h"
3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_qcamera_dbg.h"
3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic void mm_app_reprocess_notify_cb(mm_camera_super_buf_t *bufs,
3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                   void *user_data)
3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_buf_def_t *frame = bufs->bufs[0];
3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data;
3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_channel_t *channel = NULL;
4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_stream_t *m_stream = NULL;
4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_buf_def_t *m_frame = NULL;
4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_super_buf_t *src_frame;
4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int i = 0;
4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = 0;
4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE(" BEGIN - length=%zu, frame idx = %d\n",
4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          frame->frame_len, frame->frame_idx);
4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* find channel */
5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (i = 0; i < MM_CHANNEL_TYPE_MAX; i++) {
5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (pme->channels[i].ch_id == bufs->ch_id) {
5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            channel = &pme->channels[i];
5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == channel) {
5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" Wrong channel id (%d)",  bufs->ch_id);
5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // We have only one stream and buffer
6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // in the reprocess channel.
6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_stream = &channel->streams[0];
6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_frame = bufs->bufs[0];
6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( pme->encodeJpeg ) {
6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pme->jpeg_buf.buf.buffer = (uint8_t *)malloc(m_frame->frame_len);
6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ( NULL == pme->jpeg_buf.buf.buffer ) {
6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE(" error allocating jpeg output buffer");
7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            goto exit;
7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pme->jpeg_buf.buf.frame_len = m_frame->frame_len;
7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        /* create a new jpeg encoding session */
7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = createEncodingSession(pme, m_stream, m_frame);
7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (0 != rc) {
7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE(" error creating jpeg session");
7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            free(pme->jpeg_buf.buf.buffer);
7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            goto exit;
8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        /* start jpeg encoding job */
8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Encoding reprocessed frame!!");
8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = encodeData(pme, bufs, m_stream);
8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pme->encodeJpeg = 0;
8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle,
8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                bufs->ch_id,
8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                frame)) {
9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE(" Failed in Reprocess Qbuf\n");
9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info,
9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         ION_IOC_INV_CACHES);
9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinexit:
9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Release source frame
9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    src_frame = ( mm_camera_super_buf_t * ) mm_qcamera_queue_dequeue(&pme->pp_frames, 1);
10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( NULL != src_frame ) {
10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_app_release_ppinput((void *) src_frame, (void *) pme);
10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGE(" END\n");
10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_camera_stream_t * mm_app_add_reprocess_stream_from_source(mm_camera_test_obj_t *test_obj,
10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                             mm_camera_channel_t *channel,
10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                             mm_camera_stream_t *source,
11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                             mm_camera_buf_notify_t stream_cb,
11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                             cam_pp_feature_config_t pp_config,
11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                             void *userdata,
11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                             uint8_t num_bufs)
11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = MM_CAMERA_OK;
11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_stream_t *stream = NULL;
11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_capability_t *cam_cap = NULL;
11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_info_t *source_stream_info;
11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( ( NULL == test_obj ) ||
12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         ( NULL == channel ) ||
12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         ( NULL == source ) ) {
12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" Invalid input\n");
12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_cap = (cam_capability_t *)(test_obj->cap_buf.buf.buffer);
12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream = mm_app_add_stream(test_obj, channel);
13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == stream) {
13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" add stream failed\n");
13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.mem_vtbl.get_bufs = mm_app_stream_initbuf;
13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.mem_vtbl.put_bufs = mm_app_stream_deinitbuf;
13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.mem_vtbl.clean_invalidate_buf =
13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      mm_app_stream_clean_invalidate_buf;
13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.mem_vtbl.invalidate_buf = mm_app_stream_invalidate_buf;
14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.mem_vtbl.user_data = (void *)stream;
14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_cb = stream_cb;
14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_cb_sync = NULL;
14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.userdata = userdata;
14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->num_of_bufs = num_bufs;
14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_info = (cam_stream_info_t *)stream->s_info_buf.buf.buffer;
14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    source_stream_info = (cam_stream_info_t *) source->s_info_buf.buf.buffer;
14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(stream->s_config.stream_info, 0, sizeof(cam_stream_info_t));
14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_info->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC;
15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS;
15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_info->fmt = source_stream_info->fmt;
15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_info->dim = source_stream_info->dim;
15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.padding_info = cam_cap->padding_info;
15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_info->reprocess_config.pp_type = CAM_ONLINE_REPROCESS_TYPE;
15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_info->reprocess_config.online.input_stream_id = source->s_config.stream_info->stream_svr_id;
15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_info->reprocess_config.online.input_stream_type = source->s_config.stream_info->stream_type;
15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->s_config.stream_info->reprocess_config.pp_feature_config = pp_config;
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mm_app_config_stream(test_obj, channel, stream, &stream->s_config);
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (MM_CAMERA_OK != rc) {
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("config preview stream err=%d\n",  rc);
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return stream;
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_camera_channel_t * mm_app_add_reprocess_channel(mm_camera_test_obj_t *test_obj,
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                   mm_camera_stream_t *source_stream)
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_channel_t *channel = NULL;
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_stream_t *stream = NULL;
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( NULL == source_stream ) {
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" add reprocess stream failed\n");
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    channel = mm_app_add_channel(test_obj,
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                 MM_CHANNEL_TYPE_REPROCESS,
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                 NULL,
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                 NULL,
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                 NULL);
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == channel) {
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" add channel failed");
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // pp feature config
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_pp_feature_config_t pp_config;
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&pp_config, 0, sizeof(cam_pp_feature_config_t));
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_capability_t *caps = ( cam_capability_t * ) ( test_obj->cap_buf.buf.buffer );
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (caps->qcom_supported_feature_mask & CAM_QCOM_FEATURE_SHARPNESS) {
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pp_config.sharpness = test_obj->reproc_sharpness;
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (test_obj->reproc_wnr.denoise_enable) {
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pp_config.denoise2d = test_obj->reproc_wnr;
20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (test_obj->enable_CAC) {
20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pp_config.feature_mask |= CAM_QCOM_FEATURE_CAC;
20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t minStreamBufNum = source_stream->num_of_bufs;
21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream = mm_app_add_reprocess_stream_from_source(test_obj,
21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                     channel,
21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                     source_stream,
21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                     mm_app_reprocess_notify_cb,
21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                     pp_config,
21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                     (void *)test_obj,
21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                     minStreamBufNum);
21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == stream) {
21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" add reprocess stream failed\n");
22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_app_del_channel(test_obj, channel);
22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    test_obj->reproc_stream = stream;
22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return channel;
22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint mm_app_start_reprocess(mm_camera_test_obj_t *test_obj)
22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = MM_CAMERA_OK;
23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_channel_t *r_ch = NULL;
23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_queue_init(&test_obj->pp_frames,
23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         mm_app_release_ppinput,
23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         ( void * ) test_obj);
23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    r_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_REPROCESS);
23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (MM_CAMERA_OK != rc) {
23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" No initialized reprocess channel d rc=%d\n", rc);
24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mm_app_start_channel(test_obj, r_ch);
24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (MM_CAMERA_OK != rc) {
24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("start reprocess failed rc=%d\n",  rc);
24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_app_del_channel(test_obj, r_ch);
24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint mm_app_stop_reprocess(mm_camera_test_obj_t *test_obj)
25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = MM_CAMERA_OK;
25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_channel_t *r_ch = NULL;
25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    r_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_REPROCESS);
25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (MM_CAMERA_OK != rc) {
26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" No initialized reprocess channel d rc=%d\n", rc);
26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mm_app_stop_and_del_channel(test_obj, r_ch);
26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (MM_CAMERA_OK != rc) {
26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Stop Preview failed rc=%d\n",  rc);
26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_qcamera_queue_release(&test_obj->pp_frames);
27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    test_obj->reproc_stream = NULL;
27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint mm_app_do_reprocess(mm_camera_test_obj_t *test_obj,
27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mm_camera_buf_def_t *frame,
27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        uint32_t meta_idx,
27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mm_camera_super_buf_t *super_buf,
27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mm_camera_stream_t *src_meta)
28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = MM_CAMERA_OK;
28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_channel_t *r_ch = NULL;
28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_super_buf_t *src_buf = NULL;
28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( ( NULL == test_obj ) ||
28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         ( NULL == frame ) ||
28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         ( NULL == super_buf )) {
28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" Invalid input rc=%d\n", rc);
28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( NULL == test_obj->reproc_stream ) {
29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" No reprocess stream rc=%d\n", rc);
29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    r_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_REPROCESS);
29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (MM_CAMERA_OK != rc) {
29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" No reprocess channel rc=%d\n", rc);
30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    src_buf = ( mm_camera_super_buf_t * ) malloc(sizeof(mm_camera_super_buf_t));
30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( NULL == src_buf ) {
30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" No resources for src frame rc=%d\n", rc);
30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -1;
30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memcpy(src_buf, super_buf, sizeof(mm_camera_super_buf_t));
30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_qcamera_queue_enqueue(&test_obj->pp_frames, src_buf);
31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_parm_buffer_t param;
31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    param.reprocess.buf_index = frame->buf_idx;
31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    param.reprocess.frame_idx = frame->frame_idx;
31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (src_meta != NULL) {
31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.reprocess.meta_present = 1;
31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.reprocess.meta_stream_handle = src_meta->s_config.stream_info->stream_svr_id;
31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.reprocess.meta_buf_index = meta_idx;
32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE(" No metadata source stream rc=%d\n", rc);
32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    test_obj->reproc_stream->s_config.stream_info->parm_buf = param;
32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = test_obj->cam->ops->set_stream_parms(test_obj->cam->camera_handle,
32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              r_ch->ch_id,
32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              test_obj->reproc_stream->s_id,
32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              &test_obj->reproc_stream->s_config.stream_info->parm_buf);
32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid mm_app_release_ppinput(void *data, void *user_data)
33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t i = 0;
33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_super_buf_t *recvd_frame  = ( mm_camera_super_buf_t * ) data;
33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data;
33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for ( i = 0 ; i < recvd_frame->num_bufs ; i++) {
34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (MM_CAMERA_OK != pme->cam->ops->qbuf(pme->cam->camera_handle,
34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                recvd_frame->ch_id,
34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                recvd_frame->bufs[i])) {
34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE(" Failed in Qbuf\n");
34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_app_cache_ops((mm_camera_app_meminfo_t *) recvd_frame->bufs[i]->mem_info,
34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         ION_IOC_INV_CACHES);
34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
350