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(¶m, 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