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