12896d129511c499aef15b8162df05fa299860f59Thierry Strudel/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. 23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* 33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* Redistribution and use in source and binary forms, with or without 43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* modification, are permitted provided that the following conditions are 53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* met: 63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* * Redistributions of source code must retain the above copyright 73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* notice, this list of conditions and the following disclaimer. 83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* * Redistributions in binary form must reproduce the above 93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* copyright notice, this list of conditions and the following 103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* disclaimer in the documentation and/or other materials provided 113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* with the distribution. 123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* * Neither the name of The Linux Foundation nor the names of its 133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* contributors may be used to endorse or promote products derived 143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* from this software without specific prior written permission. 153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* 163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* 283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*/ 293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define LOG_TAG "QCamera2HWI" 313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies 333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <fcntl.h> 343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdio.h> 353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdlib.h> 363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define STAT_H <SYSTEM_HEADER_PREFIX/stat.h> 373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include STAT_H 383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Errors.h> 393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies 413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera2HWI.h" 423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCameraTrace.h" 433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" { 453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_dbg.h" 463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace qcamera { 493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : zsl_channel_cb 523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle ZSL superbuf callback directly from 543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * mm-camera-interface 553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @recvd_frame : received super buffer 583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : recvd_frame will be released after this call by caller, so if 633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * async operation needed for recvd_frame, it's our responsibility 643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * to save a copy for this variable to be used later. 653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::zsl_channel_cb(mm_camera_super_buf_t *recvd_frame, 673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 69e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_ZSL_CH_CB); 703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E"); 713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool dump_raw = false; 733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool log_matching = false; 743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 75cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 77cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel pme->mCameraHandle == 0 || 78e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel (!validate_handle(pme->mCameraHandle->camera_handle, 79e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel recvd_frame->camera_handle))) { 803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraChannel *pChannel = pme->m_channels[QCAMERA_CH_TYPE_ZSL]; 853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pChannel == NULL || 86e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel (!validate_handle(pChannel->getMyHandle(), 87e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel recvd_frame->ch_id))) { 883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("ZSL channel doesn't exist, return here"); 893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->mParameters.isSceneSelectionEnabled() && 933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel !pme->m_stateMachine.isCaptureRunning()) { 943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->selectScene(pChannel, recvd_frame); 953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(recvd_frame); 963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Frame CB Unlock : %d, is AEC Locked: %d", 1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel recvd_frame->bUnlockAEC, pme->m_bLedAfAecLock); 1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(recvd_frame->bUnlockAEC && pme->m_bLedAfAecLock) { 1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *)malloc( 1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sizeof(qcamera_sm_internal_evt_payload_t)); 1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK; 1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("processEvt for retro AEC unlock failed"); 1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for retro AEC event"); 1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Check if retro-active frames are completed and camera is 1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // ready to go ahead with LED estimation for regular frames 1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (recvd_frame->bReadyForPrepareSnapshot) { 1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Send an event 1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Ready for Prepare Snapshot, signal "); 1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *)malloc( 1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sizeof(qcamera_sm_internal_evt_payload_t)); 1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT; 1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt Ready for Snaphot failed"); 1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for prepare signal event detect" 1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel " qcamera_sm_internal_evt_payload_t"); 1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* indicate the parent that capture is done */ 1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->captureDone(); 1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // save a copy for the superbuf 1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t* frame = 1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame == NULL) { 1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error allocating memory to save received_frame structure."); 1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(recvd_frame); 1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *frame = *recvd_frame; 1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (recvd_frame->num_bufs > 0) { 1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: superbuf frame_idx %d", 1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel recvd_frame->bufs[0]->frame_idx); 1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // DUMP RAW if available 1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.zsl_raw", value, "0"); 1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dump_raw = atoi(value) > 0 ? true : false; 1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dump_raw) { 1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) { 1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (recvd_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_RAW) { 1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t * raw_frame = recvd_frame->bufs[i]; 1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = pChannel->getStreamByHandle(raw_frame->stream_id); 1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != pStream) { 1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(pStream, raw_frame, QCAMERA_DUMP_FRM_RAW); 1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) { 1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (recvd_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_SNAPSHOT) { 1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t * yuv_frame = recvd_frame->bufs[i]; 1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = pChannel->getStreamByHandle(yuv_frame->stream_id); 1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != pStream) { 1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(pStream, yuv_frame, QCAMERA_DUMP_FRM_INPUT_REPROCESS); 1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 186cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // whether need FD Metadata along with Snapshot frame in ZSL mode 1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->needFDMetadata(QCAMERA_CH_TYPE_ZSL)){ 1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Need Face Detection result for snapshot frames 1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Get the Meta Data frames 1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *pMetaFrame = NULL; 1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < frame->num_bufs; i++) { 1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pMetaFrame = frame->bufs[i]; //find the metadata 1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pMetaFrame != NULL){ 2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *pMetaData = (metadata_buffer_t *)pMetaFrame->buffer; 2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //send the face detection info 2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_faces_data_t faces_data; 2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->fillFacesData(faces_data, pMetaData); 2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //HARD CODE here before MCT can support 2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.detection_data.fd_type = QCAMERA_FD_SNAPSHOT; 2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT; 2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->faces_data = faces_data; 2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt face_detection_result failed"); 2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for face_detection_result qcamera_sm_internal_evt_payload_t"); 2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpmetadata", value, "0"); 2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t enabled = atoi(value); 2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (enabled) { 2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *pMetaFrame = NULL; 2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < frame->num_bufs; i++) { 2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pMetaFrame = frame->bufs[i]; 2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaFrame != NULL && 2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((metadata_buffer_t *)pMetaFrame->buffer)->is_tuning_params_valid) { 2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpMetadataToFile(pStream, pMetaFrame, (char *) "ZSL_Snapshot"); 2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.zsl_matching", value, "0"); 2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel log_matching = atoi(value) > 0 ? true : false; 2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (log_matching) { 2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("ZSL super buffer contains:"); 2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < frame->num_bufs; i++) { 2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL ) { 2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("Buffer with V4L index %d frame index %d of type %d Timestamp: %ld %ld ", 2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->bufs[i]->buf_idx, 2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->bufs[i]->frame_idx, 2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getMyType(), 2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->bufs[i]->ts.tv_sec, 2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->bufs[i]->ts.tv_nsec); 2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Wait on Postproc initialization if needed 2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // then send to postprocessor 2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NO_ERROR != pme->waitDeferredWork(pme->mReprocJob)) || 2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (NO_ERROR != pme->m_postprocessor.processData(frame))) { 2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Failed to trigger process data"); 2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(recvd_frame); 2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(frame); 2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame = NULL; 2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : selectScene 2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: send a preview callback when a specific selected scene is applied 2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pChannel: Camera channel 2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @frame : Bundled super buffer 2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera2HardwareInterface::selectScene(QCameraChannel *pChannel, 2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *frame) 2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *pMetaFrame = NULL; 2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NULL == frame) || (NULL == pChannel)) { 3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid scene select input"); 3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_scene_mode_type selectedScene = mParameters.getSelectedScene(); 3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (CAM_SCENE_MODE_MAX == selectedScene) { 3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGL("No selected scene"); 3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < frame->num_bufs; i++) { 3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pMetaFrame = frame->bufs[i]; 3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == pMetaFrame) { 3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No metadata buffer found in scene select super buffer"); 3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_INIT; 3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *pMetaData = (metadata_buffer_t *)pMetaFrame->buffer; 3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_scene_mode_type, scene, CAM_INTF_META_CURRENT_SCENE, pMetaData) { 3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((*scene == selectedScene) && 3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mDataCb != NULL) && 3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0)) { 3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *preview_frame = NULL; 3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < frame->num_bufs; i++) { 3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW)) { 3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel preview_frame = frame->bufs[i]; 3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (preview_frame) { 3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraGrallocMemory *memory = (QCameraGrallocMemory *)preview_frame->mem_info; 3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t idx = preview_frame->buf_idx; 345295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel preview_frame->cache_flags |= CPU_HAS_READ; 3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = sendPreviewCallback(pStream, memory, idx); 3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NO_ERROR != rc) { 3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error triggering scene select preview callback"); 3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParameters.setSelectedScene(CAM_SCENE_MODE_MAX); 3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No preview buffer found in scene select super buffer"); 3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_INIT; 3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No current scene metadata!"); 3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = NO_INIT; 3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : capture_channel_cb_routine 3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle snapshot superbuf callback directly from 3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * mm-camera-interface 3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @recvd_frame : received super buffer 3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : recvd_frame will be released after this call by caller, so if 3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * async operation needed for recvd_frame, it's our responsibility 3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * to save a copy for this variable to be used later. 3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*==========================================================================*/ 3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::capture_channel_cb_routine(mm_camera_super_buf_t *recvd_frame, 3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 384e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel KPI_ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_CAPTURE_CH_CB); 3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E PROFILE_YUV_CB_TO_HAL"); 3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 390e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 391e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel recvd_frame->camera_handle)){ 3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraChannel *pChannel = pme->m_channels[QCAMERA_CH_TYPE_CAPTURE]; 3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pChannel == NULL || 398cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel !validate_handle(pChannel->getMyHandle(), 399cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel recvd_frame->ch_id)) { 4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Capture channel doesn't exist, return here"); 4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // save a copy for the superbuf 4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t* frame = 4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame == NULL) { 4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error allocating memory to save received_frame structure."); 4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(recvd_frame); 4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *frame = *recvd_frame; 4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (recvd_frame->num_bufs > 0) { 4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: superbuf frame_idx %d", 4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel recvd_frame->bufs[0]->frame_idx); 4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for ( uint32_t i= 0 ; i < recvd_frame->num_bufs ; i++ ) { 4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( recvd_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_SNAPSHOT ) { 4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t * yuv_frame = recvd_frame->bufs[i]; 4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = pChannel->getStreamByHandle(yuv_frame->stream_id); 4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL != pStream ) { 4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(pStream, yuv_frame, QCAMERA_DUMP_FRM_INPUT_REPROCESS); 4253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpmetadata", value, "0"); 4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t enabled = atoi(value); 4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (enabled) { 4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *pMetaFrame = NULL; 4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < frame->num_bufs; i++) { 4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pMetaFrame = frame->bufs[i]; //find the metadata 4403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaFrame != NULL && 4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((metadata_buffer_t *)pMetaFrame->buffer)->is_tuning_params_valid) { 4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpMetadataToFile(pStream, pMetaFrame, (char *) "Snapshot"); 4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Wait on Postproc initialization if needed 4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // then send to postprocessor 4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NO_ERROR != pme->waitDeferredWork(pme->mReprocJob)) || 4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (NO_ERROR != pme->m_postprocessor.processData(frame))) { 4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Failed to trigger process data"); 4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(recvd_frame); 4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(frame); 4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame = NULL; 4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* START of test register face image for face authentication */ 4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifdef QCOM_TEST_FACE_REGISTER_FACE 4633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel static uint8_t bRunFaceReg = 1; 4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (bRunFaceReg > 0) { 4663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // find snapshot frame 4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *main_stream = NULL; 4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *main_frame = NULL; 4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (int i = 0; i < recvd_frame->num_bufs; i++) { 4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = 4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->getStreamByHandle(recvd_frame->bufs[i]->stream_id); 4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) { 4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel main_stream = pStream; 4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel main_frame = recvd_frame->bufs[i]; 4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (main_stream != NULL && main_frame != NULL) { 4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t faceId = -1; 4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_pp_offline_src_config_t config; 4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&config, 0, sizeof(cam_pp_offline_src_config_t)); 4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel config.num_of_bufs = 1; 4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel main_stream->getFormat(config.input_fmt); 4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel main_stream->getFrameDimension(config.input_dim); 4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel main_stream->getFrameOffset(config.input_buf_planes.plane_info); 4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("DEBUG: registerFaceImage E"); 4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->registerFaceImage(main_frame->buffer, &config, faceId); 4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("DEBUG: registerFaceImage X, ret=%d, faceId=%d", rc, faceId); 4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bRunFaceReg = 0; 4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif 4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* END of test register face image for face authentication */ 4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 5003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifdef TARGET_TS_MAKEUP 5013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCamera2HardwareInterface::TsMakeupProcess_Preview(mm_camera_buf_def_t *pFrame, 5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * pStream) { 5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("begin"); 5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool bRet = false; 5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream == NULL || pFrame == NULL) { 5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bRet = false; 5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("pStream == NULL || pFrame == NULL"); 5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bRet = TsMakeupProcess(pFrame, pStream, mFaceRect); 5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("end bRet = %d ",bRet); 5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return bRet; 5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCamera2HardwareInterface::TsMakeupProcess_Snapshot(mm_camera_buf_def_t *pFrame, 5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * pStream) { 5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("begin"); 5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool bRet = false; 5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream == NULL || pFrame == NULL) { 5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bRet = false; 5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("pStream == NULL || pFrame == NULL"); 5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_frame_len_offset_t offset; 5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&offset, 0, sizeof(cam_frame_len_offset_t)); 5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getFrameOffset(offset); 5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t dim; 5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getFrameDimension(dim); 5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char *yBuf = (unsigned char*)pFrame->buffer; 5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char *uvBuf = yBuf + offset.mp[0].len; 5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel TSMakeupDataEx inMakeupData; 5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.frameWidth = dim.width; 5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.frameHeight = dim.height; 5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.yBuf = yBuf; 5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.uvBuf = uvBuf; 5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.yStride = offset.mp[0].stride; 5383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.uvStride = offset.mp[1].stride; 5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("detect begin"); 5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel TSHandle fd_handle = ts_detectface_create_context(); 5413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (fd_handle != NULL) { 5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_format_t fmt; 5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getFormat(fmt); 5443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int iret = ts_detectface_detectEx(fd_handle, &inMakeupData); 5453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("ts_detectface_detect iret = %d",iret); 5463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (iret <= 0) { 5473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bRet = false; 5483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 5493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel TSRect faceRect; 5503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&faceRect,-1,sizeof(TSRect)); 5513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel iret = ts_detectface_get_face_info(fd_handle, 0, &faceRect, NULL,NULL,NULL); 5523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("ts_detectface_get_face_info iret=%d,faceRect.left=%ld," 5533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel "faceRect.top=%ld,faceRect.right=%ld,faceRect.bottom=%ld" 5543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ,iret,faceRect.left,faceRect.top,faceRect.right,faceRect.bottom); 5553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bRet = TsMakeupProcess(pFrame,pStream,faceRect); 5563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ts_detectface_destroy_context(&fd_handle); 5583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fd_handle = NULL; 5593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 5603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("fd_handle == NULL"); 5613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("detect end"); 5633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("end bRet = %d ",bRet); 5653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return bRet; 5663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 5673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCamera2HardwareInterface::TsMakeupProcess(mm_camera_buf_def_t *pFrame, 5693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * pStream,TSRect& faceRect) { 5703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool bRet = false; 5713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("begin"); 5723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream == NULL || pFrame == NULL) { 5733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("pStream == NULL || pFrame == NULL "); 5743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return false; 5753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int whiteLevel, cleanLevel; 5783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool enableMakeup = (faceRect.left > -1) && 5793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mParameters.getTsMakeupInfo(whiteLevel, cleanLevel)); 5803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (enableMakeup) { 5813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t dim; 5823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_frame_len_offset_t offset; 5833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getFrameDimension(dim); 5843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getFrameOffset(offset); 5853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char *tempOriBuf = NULL; 5863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel tempOriBuf = (unsigned char*)pFrame->buffer; 5883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char *yBuf = tempOriBuf; 5893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char *uvBuf = tempOriBuf + offset.mp[0].len; 5903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char *tmpBuf = new unsigned char[offset.frame_len]; 5913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (tmpBuf == NULL) { 5923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("tmpBuf == NULL "); 5933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return false; 5943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel TSMakeupDataEx inMakeupData, outMakeupData; 5963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel whiteLevel = whiteLevel <= 0 ? 0 : (whiteLevel >= 100 ? 100 : whiteLevel); 5973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cleanLevel = cleanLevel <= 0 ? 0 : (cleanLevel >= 100 ? 100 : cleanLevel); 5983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.frameWidth = dim.width; // NV21 Frame width > 0 5993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.frameHeight = dim.height; // NV21 Frame height > 0 6003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.yBuf = yBuf; // Y buffer pointer 6013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.uvBuf = uvBuf; // VU buffer pointer 6023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.yStride = offset.mp[0].stride; 6033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel inMakeupData.uvStride = offset.mp[1].stride; 6043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel outMakeupData.frameWidth = dim.width; // NV21 Frame width > 0 6053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel outMakeupData.frameHeight = dim.height; // NV21 Frame height > 0 6063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel outMakeupData.yBuf = tmpBuf; // Y buffer pointer 6073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel outMakeupData.uvBuf = tmpBuf + offset.mp[0].len; // VU buffer pointer 6083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel outMakeupData.yStride = offset.mp[0].stride; 6093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel outMakeupData.uvStride = offset.mp[1].stride; 6103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("faceRect:left 2:%ld,,right:%ld,,top:%ld,,bottom:%ld,,Level:%dx%d", 6113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faceRect.left,faceRect.right,faceRect.top,faceRect.bottom,cleanLevel,whiteLevel); 6123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ts_makeup_skin_beautyEx(&inMakeupData, &outMakeupData, &(faceRect),cleanLevel,whiteLevel); 6133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy((unsigned char*)pFrame->buffer, tmpBuf, offset.frame_len); 6143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *memory = (QCameraMemory *)pFrame->mem_info; 6153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memory->cleanCache(pFrame->buf_idx); 6163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (tmpBuf != NULL) { 6173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete[] tmpBuf; 6183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel tmpBuf = NULL; 6193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("end bRet = %d ",bRet); 6223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return bRet; 6233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 6243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif 6253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 6263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : postproc_channel_cb_routine 6273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle postprocess superbuf callback directly from 6293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * mm-camera-interface 6303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 6323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @recvd_frame : received super buffer 6333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 6343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 6363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : recvd_frame will be released after this call by caller, so if 6383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * async operation needed for recvd_frame, it's our responsibility 6393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * to save a copy for this variable to be used later. 6403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*==========================================================================*/ 6413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::postproc_channel_cb_routine(mm_camera_super_buf_t *recvd_frame, 6423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 6433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 644e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_PP_CH_CB); 6453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E"); 6463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 647cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 6483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 649cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel pme->mCameraHandle == 0 || 650cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 651cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel recvd_frame->camera_handle)) { 6523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 6533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 6543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // save a copy for the superbuf 6573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t* frame = 6583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 6593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame == NULL) { 6603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error allocating memory to save received_frame structure."); 6613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 6623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *frame = *recvd_frame; 6643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (recvd_frame->num_bufs > 0) { 6663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: frame_idx %d", recvd_frame->bufs[0]->frame_idx); 6673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Wait on JPEG create session 6693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->waitDeferredWork(pme->mJpegJob); 6703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // send to postprocessor 6723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_postprocessor.processPPData(frame); 6733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ATRACE_INT("Camera:Reprocess", 0); 6753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 6763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 6773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 6793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : synchronous_stream_cb_routine 6803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Function to handle STREAM SYNC CALLBACKS 6823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 6843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 6853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 6863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 6873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 6893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : This Function is excecuted in mm-interface context. 6913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Avoid adding latency on this thread. 6923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 6933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::synchronous_stream_cb_routine( 6943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *super_frame, QCameraStream * stream, 6953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 6963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 6973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t frameTime = 0, mPreviewTimestamp = 0; 6983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int err = NO_ERROR; 6993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 700e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_SYNC_STRM_CB); 7013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 7023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 7033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL) { 7053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid hardware object"); 7063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 7073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (super_frame == NULL) { 7093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid super buffer"); 7103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 7113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 7133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 7143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Frame is NULL"); 7153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 7163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (stream->getMyType() != CAM_STREAM_TYPE_PREVIEW) { 7193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("This is only for PREVIEW stream for now"); 7203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 7213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->m_bPreviewStarted) { 7243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf] : PROFILE_FIRST_PREVIEW_FRAME"); 725c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 726c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_perfLockMgr.releasePerfLock(PERF_LOCK_START_PREVIEW); 727c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_perfLockMgr.releasePerfLock(PERF_LOCK_OPEN_CAMERA); 7283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_bPreviewStarted = false; 729c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 730c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // Set power Hint for preview 731c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_perfLockMgr.acquirePerfLock(PERF_LOCK_POWERHINT_PREVIEW, 0); 7323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraGrallocMemory *memory = (QCameraGrallocMemory *) frame->mem_info; 7353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!pme->needProcessPreviewFrame(frame->frame_idx)) { 7363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 7373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mLastPreviewFrameID = frame->frame_idx; 7383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memory->setBufferStatus(frame->buf_idx, STATUS_SKIPPED); 7393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 7403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("preview is not running, no need to process"); 7413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 7423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needDebugFps()) { 7453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->debugShowPreviewFPS(); 7463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frameTime = nsecs_t(frame->ts.tv_sec) * 1000000000LL + frame->ts.tv_nsec; 7493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Convert Boottime from camera to Monotime for display if needed. 7503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Otherwise, mBootToMonoTimestampOffset value will be 0. 7513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frameTime = frameTime - pme->mBootToMonoTimestampOffset; 7523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Calculate the future presentation time stamp for displaying frames at regular interval 75373e915617b67d794a7c4b8b9c180229a2226ab3aThierry Strudel#if 0 // Temporary removing the dependency on libgui 7542896d129511c499aef15b8162df05fa299860f59Thierry Strudel if (pme->getRecordingHintValue() == true) { 7552896d129511c499aef15b8162df05fa299860f59Thierry Strudel mPreviewTimestamp = pme->mCameraDisplay.computePresentationTimeStamp(frameTime); 7562896d129511c499aef15b8162df05fa299860f59Thierry Strudel } 75773e915617b67d794a7c4b8b9c180229a2226ab3aThierry Strudel#endif 7583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mStreamTimestamp = frameTime; 7593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Enqueue buffer to gralloc. 7613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t idx = frame->buf_idx; 7623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("%p Enqueue Buffer to display %d frame Time = %lld Display Time = %lld", 7633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme, idx, frameTime, mPreviewTimestamp); 7643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = memory->enqueueBuffer(idx, mPreviewTimestamp); 7653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err == NO_ERROR) { 7673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 7683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mLastPreviewFrameID = frame->frame_idx; 7693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mEnqueuedBuffers++; 7703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 7713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 7723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Enqueue Buffer failed"); 7733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 7763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 7773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 7783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 7803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : preview_stream_cb_routine 7813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle preview frame from preview stream in 7833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * normal case with display. 7843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 7863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 7873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 7883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 7893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 7913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 7933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. The new 7943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * preview frame will be sent to display, and an older frame 7953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * will be dequeued from display and needs to be returned back 7963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * to kernel for future use. 7973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 7983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::preview_stream_cb_routine(mm_camera_super_buf_t *super_frame, 7993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * stream, 8003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 8013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 802e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel CAMSCOPE_UPDATE_FLAGS(CAMSCOPE_SECTION_HAL, kpi_camscope_flags); 803e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel KPI_ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_PREVIEW_STRM_CB); 8043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 8053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int err = NO_ERROR; 8063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 8073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraGrallocMemory *memory = (QCameraGrallocMemory *)super_frame->bufs[0]->mem_info; 8083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t dequeueCnt = 0; 8093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL) { 8113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid hardware object"); 8123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 8133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 8143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (memory == NULL) { 8163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid memory object"); 8173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 8183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 8193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 8223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 823c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel LOGE("preview frame is NULL"); 8243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 8253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 8263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // For instant capture and for instant AEC, keep track of the frame counter. 8293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // This count will be used to check against the corresponding bound values. 8303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mParameters.isInstantAECEnabled() || 8313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mParameters.isInstantCaptureEnabled()) { 8323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mInstantAecFrameCount++; 8333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 8363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!stream->isSyncCBEnabled()) { 8373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mLastPreviewFrameID = frame->frame_idx; 8383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool discardFrame = false; 8403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!stream->isSyncCBEnabled() && 8413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel !pme->needProcessPreviewFrame(frame->frame_idx)) 8423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 8433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel discardFrame = true; 8443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (stream->isSyncCBEnabled() && 8453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memory->isBufSkipped(frame->buf_idx)) { 8463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel discardFrame = true; 8473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memory->setBufferStatus(frame->buf_idx, STATUS_IDLE); 8483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 8503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (discardFrame) { 8523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("preview is not running, no need to process"); 8533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 8543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t idx = frame->buf_idx; 8573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8589ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel if (!pme->mParameters.isSecureMode()){ 8599ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_PREVIEW); 8609ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } 8613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->m_bPreviewStarted) { 863c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel LOGI("[KPI Perf] : PROFILE_FIRST_PREVIEW_FRAME"); 864c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 865c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_perfLockMgr.releasePerfLock(PERF_LOCK_START_PREVIEW); 866c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_perfLockMgr.releasePerfLock(PERF_LOCK_OPEN_CAMERA); 867c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_bPreviewStarted = false; 868c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 869c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // Set power Hint for preview 870c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_perfLockMgr.acquirePerfLock(PERF_LOCK_POWERHINT_PREVIEW, 0); 8713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 873c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (!stream->isSyncCBEnabled() && !discardFrame) { 8743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needDebugFps()) { 8763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->debugShowPreviewFPS(); 8773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Enqueue Buffer to display %d", idx); 8803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifdef TARGET_TS_MAKEUP 8813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->TsMakeupProcess_Preview(frame,stream); 8823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif 8833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = memory->enqueueBuffer(idx); 8843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err == NO_ERROR) { 8863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 8873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mEnqueuedBuffers++; 8883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dequeueCnt = pme->mEnqueuedBuffers; 8893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 8903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 8913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Enqueue Buffer failed"); 8923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 8943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 8953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dequeueCnt = pme->mEnqueuedBuffers; 8963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 8973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t numMapped = memory->getMappable(); 900295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel LOGD("EnqueuedCnt %d numMapped %d", dequeueCnt, numMapped); 9013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint8_t i = 0; i < dequeueCnt; i++) { 9033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int dequeuedIdx = memory->dequeueBuffer(); 904295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel LOGD("dequeuedIdx %d numMapped %d Loop running for %d", dequeuedIdx, numMapped, i); 9053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dequeuedIdx < 0 || dequeuedIdx >= memory->getCnt()) { 9063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid dequeued buffer index %d from display", 9073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dequeuedIdx); 9083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 9093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 9103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 9113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mEnqueuedBuffers--; 9123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 9133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dequeuedIdx >= numMapped) { 9143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // This buffer has not yet been mapped to the backend 9153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = stream->mapNewBuffer((uint32_t)dequeuedIdx); 9163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (memory->checkIfAllBuffersMapped()) { 9173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // check if mapping is done for all the buffers 9183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Signal the condition for create jpeg session 9193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex::Autolock l(pme->mMapLock); 9203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mMapCond.signal(); 9213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("Mapping done for all bufs"); 9223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 9233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("All buffers are not yet mapped"); 9243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 927295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel // Get the updated mappable buffer count since it's modified in dequeueBuffer() 928295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel numMapped = memory->getMappable(); 9293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err < 0) { 9303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("buffer mapping failed %d", err); 9313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 9323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Return dequeued buffer back to driver 9333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = stream->bufDone((uint32_t)dequeuedIdx); 9343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( err < 0) { 9353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("stream bufDone failed %d", err); 9362896d129511c499aef15b8162df05fa299860f59Thierry Strudel err = NO_ERROR; 9373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Handle preview data callback 9423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->m_channels[QCAMERA_CH_TYPE_CALLBACK] == NULL) { 943c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (pme->needSendPreviewCallback() && !discardFrame && 9449ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel (!pme->mParameters.isSceneSelectionEnabled()) && 9459ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel (!pme->mParameters.isSecureMode())) { 946295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 9473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->sendPreviewCallback(stream, memory, idx); 9483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NO_ERROR != rc) { 9493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("Preview callback was not sent succesfully"); 9503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 9553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 9563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 9573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 9583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 9603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : sendPreviewCallback 9613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function for triggering preview callbacks 9633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 9653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 9663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @memory : Stream memory allocator 9673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @idx : buffer index 9683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 9703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 9713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 9723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 9733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera2HardwareInterface::sendPreviewCallback(QCameraStream *stream, 9743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *memory, uint32_t idx) 9753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 9763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *previewMem = NULL; 9773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *data = NULL; 9783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *dataToApp = NULL; 9793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t previewBufSize = 0; 9803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t previewBufSizeFromCallback = 0; 9813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t preview_dim; 9823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_format_t previewFmt; 9833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 9843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t yStride = 0; 9853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t yScanline = 0; 9863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uvStride = 0; 9873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uvScanline = 0; 9883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uStride = 0; 9893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uScanline = 0; 9903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t vStride = 0; 9913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t vScanline = 0; 9923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t yStrideToApp = 0; 9933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uvStrideToApp = 0; 9943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t yScanlineToApp = 0; 9953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uvScanlineToApp = 0; 9963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t srcOffset = 0; 9973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t dstOffset = 0; 9983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t srcBaseOffset = 0; 9993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t dstBaseOffset = 0; 10003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int i; 10013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NULL == stream) || (NULL == memory)) { 10033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid preview callback input"); 10043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 10053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_info_t *streamInfo = 10083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel reinterpret_cast<cam_stream_info_t *>(stream->getStreamInfoBuf()->getPtr(0)); 10093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == streamInfo) { 10103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid streamInfo"); 10113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 10123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFrameDimension(preview_dim); 10153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFormat(previewFmt); 10163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yStrideToApp = preview_dim.width; 10183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yScanlineToApp = preview_dim.height; 10193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uvStrideToApp = yStrideToApp; 10203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uvScanlineToApp = yScanlineToApp / 2; 10213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* The preview buffer size in the callback should be 10233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * (width*height*bytes_per_pixel). As all preview formats we support, 10243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * use 12 bits per pixel, buffer size = previewWidth * previewHeight * 3/2. 10253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * We need to put a check if some other formats are supported in future. */ 10263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((previewFmt == CAM_FORMAT_YUV_420_NV21) || 10273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (previewFmt == CAM_FORMAT_YUV_420_NV12) || 10283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (previewFmt == CAM_FORMAT_YUV_420_YV12) || 10293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (previewFmt == CAM_FORMAT_YUV_420_NV12_VENUS) || 10303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (previewFmt == CAM_FORMAT_YUV_420_NV21_VENUS) || 10313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (previewFmt == CAM_FORMAT_YUV_420_NV21_ADRENO)) { 10323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(previewFmt == CAM_FORMAT_YUV_420_YV12) { 10333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yStride = streamInfo->buf_planes.plane_info.mp[0].stride; 10343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yScanline = streamInfo->buf_planes.plane_info.mp[0].scanline; 10353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uStride = streamInfo->buf_planes.plane_info.mp[1].stride; 10363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uScanline = streamInfo->buf_planes.plane_info.mp[1].scanline; 10373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel vStride = streamInfo->buf_planes.plane_info.mp[2].stride; 10383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel vScanline = streamInfo->buf_planes.plane_info.mp[2].scanline; 10393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize = (size_t) 10413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (yStride * yScanline + uStride * uScanline + vStride * vScanline); 10423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSizeFromCallback = previewBufSize; 10433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 10443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yStride = streamInfo->buf_planes.plane_info.mp[0].stride; 10453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yScanline = streamInfo->buf_planes.plane_info.mp[0].scanline; 10463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uvStride = streamInfo->buf_planes.plane_info.mp[1].stride; 10473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uvScanline = streamInfo->buf_planes.plane_info.mp[1].scanline; 10483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize = (size_t) 10503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((yStrideToApp * yScanlineToApp) + (uvStrideToApp * uvScanlineToApp)); 10513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSizeFromCallback = (size_t) 10533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((yStride * yScanline) + (uvStride * uvScanline)); 10543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(previewBufSize == previewBufSizeFromCallback) { 10563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewMem = mGetMemory(memory->getFd(idx), 10573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize, 1, mCallbackCookie); 10583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!previewMem || !previewMem->data) { 10593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mGetMemory failed.\n"); 10603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_MEMORY; 10613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 10623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = previewMem; 10633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 10653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = memory->getMemory(idx, false); 10663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dataToApp = mGetMemory(-1, previewBufSize, 1, mCallbackCookie); 10673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!dataToApp || !dataToApp->data) { 10683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mGetMemory failed.\n"); 10693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_MEMORY; 10703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < preview_dim.height; i++) { 10733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset = i * yStride; 10743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset = i * yStrideToApp; 10753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy((unsigned char *) dataToApp->data + dstOffset, 10773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (unsigned char *) data->data + srcOffset, 10783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (size_t)yStrideToApp); 10793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcBaseOffset = yStride * yScanline; 10823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstBaseOffset = yStrideToApp * yScanlineToApp; 10833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < preview_dim.height/2; i++) { 10853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset = i * uvStride + srcBaseOffset; 10863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset = i * uvStrideToApp + dstBaseOffset; 10873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy((unsigned char *) dataToApp->data + dstOffset, 10893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (unsigned char *) data->data + srcOffset, 10903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (size_t)yStrideToApp); 10913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 10943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /*Invalid Buffer content. But can be used as a first preview frame trigger in 10953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel framework/app */ 10963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize = (size_t) 10973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((yStrideToApp * yScanlineToApp) + 10983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (uvStrideToApp * uvScanlineToApp)); 10993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSizeFromCallback = 0; 11003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("Invalid preview format. Buffer content cannot be processed size = %d", 11013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize); 11023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dataToApp = mGetMemory(-1, previewBufSize, 1, mCallbackCookie); 11033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!dataToApp || !dataToApp->data) { 11043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mGetMemory failed.\n"); 11053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_MEMORY; 11063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t cbArg; 11093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 11103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cb_type = QCAMERA_DATA_CALLBACK; 11113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 11123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (previewBufSize != 0 && previewBufSizeFromCallback != 0 && 11133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize == previewBufSizeFromCallback) { 11143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.data = data; 11153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 11163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.data = dataToApp; 11173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( previewMem ) { 11193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.user_data = previewMem; 11203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.release_cb = releaseCameraMemory; 11213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (dataToApp) { 11223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.user_data = dataToApp; 11233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.release_cb = releaseCameraMemory; 11243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cookie = this; 11263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = m_cbNotifier.notifyCallback(cbArg); 11273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 11283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("fail sending notification"); 11293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (previewMem) { 11303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewMem->release(previewMem); 11313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (dataToApp) { 11323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dataToApp->release(dataToApp); 11333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 11373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 11383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 11403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : nodisplay_preview_stream_cb_routine 11413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle preview frame from preview stream in 11433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * no-display case 11443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 11463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 11473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 11483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 11493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 11513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 11533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. 11543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 11553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::nodisplay_preview_stream_cb_routine( 11563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *super_frame, 11573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream, 11583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 11593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1160e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_NODIS_PREVIEW_STRMCB); 11613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] E"); 11623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 11633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 11643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1165e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1166e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 11673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 11683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 11693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 11703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 11713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 11733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 11743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview frame is NULL"); 11753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 11763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 11773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!pme->needProcessPreviewFrame(frame->frame_idx)) { 11803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("preview is not running, no need to process"); 11813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 11823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 11833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 11843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needDebugFps()) { 11873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->debugShowPreviewFPS(); 11883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *previewMemObj = (QCameraMemory *)frame->mem_info; 11913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *preview_mem = NULL; 11923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (previewMemObj != NULL) { 11933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel preview_mem = previewMemObj->getMemory(frame->buf_idx, false); 11943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != previewMemObj && NULL != preview_mem) { 11963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_PREVIEW); 11973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((pme->needProcessPreviewFrame(frame->frame_idx)) && 11993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->needSendPreviewCallback() && 12003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pme->getRelatedCamSyncInfo()->mode != CAM_MODE_SECONDARY)) { 12013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t cbArg; 12023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 12033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cb_type = QCAMERA_DATA_CALLBACK; 12043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 12053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.data = preview_mem; 12063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.user_data = (void *) &frame->buf_idx; 12073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cookie = stream; 12083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.release_cb = returnStreamBuffer; 1209295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel // Preset cache flags to be handled when the buffer comes back 1210295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 12113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->m_cbNotifier.notifyCallback(cbArg); 12123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 12133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE ("fail sending data notify"); 12143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 12153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 12173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 12183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 12213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] X"); 12223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 12233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 12259ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * FUNCTION : secure_stream_cb_routine 12269ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * 12279ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * DESCRIPTION: helper function to handle secure frame 12289ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * 12299ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * PARAMETERS : 12309ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * @super_frame : received super buffer 12319ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * @stream : stream object 12329ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * @userdata : user data ptr 12339ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * 12349ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * RETURN : None 12359ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * 12369ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 12379ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel * responsibility to free super_frame once it's done. 12389ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel *==========================================================================*/ 12399ec39c64004dda78086849a21087cb217d0bf6acThierry Strudelvoid QCamera2HardwareInterface::secure_stream_cb_routine( 12409ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel mm_camera_super_buf_t *super_frame, 12419ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel QCameraStream *stream, void *userdata) 12429ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel{ 12439ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel ATRACE_CALL(); 12449ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGH("Enter"); 12459ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 12469ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel if (pme == NULL || 12479ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel pme->mCameraHandle == NULL || 12489ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 12499ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGE("camera obj not valid"); 12509ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel free(super_frame); 12519ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel return; 12529ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } 12539ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 12549ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel if (NULL == frame) { 12559ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGE("preview frame is NLUL"); 12569ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel goto end; 12579ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } 12589ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel 12599ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel if (pme->isSecureMode()) { 12609ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel // Secure Mode 12619ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel // We will do QCAMERA_NOTIFY_CALLBACK and share FD in case of secure mode 12629ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel QCameraMemory *memObj = (QCameraMemory *)frame->mem_info; 12639ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel if (NULL == memObj) { 12649ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGE("memObj is NULL"); 12659ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel stream->bufDone(frame->buf_idx); 12669ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel goto end; 12679ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } 12689ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel 12699ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel int fd = memObj->getFd(frame->buf_idx); 12709ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel if (pme->mDataCb != NULL && 12719ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel pme->msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0) { 12729ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGD("Secure frame fd =%d for index = %d ", fd, frame->buf_idx); 12739ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel // Prepare Callback structure 12749ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel qcamera_callback_argm_t cbArg; 12759ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 12769ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 12779ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 12789ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel#ifndef VANILLA_HAL 12799ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel cbArg.ext1 = CAMERA_FRAME_DATA_FD; 12809ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel cbArg.ext2 = fd; 12819ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel#endif 12829ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel cbArg.user_data = (void *) &frame->buf_idx; 12839ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel cbArg.cookie = stream; 12849ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel cbArg.release_cb = returnStreamBuffer; 12859ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel pme->m_cbNotifier.notifyCallback(cbArg); 12869ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } else { 12879ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGH("No need to process secure frame, msg not enabled"); 12889ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel stream->bufDone(frame->buf_idx); 12899ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } 12909ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } else { 12919ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGH("No need to process secure frame, not in secure mode"); 12929ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel stream->bufDone(frame->buf_idx); 12939ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } 12949ec39c64004dda78086849a21087cb217d0bf6acThierry Strudelend: 12959ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel free(super_frame); 12969ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGH("Exit"); 12979ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel return; 12989ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel} 12999ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel 13009ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel/*=========================================================================== 13013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : rdi_mode_stream_cb_routine 13023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle RDI frame from preview stream in 13043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * rdi mode case 13053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 13073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 13083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 13093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 13103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 13123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 13143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. 13153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 13163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::rdi_mode_stream_cb_routine( 13173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *super_frame, 13183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream, 13193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 13203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1321e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_RDI_MODE_STRM_CB); 13229ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel QCameraMemory *previewMemObj = NULL; 13239ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel camera_memory_t *preview_mem = NULL; 13249ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel 13253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("RDI_DEBUG Enter"); 13263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 13273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 13283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1329e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1330e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 13313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 13323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 13333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 13343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 13363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 13373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview frame is NLUL"); 13383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel goto end; 13393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!pme->needProcessPreviewFrame(frame->frame_idx)) { 13413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview is not running, no need to process"); 13423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 13433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel goto end; 13443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needDebugFps()) { 13463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->debugShowPreviewFPS(); 13473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Non-secure Mode 13499ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel previewMemObj = (QCameraMemory *)frame->mem_info; 13509ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel if (NULL == previewMemObj) { 13519ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGE("previewMemObj is NULL"); 13529ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel stream->bufDone(frame->buf_idx); 13539ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel goto end; 13549ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } 13553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13569ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel preview_mem = previewMemObj->getMemory(frame->buf_idx, false); 13579ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel if (NULL != preview_mem) { 13589ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel previewMemObj->cleanCache(frame->buf_idx); 13599ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel // Dump RAW frame 13609ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_RAW); 13619ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel // Notify Preview callback frame 13623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needProcessPreviewFrame(frame->frame_idx) && 13633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataCb != NULL && 13643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0) { 13653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t cbArg; 13663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 13679ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel cbArg.cb_type = QCAMERA_DATA_CALLBACK; 13683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 13699ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel cbArg.data = preview_mem; 13709ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel cbArg.user_data = (void *) &frame->buf_idx; 13713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cookie = stream; 13723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.release_cb = returnStreamBuffer; 1373295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel // Preset cache flags to be handled when the buffer comes back 1374295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 13753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_cbNotifier.notifyCallback(cbArg); 13763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 13779ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGE("preview_mem is NULL"); 13783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 13793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13809ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } else { 13819ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGE("preview_mem is NULL"); 13829ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel stream->bufDone(frame->buf_idx); 13833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelend: 13853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 13863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("RDI_DEBUG Exit"); 13873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 13883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 13893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 13913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : postview_stream_cb_routine 13923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle post frame from postview stream 13943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 13963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 13973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 13983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 13993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 14013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 14033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. 14043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 14053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::postview_stream_cb_routine(mm_camera_super_buf_t *super_frame, 14063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream, 14073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 14083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1409e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_POSTVIEW_STRM_CB); 14103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int err = NO_ERROR; 14113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 14123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraGrallocMemory *memory = (QCameraGrallocMemory *)super_frame->bufs[0]->mem_info; 14133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL) { 14153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid hardware object"); 14163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 14173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 14183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (memory == NULL) { 14203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid memory object"); 14213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 14223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 14233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 14263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 14283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 14293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview frame is NULL"); 14303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 14313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 14323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *memObj = (QCameraMemory *)frame->mem_info; 14353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != memObj) { 14363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_THUMBNAIL); 14373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Return buffer back to driver 14403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = stream->bufDone(frame->buf_idx); 14413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( err < 0) { 14423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("stream bufDone failed %d", err); 14433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 14463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 14473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 14483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 14493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 14513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : video_stream_cb_routine 14523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle video frame from video stream 14543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 14563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 14573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 14583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 14593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 14613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 14633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. video 14643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * frame will be sent to video encoder. Once video encoder is 14653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * done with the video frame, it will call another API 14663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * (release_recording_frame) to return the frame back 14673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 14683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::video_stream_cb_routine(mm_camera_super_buf_t *super_frame, 14693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream, 14703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 14713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1472e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_VIDEO_STRM_CB); 14733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraVideoMemory *videoMemObj = NULL; 14743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *video_mem = NULL; 14753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t timeStamp = 0; 14763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool triggerTCB = FALSE; 14773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14789e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("[KPI Perf] : BEGIN"); 14793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 14803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 1481cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel pme->mCameraHandle == 0 || 1482cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1483cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel super_frame->camera_handle)) { 14843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 14853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 14863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 14873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 14903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needDebugFps()) { 14923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->debugShowVideoFPS(); 14933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->m_bRecordStarted) { 14953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf] : PROFILE_FIRST_RECORD_FRAME"); 14963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_bRecordStarted = false ; 14973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Stream(%d), Timestamp: %ld %ld", 14993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->stream_id, 15003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->ts.tv_sec, 15013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->ts.tv_nsec); 15023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame->buf_type == CAM_STREAM_BUF_TYPE_MPLANE) { 15043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mParameters.getVideoBatchSize() == 0) { 15053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timeStamp = nsecs_t(frame->ts.tv_sec) * 1000000000LL 15063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel + frame->ts.tv_nsec; 15073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_VIDEO); 15083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel videoMemObj = (QCameraVideoMemory *)frame->mem_info; 15093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel video_mem = NULL; 15103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != videoMemObj) { 15113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel video_mem = videoMemObj->getMemory(frame->buf_idx, 15123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pme->mStoreMetaDataInFrame > 0)? true : false); 15133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel triggerTCB = TRUE; 15149e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGH("Video frame TimeStamp : %lld batch = 0 index = %d", 15159e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel timeStamp, frame->buf_idx); 15163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 15183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Handle video batch callback 15193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel native_handle_t *nh = NULL; 15203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_VIDEO); 15213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraVideoMemory *videoMemObj = (QCameraVideoMemory *)frame->mem_info; 15223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((stream->mCurMetaMemory == NULL) 15233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || (stream->mCurBufIndex == -1)) { 15243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //get Free metadata available 15253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (int i = 0; i < CAMERA_MIN_VIDEO_BATCH_BUFFERS; i++) { 15263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (stream->mStreamMetaMemory[i].consumerOwned == 0) { 15273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurMetaMemory = videoMemObj->getMemory(i,true); 15283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurBufIndex = 0; 15293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurMetaIndex = i; 15303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mStreamMetaMemory[i].numBuffers = 0; 15313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 15323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel video_mem = stream->mCurMetaMemory; 15369e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel nh = videoMemObj->getNativeHandle(stream->mCurMetaIndex); 15373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (video_mem == NULL || nh == NULL) { 15383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No Free metadata. Drop this frame"); 15393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurBufIndex = -1; 15403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 15413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 15423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 15433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int index = stream->mCurBufIndex; 15463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int fd_cnt = pme->mParameters.getVideoBatchSize(); 15473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t frame_ts = nsecs_t(frame->ts.tv_sec) * 1000000000LL 15483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel + frame->ts.tv_nsec; 15493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (index == 0) { 15503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mFirstTimeStamp = frame_ts; 15513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mStreamMetaMemory[stream->mCurMetaIndex].buf_index[index] 15543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel = (uint8_t)frame->buf_idx; 15553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mStreamMetaMemory[stream->mCurMetaIndex].numBuffers++; 15563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mStreamMetaMemory[stream->mCurMetaIndex].consumerOwned 15573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel = TRUE; 15582896d129511c499aef15b8162df05fa299860f59Thierry Strudel 15592896d129511c499aef15b8162df05fa299860f59Thierry Strudel //Fill video metadata. 15602896d129511c499aef15b8162df05fa299860f59Thierry Strudel videoMemObj->updateNativeHandle(nh, index, //native_handle 15612896d129511c499aef15b8162df05fa299860f59Thierry Strudel (int)videoMemObj->getFd(frame->buf_idx), //FD 15622896d129511c499aef15b8162df05fa299860f59Thierry Strudel (int)videoMemObj->getSize(frame->buf_idx),//Size 15632896d129511c499aef15b8162df05fa299860f59Thierry Strudel (int)(frame_ts - stream->mFirstTimeStamp)); 15642896d129511c499aef15b8162df05fa299860f59Thierry Strudel 15653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurBufIndex++; 15663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (stream->mCurBufIndex == fd_cnt) { 15673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timeStamp = stream->mFirstTimeStamp; 15689e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGH("Video frame to encoder TimeStamp : %lld batch = %d Buffer idx = %d", 15699e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel timeStamp, fd_cnt, 15702896d129511c499aef15b8162df05fa299860f59Thierry Strudel stream->mCurMetaIndex); 15713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurBufIndex = -1; 15723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurMetaIndex = -1; 15733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurMetaMemory = NULL; 15743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel triggerTCB = TRUE; 15753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 15783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel videoMemObj = (QCameraVideoMemory *)frame->mem_info; 15793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel video_mem = NULL; 15803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel native_handle_t *nh = NULL; 15813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int fd_cnt = frame->user_buf.bufs_used; 15823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != videoMemObj) { 15833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel video_mem = videoMemObj->getMemory(frame->buf_idx, true); 15849e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel nh = videoMemObj->getNativeHandle(frame->buf_idx); 15853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 15863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("videoMemObj NULL"); 15873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (nh != NULL) { 15903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timeStamp = nsecs_t(frame->ts.tv_sec) * 1000000000LL 15913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel + frame->ts.tv_nsec; 15923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (int i = 0; i < fd_cnt; i++) { 15943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame->user_buf.buf_idx[i] >= 0) { 15953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *plane_frame = 15963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &frame->user_buf.plane_buf[frame->user_buf.buf_idx[i]]; 15973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraVideoMemory *frameobj = 15983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (QCameraVideoMemory *)plane_frame->mem_info; 15993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t frame_ts = nsecs_t(plane_frame->ts.tv_sec) * 1000000000LL 16003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel + plane_frame->ts.tv_nsec; 16012896d129511c499aef15b8162df05fa299860f59Thierry Strudel //Fill video metadata. 16022896d129511c499aef15b8162df05fa299860f59Thierry Strudel videoMemObj->updateNativeHandle(nh, i, 16032896d129511c499aef15b8162df05fa299860f59Thierry Strudel (int)frameobj->getFd(plane_frame->buf_idx), 16042896d129511c499aef15b8162df05fa299860f59Thierry Strudel (int)frameobj->getSize(plane_frame->buf_idx), 16052896d129511c499aef15b8162df05fa299860f59Thierry Strudel (int)(frame_ts - timeStamp)); 16062896d129511c499aef15b8162df05fa299860f59Thierry Strudel 16073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Send Video frames to services/encoder delta : %lld FD = %d index = %d", 16083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (frame_ts - timeStamp), plane_frame->fd, plane_frame->buf_idx); 16093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, plane_frame, QCAMERA_DUMP_FRM_VIDEO); 16103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel triggerTCB = TRUE; 16139e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGH("Batch buffer TimeStamp : %lld FD = %d index = %d fd_cnt = %d", 16149e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel timeStamp, frame->fd, frame->buf_idx, fd_cnt); 16153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 16163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No Video Meta Available. Return Buffer"); 16173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(super_frame->bufs[0]->buf_idx); 16183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NULL != video_mem) && (triggerTCB == TRUE)) { 16223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((pme->mDataCbTimestamp != NULL) && 16233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->msgTypeEnabledWithLock(CAMERA_MSG_VIDEO_FRAME) > 0) { 16243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t cbArg; 16253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 16263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cb_type = QCAMERA_DATA_TIMESTAMP_CALLBACK; 16273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.msg_type = CAMERA_MSG_VIDEO_FRAME; 16283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.data = video_mem; 16293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1630cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // For VT usecase, ISP uses AVtimer not CLOCK_BOOTTIME as time source. 1631cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // So do not change video timestamp. 1632cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (!pme->mParameters.isAVTimerEnabled()) { 1633cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // Convert Boottime from camera to Monotime for video if needed. 1634cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // Otherwise, mBootToMonoTimestampOffset value will be 0. 1635cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel timeStamp = timeStamp - pme->mBootToMonoTimestampOffset; 1636cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 16373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Final video buffer TimeStamp : %lld ", timeStamp); 16383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.timestamp = timeStamp; 16393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->m_cbNotifier.notifyCallback(cbArg); 16403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 16413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("fail sending data notify"); 16423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 16433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 16489e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("[KPI Perf] : END"); 16493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 16503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 16523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : snapshot_channel_cb_routine 16533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle snapshot frame from snapshot channel 16553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 16573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 16583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 16593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 16613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : recvd_frame will be released after this call by caller, so if 16633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * async operation needed for recvd_frame, it's our responsibility 16643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * to save a copy for this variable to be used later. 16653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 16663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::snapshot_channel_cb_routine(mm_camera_super_buf_t *super_frame, 16673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 16683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1669e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_SNAPSHOT_CH_CB); 16703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 16713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraChannel *pChannel = NULL; 16723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E"); 16743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 16753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 16763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1677e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1678e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 16793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 16803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 16813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 16823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 16833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->isLowPowerMode()) { 16863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel = pme->m_channels[QCAMERA_CH_TYPE_VIDEO]; 16873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 16883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel = pme->m_channels[QCAMERA_CH_TYPE_SNAPSHOT]; 16893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1691cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if ((pChannel == NULL) 1692cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel || (!validate_handle(pChannel->getMyHandle(), 1693cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel super_frame->ch_id))) { 16943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Snapshot channel doesn't exist, return here"); 16953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 16963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpmetadata", value, "0"); 16993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t enabled = atoi(value); 17003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (enabled) { 17013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *pMetaFrame = NULL; 17023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 17033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < super_frame->num_bufs; i++) { 17043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = pChannel->getStreamByHandle(super_frame->bufs[i]->stream_id); 17053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 17063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 17073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pMetaFrame = super_frame->bufs[i]; //find the metadata 17083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaFrame != NULL && 17093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((metadata_buffer_t *)pMetaFrame->buffer)->is_tuning_params_valid) { 17103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpMetadataToFile(pStream, pMetaFrame, (char *) "Snapshot"); 17113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 17133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // save a copy for the superbuf 17193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t* frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 17203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame == NULL) { 17213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error allocating memory to save received_frame structure."); 17223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(super_frame); 17233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 17243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *frame = *super_frame; 17263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame->num_bufs > 0) { 17283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: superbuf frame_idx %d", 17293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->bufs[0]->frame_idx); 17303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NO_ERROR != pme->waitDeferredWork(pme->mReprocJob)) || 17333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (NO_ERROR != pme->m_postprocessor.processData(frame))) { 17343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Failed to trigger process data"); 17353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(super_frame); 17363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(frame); 17373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame = NULL; 17383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 17393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 17423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 17433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 17453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : raw_stream_cb_routine 17463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle raw dump frame from raw stream 17483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 17503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 17513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 17523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 17533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 17553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 17573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. For raw 17583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * frame, there is no need to send to postprocessor for jpeg 17593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * encoding. this function will play shutter and send the data 17603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * callback to upper layer. Raw frame buffer will be returned 17613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * back to kernel, and frame will be free after use. 17623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 17633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 17643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * /*stream*/, 17653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 17663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1767e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_RAW_STRM_CB); 17683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 17693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 17703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 17713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1772e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1773e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 17743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 17753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 17763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 17773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 17783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_postprocessor.processRawData(super_frame); 17813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 17823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 17833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 17853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : raw_channel_cb_routine 17863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle RAW superbuf callback directly from 17883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * mm-camera-interface 17893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 17913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 17923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 17933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 17953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : recvd_frame will be released after this call by caller, so if 17973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * async operation needed for recvd_frame, it's our responsibility 17983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * to save a copy for this variable to be used later. 17993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*==========================================================================*/ 18003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::raw_channel_cb_routine(mm_camera_super_buf_t *super_frame, 18013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 18023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1804e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_RAW_CH_CB); 18053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 18063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E"); 18083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 18093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 18103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1811e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1812e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 18133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 18143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 18153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 18163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 18173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraChannel *pChannel = pme->m_channels[QCAMERA_CH_TYPE_RAW]; 18203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pChannel == NULL) { 18213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("RAW channel doesn't exist, return here"); 18223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 18233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1825cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (!validate_handle(pChannel->getMyHandle(), super_frame->ch_id)) { 18263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid Input super buffer"); 18273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(super_frame); 18283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 18293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpmetadata", value, "0"); 18323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t enabled = atoi(value); 18333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (enabled) { 18343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *pMetaFrame = NULL; 18353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 18363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < super_frame->num_bufs; i++) { 18373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = pChannel->getStreamByHandle(super_frame->bufs[i]->stream_id); 18383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 18393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 18403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pMetaFrame = super_frame->bufs[i]; //find the metadata 18413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaFrame != NULL && 18423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((metadata_buffer_t *)pMetaFrame->buffer)->is_tuning_params_valid) { 18433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpMetadataToFile(pStream, pMetaFrame, (char *) "raw"); 18443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 18463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // save a copy for the superbuf 18523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t* frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 18533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame == NULL) { 18543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error allocating memory to save received_frame structure."); 18553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(super_frame); 18563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 18573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *frame = *super_frame; 18593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame->num_bufs > 0) { 18613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: superbuf frame_idx %d", 18623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->bufs[0]->frame_idx); 18633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Wait on Postproc initialization if needed 18663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // then send to postprocessor 18673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NO_ERROR != pme->waitDeferredWork(pme->mReprocJob)) || 18683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (NO_ERROR != pme->m_postprocessor.processData(frame))) { 18693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Failed to trigger process data"); 18703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(super_frame); 18713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(frame); 18723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame = NULL; 18733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 18743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 18773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 18793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 18813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : preview_raw_stream_cb_routine 18823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle raw frame during standard preview 18843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 18863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 18873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 18883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 18893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 18913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 18933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. 18943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 18953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::preview_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 18963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * stream, 18973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 18983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1899e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_PREVIEW_RAW_STRM_CB); 19003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 19013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 19023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool dump_preview_raw = false, dump_video_raw = false; 19033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 19053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 19063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1907e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1908e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 19093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 19103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 19113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 19123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 19133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *raw_frame = super_frame->bufs[0]; 19163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (raw_frame != NULL) { 19183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.preview_raw", value, "0"); 19193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dump_preview_raw = atoi(value) > 0 ? true : false; 19203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.video_raw", value, "0"); 19213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dump_video_raw = atoi(value) > 0 ? true : false; 19223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dump_preview_raw || (pme->mParameters.getRecordingHintValue() 19233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel && dump_video_raw)) { 19243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, raw_frame, QCAMERA_DUMP_FRM_RAW); 19253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(raw_frame->buf_idx); 19273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 19293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 19313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 19323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 19343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : snapshot_raw_stream_cb_routine 19353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle raw frame during standard capture 19373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 19393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 19403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 19413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 19423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 19443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 19463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. 19473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 19483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::snapshot_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 19493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * stream, 19503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 19513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1952e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_SNAPSHOT_RAW_STRM_CB); 19533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 19543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 19553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool dump_raw = false; 19563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 19583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 19593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1960e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1961e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 19623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 19633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 19643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 19653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 19663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.snapshot_raw", value, "0"); 19693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dump_raw = atoi(value) > 0 ? true : false; 19703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < super_frame->num_bufs; i++) { 19723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (super_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_RAW) { 19733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t * raw_frame = super_frame->bufs[i]; 19743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != stream) { 19753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dump_raw) { 19763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, raw_frame, QCAMERA_DUMP_FRM_RAW); 19773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(super_frame->bufs[i]->buf_idx); 19793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 19813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 19853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 19873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 19883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 19903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : updateMetadata 19913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Frame related parameter can be updated here 19933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 19953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pMetaData : pointer to metadata buffer 19963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 19983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 19993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 20003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 20013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera2HardwareInterface::updateMetadata(metadata_buffer_t *pMetaData) 20023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 20033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 20043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaData == NULL) { 20063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Null Metadata buffer"); 20073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 20083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Sharpness 20113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_edge_application_t edge_application; 20123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&edge_application, 0x00, sizeof(cam_edge_application_t)); 20133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.sharpness = mParameters.getSharpness(); 20143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (edge_application.sharpness != 0) { 20153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.edge_mode = CAM_EDGE_MODE_FAST; 20163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 20173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.edge_mode = CAM_EDGE_MODE_OFF; 20183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 20203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EDGE_MODE, edge_application); 20213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Effect 20233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t prmEffect = mParameters.getEffect(); 20243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_PARM_EFFECT, prmEffect); 20253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //flip 20273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t prmFlip = mParameters.getFlipMode(CAM_STREAM_TYPE_SNAPSHOT); 20283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_PARM_FLIP, prmFlip); 20293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //denoise 20313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t prmDenoise = (uint8_t)mParameters.isWNREnabled(); 20323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 20333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_NOISE_REDUCTION_MODE, prmDenoise); 20343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //rotation & device rotation 20363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t prmRotation = mParameters.getJpegRotation(); 20373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_rotation_info_t rotation_info; 20383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&rotation_info, 0, sizeof(cam_rotation_info_t)); 20393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (prmRotation == 0) { 20403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.rotation = ROTATE_0; 20413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (prmRotation == 90) { 20423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.rotation = ROTATE_90; 20433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (prmRotation == 180) { 20443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.rotation = ROTATE_180; 20453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (prmRotation == 270) { 20463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.rotation = ROTATE_270; 20473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t device_rotation = mParameters.getDeviceRotation(); 20503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (device_rotation == 0) { 20513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.device_rotation = ROTATE_0; 20523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (device_rotation == 90) { 20533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.device_rotation = ROTATE_90; 20543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (device_rotation == 180) { 20553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.device_rotation = ROTATE_180; 20563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (device_rotation == 270) { 20573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.device_rotation = ROTATE_270; 20583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 20593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.device_rotation = ROTATE_0; 20603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_PARM_ROTATION, rotation_info); 20633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Imglib Dynamic Scene Data 20653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dyn_img_data_t dyn_img_data = mParameters.getDynamicImgData(); 20663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mParameters.isStillMoreEnabled()) { 20673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_still_more_t stillmore_cap = mParameters.getStillMoreSettings(); 20683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dyn_img_data.input_count = stillmore_cap.burst_count; 20693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 20713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_IMG_DYN_FEAT, dyn_img_data); 20723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //CPP CDS 20743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t prmCDSMode = mParameters.getCDSMode(); 20753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 20763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_PARM_CDS_MODE, prmCDSMode); 20773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 207854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel IF_META_AVAILABLE(cam_crop_data_t, crop_data, CAM_INTF_META_CROP_DATA, pMetaData) { 207954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (isDualCamera()) { 20802896d129511c499aef15b8162df05fa299860f59Thierry Strudel if ((mActiveCameras == MM_CAMERA_DUAL_CAM) && mBundledSnapshot) { 208154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel crop_data->ignore_crop = 1; // CPP ignores the crop in this special zone 208254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Set the margins to 0. 208354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel crop_data->margins.widthMargins = 0.0f; 208454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel crop_data->margins.heightMargins = 0.0f; 208554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } else { 208654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel crop_data->ignore_crop = 0; 208754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Get the frame margin data for the master camera and copy to the metadata 208854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel crop_data->margins = m_pFovControl->getFrameMargins(mMasterCamera); 208954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 209054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 209154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 209254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 20933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 20943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 20953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 20973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : metadata_stream_cb_routine 20983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle metadata frame from metadata stream 21003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 21013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 21023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 21033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 21043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 21053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 21063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 21073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 21083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 21093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. Metadata 21103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * could have valid entries for face detection result or 21113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * histogram statistics information. 21123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 21133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::metadata_stream_cb_routine(mm_camera_super_buf_t * super_frame, 21143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * stream, 21153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 21163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2117e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_METADATA_STRM_CB); 21183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("[KPI Perf] : BEGIN"); 21193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 2120cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 21213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 2122cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel pme->mCameraHandle == 0 || 2123cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 2124cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel super_frame->camera_handle)) { 21253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 21263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 21273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 21283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 21313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *pMetaData = (metadata_buffer_t *)frame->buffer; 2132c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 2133c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (pme->isDualCamera()) { 21342896d129511c499aef15b8162df05fa299860f59Thierry Strudel mm_camera_buf_def_t *frameMain = NULL; 21352896d129511c499aef15b8162df05fa299860f59Thierry Strudel mm_camera_buf_def_t *frameAux = NULL; 2136c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel metadata_buffer_t *pMetaDataMain = NULL; 2137c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel metadata_buffer_t *pMetaDataAux = NULL; 2138c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel metadata_buffer_t *resultMetadata = NULL; 2139c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (super_frame->num_bufs == MM_CAMERA_MAX_CAM_CNT) { 21402896d129511c499aef15b8162df05fa299860f59Thierry Strudel if (get_main_camera_handle(super_frame->bufs[0]->stream_id)) { 21412896d129511c499aef15b8162df05fa299860f59Thierry Strudel frameMain = super_frame->bufs[0]; 21422896d129511c499aef15b8162df05fa299860f59Thierry Strudel frameAux = super_frame->bufs[1]; 21432896d129511c499aef15b8162df05fa299860f59Thierry Strudel } else { 21442896d129511c499aef15b8162df05fa299860f59Thierry Strudel frameMain = super_frame->bufs[1]; 21452896d129511c499aef15b8162df05fa299860f59Thierry Strudel frameAux = super_frame->bufs[0]; 21462896d129511c499aef15b8162df05fa299860f59Thierry Strudel } 21472896d129511c499aef15b8162df05fa299860f59Thierry Strudel pMetaDataMain = (metadata_buffer_t *)frameMain->buffer; 2148c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataAux = (metadata_buffer_t *)frameAux->buffer; 2149c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } else { 2150c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (super_frame->camera_handle == 2151c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel get_main_camera_handle(pme->mCameraHandle->camera_handle)) { 2152c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataMain = pMetaData; 2153c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataAux = NULL; 2154c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } else if (super_frame->camera_handle == 2155c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel get_aux_camera_handle(pme->mCameraHandle->camera_handle)) { 2156c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataMain = NULL; 2157c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataAux = pMetaData; 2158c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 2159c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 2160c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 2161c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel resultMetadata = pme->m_pFovControl->processResultMetadata(pMetaDataMain, pMetaDataAux); 2162c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (resultMetadata != NULL) { 2163c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaData = resultMetadata; 2164c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } else { 2165c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel LOGE("FOV-control: processResultMetadata failed."); 216654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel stream->bufDone(super_frame); 2167c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel free(super_frame); 2168c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel return; 2169c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 2170c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 2171c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 21723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->m_stateMachine.isNonZSLCaptureRunning()&& 21733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel !pme->mLongshotEnabled) { 21743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Make shutter call back in non ZSL mode once raw frame is received from VFE. 21753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->playShutter(); 21763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaData->is_tuning_params_valid && pme->mParameters.getRecordingHintValue() == true) { 21793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Dump Tuning data for video 21803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpMetadataToFile(stream,frame,(char *)"Video"); 21813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_hist_stats_t, stats_data, CAM_INTF_META_HISTOGRAM, pMetaData) { 21843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // process histogram statistics info 21853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 21863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 21873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 21883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 21893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 21903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS; 21913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->stats_data = *stats_data; 21923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 21933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 21943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt histogram failed"); 21953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 21963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 21973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 22003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for histogram qcamera_sm_internal_evt_payload_t"); 22013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_detection_data_t, detection_data, 22053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_DETECTION, pMetaData) { 22063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_faces_data_t faces_data; 22083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->fillFacesData(faces_data, pMetaData); 22093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.detection_data.fd_type = QCAMERA_FD_PREVIEW; //HARD CODE here before MCT can support 22103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = (qcamera_sm_internal_evt_payload_t *) 22123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 22133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 22143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 22153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT; 22163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->faces_data = faces_data; 22173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 22183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 22193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt face detection failed"); 22203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 22213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 22223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 22243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for face detect qcamera_sm_internal_evt_payload_t"); 22253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint32_t, afState, CAM_INTF_META_AF_STATE, pMetaData) { 22293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t forceAFUpdate = FALSE; 22303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //1. Earlier HAL used to rely on AF done flags set in metadata to generate callbacks to 22313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //upper layers. But in scenarios where metadata drops especially which contain important 22323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //AF information, APP will wait indefinitely for focus result resulting in capture hang. 22333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //2. HAL can check for AF state transitions to generate AF state callbacks to upper layers. 22343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //This will help overcome metadata drop issue with the earlier approach. 22353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //3. But sometimes AF state transitions can happen so fast within same metadata due to 22363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //which HAL will receive only the final AF state. HAL may perceive this as no change in AF 22373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //state depending on the state transitions happened (for example state A -> B -> A). 22383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //4. To overcome the drawbacks of both the approaches, we go for a hybrid model in which 22393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //we check state transition at both HAL level and AF module level. We rely on 22403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //'state transition' meta field set by AF module for the state transition detected by it. 22413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint8_t, stateChange, CAM_INTF_AF_STATE_TRANSITION, pMetaData) { 22423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel forceAFUpdate = *stateChange; 22433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //This is a special scenario in which when scene modes like landscape are selected, AF mode 22453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //gets changed to INFINITY at backend, but HAL will not be aware of it. Also, AF state in 22463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //such cases will be set to CAM_AF_STATE_INACTIVE by backend. So, detect the AF mode 22473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //change here and trigger AF callback @ processAutoFocusEvent(). 22483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint32_t, afFocusMode, CAM_INTF_PARM_FOCUS_MODE, pMetaData) { 22493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (((cam_focus_mode_type)(*afFocusMode) == CAM_FOCUS_MODE_INFINITY) && 22503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mActiveAF){ 22513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel forceAFUpdate = TRUE; 22523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((pme->m_currentFocusState != (*afState)) || forceAFUpdate) { 22553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_af_state_t prevFocusState = pme->m_currentFocusState; 22563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_currentFocusState = (cam_af_state_t)(*afState); 22573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = (qcamera_sm_internal_evt_payload_t *) 22583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 22593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 22603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 22613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_FOCUS_UPDATE; 22623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.focus_state = (cam_af_state_t)(*afState); 22633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Need to flush ZSL Q only if we are transitioning from scanning state 22643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //to focused/not focused state. 22653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.flush_info.needFlush = 22663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((prevFocusState == CAM_AF_STATE_PASSIVE_SCAN) || 22673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (prevFocusState == CAM_AF_STATE_ACTIVE_SCAN)) && 22683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((pme->m_currentFocusState == CAM_AF_STATE_FOCUSED_LOCKED) || 22693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pme->m_currentFocusState == CAM_AF_STATE_NOT_FOCUSED_LOCKED)); 22703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.flush_info.focused_frame_idx = frame->frame_idx; 22713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(float, focusDistance, 22733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_LENS_FOCUS_DISTANCE, pMetaData) { 22743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.focus_dist. 22753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel focus_distance[CAM_FOCUS_DISTANCE_OPTIMAL_INDEX] = *focusDistance; 22763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(float, focusRange, CAM_INTF_META_LENS_FOCUS_RANGE, pMetaData) { 22783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.focus_dist. 22793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel focus_distance[CAM_FOCUS_DISTANCE_NEAR_INDEX] = focusRange[0]; 22803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.focus_dist. 22813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel focus_distance[CAM_FOCUS_DISTANCE_FAR_INDEX] = focusRange[1]; 22823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint32_t, focusMode, CAM_INTF_PARM_FOCUS_MODE, pMetaData) { 22843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.focus_mode = (cam_focus_mode_type)(*focusMode); 22853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 228604e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel IF_META_AVAILABLE(uint8_t, isDepthFocus, 228704e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel CAM_INTF_META_FOCUS_DEPTH_INFO, pMetaData) { 228804e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel payload->focus_data.isDepth = *isDepthFocus; 228904e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel } 22903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 22913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 22923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt focus failed"); 22933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 22943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 22953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 22973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for focus qcamera_sm_internal_evt_payload_t"); 22983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_crop_data_t, crop_data, CAM_INTF_META_CROP_DATA, pMetaData) { 23033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (crop_data->num_of_streams > MAX_NUM_STREAMS) { 23043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid num_of_streams %d in crop_data", 23053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel crop_data->num_of_streams); 23063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 23073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 23083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 23093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 23103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 23113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 23123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_CROP_INFO; 23133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->crop_data = *crop_data; 23143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 23153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 23163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("processEvt crop info failed"); 23173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 23183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 23193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 23213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for prep_snapshot qcamera_sm_internal_evt_payload_t"); 23223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(int32_t, prep_snapshot_done_state, 23273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_PREP_SNAPSHOT_DONE, pMetaData) { 23283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 23293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 23303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 23313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 23323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE; 23333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->prep_snapshot_state = (cam_prep_snapshot_state_t)*prep_snapshot_done_state; 23343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 23353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 23363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt prep_snapshot failed"); 23373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 23383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 23393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 23413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for prep_snapshot qcamera_sm_internal_evt_payload_t"); 23423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_asd_hdr_scene_data_t, hdr_scene_data, 23463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_ASD_HDR_SCENE_DATA, pMetaData) { 23473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("hdr_scene_data: %d %f\n", 23483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel hdr_scene_data->is_hdr_scene, hdr_scene_data->hdr_confidence); 23493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Handle this HDR meta data only if capture is not in process 23503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!pme->m_stateMachine.isCaptureRunning()) { 23513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 23523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 23533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 23543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 23553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 23563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_HDR_UPDATE; 23573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->hdr_data = *hdr_scene_data; 23583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 23593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 23603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt hdr update failed"); 23613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 23623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 23633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 23653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for hdr update qcamera_sm_internal_evt_payload_t"); 23663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_asd_decision_t, cam_asd_info, 23713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_ASD_SCENE_INFO, pMetaData) { 23723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 23733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 23743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 23753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 23763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_ASD_UPDATE; 23773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->asd_data = (cam_asd_decision_t)*cam_asd_info; 23783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 23793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 23803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt asd_update failed"); 23813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 23823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 23833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 23853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for asd_update qcamera_sm_internal_evt_payload_t"); 23863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_awb_params_t, awb_params, CAM_INTF_META_AWB_INFO, pMetaData) { 23903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH(", metadata for awb params."); 23913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 23923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 23933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 23943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 23953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 23963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_AWB_UPDATE; 23973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->awb_data = *awb_params; 23983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 23993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 24003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt awb_update failed"); 24013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 24023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 24033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 24053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for awb_update qcamera_sm_internal_evt_payload_t"); 24063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint32_t, flash_mode, CAM_INTF_META_FLASH_MODE, pMetaData) { 24103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.sensor_params.flash_mode = (cam_flash_mode_t)*flash_mode; 24113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(int32_t, flash_state, CAM_INTF_META_FLASH_STATE, pMetaData) { 24143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.sensor_params.flash_state = (cam_flash_state_t) *flash_state; 24153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(float, aperture_value, CAM_INTF_META_LENS_APERTURE, pMetaData) { 24183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.sensor_params.aperture_value = *aperture_value; 24193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_3a_params_t, ae_params, CAM_INTF_META_AEC_INFO, pMetaData) { 24223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.cam_3a_params = *ae_params; 24233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.cam_3a_params_valid = TRUE; 24243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mFlashNeeded = ae_params->flash_needed; 24253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.cam_3a_params.brightness = (float) pme->mParameters.getBrightness(); 24263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 24273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 24283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 24293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 24303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 24313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_AE_UPDATE; 24323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->ae_data = *ae_params; 24333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 24343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 24353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt ae_update failed"); 24363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 24373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 24383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 24403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for ae_update qcamera_sm_internal_evt_payload_t"); 24413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(int32_t, wb_mode, CAM_INTF_PARM_WHITE_BALANCE, pMetaData) { 24453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.cam_3a_params.wb_mode = (cam_wb_mode_type) *wb_mode; 24463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_sensor_params_t, sensor_params, CAM_INTF_META_SENSOR_INFO, pMetaData) { 24493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.sensor_params = *sensor_params; 24503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_ae_exif_debug_t, ae_exif_debug_params, 24533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_AE, pMetaData) { 24543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->ae_debug_params = *ae_exif_debug_params; 24563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->ae_debug_params_valid = TRUE; 24573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_awb_exif_debug_t, awb_exif_debug_params, 24613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_AWB, pMetaData) { 24623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->awb_debug_params = *awb_exif_debug_params; 24643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->awb_debug_params_valid = TRUE; 24653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_af_exif_debug_t, af_exif_debug_params, 24693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_AF, pMetaData) { 24703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->af_debug_params = *af_exif_debug_params; 24723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->af_debug_params_valid = TRUE; 24733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_asd_exif_debug_t, asd_exif_debug_params, 24773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_ASD, pMetaData) { 24783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->asd_debug_params = *asd_exif_debug_params; 24803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->asd_debug_params_valid = TRUE; 24813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_stats_buffer_exif_debug_t, stats_exif_debug_params, 24853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_STATS, pMetaData) { 24863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->stats_debug_params = *stats_exif_debug_params; 24883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->stats_debug_params_valid = TRUE; 24893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_bestats_buffer_exif_debug_t, bestats_exif_debug_params, 24933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_BESTATS, pMetaData) { 24943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->bestats_debug_params = *bestats_exif_debug_params; 24963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->bestats_debug_params_valid = TRUE; 24973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_bhist_buffer_exif_debug_t, bhist_exif_debug_params, 25013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_BHIST, pMetaData) { 25023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 25033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->bhist_debug_params = *bhist_exif_debug_params; 25043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->bhist_debug_params_valid = TRUE; 25053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_q3a_tuning_info_t, q3a_tuning_exif_debug_params, 25093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_3A_TUNING, pMetaData) { 25103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 25113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->q3a_tuning_debug_params = *q3a_tuning_exif_debug_params; 25123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->q3a_tuning_debug_params_valid = TRUE; 25133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint32_t, led_mode, CAM_INTF_META_LED_MODE_OVERRIDE, pMetaData) { 25173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 25183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 25193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 25203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 25213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 25223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE; 25233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->led_data = (cam_flash_mode_t)*led_mode; 25243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 25253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 25263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt led mode override failed"); 25273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 25283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 25293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 25313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for focus qcamera_sm_internal_evt_payload_t"); 25323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_edge_application_t edge_application; 25363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&edge_application, 0x00, sizeof(cam_edge_application_t)); 25373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.sharpness = pme->mParameters.getSharpness(); 25383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (edge_application.sharpness != 0) { 25393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.edge_mode = CAM_EDGE_MODE_FAST; 25403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 25413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.edge_mode = CAM_EDGE_MODE_OFF; 25423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_META_EDGE_MODE, edge_application); 25443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_focus_pos_info_t, cur_pos_info, 25463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FOCUS_POSITION, pMetaData) { 25473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 25483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 25493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 25503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 25513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE; 25523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_pos = *cur_pos_info; 25533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 25543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 25553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt focus_pos_update failed"); 25563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 25573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 25583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 25603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for focus_pos_update qcamera_sm_internal_evt_payload_t"); 25613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mParameters.getLowLightCapture()) { 25653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_low_light_mode_t, low_light_level, 25663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_LOW_LIGHT, pMetaData) { 25673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mParameters.setLowLightLevel(*low_light_level); 25683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_dyn_img_data_t, dyn_img_data, 25723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_IMG_DYN_FEAT, pMetaData) { 25733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mParameters.setDynamicImgData(*dyn_img_data); 25743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(int32_t, touch_ae_status, CAM_INTF_META_TOUCH_AE_RESULT, pMetaData) { 25773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("touch_ae_status: %d", *touch_ae_status); 25783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2580cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (pme->isDualCamera()) { 2581cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel pme->fillDualCameraFOVControl(); 2582cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 2583cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 25849ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel IF_META_AVAILABLE(int32_t, led_result, CAM_INTF_META_LED_CALIB_RESULT, pMetaData) { 25859ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel qcamera_sm_internal_evt_payload_t *payload = 25869ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel (qcamera_sm_internal_evt_payload_t *)malloc( 25879ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel sizeof(qcamera_sm_internal_evt_payload_t)); 25889ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel if (NULL != payload) { 25899ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 25909ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_LED_CALIB_UPDATE; 25919ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel payload->led_calib_result = (int32_t)*led_result; 25929ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 25939ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel if (rc != NO_ERROR) { 25949ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGW("LED_calibration result update failed"); 25959ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel free(payload); 25969ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel payload = NULL; 25979ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } 25989ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } else { 25999ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel LOGE("No memory for asd_update qcamera_sm_internal_evt_payload_t"); 26009ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } 26019ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel } 26029ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel 2603cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel stream->bufDone(super_frame); 26043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 26053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("[KPI Perf] : END"); 26073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 26083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 26103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : reprocess_stream_cb_routine 26113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle reprocess frame from reprocess stream 26133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (after reprocess, e.g., ZSL snapshot frame after WNR if 26143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WNR is enabled) 26153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 26173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 26183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 26193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 26203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 26223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 26243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. In this 26253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * case, reprocessed frame need to be passed to postprocessor 26263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * for jpeg encoding. 26273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 26283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::reprocess_stream_cb_routine(mm_camera_super_buf_t * super_frame, 26293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * /*stream*/, 26303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 26313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2632e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_REPROC_STRM_CB); 26333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E"); 26343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 26353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 26363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 2637e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 2638e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 26393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 26403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 26413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 26423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 26433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_postprocessor.processPPData(super_frame); 26463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 26483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 26493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 26513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : callback_stream_cb_routine 26523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: function to process CALBACK stream data 26543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Frame will processed and sent to framework 26553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 26573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 26583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 26593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 26603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 26623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 26633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::callback_stream_cb_routine(mm_camera_super_buf_t *super_frame, 26643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream, void *userdata) 26653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2666e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_CB_STRM_CB); 26673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E"); 26683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 26693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 2671cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel pme->mCameraHandle == 0 || 2672cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 2673cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel super_frame->camera_handle)) { 26743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 26753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 26763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 26773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 26803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 26813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview callback frame is NULL"); 26823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 26833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 26843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!pme->needProcessPreviewFrame(frame->frame_idx)) { 26873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("preview is not running, no need to process"); 26883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 26893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 26903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 26913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *previewMemObj = (QCameraMemory *)frame->mem_info; 26943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Handle preview data callback 26953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mDataCb != NULL && 26963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pme->msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0) && 26973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (!pme->mParameters.isSceneSelectionEnabled())) { 2698295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel // Preset cache flags to be handled when the buffer comes back 2699295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 27003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->sendPreviewCallback(stream, previewMemObj, frame->buf_idx); 27013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NO_ERROR != rc) { 27023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Preview callback was not sent succesfully"); 27033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 27063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 27073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 27083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 27093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 27113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : dumpFrameToFile 27123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to dump jpeg into file for debug purpose. 27143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 27163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data ptr 27173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @size : length of data buffer 27183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @index : identifier for data 27193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 27213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 27223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::dumpJpegToFile(const void *data, 27233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t size, uint32_t index) 27243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 27253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 27263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpimg", value, "0"); 27273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t enabled = (uint32_t) atoi(value); 27283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frm_num = 0; 27293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t skip_mode = 0; 27303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char buf[32]; 27323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t dim; 27333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(buf, 0, sizeof(buf)); 27343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&dim, 0, sizeof(dim)); 27353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2736cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if(((enabled & QCAMERA_DUMP_FRM_OUTPUT_JPEG) && data) || 27373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((true == m_bIntJpegEvtPending) && data)) { 27383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = ((enabled & 0xffff0000) >> 16); 27393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(frm_num == 0) { 27403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 10; //default 10 frames 27413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(frm_num > 256) { 27433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 256; //256 buffers cycle around 27443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel skip_mode = ((enabled & 0x0000ff00) >> 8); 27463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(skip_mode == 0) { 27473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel skip_mode = 1; //no-skip 27483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if( mDumpSkipCnt % skip_mode == 0) { 27513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if((frm_num == 256) && (mDumpFrmCnt >= frm_num)) { 27523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // reset frame count if cycling 27533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDumpFrmCnt = 0; 27543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mDumpFrmCnt <= frm_num) { 27563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION "%d_%d.jpg", 27573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDumpFrmCnt, index); 27583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (true == m_bIntJpegEvtPending) { 27593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel strlcpy(m_BackendFileName, buf, QCAMERA_MAX_FILEPATH_LENGTH); 27603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mBackendFileSize = size; 27613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int file_fd = open(buf, O_RDWR | O_CREAT, 0777); 27643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (file_fd >= 0) { 27653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ssize_t written_len = write(file_fd, data, size); 27663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fchmod(file_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 27673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("written number of bytes %zd\n", 27683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len); 27693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(file_fd); 27703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 27713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("fail to open file for image dumping"); 27723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (false == m_bIntJpegEvtPending) { 27743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDumpFrmCnt++; 27753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDumpSkipCnt++; 27793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 27813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::dumpMetadataToFile(QCameraStream *stream, 27843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame,char *type) 27853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 27863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 27873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frm_num = 0; 27883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *metadata = (metadata_buffer_t *)frame->buffer; 27893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpmetadata", value, "0"); 27903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t enabled = (uint32_t) atoi(value); 27913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (stream == NULL) { 27923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("No op"); 27933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 27943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t dumpFrmCnt = stream->mDumpMetaFrame; 27973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(enabled){ 27983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = ((enabled & 0xffff0000) >> 16); 27993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frm_num == 0) { 28003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 10; //default 10 frames 28013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frm_num > 256) { 28033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 256; //256 buffers cycle around 28043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((frm_num == 256) && (dumpFrmCnt >= frm_num)) { 28063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // reset frame count if cycling 28073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt = 0; 28083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("dumpFrmCnt= %u, frm_num = %u", dumpFrmCnt, frm_num); 28103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dumpFrmCnt < frm_num) { 28113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char timeBuf[128]; 28123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char buf[32]; 28133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(buf, 0, sizeof(buf)); 28143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(timeBuf, 0, sizeof(timeBuf)); 28153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel time_t current_time; 28163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel struct tm * timeinfo; 28173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel time (¤t_time); 28183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timeinfo = localtime (¤t_time); 28193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != timeinfo) { 28203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel strftime(timeBuf, sizeof(timeBuf), 28213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCAMERA_DUMP_FRM_LOCATION "%Y%m%d%H%M%S", timeinfo); 28223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel String8 filePath(timeBuf); 28243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%um_%s_%d.bin", dumpFrmCnt, type, frame->frame_idx); 28253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel filePath.append(buf); 28263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int file_fd = open(filePath.string(), O_RDWR | O_CREAT, 0777); 28273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (file_fd >= 0) { 28283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ssize_t written_len = 0; 28293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata->tuning_params.tuning_data_version = TUNING_DATA_VERSION; 28303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *data = (void *)((uint8_t *)&metadata->tuning_params.tuning_data_version); 28313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 28323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.tuning_sensor_data_size); 28333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("tuning_sensor_data_size %d",(int)(*(int *)data)); 28343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 28353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.tuning_vfe_data_size); 28363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("tuning_vfe_data_size %d",(int)(*(int *)data)); 28373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 28383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.tuning_cpp_data_size); 28393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("tuning_cpp_data_size %d",(int)(*(int *)data)); 28403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 28413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.tuning_cac_data_size); 28423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("tuning_cac_data_size %d",(int)(*(int *)data)); 28433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 28443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.tuning_cac_data_size2); 28453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("< skrajago >tuning_cac_data_size %d",(int)(*(int *)data)); 28463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 28473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t total_size = metadata->tuning_params.tuning_sensor_data_size; 28483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.data); 28493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, total_size); 28503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel total_size = metadata->tuning_params.tuning_vfe_data_size; 28513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_VFE_DATA_OFFSET]); 28523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, total_size); 28533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel total_size = metadata->tuning_params.tuning_cpp_data_size; 28543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_CPP_DATA_OFFSET]); 28553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, total_size); 28563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel total_size = metadata->tuning_params.tuning_cac_data_size; 28573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_CAC_DATA_OFFSET]); 28583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, total_size); 28599ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel 28609ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel total_size = metadata->tuning_params.tuning_mod1_stats_data_size; 28619ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel data = 28629ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_MOD1_AEC_DATA_OFFSET]); 28639ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel written_len += write(file_fd, data, total_size); 28649ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel data = 28659ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_MOD1_AWB_DATA_OFFSET]); 28669ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel written_len += write(file_fd, data, total_size); 28679ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel data = 28689ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_MOD1_AF_DATA_OFFSET]); 28699ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel written_len += write(file_fd, data, total_size); 28703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(file_fd); 28713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel }else { 28723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("fail t open file for image dumping"); 28733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt++; 28753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mDumpMetaFrame = dumpFrmCnt; 28783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 28793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 28803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : dumpFrameToFile 28813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to dump frame into file for debug purpose. 28833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 28853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data ptr 28863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @size : length of data buffer 28873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @index : identifier for data 28883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @dump_type : type of the frame to be dumped. Only such 28893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * dump type is enabled, the frame will be 28903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * dumped into a file. 28913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 28933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 28943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::dumpFrameToFile(QCameraStream *stream, 28953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame, uint32_t dump_type, const char *misc) 28963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 28973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 28983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpimg", value, "0"); 28993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t enabled = (uint32_t) atoi(value); 29003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frm_num = 0; 29013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t skip_mode = 0; 29023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == stream) { 29043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("stream object is null"); 29053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 29063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t dumpFrmCnt = stream->mDumpFrame; 29093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (true == m_bIntRawEvtPending) { 29113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel enabled = QCAMERA_DUMP_FRM_RAW; 29123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if((enabled & QCAMERA_DUMP_FRM_MASK_ALL)) { 29153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if((enabled & dump_type) && stream && frame) { 29163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = ((enabled & 0xffff0000) >> 16); 29173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(frm_num == 0) { 29183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 10; //default 10 frames 29193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(frm_num > 256) { 29213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 256; //256 buffers cycle around 29223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel skip_mode = ((enabled & 0x0000ff00) >> 8); 29243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(skip_mode == 0) { 29253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel skip_mode = 1; //no-skip 29263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(stream->mDumpSkipCnt == 0) 29283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mDumpSkipCnt = 1; 29293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if( stream->mDumpSkipCnt % skip_mode == 0) { 29313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if((frm_num == 256) && (dumpFrmCnt >= frm_num)) { 29323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // reset frame count if cycling 29333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt = 0; 29343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dumpFrmCnt <= frm_num) { 29363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char buf[32]; 29373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char timeBuf[128]; 29383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel time_t current_time; 29393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel struct tm * timeinfo; 29403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(timeBuf, 0, sizeof(timeBuf)); 29423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel time (¤t_time); 29443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timeinfo = localtime (¤t_time); 29453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(buf, 0, sizeof(buf)); 29463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t dim; 29483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&dim, 0, sizeof(dim)); 29493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFrameDimension(dim); 29503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_frame_len_offset_t offset; 29523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&offset, 0, sizeof(cam_frame_len_offset_t)); 29533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFrameOffset(offset); 29543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != timeinfo) { 29563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel strftime(timeBuf, sizeof(timeBuf), 29573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCAMERA_DUMP_FRM_LOCATION "%Y%m%d%H%M%S", timeinfo); 29583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel String8 filePath(timeBuf); 29603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch (dump_type) { 29613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DUMP_FRM_PREVIEW: 29623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 29633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dp_%dx%d_%d.yuv", 29643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 29653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 29673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DUMP_FRM_THUMBNAIL: 29683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 29693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dt_%dx%d_%d.yuv", 29703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 29713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 2973cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case QCAMERA_DUMP_FRM_INPUT_JPEG: 29743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 29753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mParameters.isPostProcScaling()) { 29763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParameters.getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT, dim); 29773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 29783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFrameDimension(dim); 29793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (misc != NULL) { 29813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%ds_%dx%d_%d_%s.yuv", 29823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx, misc); 29833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 29843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%ds_%dx%d_%d.yuv", 29853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 29863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 29893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DUMP_FRM_INPUT_REPROCESS: 29903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 29913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFrameDimension(dim); 29923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (misc != NULL) { 29933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dir_%dx%d_%d_%s.yuv", 29943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx, misc); 29953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 29963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dir_%dx%d_%d.yuv", 29973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 29983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 30013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DUMP_FRM_VIDEO: 30023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 30033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dv_%dx%d_%d.yuv", 30043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 30053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 30073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DUMP_FRM_RAW: 30083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 30093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParameters.getStreamDimension(CAM_STREAM_TYPE_RAW, dim); 30103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dr_%dx%d_%d.raw", 30113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 30123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3014cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case QCAMERA_DUMP_FRM_OUTPUT_JPEG: 30153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 30163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParameters.getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT, dim); 30173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dj_%dx%d_%d.yuv", 30183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 30193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 30213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 30223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Not supported for dumping stream type %d", 30233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dump_type); 30243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 30253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel filePath.append(buf); 30283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int file_fd = open(filePath.string(), O_RDWR | O_CREAT, 0777); 30293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ssize_t written_len = 0; 30303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (file_fd >= 0) { 30313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *data = NULL; 30323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fchmod(file_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 30343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < offset.num_planes; i++) { 30353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t index = offset.mp[i].offset; 30363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (i > 0) { 30373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel index += offset.mp[i-1].len; 30383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (offset.mp[i].meta_len != 0) { 30413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)frame->buffer + index); 30423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, 30433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (size_t)offset.mp[i].meta_len); 30443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel index += (uint32_t)offset.mp[i].meta_len; 30453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (int j = 0; j < offset.mp[i].height; j++) { 30483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)frame->buffer + index); 30493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, 30503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (size_t)offset.mp[i].width); 30513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel index += (uint32_t)offset.mp[i].stride; 30523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("written number of bytes %ld\n", 30563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len); 30573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(file_fd); 3058295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 30593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 30603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("fail to open file for image dumping"); 30613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (true == m_bIntRawEvtPending) { 30633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel strlcpy(m_BackendFileName, filePath.string(), QCAMERA_MAX_FILEPATH_LENGTH); 30643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mBackendFileSize = (size_t)written_len; 30653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 30663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt++; 30673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mDumpSkipCnt++; 30713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 30733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt = 0; 30743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mDumpFrame = dumpFrmCnt; 30763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 30773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 30793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : debugShowVideoFPS 30803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to log video frame FPS for debug purpose. 30823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 30843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 30863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 30873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::debugShowVideoFPS() 30883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 30893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVFrameCount++; 30903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t now = systemTime(); 30913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t diff = now - mVLastFpsTime; 30923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (diff > ms2ns(250)) { 30933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVFps = (((double)(mVFrameCount - mVLastFrameCount)) * 30943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (double)(s2ns(1))) / (double)diff; 30953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: PROFILE_VIDEO_FRAMES_PER_SECOND: %.4f Cam ID = %d", 30963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVFps, mCameraId); 30973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVLastFpsTime = now; 30983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVLastFrameCount = mVFrameCount; 30993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 31013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 31033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : debugShowPreviewFPS 31043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to log preview frame FPS for debug purpose. 31063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 31083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 31103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 31113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::debugShowPreviewFPS() 31123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 31133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPFrameCount++; 31143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t now = systemTime(); 31153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t diff = now - mPLastFpsTime; 31163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (diff > ms2ns(250)) { 31173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPFps = (((double)(mPFrameCount - mPLastFrameCount)) * 31183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (double)(s2ns(1))) / (double)diff; 31193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: PROFILE_PREVIEW_FRAMES_PER_SECOND : %.4f Cam ID = %d", 31203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPFps, mCameraId); 31213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPLastFpsTime = now; 31223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPLastFrameCount = mPFrameCount; 31233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 31253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 31273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : fillFacesData 31283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to fill in face related metadata into a struct. 31303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 31323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @faces_data : face features data to be filled 31333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @metadata : metadata structure to read face features from 31343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 31363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 31373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::fillFacesData(cam_faces_data_t &faces_data, 31383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *metadata) 31393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 31403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&faces_data, 0, sizeof(cam_faces_data_t)); 31413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_detection_data_t, p_detection_data, 31433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_DETECTION, metadata) { 31443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.detection_data = *p_detection_data; 31453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (faces_data.detection_data.num_faces_detected > MAX_ROI) { 31463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.detection_data.num_faces_detected = MAX_ROI; 31473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31498ce36fab9b5c901b2650da1076361574d8854e7bJason Lee LOGH("[KPI Perf] FD_DEBUG : NUMBER_OF_FACES_DETECTED %d", 31503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.detection_data.num_faces_detected); 31513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_recog_data_t, p_recog_data, 31533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_RECOG, metadata) { 31543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.recog_valid = true; 31553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.recog_data = *p_recog_data; 31563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_blink_data_t, p_blink_data, 31593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_BLINK, metadata) { 31603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.blink_valid = true; 31613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.blink_data = *p_blink_data; 31623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_gaze_data_t, p_gaze_data, 31653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_GAZE, metadata) { 31663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.gaze_valid = true; 31673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.gaze_data = *p_gaze_data; 31683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_smile_data_t, p_smile_data, 31713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_SMILE, metadata) { 31723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.smile_valid = true; 31733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.smile_data = *p_smile_data; 31743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_landmarks_data_t, p_landmarks, 31773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_LANDMARK, metadata) { 31783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.landmark_valid = true; 31793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.landmark_data = *p_landmarks; 31803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_contour_data_t, p_contour, 31833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_CONTOUR, metadata) { 31843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.contour_valid = true; 31853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.contour_data = *p_contour; 31863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 31893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 31913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ~QCameraCbNotifier 31923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Destructor for exiting the callback context. 31943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 31963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 31983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 31993d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraCbNotifier::~QCameraCbNotifier() 32003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 32013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 32023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 32043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : exit 32053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: exit notify thread. 32073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 32093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 32113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 32123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraCbNotifier::exit() 32133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 32143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mActive = false; 32153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mProcTh.exit(); 32163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 32173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 32193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : releaseNotifications 32203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: callback for releasing data stored in the callback queue. 32223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 32243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data to be released 32253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @user_data : context data 32263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 32283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 32293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraCbNotifier::releaseNotifications(void *data, void *user_data) 32303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 32313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 32323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ( NULL != arg ) && ( NULL != user_data ) ) { 32343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( arg->release_cb ) { 32353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel arg->release_cb(arg->user_data, arg->cookie, FAILED_TRANSACTION); 32363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 32393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 32413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : matchSnapshotNotifications 32423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: matches snapshot data callbacks 32443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 32463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data to match 32473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @user_data : context data 32483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : bool match 32503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * true - match found 32513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * false- match not found 32523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 32533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraCbNotifier::matchSnapshotNotifications(void *data, 32543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void */*user_data*/) 32553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 32563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 32573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL != arg ) { 32583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( QCAMERA_DATA_SNAPSHOT_CALLBACK == arg->cb_type ) { 32593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return true; 32603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return false; 32643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 32653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 32673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : matchPreviewNotifications 32683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: matches preview data callbacks 32703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 32723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data to match 32733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @user_data : context data 32743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : bool match 32763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * true - match found 32773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * false- match not found 32783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 32793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraCbNotifier::matchPreviewNotifications(void *data, 32803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void */*user_data*/) 32813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 32823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 32833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != arg) { 32843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((QCAMERA_DATA_CALLBACK == arg->cb_type) && 32853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (CAMERA_MSG_PREVIEW_FRAME == arg->msg_type)) { 32863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return true; 32873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return false; 32913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 32923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 32943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : matchTimestampNotifications 32953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: matches timestamp data callbacks 32973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 32993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data to match 33003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @user_data : context data 33013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : bool match 33033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * true - match found 33043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * false- match not found 33053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 33063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraCbNotifier::matchTimestampNotifications(void *data, 33073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void */*user_data*/) 33083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 33093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 33103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != arg) { 33113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((QCAMERA_DATA_TIMESTAMP_CALLBACK == arg->cb_type) && 33123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (CAMERA_MSG_VIDEO_FRAME == arg->msg_type)) { 33133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return true; 33143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return false; 33183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 33193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 33213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : cbNotifyRoutine 33223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: callback thread which interfaces with the upper layers 33243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * given input commands. 33253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 33273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : context data 33283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 33303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 33313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid * QCameraCbNotifier::cbNotifyRoutine(void * data) 33323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 33333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int running = 1; 33343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int ret; 33353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraCbNotifier *pme = (QCameraCbNotifier *)data; 33363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraCmdThread *cmdThread = &pme->mProcTh; 33373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cmdThread->setName("CAM_cbNotify"); 33383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t isSnapshotActive = FALSE; 33393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool longShotEnabled = false; 33403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t numOfSnapshotExpected = 0; 33413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t numOfSnapshotRcvd = 0; 33423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t cbStatus = NO_ERROR; 33433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("E"); 33453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel do { 33463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel do { 33473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = cam_sem_wait(&cmdThread->cmd_sem); 33483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ret != 0 && errno != EINVAL) { 33493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("cam_sem_wait error (%s)", 33503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel strerror(errno)); 33513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 33523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } while (ret != 0); 33543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_cmd_type_t cmd = cmdThread->getCmd(); 33563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("get cmd %d", cmd); 33573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch (cmd) { 33583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case CAMERA_CMD_TYPE_START_DATA_PROC: 33593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 33603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel isSnapshotActive = TRUE; 33613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotExpected = pme->mParent->numOfSnapshotsExpected(); 33623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel longShotEnabled = pme->mParent->isLongshotEnabled(); 33633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Num Snapshots Expected = %d", 33643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotExpected); 33653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotRcvd = 0; 33663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 33683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case CAMERA_CMD_TYPE_STOP_DATA_PROC: 33693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 33703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataQ.flushNodes(matchSnapshotNotifications); 33713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel isSnapshotActive = FALSE; 33723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotExpected = 0; 33743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotRcvd = 0; 33753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 33773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case CAMERA_CMD_TYPE_DO_NEXT_JOB: 33783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 33793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *cb = 33803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_callback_argm_t *)pme->mDataQ.dequeue(); 33813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus = NO_ERROR; 33823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != cb) { 33833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("cb type %d received", 33843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->cb_type); 33853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mParent->msgTypeEnabledWithLock(cb->msg_type)) { 33873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch (cb->cb_type) { 33883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_NOTIFY_CALLBACK: 33893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 33903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->msg_type == CAMERA_MSG_FOCUS) { 33913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel KPI_ATRACE_INT("Camera:AutoFocus", 0); 33923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : PROFILE_SENDING_FOCUS_EVT_TO APP"); 33933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mNotifyCb) { 33953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mNotifyCb(cb->msg_type, 33963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->ext1, 33973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->ext2, 33983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCallbackCookie); 33993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 34003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("notify callback not set!"); 34013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 34033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, 34043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus); 34053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DATA_CALLBACK: 34093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mDataCb) { 34113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataCb(cb->msg_type, 34123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->data, 34133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->index, 34143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->metadata, 34153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCallbackCookie); 34163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 34173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("data callback not set!"); 34183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 34203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, 34213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus); 34223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DATA_TIMESTAMP_CALLBACK: 34263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->mDataCbTimestamp) { 34283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataCbTimestamp(cb->timestamp, 34293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->msg_type, 34303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->data, 34313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->index, 34323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCallbackCookie); 34333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 34343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Timestamp data callback not set!"); 34353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 34373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, 34383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus); 34393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DATA_SNAPSHOT_CALLBACK: 34433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (TRUE == isSnapshotActive && pme->mDataCb ) { 34453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!longShotEnabled) { 34463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotRcvd++; 34473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("Num Snapshots Received = %d Expected = %d", 34483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotRcvd, numOfSnapshotExpected); 34493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (numOfSnapshotExpected > 0 && 34503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (numOfSnapshotExpected == numOfSnapshotRcvd)) { 34513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("Received all snapshots"); 34523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // notify HWI that snapshot is done 34533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mParent->processSyncEvt(QCAMERA_SM_EVT_SNAPSHOT_DONE, 34543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NULL); 34553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mJpegCb) { 34583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("Calling JPEG Callback!! for camera %d" 34593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel "release_data %p", 34603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel "frame_idx %d", 34613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mParent->getCameraId(), 34623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->user_data, 34633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->frame_index); 34643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mJpegCb(cb->msg_type, cb->data, 34653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->index, cb->metadata, 34663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mJpegCallbackCookie, 34673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->frame_index, cb->release_cb, 34683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->cookie, cb->user_data); 34693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // incase of non-null Jpeg cb we transfer 34703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // ownership of buffer to muxer. hence 34713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // release_cb should not be called 34723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // muxer will release after its done with 34733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // processing the buffer 34743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if(pme->mDataCb){ 34753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataCb(cb->msg_type, cb->data, cb->index, 34763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->metadata, pme->mCallbackCookie); 34773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 34783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, 34793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus); 34803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 34863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("invalid cb type %d", 34883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->cb_type); 34893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus = BAD_VALUE; 34903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 34913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, 34923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus); 34933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel }; 34973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 34983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("cb message type %d not enabled!", 34993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->msg_type); 35003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus = INVALID_OPERATION; 35013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 35023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, cbStatus); 35033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete cb; 35063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 35073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("invalid cb type passed"); 35083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 35113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case CAMERA_CMD_TYPE_EXIT: 35123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 35133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel running = 0; 35143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataQ.flush(); 35153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 35173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 35183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 35193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } while (running); 35213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("X"); 35223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 35243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 35253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 35273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : notifyCallback 35283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Enqueus pending callback notifications for the upper layers. 35303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 35323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @cbArgs : callback arguments 35333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 35353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 35363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 35373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 35383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraCbNotifier::notifyCallback(qcamera_callback_argm_t &cbArgs) 35393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 35403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mActive) { 35413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("notify thread is not active"); 35423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 35433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *cbArg = new qcamera_callback_argm_t(); 35463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == cbArg) { 35473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("no mem for qcamera_callback_argm_t"); 35483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_MEMORY; 35493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(cbArg, 0, sizeof(qcamera_callback_argm_t)); 35513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *cbArg = cbArgs; 35523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mDataQ.enqueue((void *)cbArg)) { 35543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return mProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 35553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 35563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error adding cb data into queue"); 35573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete cbArg; 35583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 35593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 35613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 35633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setCallbacks 35643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Initializes the callback functions, which would be used for 35663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * communication with the upper layers and launches the callback 35673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * context in which the callbacks will occur. 35683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 35703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @notifyCb : notification callback 35713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @dataCb : data callback 35723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @dataCbTimestamp : data with timestamp callback 35733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @callbackCookie : callback context data 35743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 35763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 35773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraCbNotifier::setCallbacks(camera_notify_callback notifyCb, 35783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_data_callback dataCb, 35793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_data_timestamp_callback dataCbTimestamp, 35803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *callbackCookie) 35813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 35823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ( NULL == mNotifyCb ) && 35833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( NULL == mDataCb ) && 35843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( NULL == mDataCbTimestamp ) && 35853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( NULL == mCallbackCookie ) ) { 35863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mNotifyCb = notifyCb; 35873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDataCb = dataCb; 35883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDataCbTimestamp = dataCbTimestamp; 35893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCallbackCookie = callbackCookie; 35903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mActive = true; 35913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mProcTh.launch(cbNotifyRoutine, this); 35923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 35933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Camera callback notifier already initialized!"); 35943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 35963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 35983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setJpegCallBacks 35993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Initializes the JPEG callback function, which would be used for 36013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * communication with the upper layers and launches the callback 36023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * context in which the callbacks will occur. 36033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 36053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @jpegCb : notification callback 36063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @callbackCookie : callback context data 36073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 36093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraCbNotifier::setJpegCallBacks( 36113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_data_callback jpegCb, void *callbackCookie) 36123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("Setting JPEG Callback notifier"); 36143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mJpegCb = jpegCb; 36153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mJpegCallbackCookie = callbackCookie; 36163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 36193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : flushPreviewNotifications 36203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: flush all pending preview notifications 36223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * from the notifier queue 36233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 36253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 36273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 36283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 36293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraCbNotifier::flushPreviewNotifications() 36313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mActive) { 36333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("notify thread is not active"); 36343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 36353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 36363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDataQ.flushNodes(matchPreviewNotifications); 36373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 36383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 36413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : flushVideoNotifications 36423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: flush all pending video notifications 36443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * from the notifier queue 36453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 36473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 36493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 36503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 36513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraCbNotifier::flushVideoNotifications() 36533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mActive) { 36553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("notify thread is not active"); 36563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 36573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 36583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDataQ.flushNodes(matchTimestampNotifications); 36593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 36603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 36633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : startSnapshots 36643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Enables snapshot mode 36663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 36683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 36703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 36713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 36723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraCbNotifier::startSnapshots() 36743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return mProcTh.sendCmd(CAMERA_CMD_TYPE_START_DATA_PROC, FALSE, TRUE); 36763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 36793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : stopSnapshots 36803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Disables snapshot processing mode 36823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 36843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 36863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraCbNotifier::stopSnapshots() 36883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mProcTh.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC, FALSE, TRUE); 36903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; // namespace qcamera 3693