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