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