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