QCamera2HWICallbacks.cpp revision 66f9976540f830b0090ff2ca557b0364a53f2008
166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* Redistribution and use in source and binary forms, with or without 466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* modification, are permitted provided that the following conditions are 566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* met: 666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions of source code must retain the above copyright 766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* notice, this list of conditions and the following disclaimer. 866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions in binary form must reproduce the above 966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* copyright notice, this list of conditions and the following 1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* disclaimer in the documentation and/or other materials provided 1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* with the distribution. 1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Neither the name of The Linux Foundation nor the names of its 1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* contributors may be used to endorse or promote products derived 1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* from this software without specific prior written permission. 1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*/ 2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define LOG_TAG "QCamera2HWI" 3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies 3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <fcntl.h> 3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdio.h> 3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdlib.h> 3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define STAT_H <SYSTEM_HEADER_PREFIX/stat.h> 3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include STAT_H 3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/Errors.h> 3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// OpenMAX dependencies 4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QComOMXMetadata.h" 4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies 4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera2HWI.h" 4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraTrace.h" 4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" { 4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h" 4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera { 5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : zsl_channel_cb 5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle ZSL superbuf callback directly from 5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * mm-camera-interface 5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @recvd_frame : received super buffer 6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : recvd_frame will be released after this call by caller, so if 6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * async operation needed for recvd_frame, it's our responsibility 6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * to save a copy for this variable to be used later. 6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::zsl_channel_cb(mm_camera_super_buf_t *recvd_frame, 7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E"); 7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool dump_raw = false; 7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool dump_yuv = false; 7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool log_matching = false; 7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != recvd_frame->camera_handle){ 8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = pme->m_channels[QCAMERA_CH_TYPE_ZSL]; 8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL || 8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->getMyHandle() != recvd_frame->ch_id) { 8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("ZSL channel doesn't exist, return here"); 9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pme->mParameters.isSceneSelectionEnabled() && 9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !pme->m_stateMachine.isCaptureRunning()) { 9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->selectScene(pChannel, recvd_frame); 9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(recvd_frame); 9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Frame CB Unlock : %d, is AEC Locked: %d", 10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin recvd_frame->bUnlockAEC, pme->m_bLedAfAecLock); 10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(recvd_frame->bUnlockAEC && pme->m_bLedAfAecLock) { 10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *)malloc( 10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sizeof(qcamera_sm_internal_evt_payload_t)); 10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_RETRO_AEC_UNLOCK; 10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("processEvt for retro AEC unlock failed"); 11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for retro AEC event"); 11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Check if retro-active frames are completed and camera is 12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // ready to go ahead with LED estimation for regular frames 12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (recvd_frame->bReadyForPrepareSnapshot) { 12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Send an event 12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Ready for Prepare Snapshot, signal "); 12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *)malloc( 12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sizeof(qcamera_sm_internal_evt_payload_t)); 12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_READY_FOR_SNAPSHOT; 13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt Ready for Snaphot failed"); 13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for prepare signal event detect" 13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin " qcamera_sm_internal_evt_payload_t"); 14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* indicate the parent that capture is done */ 14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->captureDone(); 14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // save a copy for the superbuf 14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t* frame = 14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame == NULL) { 15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error allocating memory to save received_frame structure."); 15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(recvd_frame); 15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *frame = *recvd_frame; 15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (recvd_frame->num_bufs > 0) { 15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: superbuf frame_idx %d", 15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin recvd_frame->bufs[0]->frame_idx); 15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // DUMP RAW if available 16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.zsl_raw", value, "0"); 16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dump_raw = atoi(value) > 0 ? true : false; 16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (dump_raw) { 16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) { 16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (recvd_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_RAW) { 16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t * raw_frame = recvd_frame->bufs[i]; 16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = pChannel->getStreamByHandle(raw_frame->stream_id); 16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pStream) { 17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(pStream, raw_frame, QCAMERA_DUMP_FRM_RAW); 17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) { 17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (recvd_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_SNAPSHOT) { 17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t * yuv_frame = recvd_frame->bufs[i]; 18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = pChannel->getStreamByHandle(yuv_frame->stream_id); 18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pStream) { 18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(pStream, yuv_frame, QCAMERA_DUMP_FRM_INPUT_REPROCESS); 18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // 18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // whether need FD Metadata along with Snapshot frame in ZSL mode 18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pme->needFDMetadata(QCAMERA_CH_TYPE_ZSL)){ 19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Need Face Detection result for snapshot frames 19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Get the Meta Data frames 19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *pMetaFrame = NULL; 19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaFrame = frame->bufs[i]; //find the metadata 19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pMetaFrame != NULL){ 20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_buffer_t *pMetaData = (metadata_buffer_t *)pMetaFrame->buffer; 20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //send the face detection info 20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_faces_data_t faces_data; 20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->fillFacesData(faces_data, pMetaData); 20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //HARD CODE here before MCT can support 20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.detection_data.fd_type = QCAMERA_FD_SNAPSHOT; 21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT; 21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->faces_data = faces_data; 21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt face_detection_result failed"); 22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for face_detection_result qcamera_sm_internal_evt_payload_t"); 22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.dumpmetadata", value, "0"); 23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t enabled = atoi(value); 23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (enabled) { 23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *pMetaFrame = NULL; 23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaFrame = frame->bufs[i]; 23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pMetaFrame != NULL && 24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((metadata_buffer_t *)pMetaFrame->buffer)->is_tuning_params_valid) { 24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpMetadataToFile(pStream, pMetaFrame, (char *) "ZSL_Snapshot"); 24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.zsl_matching", value, "0"); 25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin log_matching = atoi(value) > 0 ? true : false; 25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (log_matching) { 25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("ZSL super buffer contains:"); 25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL ) { 25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Buffer with V4L index %d frame index %d of type %d Timestamp: %ld %ld ", 25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->bufs[i]->buf_idx, 25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->bufs[i]->frame_idx, 26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getMyType(), 26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->bufs[i]->ts.tv_sec, 26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->bufs[i]->ts.tv_nsec); 26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Wait on Postproc initialization if needed 26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != pme->waitDeferredWork(pme->mReprocJob)) { 26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Reprocess Deferred work failed"); 27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // send to postprocessor 27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != pme->m_postprocessor.processData(frame)) { 27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to trigger process data"); 27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(recvd_frame); 27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(frame); 27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame = NULL; 27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X"); 28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : selectScene 28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: send a preview callback when a specific selected scene is applied 28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pChannel: Camera channel 29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame : Bundled super buffer 29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::selectScene(QCameraChannel *pChannel, 29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *frame) 30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *pMetaFrame = NULL; 30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL == frame) || (NULL == pChannel)) { 30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid scene select input"); 30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_scene_mode_type selectedScene = mParameters.getSelectedScene(); 31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (CAM_SCENE_MODE_MAX == selectedScene) { 31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGL("No selected scene"); 31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaFrame = frame->bufs[i]; 32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pMetaFrame) { 32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No metadata buffer found in scene select super buffer"); 32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_INIT; 32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_buffer_t *pMetaData = (metadata_buffer_t *)pMetaFrame->buffer; 33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_scene_mode_type, scene, CAM_INTF_META_CURRENT_SCENE, pMetaData) { 33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((*scene == selectedScene) && 33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mDataCb != NULL) && 33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0)) { 33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *preview_frame = NULL; 33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW)) { 34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin preview_frame = frame->bufs[i]; 34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (preview_frame) { 34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraGrallocMemory *memory = (QCameraGrallocMemory *)preview_frame->mem_info; 34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t idx = preview_frame->buf_idx; 35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = sendPreviewCallback(pStream, memory, idx); 35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error triggering scene select preview callback"); 35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.setSelectedScene(CAM_SCENE_MODE_MAX); 35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No preview buffer found in scene select super buffer"); 35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_INIT; 35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No current scene metadata!"); 36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_INIT; 36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : capture_channel_cb_routine 37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle snapshot superbuf callback directly from 37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * mm-camera-interface 37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @recvd_frame : received super buffer 37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : recvd_frame will be released after this call by caller, so if 38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * async operation needed for recvd_frame, it's our responsibility 38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * to save a copy for this variable to be used later. 38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*==========================================================================*/ 38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::capture_channel_cb_routine(mm_camera_super_buf_t *recvd_frame, 38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_CALL(); 38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E PROFILE_YUV_CB_TO_HAL"); 39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool dump_yuv = false; 39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != recvd_frame->camera_handle){ 39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = pme->m_channels[QCAMERA_CH_TYPE_CAPTURE]; 40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL || 40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->getMyHandle() != recvd_frame->ch_id) { 40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Capture channel doesn't exist, return here"); 40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // save a copy for the superbuf 40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t* frame = 40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame == NULL) { 41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error allocating memory to save received_frame structure."); 41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(recvd_frame); 41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *frame = *recvd_frame; 41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (recvd_frame->num_bufs > 0) { 41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: superbuf frame_idx %d", 41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin recvd_frame->bufs[0]->frame_idx); 42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for ( uint32_t i= 0 ; i < recvd_frame->num_bufs ; i++ ) { 42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( recvd_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_SNAPSHOT ) { 42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t * yuv_frame = recvd_frame->bufs[i]; 42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = pChannel->getStreamByHandle(yuv_frame->stream_id); 42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL != pStream ) { 42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(pStream, yuv_frame, QCAMERA_DUMP_FRM_INPUT_REPROCESS); 42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.dumpmetadata", value, "0"); 43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t enabled = atoi(value); 43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (enabled) { 43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *pMetaFrame = NULL; 43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaFrame = frame->bufs[i]; //find the metadata 44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pMetaFrame != NULL && 44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((metadata_buffer_t *)pMetaFrame->buffer)->is_tuning_params_valid) { 44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpMetadataToFile(pStream, pMetaFrame, (char *) "Snapshot"); 44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Wait on Postproc initialization if needed 45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->waitDeferredWork(pme->mReprocJob); 45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // send to postprocessor 45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != pme->m_postprocessor.processData(frame)) { 45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to trigger process data"); 45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(recvd_frame); 46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(frame); 46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame = NULL; 46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* START of test register face image for face authentication */ 46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef QCOM_TEST_FACE_REGISTER_FACE 46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin static uint8_t bRunFaceReg = 1; 46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bRunFaceReg > 0) { 47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // find snapshot frame 47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *main_stream = NULL; 47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *main_frame = NULL; 47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < recvd_frame->num_bufs; i++) { 47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = 47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->getStreamByHandle(recvd_frame->bufs[i]->stream_id); 47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) { 47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream = pStream; 47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_frame = recvd_frame->bufs[i]; 48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (main_stream != NULL && main_frame != NULL) { 48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t faceId = -1; 48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_pp_offline_src_config_t config; 48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&config, 0, sizeof(cam_pp_offline_src_config_t)); 48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin config.num_of_bufs = 1; 48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream->getFormat(config.input_fmt); 49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream->getFrameDimension(config.input_dim); 49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream->getFrameOffset(config.input_buf_planes.plane_info); 49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("DEBUG: registerFaceImage E"); 49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->registerFaceImage(main_frame->buffer, &config, faceId); 49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("DEBUG: registerFaceImage X, ret=%d, faceId=%d", rc, faceId); 49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bRunFaceReg = 0; 49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* END of test register face image for face authentication */ 50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X"); 50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef TARGET_TS_MAKEUP 50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::TsMakeupProcess_Preview(mm_camera_buf_def_t *pFrame, 50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream * pStream) { 50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("begin"); 50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool bRet = false; 50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream == NULL || pFrame == NULL) { 51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bRet = false; 51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("pStream == NULL || pFrame == NULL"); 51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bRet = TsMakeupProcess(pFrame, pStream, mFaceRect); 51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("end bRet = %d ",bRet); 51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return bRet; 51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::TsMakeupProcess_Snapshot(mm_camera_buf_def_t *pFrame, 52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream * pStream) { 52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("begin"); 52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool bRet = false; 52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream == NULL || pFrame == NULL) { 52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bRet = false; 52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("pStream == NULL || pFrame == NULL"); 52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_frame_len_offset_t offset; 52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&offset, 0, sizeof(cam_frame_len_offset_t)); 52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameOffset(offset); 53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t dim; 53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameDimension(dim); 53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unsigned char *yBuf = (unsigned char*)pFrame->buffer; 53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unsigned char *uvBuf = yBuf + offset.mp[0].len; 53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin TSMakeupDataEx inMakeupData; 53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.frameWidth = dim.width; 53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.frameHeight = dim.height; 53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.yBuf = yBuf; 54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.uvBuf = uvBuf; 54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.yStride = offset.mp[0].stride; 54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.uvStride = offset.mp[1].stride; 54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("detect begin"); 54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin TSHandle fd_handle = ts_detectface_create_context(); 54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (fd_handle != NULL) { 54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_format_t fmt; 54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFormat(fmt); 54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int iret = ts_detectface_detectEx(fd_handle, &inMakeupData); 54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("ts_detectface_detect iret = %d",iret); 55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (iret <= 0) { 55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bRet = false; 55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin TSRect faceRect; 55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&faceRect,-1,sizeof(TSRect)); 55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin iret = ts_detectface_get_face_info(fd_handle, 0, &faceRect, NULL,NULL,NULL); 55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("ts_detectface_get_face_info iret=%d,faceRect.left=%ld," 55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "faceRect.top=%ld,faceRect.right=%ld,faceRect.bottom=%ld" 55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ,iret,faceRect.left,faceRect.top,faceRect.right,faceRect.bottom); 55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bRet = TsMakeupProcess(pFrame,pStream,faceRect); 56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ts_detectface_destroy_context(&fd_handle); 56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fd_handle = NULL; 56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("fd_handle == NULL"); 56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("detect end"); 56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("end bRet = %d ",bRet); 56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return bRet; 57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2HardwareInterface::TsMakeupProcess(mm_camera_buf_def_t *pFrame, 57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream * pStream,TSRect& faceRect) { 57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool bRet = false; 57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("begin"); 57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream == NULL || pFrame == NULL) { 57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("pStream == NULL || pFrame == NULL "); 57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int whiteLevel, cleanLevel; 58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool enableMakeup = (faceRect.left > -1) && 58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mParameters.getTsMakeupInfo(whiteLevel, cleanLevel)); 58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (enableMakeup) { 58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t dim; 58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_frame_len_offset_t offset; 58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameDimension(dim); 58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameOffset(offset); 58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unsigned char *tempOriBuf = NULL; 59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin tempOriBuf = (unsigned char*)pFrame->buffer; 59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unsigned char *yBuf = tempOriBuf; 59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unsigned char *uvBuf = tempOriBuf + offset.mp[0].len; 59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin unsigned char *tmpBuf = new unsigned char[offset.frame_len]; 59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (tmpBuf == NULL) { 59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("tmpBuf == NULL "); 59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin TSMakeupDataEx inMakeupData, outMakeupData; 60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin whiteLevel = whiteLevel <= 0 ? 0 : (whiteLevel >= 100 ? 100 : whiteLevel); 60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cleanLevel = cleanLevel <= 0 ? 0 : (cleanLevel >= 100 ? 100 : cleanLevel); 60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.frameWidth = dim.width; // NV21 Frame width > 0 60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.frameHeight = dim.height; // NV21 Frame height > 0 60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.yBuf = yBuf; // Y buffer pointer 60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.uvBuf = uvBuf; // VU buffer pointer 60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.yStride = offset.mp[0].stride; 60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin inMakeupData.uvStride = offset.mp[1].stride; 60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin outMakeupData.frameWidth = dim.width; // NV21 Frame width > 0 60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin outMakeupData.frameHeight = dim.height; // NV21 Frame height > 0 61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin outMakeupData.yBuf = tmpBuf; // Y buffer pointer 61166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin outMakeupData.uvBuf = tmpBuf + offset.mp[0].len; // VU buffer pointer 61266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin outMakeupData.yStride = offset.mp[0].stride; 61366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin outMakeupData.uvStride = offset.mp[1].stride; 61466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("faceRect:left 2:%ld,,right:%ld,,top:%ld,,bottom:%ld,,Level:%dx%d", 61566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faceRect.left,faceRect.right,faceRect.top,faceRect.bottom,cleanLevel,whiteLevel); 61666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ts_makeup_skin_beautyEx(&inMakeupData, &outMakeupData, &(faceRect),cleanLevel,whiteLevel); 61766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy((unsigned char*)pFrame->buffer, tmpBuf, offset.frame_len); 61866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *memory = (QCameraMemory *)pFrame->mem_info; 61966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memory->cleanCache(pFrame->buf_idx); 62066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (tmpBuf != NULL) { 62166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete[] tmpBuf; 62266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin tmpBuf = NULL; 62366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 62466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 62566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("end bRet = %d ",bRet); 62666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return bRet; 62766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 62866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 62966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 63066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : postproc_channel_cb_routine 63166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 63266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle postprocess superbuf callback directly from 63366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * mm-camera-interface 63466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 63566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 63666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @recvd_frame : received super buffer 63766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 63866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 63966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 64066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 64166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : recvd_frame will be released after this call by caller, so if 64266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * async operation needed for recvd_frame, it's our responsibility 64366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * to save a copy for this variable to be used later. 64466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*==========================================================================*/ 64566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::postproc_channel_cb_routine(mm_camera_super_buf_t *recvd_frame, 64666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 64766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 64866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 64966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E"); 65066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 65166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 65266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 65366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != recvd_frame->camera_handle){ 65466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 65566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 65666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 65766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 65866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // save a copy for the superbuf 65966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t* frame = 66066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 66166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame == NULL) { 66266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error allocating memory to save received_frame structure."); 66366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 66466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 66566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *frame = *recvd_frame; 66666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 66766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (recvd_frame->num_bufs > 0) { 66866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: frame_idx %d", recvd_frame->bufs[0]->frame_idx); 66966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 67066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Wait on JPEG create session 67166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->waitDeferredWork(pme->mJpegJob); 67266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 67366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // send to postprocessor 67466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_postprocessor.processPPData(frame); 67566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 67666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_INT("Camera:Reprocess", 0); 67766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X"); 67866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 67966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 68066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 68166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : synchronous_stream_cb_routine 68266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 68366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to handle STREAM SYNC CALLBACKS 68466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 68566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 68666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 68766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 68866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 68966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 69066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 69166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 69266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : This Function is excecuted in mm-interface context. 69366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Avoid adding latency on this thread. 69466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 69566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::synchronous_stream_cb_routine( 69666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *super_frame, QCameraStream * stream, 69766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 69866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 69966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nsecs_t frameTime = 0, mPreviewTimestamp = 0; 70066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int err = NO_ERROR; 70166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 70266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 70366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : BEGIN"); 70466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 70566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraGrallocMemory *memory = NULL; 70666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 70766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL) { 70866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid hardware object"); 70966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 71066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 71166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_frame == NULL) { 71266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid super buffer"); 71366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 71466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 71566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame = super_frame->bufs[0]; 71666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == frame) { 71766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Frame is NULL"); 71866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 71966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 72066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 72166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream->getMyType() != CAM_STREAM_TYPE_PREVIEW) { 72266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("This is only for PREVIEW stream for now"); 72366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 72466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 72566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 72666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pme->m_bPreviewStarted) { 72766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf] : PROFILE_FIRST_PREVIEW_FRAME"); 72866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_bPreviewStarted = false; 72966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 73066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 73166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pme->needProcessPreviewFrame()) { 73266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&pme->mGrallocLock); 73366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Increment the counter here to make sure, 73466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // these many frames will be skipped in preview channel cb as well 73566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mIgnoredPreviewCount++; 73666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&pme->mGrallocLock); 73766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("preview is not running, no need to process"); 73866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 73966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 74066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 74166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frameTime = nsecs_t(frame->ts.tv_sec) * 1000000000LL + frame->ts.tv_nsec; 74266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Calculate the future presentation time stamp for displaying frames at regular interval 74366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPreviewTimestamp = pme->mCameraDisplay.computePresentationTimeStamp(frameTime); 74466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mStreamTimestamp = frameTime; 74566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memory = (QCameraGrallocMemory *)super_frame->bufs[0]->mem_info; 74666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 74766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef TARGET_TS_MAKEUP 74866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->TsMakeupProcess_Preview(frame,stream); 74966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 75066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 75166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Enqueue buffer to gralloc. 75266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t idx = frame->buf_idx; 75366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("%p Enqueue Buffer to display %d frame Time = %lld Display Time = %lld", 75466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme, idx, frameTime, mPreviewTimestamp); 75566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin err = memory->enqueueBuffer(idx, mPreviewTimestamp); 75666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 75766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (err == NO_ERROR) { 75866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&pme->mGrallocLock); 75966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mEnqueuedBuffers++; 76066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&pme->mGrallocLock); 76166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 76266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Enqueue Buffer failed"); 76366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 76466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 76566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : END"); 76666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 76766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 76866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 76966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 77066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : preview_stream_cb_routine 77166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 77266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle preview frame from preview stream in 77366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * normal case with display. 77466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 77566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 77666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 77766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 77866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 77966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 78166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : caller passes the ownership of super_frame, it's our 78366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * responsibility to free super_frame once it's done. The new 78466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * preview frame will be sent to display, and an older frame 78566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * will be dequeued from display and needs to be returned back 78666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * to kernel for future use. 78766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 78866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::preview_stream_cb_routine(mm_camera_super_buf_t *super_frame, 78966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream * stream, 79066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 79166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 79266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_CALL(); 79366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : BEGIN"); 79466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int err = NO_ERROR; 79566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 79666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraGrallocMemory *memory = (QCameraGrallocMemory *)super_frame->bufs[0]->mem_info; 79766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t dequeueCnt = 0; 79866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 79966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL) { 80066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid hardware object"); 80166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 80266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 80366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 80466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (memory == NULL) { 80566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid memory object"); 80666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 80766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 80866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 80966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 81066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame = super_frame->bufs[0]; 81166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == frame) { 81266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("preview frame is NLUL"); 81366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 81466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 81566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 81666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&pme->mGrallocLock); 81766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pme->needProcessPreviewFrame() || 81866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mIgnoredPreviewCount > 0) { 81966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mIgnoredPreviewCount > 0) { 82066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mIgnoredPreviewCount--; 82166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 82266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&pme->mGrallocLock); 82366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("preview is not running, no need to process"); 82466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 82566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 82666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 82766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 82866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&pme->mGrallocLock); 82966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 83066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 83166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->needDebugFps()) { 83266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->debugShowPreviewFPS(); 83366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 83466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 83566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t idx = frame->buf_idx; 83666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 83766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_PREVIEW); 83866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 83966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pme->m_bPreviewStarted) { 84066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf] : PROFILE_FIRST_PREVIEW_FRAME"); 84166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_bPreviewStarted = false ; 84266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 84366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 84466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!stream->isSyncCBEnabled()) { 84566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Enqueue Buffer to display %d", idx); 84666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef TARGET_TS_MAKEUP 84766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->TsMakeupProcess_Preview(frame,stream); 84866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 84966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin err = memory->enqueueBuffer(idx); 85066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 85166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (err == NO_ERROR) { 85266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&pme->mGrallocLock); 85366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mEnqueuedBuffers++; 85466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dequeueCnt = pme->mEnqueuedBuffers; 85566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&pme->mGrallocLock); 85666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 85766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Enqueue Buffer failed"); 85866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 85966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 86066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&pme->mGrallocLock); 86166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dequeueCnt = pme->mEnqueuedBuffers; 86266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&pme->mGrallocLock); 86366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 86466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 86566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Display the buffer. 86666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("%p displayBuffer %d E", pme, idx); 86766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t numMapped = memory->getMappable(); 86866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 86966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint8_t i = 0; i < dequeueCnt; i++) { 87066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int dequeuedIdx = memory->dequeueBuffer(); 87166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (dequeuedIdx < 0 || dequeuedIdx >= memory->getCnt()) { 87266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid dequeued buffer index %d from display", 87366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dequeuedIdx); 87466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 87566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 87666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&pme->mGrallocLock); 87766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mEnqueuedBuffers--; 87866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&pme->mGrallocLock); 87966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (dequeuedIdx >= numMapped) { 88066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // This buffer has not yet been mapped to the backend 88166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin err = stream->mapNewBuffer((uint32_t)dequeuedIdx); 88266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (memory->checkIfAllBuffersMapped()) { 88366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // check if mapping is done for all the buffers 88466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Signal the condition for create jpeg session 88566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock l(pme->mMapLock); 88666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mMapCond.signal(); 88766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Mapping done for all bufs"); 88866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 88966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("All buffers are not yet mapped"); 89066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 89166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 89266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 89366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 89466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (err < 0) { 89566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("buffer mapping failed %d", err); 89666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 89766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Return dequeued buffer back to driver 89866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin err = stream->bufDone((uint32_t)dequeuedIdx); 89966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( err < 0) { 90066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("stream bufDone failed %d", err); 90166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 90266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 90366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 90466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 90566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Handle preview data callback 90666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->m_channels[QCAMERA_CH_TYPE_CALLBACK] == NULL) { 90766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->needSendPreviewCallback() && 90866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (!pme->mParameters.isSceneSelectionEnabled())) { 90966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->sendPreviewCallback(stream, memory, idx); 91066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 91166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Preview callback was not sent succesfully"); 91266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 91366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 91466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 91566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 91666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 91766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : END"); 91866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 91966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 92066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 92166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 92266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : sendPreviewCallback 92366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 92466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function for triggering preview callbacks 92566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 92666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 92766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 92866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @memory : Stream memory allocator 92966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @idx : buffer index 93066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 93166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 93266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 93366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 93466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 93566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::sendPreviewCallback(QCameraStream *stream, 93666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *memory, uint32_t idx) 93766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 93866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *previewMem = NULL; 93966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *data = NULL; 94066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *dataToApp = NULL; 94166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t previewBufSize = 0; 94266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t previewBufSizeFromCallback = 0; 94366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t preview_dim; 94466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_format_t previewFmt; 94566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 94666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t yStride = 0; 94766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t yScanline = 0; 94866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t uvStride = 0; 94966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t uvScanline = 0; 95066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t uStride = 0; 95166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t uScanline = 0; 95266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t vStride = 0; 95366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t vScanline = 0; 95466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t yStrideToApp = 0; 95566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t uvStrideToApp = 0; 95666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t yScanlineToApp = 0; 95766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t uvScanlineToApp = 0; 95866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t srcOffset = 0; 95966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t dstOffset = 0; 96066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t srcBaseOffset = 0; 96166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t dstBaseOffset = 0; 96266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int i; 96366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 96466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL == stream) || (NULL == memory)) { 96566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid preview callback input"); 96666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 96766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 96866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 96966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_info_t *streamInfo = 97066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<cam_stream_info_t *>(stream->getStreamInfoBuf()->getPtr(0)); 97166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == streamInfo) { 97266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid streamInfo"); 97366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 97466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 97566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 97666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->getFrameDimension(preview_dim); 97766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->getFormat(previewFmt); 97866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 97966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* The preview buffer size in the callback should be 98066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * (width*height*bytes_per_pixel). As all preview formats we support, 98166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * use 12 bits per pixel, buffer size = previewWidth * previewHeight * 3/2. 98266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * We need to put a check if some other formats are supported in future. */ 98366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((previewFmt == CAM_FORMAT_YUV_420_NV21) || 98466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (previewFmt == CAM_FORMAT_YUV_420_NV12) || 98566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (previewFmt == CAM_FORMAT_YUV_420_YV12) || 98666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (previewFmt == CAM_FORMAT_YUV_420_NV12_VENUS) || 98766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (previewFmt == CAM_FORMAT_YUV_420_NV21_VENUS) || 98866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (previewFmt == CAM_FORMAT_YUV_420_NV21_ADRENO)) { 98966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(previewFmt == CAM_FORMAT_YUV_420_YV12) { 99066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin yStride = streamInfo->buf_planes.plane_info.mp[0].stride; 99166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin yScanline = streamInfo->buf_planes.plane_info.mp[0].scanline; 99266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uStride = streamInfo->buf_planes.plane_info.mp[1].stride; 99366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uScanline = streamInfo->buf_planes.plane_info.mp[1].scanline; 99466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin vStride = streamInfo->buf_planes.plane_info.mp[2].stride; 99566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin vScanline = streamInfo->buf_planes.plane_info.mp[2].scanline; 99666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 99766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin previewBufSize = (size_t) 99866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (yStride * yScanline + uStride * uScanline + vStride * vScanline); 99966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin previewBufSizeFromCallback = previewBufSize; 100066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 100166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin yStride = streamInfo->buf_planes.plane_info.mp[0].stride; 100266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin yScanline = streamInfo->buf_planes.plane_info.mp[0].scanline; 100366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uvStride = streamInfo->buf_planes.plane_info.mp[1].stride; 100466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uvScanline = streamInfo->buf_planes.plane_info.mp[1].scanline; 100566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 100666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin yStrideToApp = preview_dim.width; 100766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin yScanlineToApp = preview_dim.height; 100866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uvStrideToApp = yStrideToApp; 100966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uvScanlineToApp = yScanlineToApp / 2; 101066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 101166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin previewBufSize = (size_t) 101266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((yStrideToApp * yScanlineToApp) + (uvStrideToApp * uvScanlineToApp)); 101366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 101466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin previewBufSizeFromCallback = (size_t) 101566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((yStride * yScanline) + (uvStride * uvScanline)); 101666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 101766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(previewBufSize == previewBufSizeFromCallback) { 101866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin previewMem = mGetMemory(memory->getFd(idx), 101966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin previewBufSize, 1, mCallbackCookie); 102066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!previewMem || !previewMem->data) { 102166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("mGetMemory failed.\n"); 102266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 102366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 102466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = previewMem; 102566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 102666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 102766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = memory->getMemory(idx, false); 102866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dataToApp = mGetMemory(-1, previewBufSize, 1, mCallbackCookie); 102966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!dataToApp || !dataToApp->data) { 103066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("mGetMemory failed.\n"); 103166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 103266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 103366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 103466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < preview_dim.height; i++) { 103566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin srcOffset = i * yStride; 103666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dstOffset = i * yStrideToApp; 103766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 103866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy((unsigned char *) dataToApp->data + dstOffset, 103966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (unsigned char *) data->data + srcOffset, 104066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (size_t)yStrideToApp); 104166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 104266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 104366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin srcBaseOffset = yStride * yScanline; 104466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dstBaseOffset = yStrideToApp * yScanlineToApp; 104566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 104666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < preview_dim.height/2; i++) { 104766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin srcOffset = i * uvStride + srcBaseOffset; 104866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dstOffset = i * uvStrideToApp + dstBaseOffset; 104966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 105066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy((unsigned char *) dataToApp->data + dstOffset, 105166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (unsigned char *) data->data + srcOffset, 105266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (size_t)yStrideToApp); 105366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 105466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 105566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 105666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid preview format for preview callback"); 105766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 105866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 105966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 106066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 106166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_CALLBACK; 106266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 106366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (previewBufSize != 0 && previewBufSizeFromCallback != 0 && 106466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin previewBufSize == previewBufSizeFromCallback) { 106566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = data; 106666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 106766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = dataToApp; 106866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 106966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( previewMem ) { 107066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = previewMem; 107166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = releaseCameraMemory; 107266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (dataToApp) { 107366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = dataToApp; 107466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = releaseCameraMemory; 107566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 107666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cookie = this; 107766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_cbNotifier.notifyCallback(cbArg); 107866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 107966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("fail sending notification"); 108066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (previewMem) { 108166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin previewMem->release(previewMem); 108266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (dataToApp) { 108366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dataToApp->release(dataToApp); 108466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 108566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 108666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 108766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 108866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 108966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 109066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 109166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : nodisplay_preview_stream_cb_routine 109266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 109366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle preview frame from preview stream in 109466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * no-display case 109566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 109666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 109766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 109866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 109966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 110066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 110166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 110266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 110366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : caller passes the ownership of super_frame, it's our 110466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * responsibility to free super_frame once it's done. 110566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 110666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::nodisplay_preview_stream_cb_routine( 110766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *super_frame, 110866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *stream, 110966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * userdata) 111066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 111166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 111266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] E"); 111366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 111466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 111566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 111666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 111766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 111866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply free super frame 111966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 112066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 112166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 112266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame = super_frame->bufs[0]; 112366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == frame) { 112466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("preview frame is NULL"); 112566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 112666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 112766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 112866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 112966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pme->needProcessPreviewFrame()) { 113066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("preview is not running, no need to process"); 113166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 113266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 113366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 113466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 113566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 113666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->needDebugFps()) { 113766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->debugShowPreviewFPS(); 113866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 113966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 114066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *previewMemObj = (QCameraMemory *)frame->mem_info; 114166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *preview_mem = NULL; 114266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (previewMemObj != NULL) { 114366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin preview_mem = previewMemObj->getMemory(frame->buf_idx, false); 114466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 114566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != previewMemObj && NULL != preview_mem) { 114666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_PREVIEW); 114766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 114866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pme->needProcessPreviewFrame()) && 114966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->needSendPreviewCallback() && 115066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (pme->getRelatedCamSyncInfo()->mode != CAM_MODE_SECONDARY)) { 115166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 115266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 115366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_CALLBACK; 115466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 115566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = preview_mem; 115666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = (void *) &frame->buf_idx; 115766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cookie = stream; 115866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = returnStreamBuffer; 115966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->m_cbNotifier.notifyCallback(cbArg); 116066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 116166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE ("fail sending data notify"); 116266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 116366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 116466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 116566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 116666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 116766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 116866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 116966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] X"); 117066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 117166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 117266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 117366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : rdi_mode_stream_cb_routine 117466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 117566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle RDI frame from preview stream in 117666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * rdi mode case 117766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 117866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 117966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 118066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 118166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 118266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 118366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 118466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 118566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : caller passes the ownership of super_frame, it's our 118666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * responsibility to free super_frame once it's done. 118766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 118866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::rdi_mode_stream_cb_routine( 118966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *super_frame, 119066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *stream, 119166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * userdata) 119266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 119366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 119466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("RDI_DEBUG Enter"); 119566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 119666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 119766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 119866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 119966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 120066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 120166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 120266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 120366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame = super_frame->bufs[0]; 120466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == frame) { 120566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("preview frame is NLUL"); 120666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 120766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 120866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pme->needProcessPreviewFrame()) { 120966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("preview is not running, no need to process"); 121066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 121166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 121266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 121366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->needDebugFps()) { 121466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->debugShowPreviewFPS(); 121566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 121666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Non-secure Mode 121766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pme->isSecureMode()) { 121866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *previewMemObj = (QCameraMemory *)frame->mem_info; 121966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == previewMemObj) { 122066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("previewMemObj is NULL"); 122166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 122266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 122366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 122466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 122566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *preview_mem = previewMemObj->getMemory(frame->buf_idx, false); 122666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != preview_mem) { 122766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin previewMemObj->cleanCache(frame->buf_idx); 122866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Dump RAW frame 122966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_RAW); 123066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Notify Preview callback frame 123166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->needProcessPreviewFrame() && 123266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mDataCb != NULL && 123366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0) { 123466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 123566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 123666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_CALLBACK; 123766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 123866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = preview_mem; 123966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = (void *) &frame->buf_idx; 124066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cookie = stream; 124166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = returnStreamBuffer; 124266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_cbNotifier.notifyCallback(cbArg); 124366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 124466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("preview_mem is NULL"); 124566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 124666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 124766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 124866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else { 124966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("preview_mem is NULL"); 125066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 125166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 125266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 125366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Secure Mode 125466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // We will do QCAMERA_NOTIFY_CALLBACK and share FD in case of secure mode 125566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *previewMemObj = (QCameraMemory *)frame->mem_info; 125666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == previewMemObj) { 125766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("previewMemObj is NULL"); 125866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 125966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 126066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 126166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 126266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int fd = previewMemObj->getFd(frame->buf_idx); 126366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Preview frame fd =%d for index = %d ", fd, frame->buf_idx); 126466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->needProcessPreviewFrame() && 126566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mDataCb != NULL && 126666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0) { 126766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Prepare Callback structure 126866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 126966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 127066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 127166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_PREVIEW_FRAME; 127266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifndef VANILLA_HAL 127366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.ext1 = CAMERA_FRAME_DATA_FD; 127466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.ext2 = fd; 127566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 127666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = (void *) &frame->buf_idx; 127766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cookie = stream; 127866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = returnStreamBuffer; 127966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_cbNotifier.notifyCallback(cbArg); 128066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 128166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("No need to process preview frame, return buffer"); 128266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 128366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 128466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 128566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinend: 128666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 128766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("RDI_DEBUG Exit"); 128866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 128966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 129066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 129166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 129266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : postview_stream_cb_routine 129366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 129466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle post frame from postview stream 129566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 129666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 129766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 129866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 129966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 130066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 130166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 130266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 130366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : caller passes the ownership of super_frame, it's our 130466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * responsibility to free super_frame once it's done. 130566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 130666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::postview_stream_cb_routine(mm_camera_super_buf_t *super_frame, 130766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *stream, 130866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 130966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 131066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 131166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int err = NO_ERROR; 131266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 131366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraGrallocMemory *memory = (QCameraGrallocMemory *)super_frame->bufs[0]->mem_info; 131466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 131566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL) { 131666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid hardware object"); 131766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 131866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 131966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 132066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (memory == NULL) { 132166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid memory object"); 132266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 132366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 132466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 132566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 132666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : BEGIN"); 132766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 132866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame = super_frame->bufs[0]; 132966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == frame) { 133066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("preview frame is NULL"); 133166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 133266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 133366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 133466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 133566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *memObj = (QCameraMemory *)frame->mem_info; 133666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != memObj) { 133766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_THUMBNAIL); 133866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 133966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 134066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Return buffer back to driver 134166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin err = stream->bufDone(frame->buf_idx); 134266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( err < 0) { 134366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("stream bufDone failed %d", err); 134466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 134566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 134666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 134766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : END"); 134866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 134966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 135066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 135166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 135266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : video_stream_cb_routine 135366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 135466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle video frame from video stream 135566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 135666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 135766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 135866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 135966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 136066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 136166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 136266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 136366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : caller passes the ownership of super_frame, it's our 136466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * responsibility to free super_frame once it's done. video 136566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * frame will be sent to video encoder. Once video encoder is 136666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * done with the video frame, it will call another API 136766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * (release_recording_frame) to return the frame back 136866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 136966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::video_stream_cb_routine(mm_camera_super_buf_t *super_frame, 137066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *stream, 137166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 137266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 137366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 137466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *videoMemObj = NULL; 137566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *video_mem = NULL; 137666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nsecs_t timeStamp = 0; 137766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool triggerTCB = FALSE; 137866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 137966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : BEGIN"); 138066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 138166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 138266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 138366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 138466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 138566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply free super frame 138666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 138766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 138866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 138966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 139066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame = super_frame->bufs[0]; 139166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 139266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->needDebugFps()) { 139366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->debugShowVideoFPS(); 139466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 139566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pme->m_bRecordStarted) { 139666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf] : PROFILE_FIRST_RECORD_FRAME"); 139766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_bRecordStarted = false ; 139866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 139966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Stream(%d), Timestamp: %ld %ld", 140066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->stream_id, 140166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->ts.tv_sec, 140266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->ts.tv_nsec); 140366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 140466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame->buf_type == CAM_STREAM_BUF_TYPE_MPLANE) { 140566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mParameters.getVideoBatchSize() == 0) { 140666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin timeStamp = nsecs_t(frame->ts.tv_sec) * 1000000000LL 140766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + frame->ts.tv_nsec; 140866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Video frame to encoder TimeStamp : %lld batch = 0", 140966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin timeStamp); 141066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_VIDEO); 141166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin videoMemObj = (QCameraMemory *)frame->mem_info; 141266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin video_mem = NULL; 141366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != videoMemObj) { 141466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin video_mem = videoMemObj->getMemory(frame->buf_idx, 141566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (pme->mStoreMetaDataInFrame > 0)? true : false); 141666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin triggerTCB = TRUE; 141766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 141866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 141966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Handle video batch callback 142066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin native_handle_t *nh = NULL; 142166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(stream, frame, QCAMERA_DUMP_FRM_VIDEO); 142266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraVideoMemory *videoMemObj = (QCameraVideoMemory *)frame->mem_info; 142366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((stream->mCurMetaMemory == NULL) 142466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (stream->mCurBufIndex == -1)) { 142566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //get Free metadata available 142666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < CAMERA_MIN_VIDEO_BATCH_BUFFERS; i++) { 142766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream->mStreamMetaMemory[i].consumerOwned == 0) { 142866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mCurMetaMemory = videoMemObj->getMemory(i,true); 142966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mCurBufIndex = 0; 143066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mCurMetaIndex = i; 143166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mStreamMetaMemory[i].numBuffers = 0; 143266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 143366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 143466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 143566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 143666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin video_mem = stream->mCurMetaMemory; 143766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (video_mem == NULL) { 143866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No Free metadata. Drop this frame"); 143966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mCurBufIndex = -1; 144066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 144166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 144266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 144366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 144466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 144566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct encoder_media_buffer_type * packet = 144666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (struct encoder_media_buffer_type *)video_mem->data; 144766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh = const_cast<native_handle_t *>(packet->meta_handle); 144866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int index = stream->mCurBufIndex; 144966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int fd_cnt = pme->mParameters.getVideoBatchSize(); 145066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nsecs_t frame_ts = nsecs_t(frame->ts.tv_sec) * 1000000000LL 145166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + frame->ts.tv_nsec; 145266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (index == 0) { 145366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mFirstTimeStamp = frame_ts; 145466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 145666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mStreamMetaMemory[stream->mCurMetaIndex].buf_index[index] 145766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin = (uint8_t)frame->buf_idx; 145866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mStreamMetaMemory[stream->mCurMetaIndex].numBuffers++; 145966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mStreamMetaMemory[stream->mCurMetaIndex].consumerOwned 146066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin = TRUE; 146166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* 146266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * data[0] => FD 146366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * data[mNumFDs + 1] => OFFSET 146466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * data[mNumFDs + 2] => SIZE 146566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * data[mNumFDs + 3] => Usage Flag (Color format/Compression) 146666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * data[mNumFDs + 4] => TIMESTAMP 146766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * data[mNumFDs + 5] => FORMAT 146866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */ 146966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[index] = videoMemObj->getFd(frame->buf_idx); 147066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[index + fd_cnt] = 0; 147166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[index + (fd_cnt * 2)] = (int)videoMemObj->getSize(frame->buf_idx); 147266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[index + (fd_cnt * 3)] = videoMemObj->getUsage(); 147366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[index + (fd_cnt * 4)] = (int)(frame_ts - stream->mFirstTimeStamp); 147466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[index + (fd_cnt * 5)] = videoMemObj->getFormat(); 147566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mCurBufIndex++; 147666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream->mCurBufIndex == fd_cnt) { 147766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin timeStamp = stream->mFirstTimeStamp; 147866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Video frame to encoder TimeStamp : %lld batch = %d", 147966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin timeStamp, fd_cnt); 148066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mCurBufIndex = -1; 148166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mCurMetaIndex = -1; 148266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mCurMetaMemory = NULL; 148366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin triggerTCB = TRUE; 148466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 148566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 148666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 148766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin videoMemObj = (QCameraMemory *)frame->mem_info; 148866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin video_mem = NULL; 148966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin native_handle_t *nh = NULL; 149066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int fd_cnt = frame->user_buf.bufs_used; 149166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != videoMemObj) { 149266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin video_mem = videoMemObj->getMemory(frame->buf_idx, true); 149366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (video_mem != NULL) { 149466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct encoder_media_buffer_type * packet = 149566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (struct encoder_media_buffer_type *)video_mem->data; 149666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh = const_cast<native_handle_t *>(packet->meta_handle); 149766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 149866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("video_mem NULL"); 149966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 150066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 150166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("videoMemObj NULL"); 150266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 150366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 150466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (nh != NULL) { 150566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin timeStamp = nsecs_t(frame->ts.tv_sec) * 1000000000LL 150666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + frame->ts.tv_nsec; 150766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Batch buffer TimeStamp : %lld FD = %d index = %d fd_cnt = %d", 150866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin timeStamp, frame->fd, frame->buf_idx, fd_cnt); 150966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 151066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < fd_cnt; i++) { 151166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame->user_buf.buf_idx[i] >= 0) { 151266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *plane_frame = 151366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &frame->user_buf.plane_buf[frame->user_buf.buf_idx[i]]; 151466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraVideoMemory *frameobj = 151566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (QCameraVideoMemory *)plane_frame->mem_info; 151666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int usage = frameobj->getUsage(); 151766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nsecs_t frame_ts = nsecs_t(plane_frame->ts.tv_sec) * 1000000000LL 151866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin + plane_frame->ts.tv_nsec; 151966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* 152066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data[0] => FD 152166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data[mNumFDs + 1] => OFFSET 152266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data[mNumFDs + 2] => SIZE 152366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data[mNumFDs + 3] => Usage Flag (Color format/Compression) 152466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data[mNumFDs + 4] => TIMESTAMP 152566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data[mNumFDs + 5] => FORMAT 152666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */ 152766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[i] = frameobj->getFd(plane_frame->buf_idx); 152866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[fd_cnt + i] = 0; 152966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[(2 * fd_cnt) + i] = (int)frameobj->getSize(plane_frame->buf_idx); 153066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[(3 * fd_cnt) + i] = usage; 153166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[(4 * fd_cnt) + i] = (int)(frame_ts - timeStamp); 153266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nh->data[(5 * fd_cnt) + i] = frameobj->getFormat(); 153366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Send Video frames to services/encoder delta : %lld FD = %d index = %d", 153466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (frame_ts - timeStamp), plane_frame->fd, plane_frame->buf_idx); 153566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(stream, plane_frame, QCAMERA_DUMP_FRM_VIDEO); 153666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 153766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 153866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin triggerTCB = TRUE; 153966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 154066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No Video Meta Available. Return Buffer"); 154166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(super_frame->bufs[0]->buf_idx); 154266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 154366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 154466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 154566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != video_mem) && (triggerTCB == TRUE)) { 154666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pme->mDataCbTimestamp != NULL) && 154766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->msgTypeEnabledWithLock(CAMERA_MSG_VIDEO_FRAME) > 0) { 154866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 154966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 155066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_TIMESTAMP_CALLBACK; 155166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_VIDEO_FRAME; 155266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = video_mem; 155366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.timestamp = timeStamp; 155466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->m_cbNotifier.notifyCallback(cbArg); 155566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 155666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail sending data notify"); 155766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 155866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 155966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 156066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 156166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 156266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 156366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : END"); 156466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 156566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 156666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 156766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : snapshot_channel_cb_routine 156866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 156966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle snapshot frame from snapshot channel 157066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 157166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 157266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 157366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 157466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 157566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 157666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 157766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : recvd_frame will be released after this call by caller, so if 157866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * async operation needed for recvd_frame, it's our responsibility 157966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * to save a copy for this variable to be used later. 158066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 158166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::snapshot_channel_cb_routine(mm_camera_super_buf_t *super_frame, 158266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 158366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 158466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 158566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 158666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 158766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 158866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E"); 158966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 159066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 159166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 159266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 159366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 159466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply free super frame 159566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 159666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 159766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 159866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 159966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->isLowPowerMode()) { 160066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = pme->m_channels[QCAMERA_CH_TYPE_VIDEO]; 160166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 160266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = pme->m_channels[QCAMERA_CH_TYPE_SNAPSHOT]; 160366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 160466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 160566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pChannel == NULL) || (pChannel->getMyHandle() != super_frame->ch_id)) { 160666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Snapshot channel doesn't exist, return here"); 160766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 160866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 160966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 161066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.dumpmetadata", value, "0"); 161166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t enabled = atoi(value); 161266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (enabled) { 161366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL || 161466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->getMyHandle() != super_frame->ch_id) { 161566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Capture channel doesn't exist, return here"); 161666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 161766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 161866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *pMetaFrame = NULL; 161966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 162066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < super_frame->num_bufs; i++) { 162166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByHandle(super_frame->bufs[i]->stream_id); 162266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 162366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 162466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaFrame = super_frame->bufs[i]; //find the metadata 162566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pMetaFrame != NULL && 162666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((metadata_buffer_t *)pMetaFrame->buffer)->is_tuning_params_valid) { 162766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpMetadataToFile(pStream, pMetaFrame, (char *) "Snapshot"); 162866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 162966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 163066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 163166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 163266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 163366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 163466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 163566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // save a copy for the superbuf 163666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t* frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 163766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame == NULL) { 163866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error allocating memory to save received_frame structure."); 163966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(super_frame); 164066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 164166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 164266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *frame = *super_frame; 164366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 164466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame->num_bufs > 0) { 164566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: superbuf frame_idx %d", 164666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->bufs[0]->frame_idx); 164766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 164866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != pme->m_postprocessor.processData(frame)) { 164966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to trigger process data"); 165066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(super_frame); 165166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(frame); 165266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame = NULL; 165366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 165466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 165566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 165666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X"); 165766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 165866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 165966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 166066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : raw_stream_cb_routine 166166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 166266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle raw dump frame from raw stream 166366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 166466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 166566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 166666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 166766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 166866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 166966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 167066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 167166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : caller passes the ownership of super_frame, it's our 167266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * responsibility to free super_frame once it's done. For raw 167366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * frame, there is no need to send to postprocessor for jpeg 167466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * encoding. this function will play shutter and send the data 167566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * callback to upper layer. Raw frame buffer will be returned 167666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * back to kernel, and frame will be free after use. 167766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 167866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 167966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream * /*stream*/, 168066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * userdata) 168166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 168266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 168366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : BEGIN"); 168466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 168566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 168666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 168766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 168866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 168966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply free super frame 169066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 169166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 169266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 169366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 169466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_postprocessor.processRawData(super_frame); 169566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : END"); 169666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 169766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 169866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 169966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : raw_channel_cb_routine 170066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 170166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle RAW superbuf callback directly from 170266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * mm-camera-interface 170366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 170466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 170566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 170666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 170766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 170866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 170966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 171066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : recvd_frame will be released after this call by caller, so if 171166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * async operation needed for recvd_frame, it's our responsibility 171266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * to save a copy for this variable to be used later. 171366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*==========================================================================*/ 171466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::raw_channel_cb_routine(mm_camera_super_buf_t *super_frame, 171566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userdata) 171666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 171766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 171866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 171966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 172066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 172166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E"); 172266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 172366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 172466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 172566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 172666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 172766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply free super frame 172866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 172966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 173066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 173166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 173266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = pme->m_channels[QCAMERA_CH_TYPE_RAW]; 173366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 173466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("RAW channel doesn't exist, return here"); 173566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 173666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 173766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 173866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel->getMyHandle() != super_frame->ch_id) { 173966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid Input super buffer"); 174066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(super_frame); 174166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 174266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 174366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 174466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.dumpmetadata", value, "0"); 174566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t enabled = atoi(value); 174666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (enabled) { 174766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *pMetaFrame = NULL; 174866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 174966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < super_frame->num_bufs; i++) { 175066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pChannel->getStreamByHandle(super_frame->bufs[i]->stream_id); 175166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 175266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 175366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaFrame = super_frame->bufs[i]; //find the metadata 175466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pMetaFrame != NULL && 175566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((metadata_buffer_t *)pMetaFrame->buffer)->is_tuning_params_valid) { 175666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpMetadataToFile(pStream, pMetaFrame, (char *) "raw"); 175766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 175866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 175966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 176066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 176166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 176266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 176366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 176466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // save a copy for the superbuf 176566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t* frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 176666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame == NULL) { 176766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error allocating memory to save received_frame structure."); 176866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(super_frame); 176966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 177066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 177166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *frame = *super_frame; 177266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 177366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame->num_bufs > 0) { 177466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: superbuf frame_idx %d", 177566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->bufs[0]->frame_idx); 177666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 177766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 177866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Wait on Postproc initialization if needed 177966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != pme->waitDeferredWork(pme->mReprocJob)) { 178066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Reprocess Deferred work failed"); 178166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(super_frame); 178266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(frame); 178366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame = NULL; 178466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 178566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 178666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 178766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != pme->m_postprocessor.processData(frame)) { 178866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to trigger process data"); 178966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(super_frame); 179066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(frame); 179166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame = NULL; 179266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 179366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 179466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 179566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X"); 179666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 179766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 179866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 179966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 180066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : preview_raw_stream_cb_routine 180166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 180266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle raw frame during standard preview 180366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 180466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 180566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 180666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 180766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 180866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 180966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 181066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 181166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : caller passes the ownership of super_frame, it's our 181266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * responsibility to free super_frame once it's done. 181366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 181466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::preview_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 181566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream * stream, 181666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * userdata) 181766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 181866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 181966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : BEGIN"); 182066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 182166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool dump_preview_raw = false, dump_video_raw = false; 182266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 182366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 182466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 182566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 182666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 182766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 182866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply free super frame 182966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 183066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 183166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 183266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 183366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *raw_frame = super_frame->bufs[0]; 183466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 183566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (raw_frame != NULL) { 183666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.preview_raw", value, "0"); 183766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dump_preview_raw = atoi(value) > 0 ? true : false; 183866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.video_raw", value, "0"); 183966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dump_video_raw = atoi(value) > 0 ? true : false; 184066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (dump_preview_raw || (pme->mParameters.getRecordingHintValue() 184166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && dump_video_raw)) { 184266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(stream, raw_frame, QCAMERA_DUMP_FRM_RAW); 184366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 184466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(raw_frame->buf_idx); 184566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 184666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 184766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 184866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : END"); 184966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 185066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 185166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 185266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : snapshot_raw_stream_cb_routine 185366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 185466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle raw frame during standard capture 185566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 185666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 185766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 185866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 185966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 186066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 186166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 186266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 186366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : caller passes the ownership of super_frame, it's our 186466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * responsibility to free super_frame once it's done. 186566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 186666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::snapshot_raw_stream_cb_routine(mm_camera_super_buf_t * super_frame, 186766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream * stream, 186866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * userdata) 186966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 187066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 187166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : BEGIN"); 187266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 187366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool dump_raw = false; 187466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 187566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 187666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 187766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 187866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 187966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 188066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply free super frame 188166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 188266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 188366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 188466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 188566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.snapshot_raw", value, "0"); 188666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dump_raw = atoi(value) > 0 ? true : false; 188766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 188866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < super_frame->num_bufs; i++) { 188966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_RAW) { 189066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t * raw_frame = super_frame->bufs[i]; 189166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != stream) { 189266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (dump_raw) { 189366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpFrameToFile(stream, raw_frame, QCAMERA_DUMP_FRM_RAW); 189466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 189566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(super_frame->bufs[i]->buf_idx); 189666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 189766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 189866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 189966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 190066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 190166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 190266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 190366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : END"); 190466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 190566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 190666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 190766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : updateMetadata 190866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 190966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Frame related parameter can be updated here 191066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 191166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 191266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pMetaData : pointer to metadata buffer 191366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 191466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 191566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 191666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 191766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 191866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera2HardwareInterface::updateMetadata(metadata_buffer_t *pMetaData) 191966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 192066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 192166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 192266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pMetaData == NULL) { 192366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Null Metadata buffer"); 192466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 192566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 192666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 192766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Sharpness 192866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_edge_application_t edge_application; 192966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&edge_application, 0x00, sizeof(cam_edge_application_t)); 193066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin edge_application.sharpness = mParameters.getSharpness(); 193166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (edge_application.sharpness != 0) { 193266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin edge_application.edge_mode = CAM_EDGE_MODE_FAST; 193366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 193466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin edge_application.edge_mode = CAM_EDGE_MODE_OFF; 193566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 193666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 193766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_EDGE_MODE, edge_application); 193866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 193966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Effect 194066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t prmEffect = mParameters.getEffect(); 194166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_PARM_EFFECT, prmEffect); 194266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 194366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //flip 194466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t prmFlip = mParameters.getFlipMode(CAM_STREAM_TYPE_SNAPSHOT); 194566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_PARM_FLIP, prmFlip); 194666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 194766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //denoise 194866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t prmDenoise = (uint8_t)mParameters.isWNREnabled(); 194966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 195066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_NOISE_REDUCTION_MODE, prmDenoise); 195166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 195266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //rotation & device rotation 195366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t prmRotation = mParameters.getJpegRotation(); 195466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_rotation_info_t rotation_info; 195566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (prmRotation == 0) { 195666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rotation_info.rotation = ROTATE_0; 195766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (prmRotation == 90) { 195866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rotation_info.rotation = ROTATE_90; 195966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (prmRotation == 180) { 196066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rotation_info.rotation = ROTATE_180; 196166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (prmRotation == 270) { 196266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rotation_info.rotation = ROTATE_270; 196366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 196466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 196566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t device_rotation = mParameters.getDeviceRotation(); 196666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (device_rotation == 0) { 196766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rotation_info.device_rotation = ROTATE_0; 196866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (device_rotation == 90) { 196966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rotation_info.device_rotation = ROTATE_90; 197066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (device_rotation == 180) { 197166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rotation_info.device_rotation = ROTATE_180; 197266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (device_rotation == 270) { 197366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rotation_info.device_rotation = ROTATE_270; 197466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 197566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rotation_info.device_rotation = ROTATE_0; 197666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 197766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 197866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_PARM_ROTATION, rotation_info); 197966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 198066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Imglib Dynamic Scene Data 198166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dyn_img_data_t dyn_img_data = mParameters.getDynamicImgData(); 198266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameters.isStillMoreEnabled()) { 198366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_still_more_t stillmore_cap = mParameters.getStillMoreSettings(); 198466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dyn_img_data.input_count = stillmore_cap.burst_count; 198566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 198666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 198766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_IMG_DYN_FEAT, dyn_img_data); 198866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 198966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //CPP CDS 199066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t prmCDSMode = mParameters.getCDSMode(); 199166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, 199266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_PARM_CDS_MODE, prmCDSMode); 199366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 199466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 199566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 199666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 199766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 199866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : metadata_stream_cb_routine 199966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 200066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle metadata frame from metadata stream 200166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 200266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 200366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 200466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 200566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 200666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 200766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 200866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 200966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : caller passes the ownership of super_frame, it's our 201066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * responsibility to free super_frame once it's done. Metadata 201166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * could have valid entries for face detection result or 201266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * histogram statistics information. 201366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 201466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::metadata_stream_cb_routine(mm_camera_super_buf_t * super_frame, 201566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream * stream, 201666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * userdata) 201766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 201866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 201966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("[KPI Perf] : BEGIN"); 202066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 202166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 202266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 202366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 202466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 202566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply free super frame 202666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 202766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 202866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 202966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 203066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame = super_frame->bufs[0]; 203166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_buffer_t *pMetaData = (metadata_buffer_t *)frame->buffer; 203266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pme->m_stateMachine.isNonZSLCaptureRunning()&& 203366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !pme->mLongshotEnabled) { 203466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Make shutter call back in non ZSL mode once raw frame is received from VFE. 203566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->playShutter(); 203666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 203766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 203866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pMetaData->is_tuning_params_valid && pme->mParameters.getRecordingHintValue() == true) { 203966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Dump Tuning data for video 204066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->dumpMetadataToFile(stream,frame,(char *)"Video"); 204166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 204266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 204366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_hist_stats_t, stats_data, CAM_INTF_META_HISTOGRAM, pMetaData) { 204466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // process histogram statistics info 204566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 204666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *) 204766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 204866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 204966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 205066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_HISTOGRAM_STATS; 205166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->stats_data = *stats_data; 205266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 205366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 205466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt histogram failed"); 205566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 205666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 205766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 205866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 205966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 206066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for histogram qcamera_sm_internal_evt_payload_t"); 206166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 206266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 206366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 206466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_face_detection_data_t, detection_data, 206566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_FACE_DETECTION, pMetaData) { 206666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 206766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_faces_data_t faces_data; 206866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->fillFacesData(faces_data, pMetaData); 206966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.detection_data.fd_type = QCAMERA_FD_PREVIEW; //HARD CODE here before MCT can support 207066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 207166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = (qcamera_sm_internal_evt_payload_t *) 207266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 207366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 207466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 207566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_FACE_DETECT_RESULT; 207666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->faces_data = faces_data; 207766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 207866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 207966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("%s: processEvt face detection failed", __func__); 208066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 208166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 208266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 208366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 208466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("%s: No memory for face detect qcamera_sm_internal_evt_payload_t", __func__); 208566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 208666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 208766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 208866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(uint32_t, afState, CAM_INTF_META_AF_STATE, pMetaData) { 208966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t forceAFUpdate = FALSE; 209066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //1. Earlier HAL used to rely on AF done flags set in metadata to generate callbacks to 209166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //upper layers. But in scenarios where metadata drops especially which contain important 209266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //AF information, APP will wait indefinitely for focus result resulting in capture hang. 209366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //2. HAL can check for AF state transitions to generate AF state callbacks to upper layers. 209466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //This will help overcome metadata drop issue with the earlier approach. 209566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //3. But sometimes AF state transitions can happen so fast within same metadata due to 209666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //which HAL will receive only the final AF state. HAL may perceive this as no change in AF 209766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //state depending on the state transitions happened (for example state A -> B -> A). 209866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //4. To overcome the drawbacks of both the approaches, we go for a hybrid model in which 209966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //we check state transition at both HAL level and AF module level. We rely on 210066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //'state transition' meta field set by AF module for the state transition detected by it. 210166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(uint8_t, stateChange, CAM_INTF_AF_STATE_TRANSITION, pMetaData) { 210266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin forceAFUpdate = *stateChange; 210366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 210466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //This is a special scenario in which when scene modes like landscape are selected, AF mode 210566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //gets changed to INFINITY at backend, but HAL will not be aware of it. Also, AF state in 210666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //such cases will be set to CAM_AF_STATE_INACTIVE by backend. So, detect the AF mode 210766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //change here and trigger AF callback @ processAutoFocusEvent(). 210866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(uint32_t, afFocusMode, CAM_INTF_PARM_FOCUS_MODE, pMetaData) { 210966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (((cam_focus_mode_type)(*afFocusMode) == CAM_FOCUS_MODE_INFINITY) && 211066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mActiveAF){ 211166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin forceAFUpdate = TRUE; 211266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 211366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 211466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pme->m_currentFocusState != (*afState)) || forceAFUpdate) { 211566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_currentFocusState = (cam_af_state_t)(*afState); 211666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = (qcamera_sm_internal_evt_payload_t *) 211766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 211866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 211966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 212066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_FOCUS_UPDATE; 212166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->focus_data.focus_state = (cam_af_state_t)(*afState); 212266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->focus_data.focused_frame_idx = frame->frame_idx; 212366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(float, focusDistance, 212466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_LENS_FOCUS_DISTANCE, pMetaData) { 212566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->focus_data.focus_dist. 212666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin focus_distance[CAM_FOCUS_DISTANCE_OPTIMAL_INDEX] = *focusDistance; 212766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 212866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(float, focusRange, CAM_INTF_META_LENS_FOCUS_RANGE, pMetaData) { 212966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->focus_data.focus_dist. 213066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin focus_distance[CAM_FOCUS_DISTANCE_NEAR_INDEX] = focusRange[0]; 213166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->focus_data.focus_dist. 213266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin focus_distance[CAM_FOCUS_DISTANCE_FAR_INDEX] = focusRange[1]; 213366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 213466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(uint32_t, focusMode, CAM_INTF_PARM_FOCUS_MODE, pMetaData) { 213566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->focus_data.focus_mode = (cam_focus_mode_type)(*focusMode); 213666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 213766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 213866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 213966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt focus failed"); 214066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 214166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 214266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 214366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 214466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for focus qcamera_sm_internal_evt_payload_t"); 214566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 214666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 214766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 214866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 214966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_crop_data_t, crop_data, CAM_INTF_META_CROP_DATA, pMetaData) { 215066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (crop_data->num_of_streams > MAX_NUM_STREAMS) { 215166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid num_of_streams %d in crop_data", 215266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop_data->num_of_streams); 215366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 215466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 215566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *) 215666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 215766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 215866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 215966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_CROP_INFO; 216066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->crop_data = *crop_data; 216166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 216266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 216366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("processEvt crop info failed"); 216466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 216566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 216666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 216766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 216866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for prep_snapshot qcamera_sm_internal_evt_payload_t"); 216966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 217066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 217166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 217266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 217366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(int32_t, prep_snapshot_done_state, 217466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_PREP_SNAPSHOT_DONE, pMetaData) { 217566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 217666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 217766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 217866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 217966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_PREP_SNAPSHOT_DONE; 218066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->prep_snapshot_state = (cam_prep_snapshot_state_t)*prep_snapshot_done_state; 218166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 218266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 218366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt prep_snapshot failed"); 218466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 218566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 218666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 218766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 218866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for prep_snapshot qcamera_sm_internal_evt_payload_t"); 218966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 219066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 219166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 219266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_asd_hdr_scene_data_t, hdr_scene_data, 219366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_ASD_HDR_SCENE_DATA, pMetaData) { 219466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("hdr_scene_data: %d %f\n", 219566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin hdr_scene_data->is_hdr_scene, hdr_scene_data->hdr_confidence); 219666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Handle this HDR meta data only if capture is not in process 219766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pme->m_stateMachine.isCaptureRunning()) { 219866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 219966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *) 220066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 220166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 220266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 220366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_HDR_UPDATE; 220466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->hdr_data = *hdr_scene_data; 220566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 220666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 220766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt hdr update failed"); 220866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 220966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 221066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 221166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 221266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for hdr update qcamera_sm_internal_evt_payload_t"); 221366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 221466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 221566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 221666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 221766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(int32_t, scene, CAM_INTF_META_ASD_SCENE_TYPE, pMetaData) { 221866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 221966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 222066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 222166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 222266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_ASD_UPDATE; 222366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->asd_data = (cam_auto_scene_t)*scene; 222466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 222566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 222666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt asd_update failed"); 222766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 222866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 222966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 223066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 223166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for asd_update qcamera_sm_internal_evt_payload_t"); 223266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 223366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 223466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 223566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_awb_params_t, awb_params, CAM_INTF_META_AWB_INFO, pMetaData) { 223666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH(", metadata for awb params."); 223766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 223866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *) 223966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 224066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 224166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 224266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_AWB_UPDATE; 224366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->awb_data = *awb_params; 224466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 224566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 224666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt awb_update failed"); 224766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 224866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 224966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 225066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 225166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for awb_update qcamera_sm_internal_evt_payload_t"); 225266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 225366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 225466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 225566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(uint32_t, flash_mode, CAM_INTF_META_FLASH_MODE, pMetaData) { 225666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.sensor_params.flash_mode = (cam_flash_mode_t)*flash_mode; 225766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 225866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 225966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(int32_t, flash_state, CAM_INTF_META_FLASH_STATE, pMetaData) { 226066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.sensor_params.flash_state = (cam_flash_state_t) *flash_state; 226166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 226266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 226366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(float, aperture_value, CAM_INTF_META_LENS_APERTURE, pMetaData) { 226466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.sensor_params.aperture_value = *aperture_value; 226566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 226666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 226766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_3a_params_t, ae_params, CAM_INTF_META_AEC_INFO, pMetaData) { 226866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.cam_3a_params = *ae_params; 226966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.cam_3a_params_valid = TRUE; 227066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mFlashNeeded = ae_params->flash_needed; 227166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.cam_3a_params.brightness = (float) pme->mParameters.getBrightness(); 227266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 227366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *) 227466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 227566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 227666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 227766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_AE_UPDATE; 227866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->ae_data = *ae_params; 227966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 228066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 228166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt ae_update failed"); 228266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 228366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 228466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 228566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 228666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for ae_update qcamera_sm_internal_evt_payload_t"); 228766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 228866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 228966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 229066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(int32_t, wb_mode, CAM_INTF_PARM_WHITE_BALANCE, pMetaData) { 229166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.cam_3a_params.wb_mode = (cam_wb_mode_type) *wb_mode; 229266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 229366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 229466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_sensor_params_t, sensor_params, CAM_INTF_META_SENSOR_INFO, pMetaData) { 229566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.sensor_params = *sensor_params; 229666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 229766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 229866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_ae_exif_debug_t, ae_exif_debug_params, 229966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_EXIF_DEBUG_AE, pMetaData) { 230066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mExifParams.debug_params) { 230166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params->ae_debug_params = *ae_exif_debug_params; 230266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params->ae_debug_params_valid = TRUE; 230366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 230466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 230566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 230666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_awb_exif_debug_t, awb_exif_debug_params, 230766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_EXIF_DEBUG_AWB, pMetaData) { 230866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mExifParams.debug_params) { 230966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params->awb_debug_params = *awb_exif_debug_params; 231066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params->awb_debug_params_valid = TRUE; 231166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 231266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 231366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 231466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_af_exif_debug_t, af_exif_debug_params, 231566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_EXIF_DEBUG_AF, pMetaData) { 231666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mExifParams.debug_params) { 231766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params->af_debug_params = *af_exif_debug_params; 231866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params->af_debug_params_valid = TRUE; 231966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 232066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 232166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 232266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_asd_exif_debug_t, asd_exif_debug_params, 232366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_EXIF_DEBUG_ASD, pMetaData) { 232466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mExifParams.debug_params) { 232566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params->asd_debug_params = *asd_exif_debug_params; 232666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params->asd_debug_params_valid = TRUE; 232766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 232866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 232966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 233066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_stats_buffer_exif_debug_t, stats_exif_debug_params, 233166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_EXIF_DEBUG_STATS, pMetaData) { 233266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mExifParams.debug_params) { 233366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params->stats_debug_params = *stats_exif_debug_params; 233466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mExifParams.debug_params->stats_debug_params_valid = TRUE; 233566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 233666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 233766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 233866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(uint32_t, led_mode, CAM_INTF_META_LED_MODE_OVERRIDE, pMetaData) { 233966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 234066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *) 234166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 234266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 234366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 234466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_LED_MODE_OVERRIDE; 234566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->led_data = (cam_flash_mode_t)*led_mode; 234666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 234766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 234866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt led mode override failed"); 234966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 235066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 235166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 235266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 235366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for focus qcamera_sm_internal_evt_payload_t"); 235466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 235566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 235666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 235766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_edge_application_t edge_application; 235866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&edge_application, 0x00, sizeof(cam_edge_application_t)); 235966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin edge_application.sharpness = pme->mParameters.getSharpness(); 236066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (edge_application.sharpness != 0) { 236166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin edge_application.edge_mode = CAM_EDGE_MODE_FAST; 236266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 236366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin edge_application.edge_mode = CAM_EDGE_MODE_OFF; 236466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 236566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ADD_SET_PARAM_ENTRY_TO_BATCH(pMetaData, CAM_INTF_META_EDGE_MODE, edge_application); 236666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 236766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_focus_pos_info_t, cur_pos_info, 236866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_FOCUS_POSITION, pMetaData) { 236966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_sm_internal_evt_payload_t *payload = 237066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_sm_internal_evt_payload_t *)malloc(sizeof(qcamera_sm_internal_evt_payload_t)); 237166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != payload) { 237266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(payload, 0, sizeof(qcamera_sm_internal_evt_payload_t)); 237366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->evt_type = QCAMERA_INTERNAL_EVT_FOCUS_POS_UPDATE; 237466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload->focus_pos = *cur_pos_info; 237566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->processEvt(QCAMERA_SM_EVT_EVT_INTERNAL, payload); 237666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 237766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("processEvt focus_pos_update failed"); 237866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(payload); 237966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin payload = NULL; 238066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 238166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 238266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for focus_pos_update qcamera_sm_internal_evt_payload_t"); 238366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 238466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 238566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 238666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mParameters.getLowLightCapture()) { 238766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_low_light_mode_t, low_light_level, 238866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_LOW_LIGHT, pMetaData) { 238966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mParameters.setLowLightLevel(*low_light_level); 239066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 239166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 239266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 239366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_dyn_img_data_t, dyn_img_data, 239466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_IMG_DYN_FEAT, pMetaData) { 239566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mParameters.setDynamicImgData(*dyn_img_data); 239666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 239766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 239866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(int32_t, touch_ae_status, CAM_INTF_META_TOUCH_AE_RESULT, pMetaData) { 239966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("touch_ae_status: %d", *touch_ae_status); 240066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 240166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 240266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 240366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 240466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 240566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("[KPI Perf] : END"); 240666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 240766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 240866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 240966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : reprocess_stream_cb_routine 241066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 241166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to handle reprocess frame from reprocess stream 241266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (after reprocess, e.g., ZSL snapshot frame after WNR if 241366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WNR is enabled) 241466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 241566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 241666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 241766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 241866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 241966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 242066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 242166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 242266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : caller passes the ownership of super_frame, it's our 242366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * responsibility to free super_frame once it's done. In this 242466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * case, reprocessed frame need to be passed to postprocessor 242566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * for jpeg encoding. 242666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 242766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::reprocess_stream_cb_routine(mm_camera_super_buf_t * super_frame, 242866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream * /*stream*/, 242966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void * userdata) 243066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 243166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 243266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E"); 243366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 243466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 243566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 243666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle){ 243766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 243866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply free super frame 243966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 244066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 244166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 244266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 244366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_postprocessor.processPPData(super_frame); 244466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 244566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X"); 244666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 244766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 244866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 244966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : callback_stream_cb_routine 245066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 245166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to process CALBACK stream data 245266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Frame will processed and sent to framework 245366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 245466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 245566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : received super buffer 245666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : stream object 245766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 245866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 245966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 246066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 246166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::callback_stream_cb_routine(mm_camera_super_buf_t *super_frame, 246266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *stream, void *userdata) 246366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 246466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_CALL(); 246566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: E"); 246666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *pme = (QCamera2HardwareInterface *)userdata; 246766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 246866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme == NULL || 246966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle == NULL || 247066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCameraHandle->camera_handle != super_frame->camera_handle) { 247166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("camera obj not valid"); 247266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // simply free super frame 247366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 247466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 247566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 247666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 247766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame = super_frame->bufs[0]; 247866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == frame) { 247966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("preview callback frame is NULL"); 248066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 248166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 248266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 248366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 248466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pme->needProcessPreviewFrame()) { 248566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("preview is not running, no need to process"); 248666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 248766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 248866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 248966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 249066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 249166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *previewMemObj = (QCameraMemory *)frame->mem_info; 249266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Handle preview data callback 249366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mDataCb != NULL && 249466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (pme->msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_FRAME) > 0) && 249566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (!pme->mParameters.isSceneSelectionEnabled())) { 249666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pme->sendPreviewCallback(stream, previewMemObj, frame->buf_idx); 249766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc) { 249866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Preview callback was not sent succesfully"); 249966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 250066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 250166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->bufDone(frame->buf_idx); 250266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_frame); 250366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: X"); 250466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 250566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 250666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 250766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : dumpFrameToFile 250866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 250966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to dump jpeg into file for debug purpose. 251066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 251166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 251266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : data ptr 251366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @size : length of data buffer 251466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @index : identifier for data 251566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 251666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 251766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 251866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::dumpJpegToFile(const void *data, 251966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t size, uint32_t index) 252066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 252166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 252266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.dumpimg", value, "0"); 252366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t enabled = (uint32_t) atoi(value); 252466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t frm_num = 0; 252566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t skip_mode = 0; 252666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 252766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char buf[32]; 252866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t dim; 252966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(buf, 0, sizeof(buf)); 253066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&dim, 0, sizeof(dim)); 253166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 253266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(((enabled & QCAMERA_DUMP_FRM_JPEG) && data) || 253366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((true == m_bIntJpegEvtPending) && data)) { 253466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frm_num = ((enabled & 0xffff0000) >> 16); 253566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(frm_num == 0) { 253666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frm_num = 10; //default 10 frames 253766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 253866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(frm_num > 256) { 253966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frm_num = 256; //256 buffers cycle around 254066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 254166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin skip_mode = ((enabled & 0x0000ff00) >> 8); 254266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(skip_mode == 0) { 254366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin skip_mode = 1; //no-skip 254466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 254566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 254666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if( mDumpSkipCnt % skip_mode == 0) { 254766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if((frm_num == 256) && (mDumpFrmCnt >= frm_num)) { 254866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // reset frame count if cycling 254966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDumpFrmCnt = 0; 255066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 255166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mDumpFrmCnt <= frm_num) { 255266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION "%d_%d.jpg", 255366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDumpFrmCnt, index); 255466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == m_bIntJpegEvtPending) { 255566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin strlcpy(m_BackendFileName, buf, sizeof(buf)); 255666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mBackendFileSize = size; 255766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 255866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 255966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int file_fd = open(buf, O_RDWR | O_CREAT, 0777); 256066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (file_fd >= 0) { 256166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ssize_t written_len = write(file_fd, data, size); 256266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fchmod(file_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 256366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("written number of bytes %zd\n", 256466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len); 256566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin close(file_fd); 256666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 256766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail to open file for image dumping"); 256866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 256966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (false == m_bIntJpegEvtPending) { 257066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDumpFrmCnt++; 257166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDumpSkipCnt++; 257566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 257766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 257866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 257966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::dumpMetadataToFile(QCameraStream *stream, 258066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame,char *type) 258166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 258266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 258366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t frm_num = 0; 258466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_buffer_t *metadata = (metadata_buffer_t *)frame->buffer; 258566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.dumpmetadata", value, "0"); 258666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t enabled = (uint32_t) atoi(value); 258766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream == NULL) { 258866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("No op"); 258966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 259066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 259266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t dumpFrmCnt = stream->mDumpMetaFrame; 259366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(enabled){ 259466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frm_num = ((enabled & 0xffff0000) >> 16); 259566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frm_num == 0) { 259666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frm_num = 10; //default 10 frames 259766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frm_num > 256) { 259966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frm_num = 256; //256 buffers cycle around 260066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 260166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((frm_num == 256) && (dumpFrmCnt >= frm_num)) { 260266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // reset frame count if cycling 260366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt = 0; 260466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 260566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("dumpFrmCnt= %u, frm_num = %u", dumpFrmCnt, frm_num); 260666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (dumpFrmCnt < frm_num) { 260766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char timeBuf[128]; 260866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char buf[32]; 260966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(buf, 0, sizeof(buf)); 261066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(timeBuf, 0, sizeof(timeBuf)); 261166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin time_t current_time; 261266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct tm * timeinfo; 261366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin time (¤t_time); 261466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin timeinfo = localtime (¤t_time); 261566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != timeinfo) { 261666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin strftime(timeBuf, sizeof(timeBuf), 261766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCAMERA_DUMP_FRM_LOCATION "%Y%m%d%H%M%S", timeinfo); 261866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 261966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin String8 filePath(timeBuf); 262066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), "%um_%s_%d.bin", dumpFrmCnt, type, frame->frame_idx); 262166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin filePath.append(buf); 262266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int file_fd = open(filePath.string(), O_RDWR | O_CREAT, 0777); 262366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (file_fd >= 0) { 262466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ssize_t written_len = 0; 262566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata->tuning_params.tuning_data_version = TUNING_DATA_VERSION; 262666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *data = (void *)((uint8_t *)&metadata->tuning_params.tuning_data_version); 262766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, sizeof(uint32_t)); 262866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)&metadata->tuning_params.tuning_sensor_data_size); 262966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("tuning_sensor_data_size %d",(int)(*(int *)data)); 263066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, sizeof(uint32_t)); 263166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)&metadata->tuning_params.tuning_vfe_data_size); 263266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("tuning_vfe_data_size %d",(int)(*(int *)data)); 263366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, sizeof(uint32_t)); 263466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)&metadata->tuning_params.tuning_cpp_data_size); 263566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("tuning_cpp_data_size %d",(int)(*(int *)data)); 263666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, sizeof(uint32_t)); 263766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)&metadata->tuning_params.tuning_cac_data_size); 263866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("tuning_cac_data_size %d",(int)(*(int *)data)); 263966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, sizeof(uint32_t)); 264066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)&metadata->tuning_params.tuning_cac_data_size2); 264166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("< skrajago >tuning_cac_data_size %d",(int)(*(int *)data)); 264266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, sizeof(uint32_t)); 264366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t total_size = metadata->tuning_params.tuning_sensor_data_size; 264466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)&metadata->tuning_params.data); 264566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, total_size); 264666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin total_size = metadata->tuning_params.tuning_vfe_data_size; 264766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_VFE_DATA_OFFSET]); 264866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, total_size); 264966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin total_size = metadata->tuning_params.tuning_cpp_data_size; 265066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_CPP_DATA_OFFSET]); 265166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, total_size); 265266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin total_size = metadata->tuning_params.tuning_cac_data_size; 265366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)&metadata->tuning_params.data[TUNING_CAC_DATA_OFFSET]); 265466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, total_size); 265566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin close(file_fd); 265666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin }else { 265766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail t open file for image dumping"); 265866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 265966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt++; 266066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 266166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 266266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mDumpMetaFrame = dumpFrmCnt; 266366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 266466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 266566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : dumpFrameToFile 266666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 266766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to dump frame into file for debug purpose. 266866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 266966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 267066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : data ptr 267166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @size : length of data buffer 267266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @index : identifier for data 267366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @dump_type : type of the frame to be dumped. Only such 267466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * dump type is enabled, the frame will be 267566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * dumped into a file. 267666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 267766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 267866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 267966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::dumpFrameToFile(QCameraStream *stream, 268066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame, uint32_t dump_type, const char *misc) 268166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 268266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 268366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.dumpimg", value, "0"); 268466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t enabled = (uint32_t) atoi(value); 268566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t frm_num = 0; 268666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t skip_mode = 0; 268766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 268866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == stream) { 268966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("stream object is null"); 269066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 269166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 269266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 269366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t dumpFrmCnt = stream->mDumpFrame; 269466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 269566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == m_bIntRawEvtPending) { 269666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin enabled = QCAMERA_DUMP_FRM_RAW; 269766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 269866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 269966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if((enabled & QCAMERA_DUMP_FRM_MASK_ALL)) { 270066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if((enabled & dump_type) && stream && frame) { 270166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frm_num = ((enabled & 0xffff0000) >> 16); 270266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(frm_num == 0) { 270366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frm_num = 10; //default 10 frames 270466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 270566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(frm_num > 256) { 270666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frm_num = 256; //256 buffers cycle around 270766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 270866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin skip_mode = ((enabled & 0x0000ff00) >> 8); 270966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(skip_mode == 0) { 271066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin skip_mode = 1; //no-skip 271166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 271266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(stream->mDumpSkipCnt == 0) 271366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mDumpSkipCnt = 1; 271466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 271566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if( stream->mDumpSkipCnt % skip_mode == 0) { 271666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if((frm_num == 256) && (dumpFrmCnt >= frm_num)) { 271766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // reset frame count if cycling 271866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt = 0; 271966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 272066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (dumpFrmCnt <= frm_num) { 272166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char buf[32]; 272266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char timeBuf[128]; 272366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin time_t current_time; 272466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct tm * timeinfo; 272566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 272666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(timeBuf, 0, sizeof(timeBuf)); 272766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 272866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin time (¤t_time); 272966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin timeinfo = localtime (¤t_time); 273066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(buf, 0, sizeof(buf)); 273166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 273266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t dim; 273366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&dim, 0, sizeof(dim)); 273466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->getFrameDimension(dim); 273566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 273666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_frame_len_offset_t offset; 273766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&offset, 0, sizeof(cam_frame_len_offset_t)); 273866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->getFrameOffset(offset); 273966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 274066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != timeinfo) { 274166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin strftime(timeBuf, sizeof(timeBuf), 274266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCAMERA_DUMP_FRM_LOCATION "%Y%m%d%H%M%S", timeinfo); 274366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 274466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin String8 filePath(timeBuf); 274566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (dump_type) { 274666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_DUMP_FRM_PREVIEW: 274766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 274866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), "%dp_%dx%d_%d.yuv", 274966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 275066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 275166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 275266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_DUMP_FRM_THUMBNAIL: 275366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 275466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), "%dt_%dx%d_%d.yuv", 275566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 275666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 275766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 275866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_DUMP_FRM_SNAPSHOT: 275966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 276066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mParameters.isPostProcScaling()) { 276166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT, dim); 276266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 276366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->getFrameDimension(dim); 276466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 276566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (misc != NULL) { 276666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), "%ds_%dx%d_%d_%s.yuv", 276766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt, dim.width, dim.height, frame->frame_idx, misc); 276866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 276966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), "%ds_%dx%d_%d.yuv", 277066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 277166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 277266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 277366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 277466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_DUMP_FRM_INPUT_REPROCESS: 277566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 277666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->getFrameDimension(dim); 277766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (misc != NULL) { 277866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), "%dir_%dx%d_%d_%s.yuv", 277966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt, dim.width, dim.height, frame->frame_idx, misc); 278066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 278166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), "%dir_%dx%d_%d.yuv", 278266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 278366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 278466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 278566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 278666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_DUMP_FRM_VIDEO: 278766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 278866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), "%dv_%dx%d_%d.yuv", 278966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 279066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 279166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 279266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_DUMP_FRM_RAW: 279366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 279466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamDimension(CAM_STREAM_TYPE_RAW, dim); 279566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), "%dr_%dx%d_%d.raw", 279666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 279766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 279866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 279966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_DUMP_FRM_JPEG: 280066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 280166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mParameters.getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT, dim); 280266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(buf, sizeof(buf), "%dj_%dx%d_%d.yuv", 280366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt, dim.width, dim.height, frame->frame_idx); 280466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 280566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 280666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 280766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Not supported for dumping stream type %d", 280866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dump_type); 280966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 281066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 281166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 281266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin filePath.append(buf); 281366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int file_fd = open(filePath.string(), O_RDWR | O_CREAT, 0777); 281466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ssize_t written_len = 0; 281566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (file_fd >= 0) { 281666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *data = NULL; 281766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 281866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fchmod(file_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 281966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < offset.num_planes; i++) { 282066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t index = offset.mp[i].offset; 282166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (i > 0) { 282266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin index += offset.mp[i-1].len; 282366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 282466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 282566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (offset.mp[i].meta_len != 0) { 282666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)frame->buffer + index); 282766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, 282866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (size_t)offset.mp[i].meta_len); 282966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin index += (uint32_t)offset.mp[i].meta_len; 283066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 283166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 283266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int j = 0; j < offset.mp[i].height; j++) { 283366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = (void *)((uint8_t *)frame->buffer + index); 283466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len += write(file_fd, data, 283566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (size_t)offset.mp[i].width); 283666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin index += (uint32_t)offset.mp[i].stride; 283766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 283866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 283966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 284066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("written number of bytes %ld\n", 284166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len); 284266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin close(file_fd); 284366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 284466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail to open file for image dumping"); 284566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 284666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (true == m_bIntRawEvtPending) { 284766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin strlcpy(m_BackendFileName, filePath.string(), QCAMERA_MAX_FILEPATH_LENGTH); 284866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mBackendFileSize = (size_t)written_len; 284966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 285066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt++; 285166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 285266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 285366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 285466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mDumpSkipCnt++; 285566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 285666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 285766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dumpFrmCnt = 0; 285866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 285966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->mDumpFrame = dumpFrmCnt; 286066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 286166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 286266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 286366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : debugShowVideoFPS 286466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 286566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to log video frame FPS for debug purpose. 286666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 286766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 286866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 286966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 287066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 287166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::debugShowVideoFPS() 287266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 287366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mVFrameCount++; 287466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nsecs_t now = systemTime(); 287566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nsecs_t diff = now - mVLastFpsTime; 287666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (diff > ms2ns(250)) { 287766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mVFps = (((double)(mVFrameCount - mVLastFrameCount)) * 287866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (double)(s2ns(1))) / (double)diff; 287966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: PROFILE_VIDEO_FRAMES_PER_SECOND: %.4f Cam ID = %d", 288066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mVFps, mCameraId); 288166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mVLastFpsTime = now; 288266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mVLastFrameCount = mVFrameCount; 288366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 288466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 288566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 288666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 288766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : debugShowPreviewFPS 288866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 288966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to log preview frame FPS for debug purpose. 289066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 289166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 289266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 289366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 289466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 289566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::debugShowPreviewFPS() 289666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 289766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPFrameCount++; 289866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nsecs_t now = systemTime(); 289966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nsecs_t diff = now - mPLastFpsTime; 290066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (diff > ms2ns(250)) { 290166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPFps = (((double)(mPFrameCount - mPLastFrameCount)) * 290266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (double)(s2ns(1))) / (double)diff; 290366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: PROFILE_PREVIEW_FRAMES_PER_SECOND : %.4f Cam ID = %d", 290466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPFps, mCameraId); 290566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPLastFpsTime = now; 290666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPLastFrameCount = mPFrameCount; 290766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 290866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 290966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 291066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 291166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : fillFacesData 291266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 291366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: helper function to fill in face related metadata into a struct. 291466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 291566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 291666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @faces_data : face features data to be filled 291766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @metadata : metadata structure to read face features from 291866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 291966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 292066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 292166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera2HardwareInterface::fillFacesData(cam_faces_data_t &faces_data, 292266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_buffer_t *metadata) 292366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 292466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&faces_data, 0, sizeof(cam_faces_data_t)); 292566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 292666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_face_detection_data_t, p_detection_data, 292766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_FACE_DETECTION, metadata) { 292866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.detection_data = *p_detection_data; 292966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (faces_data.detection_data.num_faces_detected > MAX_ROI) { 293066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.detection_data.num_faces_detected = MAX_ROI; 293166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 293266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 293366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] %s: PROFILE_NUMBER_OF_FACES_DETECTED %d", 293466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin __func__,faces_data.detection_data.num_faces_detected); 293566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 293666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_face_recog_data_t, p_recog_data, 293766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_FACE_RECOG, metadata) { 293866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.recog_valid = true; 293966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.recog_data = *p_recog_data; 294066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 294166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 294266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_face_blink_data_t, p_blink_data, 294366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_FACE_BLINK, metadata) { 294466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.blink_valid = true; 294566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.blink_data = *p_blink_data; 294666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 294766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 294866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_face_gaze_data_t, p_gaze_data, 294966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_FACE_GAZE, metadata) { 295066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.gaze_valid = true; 295166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.gaze_data = *p_gaze_data; 295266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 295366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 295466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_face_smile_data_t, p_smile_data, 295566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_FACE_SMILE, metadata) { 295666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.smile_valid = true; 295766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.smile_data = *p_smile_data; 295866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 295966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 296066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_face_landmarks_data_t, p_landmarks, 296166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_FACE_LANDMARK, metadata) { 296266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.landmark_valid = true; 296366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.landmark_data = *p_landmarks; 296466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 296566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 296666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_face_contour_data_t, p_contour, 296766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_FACE_CONTOUR, metadata) { 296866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.contour_valid = true; 296966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin faces_data.contour_data = *p_contour; 297066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 297166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 297266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 297366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 297466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 297566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : ~QCameraCbNotifier 297666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 297766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Destructor for exiting the callback context. 297866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 297966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 298066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 298166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 298266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 298366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraCbNotifier::~QCameraCbNotifier() 298466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 298566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 298666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 298766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 298866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : exit 298966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 299066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: exit notify thread. 299166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 299266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 299366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 299466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 299566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 299666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraCbNotifier::exit() 299766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 299866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActive = false; 299966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mProcTh.exit(); 300066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 300166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 300266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 300366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseNotifications 300466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 300566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: callback for releasing data stored in the callback queue. 300666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 300766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 300866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : data to be released 300966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user_data : context data 301066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 301166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 301266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 301366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraCbNotifier::releaseNotifications(void *data, void *user_data) 301466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 301566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 301666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 301766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( ( NULL != arg ) && ( NULL != user_data ) ) { 301866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( arg->release_cb ) { 301966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin arg->release_cb(arg->user_data, arg->cookie, FAILED_TRANSACTION); 302066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 302166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 302266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 302366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 302466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 302566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : matchSnapshotNotifications 302666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 302766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: matches snapshot data callbacks 302866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 302966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 303066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : data to match 303166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user_data : context data 303266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 303366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : bool match 303466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * true - match found 303566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false- match not found 303666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 303766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCameraCbNotifier::matchSnapshotNotifications(void *data, 303866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void */*user_data*/) 303966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 304066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 304166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL != arg ) { 304266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( QCAMERA_DATA_SNAPSHOT_CALLBACK == arg->cb_type ) { 304366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return true; 304466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 304566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 304666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 304766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 304866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 304966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 305066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 305166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : matchPreviewNotifications 305266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 305366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: matches preview data callbacks 305466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 305566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 305666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : data to match 305766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user_data : context data 305866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 305966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : bool match 306066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * true - match found 306166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false- match not found 306266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 306366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCameraCbNotifier::matchPreviewNotifications(void *data, 306466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void */*user_data*/) 306566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 306666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t *arg = ( qcamera_callback_argm_t * ) data; 306766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != arg) { 306866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((QCAMERA_DATA_CALLBACK == arg->cb_type) && 306966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (CAMERA_MSG_PREVIEW_FRAME == arg->msg_type)) { 307066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return true; 307166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 307266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 307366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 307466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 307566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 307666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 307766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 307866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : cbNotifyRoutine 307966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 308066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: callback thread which interfaces with the upper layers 308166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * given input commands. 308266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 308366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 308466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : context data 308566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 308666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 308766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 308866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid * QCameraCbNotifier::cbNotifyRoutine(void * data) 308966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 309066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int running = 1; 309166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret; 309266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraCbNotifier *pme = (QCameraCbNotifier *)data; 309366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraCmdThread *cmdThread = &pme->mProcTh; 309466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cmdThread->setName("CAM_cbNotify"); 309566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t isSnapshotActive = FALSE; 309666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool longShotEnabled = false; 309766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t numOfSnapshotExpected = 0; 309866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t numOfSnapshotRcvd = 0; 309966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t cbStatus = NO_ERROR; 310066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 310166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 310266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin do { 310366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin do { 310466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = cam_sem_wait(&cmdThread->cmd_sem); 310566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != 0 && errno != EINVAL) { 310666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("cam_sem_wait error (%s)", 310766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin strerror(errno)); 310866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 310966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 311066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } while (ret != 0); 311166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 311266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_cmd_type_t cmd = cmdThread->getCmd(); 311366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("get cmd %d", cmd); 311466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (cmd) { 311566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_START_DATA_PROC: 311666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 311766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin isSnapshotActive = TRUE; 311866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numOfSnapshotExpected = pme->mParent->numOfSnapshotsExpected(); 311966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin longShotEnabled = pme->mParent->isLongshotEnabled(); 312066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Num Snapshots Expected = %d", 312166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numOfSnapshotExpected); 312266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numOfSnapshotRcvd = 0; 312366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 312466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 312566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_STOP_DATA_PROC: 312666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 312766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mDataQ.flushNodes(matchSnapshotNotifications); 312866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin isSnapshotActive = FALSE; 312966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 313066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numOfSnapshotExpected = 0; 313166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numOfSnapshotRcvd = 0; 313266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 313366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 313466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_DO_NEXT_JOB: 313566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 313666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t *cb = 313766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_callback_argm_t *)pme->mDataQ.dequeue(); 313866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbStatus = NO_ERROR; 313966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != cb) { 314066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("cb type %d received", 314166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->cb_type); 314266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 314366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mParent->msgTypeEnabledWithLock(cb->msg_type)) { 314466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (cb->cb_type) { 314566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_NOTIFY_CALLBACK: 314666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 314766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cb->msg_type == CAMERA_MSG_FOCUS) { 314866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin KPI_ATRACE_INT("Camera:AutoFocus", 0); 314966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : PROFILE_SENDING_FOCUS_EVT_TO APP"); 315066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 315166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mNotifyCb) { 315266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mNotifyCb(cb->msg_type, 315366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->ext1, 315466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->ext2, 315566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCallbackCookie); 315666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 315766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("notify callback not set!"); 315866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 315966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cb->release_cb) { 316066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->release_cb(cb->user_data, cb->cookie, 316166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbStatus); 316266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 316366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 316466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 316566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_DATA_CALLBACK: 316666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 316766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mDataCb) { 316866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mDataCb(cb->msg_type, 316966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->data, 317066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->index, 317166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->metadata, 317266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCallbackCookie); 317366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 317466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("data callback not set!"); 317566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 317666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cb->release_cb) { 317766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->release_cb(cb->user_data, cb->cookie, 317866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbStatus); 317966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 318066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 318166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 318266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_DATA_TIMESTAMP_CALLBACK: 318366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 318466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pme->mDataCbTimestamp) { 318566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mDataCbTimestamp(cb->timestamp, 318666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->msg_type, 318766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->data, 318866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->index, 318966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mCallbackCookie); 319066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 319166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Timestamp data callback not set!"); 319266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 319366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cb->release_cb) { 319466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->release_cb(cb->user_data, cb->cookie, 319566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbStatus); 319666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 319766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 319866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 319966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case QCAMERA_DATA_SNAPSHOT_CALLBACK: 320066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 320166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (TRUE == isSnapshotActive && pme->mDataCb ) { 320266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!longShotEnabled) { 320366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numOfSnapshotRcvd++; 320466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Num Snapshots Received = %d Expected = %d", 320566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numOfSnapshotRcvd, numOfSnapshotExpected); 320666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (numOfSnapshotExpected > 0 && 320766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (numOfSnapshotExpected == numOfSnapshotRcvd)) { 320866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Received all snapshots"); 320966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // notify HWI that snapshot is done 321066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mParent->processSyncEvt(QCAMERA_SM_EVT_SNAPSHOT_DONE, 321166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 321266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 321366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 321466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->mJpegCb) { 321566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Calling JPEG Callback!! for camera %d" 321666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "release_data %p", 321766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "frame_idx %d", 321866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mParent->getCameraId(), 321966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->user_data, 322066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->frame_index); 322166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mJpegCb(cb->msg_type, cb->data, 322266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->index, cb->metadata, 322366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mJpegCallbackCookie, 322466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->frame_index, cb->release_cb, 322566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->cookie, cb->user_data); 322666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // incase of non-null Jpeg cb we transfer 322766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // ownership of buffer to muxer. hence 322866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // release_cb should not be called 322966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // muxer will release after its done with 323066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // processing the buffer 323166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 323266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else { 323366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mDataCb(cb->msg_type, cb->data, cb->index, 323466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->metadata, pme->mCallbackCookie); 323566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cb->release_cb) { 323666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->release_cb(cb->user_data, cb->cookie, 323766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbStatus); 323866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 323966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 324066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 324166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 324266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 324366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 324466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 324566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("invalid cb type %d", 324666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->cb_type); 324766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbStatus = BAD_VALUE; 324866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cb->release_cb) { 324966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->release_cb(cb->user_data, cb->cookie, 325066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbStatus); 325166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 325266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 325366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 325466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin }; 325566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 325666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cb message type %d not enabled!", 325766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->msg_type); 325866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbStatus = INVALID_OPERATION; 325966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cb->release_cb) { 326066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cb->release_cb(cb->user_data, cb->cookie, cbStatus); 326166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 326266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 326366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete cb; 326466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 326566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("invalid cb type passed"); 326666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 326766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 326866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 326966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_EXIT: 327066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 327166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin running = 0; 327266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mDataQ.flush(); 327366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 327466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 327566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 327666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 327766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 327866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } while (running); 327966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 328066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 328166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 328266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 328366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 328466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 328566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : notifyCallback 328666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 328766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Enqueus pending callback notifications for the upper layers. 328866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 328966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 329066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cbArgs : callback arguments 329166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 329266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 329366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 329466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 329566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 329666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraCbNotifier::notifyCallback(qcamera_callback_argm_t &cbArgs) 329766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 329866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mActive) { 329966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("notify thread is not active"); 330066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 330166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 330266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 330366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t *cbArg = new qcamera_callback_argm_t(); 330466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == cbArg) { 330566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for qcamera_callback_argm_t"); 330666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 330766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 330866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(cbArg, 0, sizeof(qcamera_callback_argm_t)); 330966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *cbArg = cbArgs; 331066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 331166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mDataQ.enqueue((void *)cbArg)) { 331266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 331366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 331466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error adding cb data into queue"); 331566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete cbArg; 331666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 331766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 331866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 331966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 332066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 332166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setCallbacks 332266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 332366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Initializes the callback functions, which would be used for 332466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * communication with the upper layers and launches the callback 332566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * context in which the callbacks will occur. 332666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 332766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 332866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @notifyCb : notification callback 332966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @dataCb : data callback 333066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @dataCbTimestamp : data with timestamp callback 333166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @callbackCookie : callback context data 333266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 333366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 333466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 333566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraCbNotifier::setCallbacks(camera_notify_callback notifyCb, 333666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_data_callback dataCb, 333766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_data_timestamp_callback dataCbTimestamp, 333866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *callbackCookie) 333966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 334066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( ( NULL == mNotifyCb ) && 334166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ( NULL == mDataCb ) && 334266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ( NULL == mDataCbTimestamp ) && 334366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ( NULL == mCallbackCookie ) ) { 334466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mNotifyCb = notifyCb; 334566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDataCb = dataCb; 334666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDataCbTimestamp = dataCbTimestamp; 334766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbackCookie = callbackCookie; 334866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActive = true; 334966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mProcTh.launch(cbNotifyRoutine, this); 335066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 335166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Camera callback notifier already initialized!"); 335266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 335366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 335466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 335566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 335666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setJpegCallBacks 335766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 335866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Initializes the JPEG callback function, which would be used for 335966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * communication with the upper layers and launches the callback 336066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * context in which the callbacks will occur. 336166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 336266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 336366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jpegCb : notification callback 336466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @callbackCookie : callback context data 336566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 336666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 336766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 336866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraCbNotifier::setJpegCallBacks( 336966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_data_callback jpegCb, void *callbackCookie) 337066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 337166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Setting JPEG Callback notifier"); 337266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegCb = jpegCb; 337366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegCallbackCookie = callbackCookie; 337466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 337566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 337666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 337766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : flushPreviewNotifications 337866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 337966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush all pending preview notifications 338066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * from the notifier queue 338166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 338266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 338366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 338466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 338566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 338666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 338766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 338866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraCbNotifier::flushPreviewNotifications() 338966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 339066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mActive) { 339166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("notify thread is not active"); 339266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 339366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 339466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 339566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDataQ.flushNodes(matchPreviewNotifications); 339666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 339766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 339866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 339966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 340066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 340166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : startSnapshots 340266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 340366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Enables snapshot mode 340466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 340566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 340666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 340766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 340866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 340966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 341066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 341166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraCbNotifier::startSnapshots() 341266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 341366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mProcTh.sendCmd(CAMERA_CMD_TYPE_START_DATA_PROC, FALSE, TRUE); 341466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 341566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 341666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 341766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stopSnapshots 341866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 341966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Disables snapshot processing mode 342066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 342166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 342266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 342366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 342466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 342566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraCbNotifier::stopSnapshots() 342666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 342766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mProcTh.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC, FALSE, TRUE); 342866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 342966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 343066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera 3431