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