13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2012-2016, 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 7533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewTimestamp = pme->mCameraDisplay.computePresentationTimeStamp(frameTime); 7543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mStreamTimestamp = frameTime; 7553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Enqueue buffer to gralloc. 7573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t idx = frame->buf_idx; 7583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("%p Enqueue Buffer to display %d frame Time = %lld Display Time = %lld", 7593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme, idx, frameTime, mPreviewTimestamp); 7603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = memory->enqueueBuffer(idx, mPreviewTimestamp); 7613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err == NO_ERROR) { 7633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 7643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mLastPreviewFrameID = frame->frame_idx; 7653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mEnqueuedBuffers++; 7663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 7673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 7683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Enqueue Buffer failed"); 7693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 7723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 7733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 7743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 7763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : preview_stream_cb_routine 7773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle preview frame from preview stream in 7793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * normal case with display. 7803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 7823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 7833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 7843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 7853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 7873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 7893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. The new 7903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * preview frame will be sent to display, and an older frame 7913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * will be dequeued from display and needs to be returned back 7923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * to kernel for future use. 7933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 7943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::preview_stream_cb_routine(mm_camera_super_buf_t *super_frame, 7953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * stream, 7963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 7973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 798e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel CAMSCOPE_UPDATE_FLAGS(CAMSCOPE_SECTION_HAL, kpi_camscope_flags); 799e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel KPI_ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_PREVIEW_STRM_CB); 8003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 8013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int err = NO_ERROR; 8023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 8033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraGrallocMemory *memory = (QCameraGrallocMemory *)super_frame->bufs[0]->mem_info; 8043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t dequeueCnt = 0; 8053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL) { 8073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid hardware object"); 8083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 8093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 8103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (memory == NULL) { 8123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid memory object"); 8133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 8143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 8153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 8183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 819c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel LOGE("preview frame is NULL"); 8203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 8213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 8223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // For instant capture and for instant AEC, keep track of the frame counter. 8253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // This count will be used to check against the corresponding bound values. 8263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mParameters.isInstantAECEnabled() || 8273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mParameters.isInstantCaptureEnabled()) { 8283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mInstantAecFrameCount++; 8293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 8323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!stream->isSyncCBEnabled()) { 8333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mLastPreviewFrameID = frame->frame_idx; 8343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool discardFrame = false; 8363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!stream->isSyncCBEnabled() && 8373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel !pme->needProcessPreviewFrame(frame->frame_idx)) 8383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 8393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel discardFrame = true; 8403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (stream->isSyncCBEnabled() && 8413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memory->isBufSkipped(frame->buf_idx)) { 8423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel discardFrame = true; 8433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memory->setBufferStatus(frame->buf_idx, STATUS_IDLE); 8443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 8463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (discardFrame) { 8483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("preview is not running, no need to process"); 8493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 8503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t idx = frame->buf_idx; 8533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_PREVIEW); 8553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->m_bPreviewStarted) { 857c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel LOGI("[KPI Perf] : PROFILE_FIRST_PREVIEW_FRAME"); 858c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 859c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_perfLockMgr.releasePerfLock(PERF_LOCK_START_PREVIEW); 860c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_perfLockMgr.releasePerfLock(PERF_LOCK_OPEN_CAMERA); 861c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_bPreviewStarted = false; 862c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 863c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // Set power Hint for preview 864c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pme->m_perfLockMgr.acquirePerfLock(PERF_LOCK_POWERHINT_PREVIEW, 0); 8653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 867c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (!stream->isSyncCBEnabled() && !discardFrame) { 8683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needDebugFps()) { 8703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->debugShowPreviewFPS(); 8713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Enqueue Buffer to display %d", idx); 8743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifdef TARGET_TS_MAKEUP 8753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->TsMakeupProcess_Preview(frame,stream); 8763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif 8773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = memory->enqueueBuffer(idx); 8783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err == NO_ERROR) { 8803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 8813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mEnqueuedBuffers++; 8823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dequeueCnt = pme->mEnqueuedBuffers; 8833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 8843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 8853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Enqueue Buffer failed"); 8863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 8883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 8893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dequeueCnt = pme->mEnqueuedBuffers; 8903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 8913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t numMapped = memory->getMappable(); 894295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel LOGD("EnqueuedCnt %d numMapped %d", dequeueCnt, numMapped); 8953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint8_t i = 0; i < dequeueCnt; i++) { 8973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int dequeuedIdx = memory->dequeueBuffer(); 898295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel LOGD("dequeuedIdx %d numMapped %d Loop running for %d", dequeuedIdx, numMapped, i); 8993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dequeuedIdx < 0 || dequeuedIdx >= memory->getCnt()) { 9003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid dequeued buffer index %d from display", 9013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dequeuedIdx); 9023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 9033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 9043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_lock(&pme->mGrallocLock); 9053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mEnqueuedBuffers--; 9063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_mutex_unlock(&pme->mGrallocLock); 9073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dequeuedIdx >= numMapped) { 9083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // This buffer has not yet been mapped to the backend 9093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = stream->mapNewBuffer((uint32_t)dequeuedIdx); 9103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (memory->checkIfAllBuffersMapped()) { 9113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // check if mapping is done for all the buffers 9123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Signal the condition for create jpeg session 9133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex::Autolock l(pme->mMapLock); 9143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mMapCond.signal(); 9153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("Mapping done for all bufs"); 9163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 9173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("All buffers are not yet mapped"); 9183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 921295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel // Get the updated mappable buffer count since it's modified in dequeueBuffer() 922295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel numMapped = memory->getMappable(); 9233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err < 0) { 9243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("buffer mapping failed %d", err); 9253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 9263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Return dequeued buffer back to driver 9273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = stream->bufDone((uint32_t)dequeuedIdx); 9283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( err < 0) { 9293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("stream bufDone failed %d", err); 9303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Handle preview data callback 9353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->m_channels[QCAMERA_CH_TYPE_CALLBACK] == NULL) { 936c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (pme->needSendPreviewCallback() && !discardFrame && 9373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (!pme->mParameters.isSceneSelectionEnabled())) { 938295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 9393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->sendPreviewCallback(stream, memory, idx); 9403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NO_ERROR != rc) { 9413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("Preview callback was not sent succesfully"); 9423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 9473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 9483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 9493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 9503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 9523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : sendPreviewCallback 9533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function for triggering preview callbacks 9553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 9573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 9583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @memory : Stream memory allocator 9593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @idx : buffer index 9603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 9623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 9633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 9643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 9653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera2HardwareInterface::sendPreviewCallback(QCameraStream *stream, 9663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *memory, uint32_t idx) 9673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 9683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *previewMem = NULL; 9693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *data = NULL; 9703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *dataToApp = NULL; 9713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t previewBufSize = 0; 9723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t previewBufSizeFromCallback = 0; 9733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t preview_dim; 9743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_format_t previewFmt; 9753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 9763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t yStride = 0; 9773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t yScanline = 0; 9783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uvStride = 0; 9793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uvScanline = 0; 9803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uStride = 0; 9813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uScanline = 0; 9823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t vStride = 0; 9833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t vScanline = 0; 9843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t yStrideToApp = 0; 9853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uvStrideToApp = 0; 9863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t yScanlineToApp = 0; 9873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t uvScanlineToApp = 0; 9883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t srcOffset = 0; 9893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t dstOffset = 0; 9903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t srcBaseOffset = 0; 9913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t dstBaseOffset = 0; 9923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int i; 9933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NULL == stream) || (NULL == memory)) { 9953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid preview callback input"); 9963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 9973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_info_t *streamInfo = 10003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel reinterpret_cast<cam_stream_info_t *>(stream->getStreamInfoBuf()->getPtr(0)); 10013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == streamInfo) { 10023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid streamInfo"); 10033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 10043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFrameDimension(preview_dim); 10073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFormat(previewFmt); 10083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yStrideToApp = preview_dim.width; 10103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yScanlineToApp = preview_dim.height; 10113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uvStrideToApp = yStrideToApp; 10123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uvScanlineToApp = yScanlineToApp / 2; 10133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* The preview buffer size in the callback should be 10153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * (width*height*bytes_per_pixel). As all preview formats we support, 10163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * use 12 bits per pixel, buffer size = previewWidth * previewHeight * 3/2. 10173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * We need to put a check if some other formats are supported in future. */ 10183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((previewFmt == CAM_FORMAT_YUV_420_NV21) || 10193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (previewFmt == CAM_FORMAT_YUV_420_NV12) || 10203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (previewFmt == CAM_FORMAT_YUV_420_YV12) || 10213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (previewFmt == CAM_FORMAT_YUV_420_NV12_VENUS) || 10223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (previewFmt == CAM_FORMAT_YUV_420_NV21_VENUS) || 10233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (previewFmt == CAM_FORMAT_YUV_420_NV21_ADRENO)) { 10243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(previewFmt == CAM_FORMAT_YUV_420_YV12) { 10253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yStride = streamInfo->buf_planes.plane_info.mp[0].stride; 10263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yScanline = streamInfo->buf_planes.plane_info.mp[0].scanline; 10273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uStride = streamInfo->buf_planes.plane_info.mp[1].stride; 10283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uScanline = streamInfo->buf_planes.plane_info.mp[1].scanline; 10293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel vStride = streamInfo->buf_planes.plane_info.mp[2].stride; 10303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel vScanline = streamInfo->buf_planes.plane_info.mp[2].scanline; 10313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize = (size_t) 10333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (yStride * yScanline + uStride * uScanline + vStride * vScanline); 10343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSizeFromCallback = previewBufSize; 10353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 10363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yStride = streamInfo->buf_planes.plane_info.mp[0].stride; 10373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel yScanline = streamInfo->buf_planes.plane_info.mp[0].scanline; 10383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uvStride = streamInfo->buf_planes.plane_info.mp[1].stride; 10393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uvScanline = streamInfo->buf_planes.plane_info.mp[1].scanline; 10403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize = (size_t) 10423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((yStrideToApp * yScanlineToApp) + (uvStrideToApp * uvScanlineToApp)); 10433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSizeFromCallback = (size_t) 10453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((yStride * yScanline) + (uvStride * uvScanline)); 10463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(previewBufSize == previewBufSizeFromCallback) { 10483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewMem = mGetMemory(memory->getFd(idx), 10493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize, 1, mCallbackCookie); 10503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!previewMem || !previewMem->data) { 10513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mGetMemory failed.\n"); 10523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_MEMORY; 10533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 10543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = previewMem; 10553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 10573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = memory->getMemory(idx, false); 10583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dataToApp = mGetMemory(-1, previewBufSize, 1, mCallbackCookie); 10593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!dataToApp || !dataToApp->data) { 10603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mGetMemory failed.\n"); 10613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_MEMORY; 10623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < preview_dim.height; i++) { 10653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset = i * yStride; 10663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset = i * yStrideToApp; 10673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy((unsigned char *) dataToApp->data + dstOffset, 10693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (unsigned char *) data->data + srcOffset, 10703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (size_t)yStrideToApp); 10713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcBaseOffset = yStride * yScanline; 10743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstBaseOffset = yStrideToApp * yScanlineToApp; 10753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < preview_dim.height/2; i++) { 10773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset = i * uvStride + srcBaseOffset; 10783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset = i * uvStrideToApp + dstBaseOffset; 10793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy((unsigned char *) dataToApp->data + dstOffset, 10813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (unsigned char *) data->data + srcOffset, 10823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (size_t)yStrideToApp); 10833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 10863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /*Invalid Buffer content. But can be used as a first preview frame trigger in 10873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel framework/app */ 10883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize = (size_t) 10893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((yStrideToApp * yScanlineToApp) + 10903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (uvStrideToApp * uvScanlineToApp)); 10913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSizeFromCallback = 0; 10923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("Invalid preview format. Buffer content cannot be processed size = %d", 10933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize); 10943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dataToApp = mGetMemory(-1, previewBufSize, 1, mCallbackCookie); 10953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!dataToApp || !dataToApp->data) { 10963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("mGetMemory failed.\n"); 10973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_MEMORY; 10983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t cbArg; 11013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 11023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cb_type = QCAMERA_DATA_CALLBACK; 11033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 11043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (previewBufSize != 0 && previewBufSizeFromCallback != 0 && 11053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewBufSize == previewBufSizeFromCallback) { 11063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.data = data; 11073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 11083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.data = dataToApp; 11093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( previewMem ) { 11113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.user_data = previewMem; 11123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.release_cb = releaseCameraMemory; 11133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (dataToApp) { 11143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.user_data = dataToApp; 11153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.release_cb = releaseCameraMemory; 11163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cookie = this; 11183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = m_cbNotifier.notifyCallback(cbArg); 11193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 11203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("fail sending notification"); 11213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (previewMem) { 11223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewMem->release(previewMem); 11233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (dataToApp) { 11243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dataToApp->release(dataToApp); 11253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 11293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 11303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 11323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : nodisplay_preview_stream_cb_routine 11333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle preview frame from preview stream in 11353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * no-display case 11363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 11383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 11393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 11403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 11413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 11433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 11453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. 11463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 11473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::nodisplay_preview_stream_cb_routine( 11483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *super_frame, 11493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream, 11503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 11513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1152e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_NODIS_PREVIEW_STRMCB); 11533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] E"); 11543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 11553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 11563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1157e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1158e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 11593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 11603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 11613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 11623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 11633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 11653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 11663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview frame is NULL"); 11673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 11683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 11693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!pme->needProcessPreviewFrame(frame->frame_idx)) { 11723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("preview is not running, no need to process"); 11733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 11743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 11753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 11763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needDebugFps()) { 11793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->debugShowPreviewFPS(); 11803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *previewMemObj = (QCameraMemory *)frame->mem_info; 11833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *preview_mem = NULL; 11843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (previewMemObj != NULL) { 11853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel preview_mem = previewMemObj->getMemory(frame->buf_idx, false); 11863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != previewMemObj && NULL != preview_mem) { 11883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_PREVIEW); 11893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((pme->needProcessPreviewFrame(frame->frame_idx)) && 11913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->needSendPreviewCallback() && 11923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pme->getRelatedCamSyncInfo()->mode != CAM_MODE_SECONDARY)) { 11933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t cbArg; 11943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 11953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cb_type = QCAMERA_DATA_CALLBACK; 11963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 11973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.data = preview_mem; 11983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.user_data = (void *) &frame->buf_idx; 11993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cookie = stream; 12003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.release_cb = returnStreamBuffer; 1201295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel // Preset cache flags to be handled when the buffer comes back 1202295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 12033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->m_cbNotifier.notifyCallback(cbArg); 12043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 12053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE ("fail sending data notify"); 12063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 12073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 12093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 12103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 12133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] X"); 12143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 12153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 12173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : rdi_mode_stream_cb_routine 12183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 12193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle RDI frame from preview stream in 12203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * rdi mode case 12213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 12223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 12233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 12243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 12253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 12263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 12273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 12283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 12293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 12303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. 12313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 12323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::rdi_mode_stream_cb_routine( 12333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *super_frame, 12343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream, 12353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 12363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1237e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_RDI_MODE_STRM_CB); 12383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("RDI_DEBUG Enter"); 12393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 12403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 12413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1242e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1243e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 12443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 12453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 12463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 12473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 12493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 12503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview frame is NLUL"); 12513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel goto end; 12523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!pme->needProcessPreviewFrame(frame->frame_idx)) { 12543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview is not running, no need to process"); 12553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 12563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel goto end; 12573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needDebugFps()) { 12593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->debugShowPreviewFPS(); 12603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Non-secure Mode 12623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!pme->isSecureMode()) { 12633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *previewMemObj = (QCameraMemory *)frame->mem_info; 12643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == previewMemObj) { 12653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("previewMemObj is NULL"); 12663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 12673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel goto end; 12683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *preview_mem = previewMemObj->getMemory(frame->buf_idx, false); 12713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != preview_mem) { 12723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewMemObj->cleanCache(frame->buf_idx); 12733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Dump RAW frame 12743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_RAW); 12753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Notify Preview callback frame 12763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needProcessPreviewFrame(frame->frame_idx) && 12773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataCb != NULL && 12783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0) { 12793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t cbArg; 12803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 12813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cb_type = QCAMERA_DATA_CALLBACK; 12823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 12833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.data = preview_mem; 12843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.user_data = (void *) &frame->buf_idx; 12853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cookie = stream; 12863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.release_cb = returnStreamBuffer; 1287295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel // Preset cache flags to be handled when the buffer comes back 1288295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 12893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_cbNotifier.notifyCallback(cbArg); 12903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 12913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview_mem is NULL"); 12923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 12933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel else { 12963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview_mem is NULL"); 12973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 12983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 13003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Secure Mode 13013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // We will do QCAMERA_NOTIFY_CALLBACK and share FD in case of secure mode 13023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *previewMemObj = (QCameraMemory *)frame->mem_info; 13033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == previewMemObj) { 13043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("previewMemObj is NULL"); 13053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 13063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel goto end; 13073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int fd = previewMemObj->getFd(frame->buf_idx); 13103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Preview frame fd =%d for index = %d ", fd, frame->buf_idx); 13113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needProcessPreviewFrame(frame->frame_idx) && 13123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataCb != NULL && 13133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0) { 13143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Prepare Callback structure 13153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t cbArg; 13163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 13173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 13183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 13193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef VANILLA_HAL 13203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.ext1 = CAMERA_FRAME_DATA_FD; 13213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.ext2 = fd; 13223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif 13233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.user_data = (void *) &frame->buf_idx; 13243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cookie = stream; 13253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.release_cb = returnStreamBuffer; 1326295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel // Preset cache flags to be handled when the buffer comes back 1327295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 13283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_cbNotifier.notifyCallback(cbArg); 13293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 13303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("No need to process preview frame, return buffer"); 13313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 13323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelend: 13353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 13363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("RDI_DEBUG Exit"); 13373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 13383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 13393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 13413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : postview_stream_cb_routine 13423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle post frame from postview stream 13443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 13463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 13473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 13483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 13493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 13513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 13533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. 13543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 13553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::postview_stream_cb_routine(mm_camera_super_buf_t *super_frame, 13563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream, 13573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 13583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1359e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_POSTVIEW_STRM_CB); 13603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int err = NO_ERROR; 13613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 13623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraGrallocMemory *memory = (QCameraGrallocMemory *)super_frame->bufs[0]->mem_info; 13633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL) { 13653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid hardware object"); 13663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 13673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 13683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (memory == NULL) { 13703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid memory object"); 13713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 13723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 13733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 13763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 13783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 13793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview frame is NULL"); 13803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 13813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 13823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *memObj = (QCameraMemory *)frame->mem_info; 13853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != memObj) { 13863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_THUMBNAIL); 13873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Return buffer back to driver 13903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = stream->bufDone(frame->buf_idx); 13913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( err < 0) { 13923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("stream bufDone failed %d", err); 13933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 13963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 13973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 13983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 13993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 14013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : video_stream_cb_routine 14023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle video frame from video stream 14043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 14063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 14073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 14083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 14093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 14113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 14133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. video 14143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * frame will be sent to video encoder. Once video encoder is 14153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * done with the video frame, it will call another API 14163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * (release_recording_frame) to return the frame back 14173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 14183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::video_stream_cb_routine(mm_camera_super_buf_t *super_frame, 14193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream, 14203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 14213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1422e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_VIDEO_STRM_CB); 14233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraVideoMemory *videoMemObj = NULL; 14243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_memory_t *video_mem = NULL; 14253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t timeStamp = 0; 14263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool triggerTCB = FALSE; 14273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14289e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("[KPI Perf] : BEGIN"); 14293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 14303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 1431cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel pme->mCameraHandle == 0 || 1432cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1433cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel super_frame->camera_handle)) { 14343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 14353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 14363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 14373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 14403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->needDebugFps()) { 14423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->debugShowVideoFPS(); 14433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->m_bRecordStarted) { 14453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf] : PROFILE_FIRST_RECORD_FRAME"); 14463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_bRecordStarted = false ; 14473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Stream(%d), Timestamp: %ld %ld", 14493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->stream_id, 14503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->ts.tv_sec, 14513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->ts.tv_nsec); 14523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame->buf_type == CAM_STREAM_BUF_TYPE_MPLANE) { 14543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mParameters.getVideoBatchSize() == 0) { 14553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timeStamp = nsecs_t(frame->ts.tv_sec) * 1000000000LL 14563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel + frame->ts.tv_nsec; 14573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_VIDEO); 14583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel videoMemObj = (QCameraVideoMemory *)frame->mem_info; 14593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel video_mem = NULL; 14603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != videoMemObj) { 14613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel video_mem = videoMemObj->getMemory(frame->buf_idx, 14623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pme->mStoreMetaDataInFrame > 0)? true : false); 14633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel triggerTCB = TRUE; 14649e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGH("Video frame TimeStamp : %lld batch = 0 index = %d", 14659e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel timeStamp, frame->buf_idx); 14663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 14683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Handle video batch callback 14693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel native_handle_t *nh = NULL; 14703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_VIDEO); 14713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraVideoMemory *videoMemObj = (QCameraVideoMemory *)frame->mem_info; 14723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((stream->mCurMetaMemory == NULL) 14733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || (stream->mCurBufIndex == -1)) { 14743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //get Free metadata available 14753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (int i = 0; i < CAMERA_MIN_VIDEO_BATCH_BUFFERS; i++) { 14763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (stream->mStreamMetaMemory[i].consumerOwned == 0) { 14773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurMetaMemory = videoMemObj->getMemory(i,true); 14783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurBufIndex = 0; 14793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurMetaIndex = i; 14803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mStreamMetaMemory[i].numBuffers = 0; 14813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 14823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel video_mem = stream->mCurMetaMemory; 14869e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel nh = videoMemObj->getNativeHandle(stream->mCurMetaIndex); 14873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (video_mem == NULL || nh == NULL) { 14883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No Free metadata. Drop this frame"); 14893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurBufIndex = -1; 14903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 14913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 14923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 14933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int index = stream->mCurBufIndex; 14963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int fd_cnt = pme->mParameters.getVideoBatchSize(); 14973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t frame_ts = nsecs_t(frame->ts.tv_sec) * 1000000000LL 14983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel + frame->ts.tv_nsec; 14993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (index == 0) { 15003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mFirstTimeStamp = frame_ts; 15013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mStreamMetaMemory[stream->mCurMetaIndex].buf_index[index] 15043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel = (uint8_t)frame->buf_idx; 15053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mStreamMetaMemory[stream->mCurMetaIndex].numBuffers++; 15063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mStreamMetaMemory[stream->mCurMetaIndex].consumerOwned 15073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel = TRUE; 15083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* 15093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * data[0] => FD 15103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * data[mNumFDs + 1] => OFFSET 15113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * data[mNumFDs + 2] => SIZE 15123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * data[mNumFDs + 3] => Usage Flag (Color format/Compression) 15133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * data[mNumFDs + 4] => TIMESTAMP 15143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * data[mNumFDs + 5] => FORMAT 15153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */ 15163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[index] = videoMemObj->getFd(frame->buf_idx); 15173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[index + fd_cnt] = 0; 15183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[index + (fd_cnt * 2)] = (int)videoMemObj->getSize(frame->buf_idx); 15193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[index + (fd_cnt * 3)] = videoMemObj->getUsage(); 15203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[index + (fd_cnt * 4)] = (int)(frame_ts - stream->mFirstTimeStamp); 15213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[index + (fd_cnt * 5)] = videoMemObj->getFormat(); 15223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurBufIndex++; 15233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (stream->mCurBufIndex == fd_cnt) { 15243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timeStamp = stream->mFirstTimeStamp; 15259e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGH("Video frame to encoder TimeStamp : %lld batch = %d Buffer idx = %d", 15269e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel timeStamp, fd_cnt, 15279e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel nh->data[nh->numFds + nh->numInts - VIDEO_METADATA_NUM_COMMON_INTS]); 15283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurBufIndex = -1; 15293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurMetaIndex = -1; 15303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mCurMetaMemory = NULL; 15313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel triggerTCB = TRUE; 15323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 15353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel videoMemObj = (QCameraVideoMemory *)frame->mem_info; 15363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel video_mem = NULL; 15373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel native_handle_t *nh = NULL; 15383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int fd_cnt = frame->user_buf.bufs_used; 15393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != videoMemObj) { 15403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel video_mem = videoMemObj->getMemory(frame->buf_idx, true); 15419e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel nh = videoMemObj->getNativeHandle(frame->buf_idx); 15423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 15433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("videoMemObj NULL"); 15443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (nh != NULL) { 15473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timeStamp = nsecs_t(frame->ts.tv_sec) * 1000000000LL 15483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel + frame->ts.tv_nsec; 15493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (int i = 0; i < fd_cnt; i++) { 15513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame->user_buf.buf_idx[i] >= 0) { 15523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *plane_frame = 15533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &frame->user_buf.plane_buf[frame->user_buf.buf_idx[i]]; 15543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraVideoMemory *frameobj = 15553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (QCameraVideoMemory *)plane_frame->mem_info; 15563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int usage = frameobj->getUsage(); 15573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t frame_ts = nsecs_t(plane_frame->ts.tv_sec) * 1000000000LL 15583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel + plane_frame->ts.tv_nsec; 15593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* 15603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data[0] => FD 15613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data[mNumFDs + 1] => OFFSET 15623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data[mNumFDs + 2] => SIZE 15633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data[mNumFDs + 3] => Usage Flag (Color format/Compression) 15643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data[mNumFDs + 4] => TIMESTAMP 15653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data[mNumFDs + 5] => FORMAT 15663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */ 15673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[i] = frameobj->getFd(plane_frame->buf_idx); 15683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[fd_cnt + i] = 0; 15693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[(2 * fd_cnt) + i] = (int)frameobj->getSize(plane_frame->buf_idx); 15703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[(3 * fd_cnt) + i] = usage; 15713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[(4 * fd_cnt) + i] = (int)(frame_ts - timeStamp); 15723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nh->data[(5 * fd_cnt) + i] = frameobj->getFormat(); 15733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Send Video frames to services/encoder delta : %lld FD = %d index = %d", 15743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (frame_ts - timeStamp), plane_frame->fd, plane_frame->buf_idx); 15753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, plane_frame, QCAMERA_DUMP_FRM_VIDEO); 15763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel triggerTCB = TRUE; 15799e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGH("Batch buffer TimeStamp : %lld FD = %d index = %d fd_cnt = %d", 15809e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel timeStamp, frame->fd, frame->buf_idx, fd_cnt); 15813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 15823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No Video Meta Available. Return Buffer"); 15833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(super_frame->bufs[0]->buf_idx); 15843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NULL != video_mem) && (triggerTCB == TRUE)) { 15883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((pme->mDataCbTimestamp != NULL) && 15893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->msgTypeEnabledWithLock(CAMERA_MSG_VIDEO_FRAME) > 0) { 15903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t cbArg; 15913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 15923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.cb_type = QCAMERA_DATA_TIMESTAMP_CALLBACK; 15933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.msg_type = CAMERA_MSG_VIDEO_FRAME; 15943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.data = video_mem; 15953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1596cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // For VT usecase, ISP uses AVtimer not CLOCK_BOOTTIME as time source. 1597cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // So do not change video timestamp. 1598cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (!pme->mParameters.isAVTimerEnabled()) { 1599cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // Convert Boottime from camera to Monotime for video if needed. 1600cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // Otherwise, mBootToMonoTimestampOffset value will be 0. 1601cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel timeStamp = timeStamp - pme->mBootToMonoTimestampOffset; 1602cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 16033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Final video buffer TimeStamp : %lld ", timeStamp); 16043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbArg.timestamp = timeStamp; 16053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->m_cbNotifier.notifyCallback(cbArg); 16063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 16073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("fail sending data notify"); 16083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 16093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 16149e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel LOGD("[KPI Perf] : END"); 16153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 16163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 16183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : snapshot_channel_cb_routine 16193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle snapshot frame from snapshot channel 16213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 16233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 16243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 16253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 16273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : recvd_frame will be released after this call by caller, so if 16293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * async operation needed for recvd_frame, it's our responsibility 16303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * to save a copy for this variable to be used later. 16313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 16323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::snapshot_channel_cb_routine(mm_camera_super_buf_t *super_frame, 16333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 16343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1635e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_SNAPSHOT_CH_CB); 16363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 16373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraChannel *pChannel = NULL; 16383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E"); 16403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 16413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 16423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1643e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1644e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 16453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 16463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 16473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 16483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 16493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->isLowPowerMode()) { 16523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel = pme->m_channels[QCAMERA_CH_TYPE_VIDEO]; 16533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 16543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel = pme->m_channels[QCAMERA_CH_TYPE_SNAPSHOT]; 16553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1657cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if ((pChannel == NULL) 1658cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel || (!validate_handle(pChannel->getMyHandle(), 1659cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel super_frame->ch_id))) { 16603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Snapshot channel doesn't exist, return here"); 16613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 16623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpmetadata", value, "0"); 16653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t enabled = atoi(value); 16663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (enabled) { 16673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *pMetaFrame = NULL; 16683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 16693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < super_frame->num_bufs; i++) { 16703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = pChannel->getStreamByHandle(super_frame->bufs[i]->stream_id); 16713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 16723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 16733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pMetaFrame = super_frame->bufs[i]; //find the metadata 16743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaFrame != NULL && 16753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((metadata_buffer_t *)pMetaFrame->buffer)->is_tuning_params_valid) { 16763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpMetadataToFile(pStream, pMetaFrame, (char *) "Snapshot"); 16773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 16793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // save a copy for the superbuf 16853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t* frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 16863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame == NULL) { 16873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error allocating memory to save received_frame structure."); 16883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(super_frame); 16893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 16903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *frame = *super_frame; 16923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame->num_bufs > 0) { 16943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: superbuf frame_idx %d", 16953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->bufs[0]->frame_idx); 16963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NO_ERROR != pme->waitDeferredWork(pme->mReprocJob)) || 16993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (NO_ERROR != pme->m_postprocessor.processData(frame))) { 17003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Failed to trigger process data"); 17013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(super_frame); 17023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(frame); 17033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame = NULL; 17043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 17053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 17083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 17093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 17113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : raw_stream_cb_routine 17123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle raw dump frame from raw stream 17143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 17163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 17173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 17183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 17193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 17213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 17233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. For raw 17243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * frame, there is no need to send to postprocessor for jpeg 17253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * encoding. this function will play shutter and send the data 17263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * callback to upper layer. Raw frame buffer will be returned 17273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * back to kernel, and frame will be free after use. 17283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 17293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 17303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * /*stream*/, 17313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 17323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1733e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_RAW_STRM_CB); 17343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 17353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 17363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 17373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1738e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1739e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 17403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 17413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 17423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 17433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 17443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_postprocessor.processRawData(super_frame); 17473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 17483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 17493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 17513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : raw_channel_cb_routine 17523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle RAW superbuf callback directly from 17543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * mm-camera-interface 17553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 17573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 17583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 17593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 17613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : recvd_frame will be released after this call by caller, so if 17633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * async operation needed for recvd_frame, it's our responsibility 17643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * to save a copy for this variable to be used later. 17653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*==========================================================================*/ 17663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::raw_channel_cb_routine(mm_camera_super_buf_t *super_frame, 17673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata) 17683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1770e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_RAW_CH_CB); 17713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 17723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E"); 17743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 17753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 17763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1777e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1778e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 17793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 17803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 17813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 17823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 17833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraChannel *pChannel = pme->m_channels[QCAMERA_CH_TYPE_RAW]; 17863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pChannel == NULL) { 17873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("RAW channel doesn't exist, return here"); 17883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 17893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1791cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (!validate_handle(pChannel->getMyHandle(), super_frame->ch_id)) { 17923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid Input super buffer"); 17933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(super_frame); 17943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 17953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpmetadata", value, "0"); 17983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t enabled = atoi(value); 17993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (enabled) { 18003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *pMetaFrame = NULL; 18013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 18023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < super_frame->num_bufs; i++) { 18033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = pChannel->getStreamByHandle(super_frame->bufs[i]->stream_id); 18043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 18053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 18063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pMetaFrame = super_frame->bufs[i]; //find the metadata 18073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaFrame != NULL && 18083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((metadata_buffer_t *)pMetaFrame->buffer)->is_tuning_params_valid) { 18093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpMetadataToFile(pStream, pMetaFrame, (char *) "raw"); 18103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 18123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // save a copy for the superbuf 18183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t* frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 18193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame == NULL) { 18203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error allocating memory to save received_frame structure."); 18213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(super_frame); 18223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 18233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *frame = *super_frame; 18253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame->num_bufs > 0) { 18273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: superbuf frame_idx %d", 18283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->bufs[0]->frame_idx); 18293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Wait on Postproc initialization if needed 18323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // then send to postprocessor 18333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NO_ERROR != pme->waitDeferredWork(pme->mReprocJob)) || 18343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (NO_ERROR != pme->m_postprocessor.processData(frame))) { 18353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Failed to trigger process data"); 18363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pChannel->bufDone(super_frame); 18373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(frame); 18383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame = NULL; 18393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 18403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 18433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 18453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 18473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : preview_raw_stream_cb_routine 18483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle raw frame during standard preview 18503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 18523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 18533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 18543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 18553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 18573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 18593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. 18603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 18613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::preview_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 18623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * stream, 18633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 18643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1865e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_PREVIEW_RAW_STRM_CB); 18663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 18673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 18683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool dump_preview_raw = false, dump_video_raw = false; 18693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 18713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 18723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1873e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1874e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 18753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 18763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 18773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 18783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 18793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *raw_frame = super_frame->bufs[0]; 18823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (raw_frame != NULL) { 18843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.preview_raw", value, "0"); 18853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dump_preview_raw = atoi(value) > 0 ? true : false; 18863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.video_raw", value, "0"); 18873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dump_video_raw = atoi(value) > 0 ? true : false; 18883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dump_preview_raw || (pme->mParameters.getRecordingHintValue() 18893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel && dump_video_raw)) { 18903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, raw_frame, QCAMERA_DUMP_FRM_RAW); 18913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(raw_frame->buf_idx); 18933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 18953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 18973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 18983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 19003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : snapshot_raw_stream_cb_routine 19013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle raw frame during standard capture 19033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 19053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 19063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 19073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 19083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 19103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 19123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. 19133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 19143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::snapshot_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 19153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * stream, 19163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 19173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1918e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_SNAPSHOT_RAW_STRM_CB); 19193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : BEGIN"); 19203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 19213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool dump_raw = false; 19223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 19243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 19253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 1926e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 1927e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 19283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 19293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 19303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 19313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 19323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.snapshot_raw", value, "0"); 19353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dump_raw = atoi(value) > 0 ? true : false; 19363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < super_frame->num_bufs; i++) { 19383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (super_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_RAW) { 19393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t * raw_frame = super_frame->bufs[i]; 19403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != stream) { 19413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dump_raw) { 19423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpFrameToFile(stream, raw_frame, QCAMERA_DUMP_FRM_RAW); 19433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(super_frame->bufs[i]->buf_idx); 19453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 19473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 19513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : END"); 19533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 19543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 19563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : updateMetadata 19573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Frame related parameter can be updated here 19593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 19613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pMetaData : pointer to metadata buffer 19623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 19643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 19653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 19663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 19673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera2HardwareInterface::updateMetadata(metadata_buffer_t *pMetaData) 19683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 19693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 19703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaData == NULL) { 19723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Null Metadata buffer"); 19733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 19743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Sharpness 19773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_edge_application_t edge_application; 19783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&edge_application, 0x00, sizeof(cam_edge_application_t)); 19793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.sharpness = mParameters.getSharpness(); 19803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (edge_application.sharpness != 0) { 19813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.edge_mode = CAM_EDGE_MODE_FAST; 19823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 19833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.edge_mode = CAM_EDGE_MODE_OFF; 19843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 19863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EDGE_MODE, edge_application); 19873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Effect 19893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t prmEffect = mParameters.getEffect(); 19903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_PARM_EFFECT, prmEffect); 19913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //flip 19933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t prmFlip = mParameters.getFlipMode(CAM_STREAM_TYPE_SNAPSHOT); 19943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_PARM_FLIP, prmFlip); 19953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //denoise 19973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t prmDenoise = (uint8_t)mParameters.isWNREnabled(); 19983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 19993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_NOISE_REDUCTION_MODE, prmDenoise); 20003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //rotation & device rotation 20023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t prmRotation = mParameters.getJpegRotation(); 20033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_rotation_info_t rotation_info; 20043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&rotation_info, 0, sizeof(cam_rotation_info_t)); 20053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (prmRotation == 0) { 20063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.rotation = ROTATE_0; 20073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (prmRotation == 90) { 20083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.rotation = ROTATE_90; 20093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (prmRotation == 180) { 20103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.rotation = ROTATE_180; 20113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (prmRotation == 270) { 20123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.rotation = ROTATE_270; 20133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t device_rotation = mParameters.getDeviceRotation(); 20163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (device_rotation == 0) { 20173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.device_rotation = ROTATE_0; 20183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (device_rotation == 90) { 20193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.device_rotation = ROTATE_90; 20203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (device_rotation == 180) { 20213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.device_rotation = ROTATE_180; 20223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (device_rotation == 270) { 20233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.device_rotation = ROTATE_270; 20243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 20253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rotation_info.device_rotation = ROTATE_0; 20263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_PARM_ROTATION, rotation_info); 20293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Imglib Dynamic Scene Data 20313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dyn_img_data_t dyn_img_data = mParameters.getDynamicImgData(); 20323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mParameters.isStillMoreEnabled()) { 20333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_still_more_t stillmore_cap = mParameters.getStillMoreSettings(); 20343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dyn_img_data.input_count = stillmore_cap.burst_count; 20353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 20373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_IMG_DYN_FEAT, dyn_img_data); 20383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //CPP CDS 20403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t prmCDSMode = mParameters.getCDSMode(); 20413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 20423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_PARM_CDS_MODE, prmCDSMode); 20433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 20453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 20463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 20483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : metadata_stream_cb_routine 20493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle metadata frame from metadata stream 20513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 20533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 20543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 20553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 20563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 20583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 20603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. Metadata 20613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * could have valid entries for face detection result or 20623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * histogram statistics information. 20633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 20643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::metadata_stream_cb_routine(mm_camera_super_buf_t * super_frame, 20653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * stream, 20663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 20673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2068e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_METADATA_STRM_CB); 20693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("[KPI Perf] : BEGIN"); 20703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 2071cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 20723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 2073cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel pme->mCameraHandle == 0 || 2074cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 2075cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel super_frame->camera_handle)) { 20763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 20773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 20783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 20793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 20823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *pMetaData = (metadata_buffer_t *)frame->buffer; 2083c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 2084c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (pme->isDualCamera()) { 2085c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel mm_camera_buf_def_t *frameAux; 2086c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel metadata_buffer_t *pMetaDataMain = NULL; 2087c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel metadata_buffer_t *pMetaDataAux = NULL; 2088c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel metadata_buffer_t *resultMetadata = NULL; 2089c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (super_frame->num_bufs == MM_CAMERA_MAX_CAM_CNT) { 2090c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel frameAux = super_frame->bufs[1]; 2091c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataMain = pMetaData; 2092c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataAux = (metadata_buffer_t *)frameAux->buffer; 2093c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } else { 2094c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (super_frame->camera_handle == 2095c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel get_main_camera_handle(pme->mCameraHandle->camera_handle)) { 2096c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataMain = pMetaData; 2097c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataAux = NULL; 2098c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } else if (super_frame->camera_handle == 2099c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel get_aux_camera_handle(pme->mCameraHandle->camera_handle)) { 2100c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataMain = NULL; 2101c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaDataAux = pMetaData; 2102c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 2103c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 2104c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 2105c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel resultMetadata = pme->m_pFovControl->processResultMetadata(pMetaDataMain, pMetaDataAux); 2106c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (resultMetadata != NULL) { 2107c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pMetaData = resultMetadata; 2108c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } else { 2109c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel LOGE("FOV-control: processResultMetadata failed."); 2110c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel free(super_frame); 2111c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel return; 2112c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 2113c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 2114c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 21153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->m_stateMachine.isNonZSLCaptureRunning()&& 21163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel !pme->mLongshotEnabled) { 21173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Make shutter call back in non ZSL mode once raw frame is received from VFE. 21183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->playShutter(); 21193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaData->is_tuning_params_valid && pme->mParameters.getRecordingHintValue() == true) { 21223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Dump Tuning data for video 21233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->dumpMetadataToFile(stream,frame,(char *)"Video"); 21243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_hist_stats_t, stats_data, CAM_INTF_META_HISTOGRAM, pMetaData) { 21273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // process histogram statistics info 21283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 21293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 21303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 21313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 21323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 21333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS; 21343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->stats_data = *stats_data; 21353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 21363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 21373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt histogram failed"); 21383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 21393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 21403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 21433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for histogram qcamera_sm_internal_evt_payload_t"); 21443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_detection_data_t, detection_data, 21483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_DETECTION, pMetaData) { 21493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_faces_data_t faces_data; 21513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->fillFacesData(faces_data, pMetaData); 21523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.detection_data.fd_type = QCAMERA_FD_PREVIEW; //HARD CODE here before MCT can support 21533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = (qcamera_sm_internal_evt_payload_t *) 21553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 21563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 21573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 21583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT; 21593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->faces_data = faces_data; 21603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 21613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 21623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt face detection failed"); 21633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 21643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 21653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 21673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for face detect qcamera_sm_internal_evt_payload_t"); 21683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint32_t, afState, CAM_INTF_META_AF_STATE, pMetaData) { 21723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t forceAFUpdate = FALSE; 21733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //1. Earlier HAL used to rely on AF done flags set in metadata to generate callbacks to 21743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //upper layers. But in scenarios where metadata drops especially which contain important 21753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //AF information, APP will wait indefinitely for focus result resulting in capture hang. 21763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //2. HAL can check for AF state transitions to generate AF state callbacks to upper layers. 21773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //This will help overcome metadata drop issue with the earlier approach. 21783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //3. But sometimes AF state transitions can happen so fast within same metadata due to 21793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //which HAL will receive only the final AF state. HAL may perceive this as no change in AF 21803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //state depending on the state transitions happened (for example state A -> B -> A). 21813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //4. To overcome the drawbacks of both the approaches, we go for a hybrid model in which 21823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //we check state transition at both HAL level and AF module level. We rely on 21833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //'state transition' meta field set by AF module for the state transition detected by it. 21843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint8_t, stateChange, CAM_INTF_AF_STATE_TRANSITION, pMetaData) { 21853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel forceAFUpdate = *stateChange; 21863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //This is a special scenario in which when scene modes like landscape are selected, AF mode 21883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //gets changed to INFINITY at backend, but HAL will not be aware of it. Also, AF state in 21893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //such cases will be set to CAM_AF_STATE_INACTIVE by backend. So, detect the AF mode 21903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //change here and trigger AF callback @ processAutoFocusEvent(). 21913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint32_t, afFocusMode, CAM_INTF_PARM_FOCUS_MODE, pMetaData) { 21923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (((cam_focus_mode_type)(*afFocusMode) == CAM_FOCUS_MODE_INFINITY) && 21933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mActiveAF){ 21943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel forceAFUpdate = TRUE; 21953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((pme->m_currentFocusState != (*afState)) || forceAFUpdate) { 21983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_af_state_t prevFocusState = pme->m_currentFocusState; 21993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_currentFocusState = (cam_af_state_t)(*afState); 22003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = (qcamera_sm_internal_evt_payload_t *) 22013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 22023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 22033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 22043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_FOCUS_UPDATE; 22053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.focus_state = (cam_af_state_t)(*afState); 22063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Need to flush ZSL Q only if we are transitioning from scanning state 22073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //to focused/not focused state. 22083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.flush_info.needFlush = 22093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((prevFocusState == CAM_AF_STATE_PASSIVE_SCAN) || 22103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (prevFocusState == CAM_AF_STATE_ACTIVE_SCAN)) && 22113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((pme->m_currentFocusState == CAM_AF_STATE_FOCUSED_LOCKED) || 22123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pme->m_currentFocusState == CAM_AF_STATE_NOT_FOCUSED_LOCKED)); 22133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.flush_info.focused_frame_idx = frame->frame_idx; 22143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(float, focusDistance, 22163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_LENS_FOCUS_DISTANCE, pMetaData) { 22173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.focus_dist. 22183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel focus_distance[CAM_FOCUS_DISTANCE_OPTIMAL_INDEX] = *focusDistance; 22193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(float, focusRange, CAM_INTF_META_LENS_FOCUS_RANGE, pMetaData) { 22213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.focus_dist. 22223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel focus_distance[CAM_FOCUS_DISTANCE_NEAR_INDEX] = focusRange[0]; 22233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.focus_dist. 22243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel focus_distance[CAM_FOCUS_DISTANCE_FAR_INDEX] = focusRange[1]; 22253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint32_t, focusMode, CAM_INTF_PARM_FOCUS_MODE, pMetaData) { 22273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_data.focus_mode = (cam_focus_mode_type)(*focusMode); 22283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 222904e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel IF_META_AVAILABLE(uint8_t, isDepthFocus, 223004e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel CAM_INTF_META_FOCUS_DEPTH_INFO, pMetaData) { 223104e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel payload->focus_data.isDepth = *isDepthFocus; 223204e026fe14f98a83811cd3a2c04b60b3b501b80cThierry Strudel } 22333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 22343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 22353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt focus failed"); 22363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 22373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 22383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 22403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for focus qcamera_sm_internal_evt_payload_t"); 22413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_crop_data_t, crop_data, CAM_INTF_META_CROP_DATA, pMetaData) { 22463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (crop_data->num_of_streams > MAX_NUM_STREAMS) { 22473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid num_of_streams %d in crop_data", 22483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel crop_data->num_of_streams); 22493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 22503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 22513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 22523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 22533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 22543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 22553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_CROP_INFO; 22563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->crop_data = *crop_data; 22573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 22583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 22593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("processEvt crop info failed"); 22603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 22613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 22623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 22643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for prep_snapshot qcamera_sm_internal_evt_payload_t"); 22653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(int32_t, prep_snapshot_done_state, 22703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_PREP_SNAPSHOT_DONE, pMetaData) { 22713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 22723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 22733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 22743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 22753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE; 22763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->prep_snapshot_state = (cam_prep_snapshot_state_t)*prep_snapshot_done_state; 22773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 22783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 22793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt prep_snapshot failed"); 22803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 22813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 22823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 22843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for prep_snapshot qcamera_sm_internal_evt_payload_t"); 22853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_asd_hdr_scene_data_t, hdr_scene_data, 22893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_ASD_HDR_SCENE_DATA, pMetaData) { 22903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("hdr_scene_data: %d %f\n", 22913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel hdr_scene_data->is_hdr_scene, hdr_scene_data->hdr_confidence); 22923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Handle this HDR meta data only if capture is not in process 22933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!pme->m_stateMachine.isCaptureRunning()) { 22943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 22953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 22963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 22973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 22983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 22993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_HDR_UPDATE; 23003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->hdr_data = *hdr_scene_data; 23013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 23023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 23033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt hdr update failed"); 23043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 23053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 23063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 23083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for hdr update qcamera_sm_internal_evt_payload_t"); 23093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_asd_decision_t, cam_asd_info, 23143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_ASD_SCENE_INFO, pMetaData) { 23153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 23163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 23173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 23183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 23193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_ASD_UPDATE; 23203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->asd_data = (cam_asd_decision_t)*cam_asd_info; 23213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 23223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 23233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt asd_update failed"); 23243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 23253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 23263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 23283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for asd_update qcamera_sm_internal_evt_payload_t"); 23293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_awb_params_t, awb_params, CAM_INTF_META_AWB_INFO, pMetaData) { 23333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH(", metadata for awb params."); 23343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 23353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 23363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 23373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 23383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 23393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_AWB_UPDATE; 23403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->awb_data = *awb_params; 23413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 23423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 23433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt awb_update failed"); 23443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 23453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 23463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 23483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for awb_update qcamera_sm_internal_evt_payload_t"); 23493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint32_t, flash_mode, CAM_INTF_META_FLASH_MODE, pMetaData) { 23533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.sensor_params.flash_mode = (cam_flash_mode_t)*flash_mode; 23543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(int32_t, flash_state, CAM_INTF_META_FLASH_STATE, pMetaData) { 23573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.sensor_params.flash_state = (cam_flash_state_t) *flash_state; 23583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(float, aperture_value, CAM_INTF_META_LENS_APERTURE, pMetaData) { 23613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.sensor_params.aperture_value = *aperture_value; 23623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_3a_params_t, ae_params, CAM_INTF_META_AEC_INFO, pMetaData) { 23653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.cam_3a_params = *ae_params; 23663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.cam_3a_params_valid = TRUE; 23673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mFlashNeeded = ae_params->flash_needed; 23683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.cam_3a_params.brightness = (float) pme->mParameters.getBrightness(); 23693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 23703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 23713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 23723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 23733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 23743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_AE_UPDATE; 23753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->ae_data = *ae_params; 23763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 23773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 23783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt ae_update failed"); 23793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 23803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 23813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 23833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for ae_update qcamera_sm_internal_evt_payload_t"); 23843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(int32_t, wb_mode, CAM_INTF_PARM_WHITE_BALANCE, pMetaData) { 23883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.cam_3a_params.wb_mode = (cam_wb_mode_type) *wb_mode; 23893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_sensor_params_t, sensor_params, CAM_INTF_META_SENSOR_INFO, pMetaData) { 23923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.sensor_params = *sensor_params; 23933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_ae_exif_debug_t, ae_exif_debug_params, 23963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_AE, pMetaData) { 23973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 23983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->ae_debug_params = *ae_exif_debug_params; 23993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->ae_debug_params_valid = TRUE; 24003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_awb_exif_debug_t, awb_exif_debug_params, 24043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_AWB, pMetaData) { 24053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->awb_debug_params = *awb_exif_debug_params; 24073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->awb_debug_params_valid = TRUE; 24083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_af_exif_debug_t, af_exif_debug_params, 24123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_AF, pMetaData) { 24133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->af_debug_params = *af_exif_debug_params; 24153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->af_debug_params_valid = TRUE; 24163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_asd_exif_debug_t, asd_exif_debug_params, 24203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_ASD, pMetaData) { 24213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->asd_debug_params = *asd_exif_debug_params; 24233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->asd_debug_params_valid = TRUE; 24243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_stats_buffer_exif_debug_t, stats_exif_debug_params, 24283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_STATS, pMetaData) { 24293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->stats_debug_params = *stats_exif_debug_params; 24313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->stats_debug_params_valid = TRUE; 24323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_bestats_buffer_exif_debug_t, bestats_exif_debug_params, 24363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_BESTATS, pMetaData) { 24373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->bestats_debug_params = *bestats_exif_debug_params; 24393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->bestats_debug_params_valid = TRUE; 24403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_bhist_buffer_exif_debug_t, bhist_exif_debug_params, 24443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_BHIST, pMetaData) { 24453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->bhist_debug_params = *bhist_exif_debug_params; 24473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->bhist_debug_params_valid = TRUE; 24483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_q3a_tuning_info_t, q3a_tuning_exif_debug_params, 24523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_EXIF_DEBUG_3A_TUNING, pMetaData) { 24533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mExifParams.debug_params) { 24543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->q3a_tuning_debug_params = *q3a_tuning_exif_debug_params; 24553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mExifParams.debug_params->q3a_tuning_debug_params_valid = TRUE; 24563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(uint32_t, led_mode, CAM_INTF_META_LED_MODE_OVERRIDE, pMetaData) { 24603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 24613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *) 24623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 24633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 24643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 24653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE; 24663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->led_data = (cam_flash_mode_t)*led_mode; 24673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 24683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 24693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt led mode override failed"); 24703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 24713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 24723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 24743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for focus qcamera_sm_internal_evt_payload_t"); 24753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_edge_application_t edge_application; 24793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&edge_application, 0x00, sizeof(cam_edge_application_t)); 24803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.sharpness = pme->mParameters.getSharpness(); 24813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (edge_application.sharpness != 0) { 24823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.edge_mode = CAM_EDGE_MODE_FAST; 24833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 24843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel edge_application.edge_mode = CAM_EDGE_MODE_OFF; 24853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_META_EDGE_MODE, edge_application); 24873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_focus_pos_info_t, cur_pos_info, 24893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FOCUS_POSITION, pMetaData) { 24903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_sm_internal_evt_payload_t *payload = 24913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 24923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != payload) { 24933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 24943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->evt_type = QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE; 24953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload->focus_pos = *cur_pos_info; 24963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 24973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 24983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("processEvt focus_pos_update failed"); 24993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(payload); 25003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel payload = NULL; 25013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 25033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No memory for focus_pos_update qcamera_sm_internal_evt_payload_t"); 25043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mParameters.getLowLightCapture()) { 25083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_low_light_mode_t, low_light_level, 25093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_LOW_LIGHT, pMetaData) { 25103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mParameters.setLowLightLevel(*low_light_level); 25113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_dyn_img_data_t, dyn_img_data, 25153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_IMG_DYN_FEAT, pMetaData) { 25163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mParameters.setDynamicImgData(*dyn_img_data); 25173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(int32_t, touch_ae_status, CAM_INTF_META_TOUCH_AE_RESULT, pMetaData) { 25203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("touch_ae_status: %d", *touch_ae_status); 25213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2523cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (pme->isDualCamera()) { 2524cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel pme->fillDualCameraFOVControl(); 2525cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 2526cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 2527cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel stream->bufDone(super_frame); 25283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 25293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("[KPI Perf] : END"); 25313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 25323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 25343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : reprocess_stream_cb_routine 25353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to handle reprocess frame from reprocess stream 25373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (after reprocess, e.g., ZSL snapshot frame after WNR if 25383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WNR is enabled) 25393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 25413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 25423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 25433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 25443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 25463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NOTE : caller passes the ownership of super_frame, it's our 25483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * responsibility to free super_frame once it's done. In this 25493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * case, reprocessed frame need to be passed to postprocessor 25503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * for jpeg encoding. 25513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 25523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::reprocess_stream_cb_routine(mm_camera_super_buf_t * super_frame, 25533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream * /*stream*/, 25543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * userdata) 25553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2556e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_REPROC_STRM_CB); 25573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E"); 25583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 25593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 25603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCameraHandle == NULL || 2561e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 2562e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel super_frame->camera_handle)){ 25633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("camera obj not valid"); 25643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 25653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 25663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 25673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->m_postprocessor.processPPData(super_frame); 25703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 25723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 25733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 25753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : callback_stream_cb_routine 25763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: function to process CALBACK stream data 25783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Frame will processed and sent to framework 25793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 25813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : received super buffer 25823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : stream object 25833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 25843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 25863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 25873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::callback_stream_cb_routine(mm_camera_super_buf_t *super_frame, 25883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream, void *userdata) 25893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2590e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL1_CB_STRM_CB); 25913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: E"); 25923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 25933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme == NULL || 2595cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel pme->mCameraHandle == 0 || 2596cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel !validate_handle(pme->mCameraHandle->camera_handle, 2597cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel super_frame->camera_handle)) { 25983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // simply free super frame 25993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 26003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 26013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame = super_frame->bufs[0]; 26043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == frame) { 26053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("preview callback frame is NULL"); 26063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 26073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 26083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!pme->needProcessPreviewFrame(frame->frame_idx)) { 26113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("preview is not running, no need to process"); 26123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 26133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 26143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 26153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraMemory *previewMemObj = (QCameraMemory *)frame->mem_info; 26183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Handle preview data callback 26193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mDataCb != NULL && 26203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pme->msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0) && 26213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (!pme->mParameters.isSceneSelectionEnabled())) { 2622295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel // Preset cache flags to be handled when the buffer comes back 2623295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 26243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pme->sendPreviewCallback(stream, previewMemObj, frame->buf_idx); 26253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NO_ERROR != rc) { 26263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Preview callback was not sent succesfully"); 26273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->bufDone(frame->buf_idx); 26303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(super_frame); 26313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf]: X"); 26323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 26333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 26353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : dumpFrameToFile 26363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to dump jpeg into file for debug purpose. 26383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 26403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data ptr 26413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @size : length of data buffer 26423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @index : identifier for data 26433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 26453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 26463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::dumpJpegToFile(const void *data, 26473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t size, uint32_t index) 26483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 26493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 26503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpimg", value, "0"); 26513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t enabled = (uint32_t) atoi(value); 26523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frm_num = 0; 26533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t skip_mode = 0; 26543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char buf[32]; 26563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t dim; 26573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(buf, 0, sizeof(buf)); 26583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&dim, 0, sizeof(dim)); 26593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2660cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if(((enabled & QCAMERA_DUMP_FRM_OUTPUT_JPEG) && data) || 26613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((true == m_bIntJpegEvtPending) && data)) { 26623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = ((enabled & 0xffff0000) >> 16); 26633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(frm_num == 0) { 26643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 10; //default 10 frames 26653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(frm_num > 256) { 26673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 256; //256 buffers cycle around 26683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel skip_mode = ((enabled & 0x0000ff00) >> 8); 26703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(skip_mode == 0) { 26713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel skip_mode = 1; //no-skip 26723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if( mDumpSkipCnt % skip_mode == 0) { 26753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if((frm_num == 256) && (mDumpFrmCnt >= frm_num)) { 26763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // reset frame count if cycling 26773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDumpFrmCnt = 0; 26783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mDumpFrmCnt <= frm_num) { 26803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION "%d_%d.jpg", 26813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDumpFrmCnt, index); 26823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (true == m_bIntJpegEvtPending) { 26833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel strlcpy(m_BackendFileName, buf, QCAMERA_MAX_FILEPATH_LENGTH); 26843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mBackendFileSize = size; 26853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int file_fd = open(buf, O_RDWR | O_CREAT, 0777); 26883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (file_fd >= 0) { 26893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ssize_t written_len = write(file_fd, data, size); 26903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fchmod(file_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 26913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("written number of bytes %zd\n", 26923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len); 26933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(file_fd); 26943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 26953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("fail to open file for image dumping"); 26963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (false == m_bIntJpegEvtPending) { 26983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDumpFrmCnt++; 26993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDumpSkipCnt++; 27033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 27053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::dumpMetadataToFile(QCameraStream *stream, 27083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame,char *type) 27093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 27103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 27113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frm_num = 0; 27123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *metadata = (metadata_buffer_t *)frame->buffer; 27133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpmetadata", value, "0"); 27143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t enabled = (uint32_t) atoi(value); 27153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (stream == NULL) { 27163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("No op"); 27173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 27183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t dumpFrmCnt = stream->mDumpMetaFrame; 27213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(enabled){ 27223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = ((enabled & 0xffff0000) >> 16); 27233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frm_num == 0) { 27243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 10; //default 10 frames 27253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frm_num > 256) { 27273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 256; //256 buffers cycle around 27283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((frm_num == 256) && (dumpFrmCnt >= frm_num)) { 27303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // reset frame count if cycling 27313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt = 0; 27323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("dumpFrmCnt= %u, frm_num = %u", dumpFrmCnt, frm_num); 27343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dumpFrmCnt < frm_num) { 27353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char timeBuf[128]; 27363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char buf[32]; 27373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(buf, 0, sizeof(buf)); 27383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(timeBuf, 0, sizeof(timeBuf)); 27393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel time_t current_time; 27403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel struct tm * timeinfo; 27413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel time (¤t_time); 27423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timeinfo = localtime (¤t_time); 27433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != timeinfo) { 27443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel strftime(timeBuf, sizeof(timeBuf), 27453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCAMERA_DUMP_FRM_LOCATION "%Y%m%d%H%M%S", timeinfo); 27463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel String8 filePath(timeBuf); 27483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%um_%s_%d.bin", dumpFrmCnt, type, frame->frame_idx); 27493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel filePath.append(buf); 27503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int file_fd = open(filePath.string(), O_RDWR | O_CREAT, 0777); 27513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (file_fd >= 0) { 27523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ssize_t written_len = 0; 27533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata->tuning_params.tuning_data_version = TUNING_DATA_VERSION; 27543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *data = (void *)((uint8_t *)&metadata->tuning_params.tuning_data_version); 27553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 27563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.tuning_sensor_data_size); 27573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("tuning_sensor_data_size %d",(int)(*(int *)data)); 27583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 27593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.tuning_vfe_data_size); 27603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("tuning_vfe_data_size %d",(int)(*(int *)data)); 27613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 27623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.tuning_cpp_data_size); 27633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("tuning_cpp_data_size %d",(int)(*(int *)data)); 27643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 27653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.tuning_cac_data_size); 27663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("tuning_cac_data_size %d",(int)(*(int *)data)); 27673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 27683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.tuning_cac_data_size2); 27693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("< skrajago >tuning_cac_data_size %d",(int)(*(int *)data)); 27703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, sizeof(uint32_t)); 27713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t total_size = metadata->tuning_params.tuning_sensor_data_size; 27723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.data); 27733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, total_size); 27743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel total_size = metadata->tuning_params.tuning_vfe_data_size; 27753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_VFE_DATA_OFFSET]); 27763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, total_size); 27773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel total_size = metadata->tuning_params.tuning_cpp_data_size; 27783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_CPP_DATA_OFFSET]); 27793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, total_size); 27803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel total_size = metadata->tuning_params.tuning_cac_data_size; 27813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_CAC_DATA_OFFSET]); 27823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, total_size); 27833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(file_fd); 27843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel }else { 27853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("fail t open file for image dumping"); 27863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt++; 27883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mDumpMetaFrame = dumpFrmCnt; 27913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 27923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 27933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : dumpFrameToFile 27943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to dump frame into file for debug purpose. 27963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 27983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data ptr 27993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @size : length of data buffer 28003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @index : identifier for data 28013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @dump_type : type of the frame to be dumped. Only such 28023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * dump type is enabled, the frame will be 28033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * dumped into a file. 28043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 28063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 28073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::dumpFrameToFile(QCameraStream *stream, 28083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *frame, uint32_t dump_type, const char *misc) 28093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 28103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[PROPERTY_VALUE_MAX]; 28113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.dumpimg", value, "0"); 28123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t enabled = (uint32_t) atoi(value); 28133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frm_num = 0; 28143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t skip_mode = 0; 28153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == stream) { 28173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("stream object is null"); 28183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 28193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t dumpFrmCnt = stream->mDumpFrame; 28223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (true == m_bIntRawEvtPending) { 28243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel enabled = QCAMERA_DUMP_FRM_RAW; 28253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if((enabled & QCAMERA_DUMP_FRM_MASK_ALL)) { 28283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if((enabled & dump_type) && stream && frame) { 28293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = ((enabled & 0xffff0000) >> 16); 28303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(frm_num == 0) { 28313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 10; //default 10 frames 28323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(frm_num > 256) { 28343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frm_num = 256; //256 buffers cycle around 28353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel skip_mode = ((enabled & 0x0000ff00) >> 8); 28373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(skip_mode == 0) { 28383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel skip_mode = 1; //no-skip 28393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(stream->mDumpSkipCnt == 0) 28413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mDumpSkipCnt = 1; 28423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if( stream->mDumpSkipCnt % skip_mode == 0) { 28443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if((frm_num == 256) && (dumpFrmCnt >= frm_num)) { 28453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // reset frame count if cycling 28463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt = 0; 28473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (dumpFrmCnt <= frm_num) { 28493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char buf[32]; 28503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char timeBuf[128]; 28513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel time_t current_time; 28523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel struct tm * timeinfo; 28533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(timeBuf, 0, sizeof(timeBuf)); 28553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel time (¤t_time); 28573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timeinfo = localtime (¤t_time); 28583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(buf, 0, sizeof(buf)); 28593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t dim; 28613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&dim, 0, sizeof(dim)); 28623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFrameDimension(dim); 28633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_frame_len_offset_t offset; 28653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&offset, 0, sizeof(cam_frame_len_offset_t)); 28663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFrameOffset(offset); 28673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != timeinfo) { 28693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel strftime(timeBuf, sizeof(timeBuf), 28703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCAMERA_DUMP_FRM_LOCATION "%Y%m%d%H%M%S", timeinfo); 28713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel String8 filePath(timeBuf); 28733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch (dump_type) { 28743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DUMP_FRM_PREVIEW: 28753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 28763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dp_%dx%d_%d.yuv", 28773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 28783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 28803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DUMP_FRM_THUMBNAIL: 28813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 28823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dt_%dx%d_%d.yuv", 28833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 28843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 2886cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case QCAMERA_DUMP_FRM_INPUT_JPEG: 28873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 28883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mParameters.isPostProcScaling()) { 28893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParameters.getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT, dim); 28903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 28913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFrameDimension(dim); 28923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 28933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (misc != NULL) { 28943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%ds_%dx%d_%d_%s.yuv", 28953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx, misc); 28963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 28973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%ds_%dx%d_%d.yuv", 28983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 28993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 29023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DUMP_FRM_INPUT_REPROCESS: 29033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 29043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getFrameDimension(dim); 29053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (misc != NULL) { 29063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dir_%dx%d_%d_%s.yuv", 29073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx, misc); 29083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 29093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dir_%dx%d_%d.yuv", 29103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 29113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 29143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DUMP_FRM_VIDEO: 29153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 29163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dv_%dx%d_%d.yuv", 29173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 29183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 29203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DUMP_FRM_RAW: 29213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 29223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParameters.getStreamDimension(CAM_STREAM_TYPE_RAW, dim); 29233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dr_%dx%d_%d.raw", 29243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 29253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 2927cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case QCAMERA_DUMP_FRM_OUTPUT_JPEG: 29283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 29293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParameters.getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT, dim); 29303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(buf, sizeof(buf), "%dj_%dx%d_%d.yuv", 29313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 29323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 29343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 29353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Not supported for dumping stream type %d", 29363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dump_type); 29373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 29383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel filePath.append(buf); 29413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int file_fd = open(filePath.string(), O_RDWR | O_CREAT, 0777); 29423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ssize_t written_len = 0; 29433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (file_fd >= 0) { 29443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *data = NULL; 29453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fchmod(file_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 29473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < offset.num_planes; i++) { 29483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t index = offset.mp[i].offset; 29493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (i > 0) { 29503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel index += offset.mp[i-1].len; 29513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (offset.mp[i].meta_len != 0) { 29543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)frame->buffer + index); 29553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, 29563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (size_t)offset.mp[i].meta_len); 29573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel index += (uint32_t)offset.mp[i].meta_len; 29583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (int j = 0; j < offset.mp[i].height; j++) { 29613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel data = (void *)((uint8_t *)frame->buffer + index); 29623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len += write(file_fd, data, 29633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (size_t)offset.mp[i].width); 29643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel index += (uint32_t)offset.mp[i].stride; 29653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("written number of bytes %ld\n", 29693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel written_len); 29703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(file_fd); 2971295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->cache_flags |= CPU_HAS_READ; 29723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 29733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("fail to open file for image dumping"); 29743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (true == m_bIntRawEvtPending) { 29763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel strlcpy(m_BackendFileName, filePath.string(), QCAMERA_MAX_FILEPATH_LENGTH); 29773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mBackendFileSize = (size_t)written_len; 29783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 29793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt++; 29803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mDumpSkipCnt++; 29843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 29863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dumpFrmCnt = 0; 29873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->mDumpFrame = dumpFrmCnt; 29893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 29903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 29923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : debugShowVideoFPS 29933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to log video frame FPS for debug purpose. 29953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 29973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 29993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 30003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::debugShowVideoFPS() 30013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 30023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVFrameCount++; 30033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t now = systemTime(); 30043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t diff = now - mVLastFpsTime; 30053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (diff > ms2ns(250)) { 30063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVFps = (((double)(mVFrameCount - mVLastFrameCount)) * 30073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (double)(s2ns(1))) / (double)diff; 30083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: PROFILE_VIDEO_FRAMES_PER_SECOND: %.4f Cam ID = %d", 30093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVFps, mCameraId); 30103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVLastFpsTime = now; 30113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVLastFrameCount = mVFrameCount; 30123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 30143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 30163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : debugShowPreviewFPS 30173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to log preview frame FPS for debug purpose. 30193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 30213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 30233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 30243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::debugShowPreviewFPS() 30253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 30263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPFrameCount++; 30273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t now = systemTime(); 30283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t diff = now - mPLastFpsTime; 30293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (diff > ms2ns(250)) { 30303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPFps = (((double)(mPFrameCount - mPLastFrameCount)) * 30313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (double)(s2ns(1))) / (double)diff; 30323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("[KPI Perf]: PROFILE_PREVIEW_FRAMES_PER_SECOND : %.4f Cam ID = %d", 30333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPFps, mCameraId); 30343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPLastFpsTime = now; 30353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPLastFrameCount = mPFrameCount; 30363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 30383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 30403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : fillFacesData 30413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function to fill in face related metadata into a struct. 30433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 30453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @faces_data : face features data to be filled 30463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @metadata : metadata structure to read face features from 30473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 30493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 30503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera2HardwareInterface::fillFacesData(cam_faces_data_t &faces_data, 30513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *metadata) 30523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 30533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&faces_data, 0, sizeof(cam_faces_data_t)); 30543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_detection_data_t, p_detection_data, 30563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_DETECTION, metadata) { 30573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.detection_data = *p_detection_data; 30583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (faces_data.detection_data.num_faces_detected > MAX_ROI) { 30593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.detection_data.num_faces_detected = MAX_ROI; 30603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] PROFILE_NUMBER_OF_FACES_DETECTED %d", 30633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.detection_data.num_faces_detected); 30643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_recog_data_t, p_recog_data, 30663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_RECOG, metadata) { 30673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.recog_valid = true; 30683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.recog_data = *p_recog_data; 30693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_blink_data_t, p_blink_data, 30723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_BLINK, metadata) { 30733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.blink_valid = true; 30743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.blink_data = *p_blink_data; 30753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_gaze_data_t, p_gaze_data, 30783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_GAZE, metadata) { 30793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.gaze_valid = true; 30803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.gaze_data = *p_gaze_data; 30813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_smile_data_t, p_smile_data, 30843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_SMILE, metadata) { 30853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.smile_valid = true; 30863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.smile_data = *p_smile_data; 30873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_landmarks_data_t, p_landmarks, 30903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_LANDMARK, metadata) { 30913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.landmark_valid = true; 30923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.landmark_data = *p_landmarks; 30933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_face_contour_data_t, p_contour, 30963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_FACE_CONTOUR, metadata) { 30973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.contour_valid = true; 30983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel faces_data.contour_data = *p_contour; 30993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 31023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 31043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ~QCameraCbNotifier 31053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Destructor for exiting the callback context. 31073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 31093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 31113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 31123d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraCbNotifier::~QCameraCbNotifier() 31133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 31143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 31153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 31173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : exit 31183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: exit notify thread. 31203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 31223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 31243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 31253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraCbNotifier::exit() 31263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 31273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mActive = false; 31283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mProcTh.exit(); 31293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 31303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 31323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : releaseNotifications 31333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: callback for releasing data stored in the callback queue. 31353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 31373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data to be released 31383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @user_data : context data 31393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 31413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 31423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraCbNotifier::releaseNotifications(void *data, void *user_data) 31433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 31443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 31453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ( NULL != arg ) && ( NULL != user_data ) ) { 31473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( arg->release_cb ) { 31483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel arg->release_cb(arg->user_data, arg->cookie, FAILED_TRANSACTION); 31493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 31523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 31543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : matchSnapshotNotifications 31553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: matches snapshot data callbacks 31573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 31593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data to match 31603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @user_data : context data 31613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : bool match 31633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * true - match found 31643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * false- match not found 31653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 31663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraCbNotifier::matchSnapshotNotifications(void *data, 31673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void */*user_data*/) 31683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 31693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 31703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL != arg ) { 31713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( QCAMERA_DATA_SNAPSHOT_CALLBACK == arg->cb_type ) { 31723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return true; 31733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return false; 31773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 31783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 31803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : matchPreviewNotifications 31813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: matches preview data callbacks 31833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 31853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data to match 31863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @user_data : context data 31873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : bool match 31893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * true - match found 31903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * false- match not found 31913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 31923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraCbNotifier::matchPreviewNotifications(void *data, 31933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void */*user_data*/) 31943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 31953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 31963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != arg) { 31973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((QCAMERA_DATA_CALLBACK == arg->cb_type) && 31983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (CAMERA_MSG_PREVIEW_FRAME == arg->msg_type)) { 31993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return true; 32003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return false; 32043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 32053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 32073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : matchTimestampNotifications 32083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: matches timestamp data callbacks 32103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 32123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : data to match 32133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @user_data : context data 32143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : bool match 32163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * true - match found 32173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * false- match not found 32183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 32193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraCbNotifier::matchTimestampNotifications(void *data, 32203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void */*user_data*/) 32213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 32223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 32233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != arg) { 32243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((QCAMERA_DATA_TIMESTAMP_CALLBACK == arg->cb_type) && 32253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (CAMERA_MSG_VIDEO_FRAME == arg->msg_type)) { 32263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return true; 32273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return false; 32313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 32323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 32343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : cbNotifyRoutine 32353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: callback thread which interfaces with the upper layers 32373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * given input commands. 32383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 32403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @data : context data 32413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 32433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 32443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid * QCameraCbNotifier::cbNotifyRoutine(void * data) 32453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 32463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int running = 1; 32473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int ret; 32483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraCbNotifier *pme = (QCameraCbNotifier *)data; 32493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraCmdThread *cmdThread = &pme->mProcTh; 32503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cmdThread->setName("CAM_cbNotify"); 32513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t isSnapshotActive = FALSE; 32523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool longShotEnabled = false; 32533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t numOfSnapshotExpected = 0; 32543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t numOfSnapshotRcvd = 0; 32553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t cbStatus = NO_ERROR; 32563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("E"); 32583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel do { 32593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel do { 32603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = cam_sem_wait(&cmdThread->cmd_sem); 32613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ret != 0 && errno != EINVAL) { 32623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("cam_sem_wait error (%s)", 32633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel strerror(errno)); 32643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 32653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } while (ret != 0); 32673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_cmd_type_t cmd = cmdThread->getCmd(); 32693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("get cmd %d", cmd); 32703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch (cmd) { 32713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case CAMERA_CMD_TYPE_START_DATA_PROC: 32723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 32733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel isSnapshotActive = TRUE; 32743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotExpected = pme->mParent->numOfSnapshotsExpected(); 32753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel longShotEnabled = pme->mParent->isLongshotEnabled(); 32763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("Num Snapshots Expected = %d", 32773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotExpected); 32783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotRcvd = 0; 32793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 32813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case CAMERA_CMD_TYPE_STOP_DATA_PROC: 32823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 32833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataQ.flushNodes(matchSnapshotNotifications); 32843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel isSnapshotActive = FALSE; 32853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotExpected = 0; 32873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotRcvd = 0; 32883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 32903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case CAMERA_CMD_TYPE_DO_NEXT_JOB: 32913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 32923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *cb = 32933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (qcamera_callback_argm_t *)pme->mDataQ.dequeue(); 32943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus = NO_ERROR; 32953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != cb) { 32963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("cb type %d received", 32973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->cb_type); 32983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mParent->msgTypeEnabledWithLock(cb->msg_type)) { 33003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch (cb->cb_type) { 33013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_NOTIFY_CALLBACK: 33023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 33033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->msg_type == CAMERA_MSG_FOCUS) { 33043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel KPI_ATRACE_INT("Camera:AutoFocus", 0); 33053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("[KPI Perf] : PROFILE_SENDING_FOCUS_EVT_TO APP"); 33063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mNotifyCb) { 33083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mNotifyCb(cb->msg_type, 33093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->ext1, 33103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->ext2, 33113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCallbackCookie); 33123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 33133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("notify callback not set!"); 33143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 33163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, 33173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus); 33183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 33213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DATA_CALLBACK: 33223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 33233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mDataCb) { 33243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataCb(cb->msg_type, 33253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->data, 33263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->index, 33273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->metadata, 33283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCallbackCookie); 33293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 33303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("data callback not set!"); 33313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 33333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, 33343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus); 33353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 33383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DATA_TIMESTAMP_CALLBACK: 33393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 33403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(pme->mDataCbTimestamp) { 33413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataCbTimestamp(cb->timestamp, 33423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->msg_type, 33433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->data, 33443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->index, 33453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mCallbackCookie); 33463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 33473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Timestamp data callback not set!"); 33483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 33503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, 33513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus); 33523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 33553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case QCAMERA_DATA_SNAPSHOT_CALLBACK: 33563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 33573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (TRUE == isSnapshotActive && pme->mDataCb ) { 33583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!longShotEnabled) { 33593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotRcvd++; 33603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("Num Snapshots Received = %d Expected = %d", 33613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel numOfSnapshotRcvd, numOfSnapshotExpected); 33623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (numOfSnapshotExpected > 0 && 33633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (numOfSnapshotExpected == numOfSnapshotRcvd)) { 33643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("Received all snapshots"); 33653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // notify HWI that snapshot is done 33663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mParent->processSyncEvt(QCAMERA_SM_EVT_SNAPSHOT_DONE, 33673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NULL); 33683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pme->mJpegCb) { 33713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("Calling JPEG Callback!! for camera %d" 33723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel "release_data %p", 33733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel "frame_idx %d", 33743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mParent->getCameraId(), 33753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->user_data, 33763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->frame_index); 33773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mJpegCb(cb->msg_type, cb->data, 33783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->index, cb->metadata, 33793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mJpegCallbackCookie, 33803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->frame_index, cb->release_cb, 33813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->cookie, cb->user_data); 33823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // incase of non-null Jpeg cb we transfer 33833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // ownership of buffer to muxer. hence 33843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // release_cb should not be called 33853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // muxer will release after its done with 33863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // processing the buffer 33873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if(pme->mDataCb){ 33883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataCb(cb->msg_type, cb->data, cb->index, 33893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->metadata, pme->mCallbackCookie); 33903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 33913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, 33923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus); 33933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 33983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 33993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("invalid cb type %d", 34013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->cb_type); 34023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus = BAD_VALUE; 34033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 34043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, 34053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus); 34063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel }; 34103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 34113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("cb message type %d not enabled!", 34123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->msg_type); 34133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cbStatus = INVALID_OPERATION; 34143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (cb->release_cb) { 34153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cb->release_cb(cb->user_data, cb->cookie, cbStatus); 34163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete cb; 34193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 34203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("invalid cb type passed"); 34213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case CAMERA_CMD_TYPE_EXIT: 34253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel running = 0; 34273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pme->mDataQ.flush(); 34283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 34313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } while (running); 34343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("X"); 34353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 34373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 34383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 34403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : notifyCallback 34413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 34423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Enqueus pending callback notifications for the upper layers. 34433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 34443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 34453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @cbArgs : callback arguments 34463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 34473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 34483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 34493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 34503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 34513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraCbNotifier::notifyCallback(qcamera_callback_argm_t &cbArgs) 34523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 34533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mActive) { 34543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("notify thread is not active"); 34553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 34563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_callback_argm_t *cbArg = new qcamera_callback_argm_t(); 34593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == cbArg) { 34603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("no mem for qcamera_callback_argm_t"); 34613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_MEMORY; 34623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(cbArg, 0, sizeof(qcamera_callback_argm_t)); 34643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *cbArg = cbArgs; 34653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mDataQ.enqueue((void *)cbArg)) { 34673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return mProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 34683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 34693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error adding cb data into queue"); 34703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete cbArg; 34713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 34723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 34743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 34763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setCallbacks 34773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 34783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Initializes the callback functions, which would be used for 34793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * communication with the upper layers and launches the callback 34803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * context in which the callbacks will occur. 34813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 34823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 34833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @notifyCb : notification callback 34843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @dataCb : data callback 34853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @dataCbTimestamp : data with timestamp callback 34863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @callbackCookie : callback context data 34873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 34883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 34893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 34903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraCbNotifier::setCallbacks(camera_notify_callback notifyCb, 34913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_data_callback dataCb, 34923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_data_timestamp_callback dataCbTimestamp, 34933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *callbackCookie) 34943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 34953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ( NULL == mNotifyCb ) && 34963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( NULL == mDataCb ) && 34973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( NULL == mDataCbTimestamp ) && 34983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ( NULL == mCallbackCookie ) ) { 34993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mNotifyCb = notifyCb; 35003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDataCb = dataCb; 35013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDataCbTimestamp = dataCbTimestamp; 35023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCallbackCookie = callbackCookie; 35033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mActive = true; 35043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mProcTh.launch(cbNotifyRoutine, this); 35053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 35063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Camera callback notifier already initialized!"); 35073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 35093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 35113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setJpegCallBacks 35123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Initializes the JPEG callback function, which would be used for 35143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * communication with the upper layers and launches the callback 35153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * context in which the callbacks will occur. 35163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 35183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @jpegCb : notification callback 35193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @callbackCookie : callback context data 35203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 35223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 35233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraCbNotifier::setJpegCallBacks( 35243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_data_callback jpegCb, void *callbackCookie) 35253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 35263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("Setting JPEG Callback notifier"); 35273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mJpegCb = jpegCb; 35283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mJpegCallbackCookie = callbackCookie; 35293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 35303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 35323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : flushPreviewNotifications 35333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: flush all pending preview notifications 35353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * from the notifier queue 35363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 35383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 35403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 35413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 35423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 35433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraCbNotifier::flushPreviewNotifications() 35443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 35453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mActive) { 35463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("notify thread is not active"); 35473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 35483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDataQ.flushNodes(matchPreviewNotifications); 35503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 35513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 35523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 35543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : flushVideoNotifications 35553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: flush all pending video notifications 35573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * from the notifier queue 35583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 35603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 35623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 35633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 35643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 35653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraCbNotifier::flushVideoNotifications() 35663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 35673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mActive) { 35683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("notify thread is not active"); 35693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 35703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDataQ.flushNodes(matchTimestampNotifications); 35723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 35733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 35743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 35763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : startSnapshots 35773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Enables snapshot mode 35793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 35813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 35833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 35843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 35853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 35863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraCbNotifier::startSnapshots() 35873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 35883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return mProcTh.sendCmd(CAMERA_CMD_TYPE_START_DATA_PROC, FALSE, TRUE); 35893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 35903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 35923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : stopSnapshots 35933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Disables snapshot processing mode 35953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 35973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 35983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 35993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraCbNotifier::stopSnapshots() 36013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mProcTh.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC, FALSE, TRUE); 36033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; // namespace qcamera 3606