16d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev/*
2c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang** Copyright (c) 2011-2012,2015 The Linux Foundation. All rights reserved.
36d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev**
46d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** Licensed under the Apache License, Version 2.0 (the "License");
56d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** you may not use this file except in compliance with the License.
66d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** You may obtain a copy of the License at
76d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev**
86d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev**     http://www.apache.org/licenses/LICENSE-2.0
96d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev**
106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** Unless required by applicable law or agreed to in writing, software
116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** distributed under the License is distributed on an "AS IS" BASIS,
126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** See the License for the specific language governing permissions and
146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev** limitations under the License.
156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev*/
166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev/*#error uncomment this for compiler test!*/
186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#define LOG_TAG "QCameraHWI_Preview"
206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <utils/Log.h>
216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <utils/threads.h>
226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <fcntl.h>
236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <sys/mman.h>
246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include "QCameraHAL.h"
256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include "QCameraHWI.h"
266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <genlock.h>
276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#include <gralloc_priv.h>
286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#define UNLIKELY(exp) __builtin_expect(!!(exp), 0)
306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev/* QCameraHWI_Preview class implementation goes here*/
326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev/* following code implement the preview mode's image capture & display logic of this class*/
336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevnamespace android {
356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// Preview Callback
386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevstatic void preview_notify_cb(mm_camera_ch_data_buf_t *frame,
406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                void *user_data)
416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  QCameraStream_preview *pme = (QCameraStream_preview *)user_data;
436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mm_camera_ch_data_buf_t *bufs_used = 0;
446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ALOGV("%s: E", __func__);
456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  /* for peview data, there is no queue, so directly use*/
466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(pme==NULL) {
476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGE("%s: X : Incorrect cookie",__func__);
486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    /*Call buf done*/
496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return;
506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  pme->processPreviewFrame(frame);
536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ALOGV("%s: X", __func__);
546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevstatus_t QCameraStream_preview::setPreviewWindow(preview_stream_ops_t* window)
576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    status_t retVal = NO_ERROR;
596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV(" %s: E ", __FUNCTION__);
606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if( window == NULL) {
616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGW(" Setting NULL preview window ");
626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        /* TODO: Current preview window will be invalidated.
636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev         * Release all the buffers back */
646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev       // relinquishBuffers();
656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    Mutex::Autolock lock(mStopCallbackLock);
676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mPreviewWindow = window;
686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV(" %s : X ", __FUNCTION__ );
696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return retVal;
706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevstatus_t QCameraStream_preview::getBufferFromSurface()
736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int err = 0;
756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int numMinUndequeuedBufs = 0;
766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int format = 0;
776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    status_t ret = NO_ERROR;
786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int gralloc_usage;
796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV(" %s : E ", __FUNCTION__);
816d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
826d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if( mPreviewWindow == NULL) {
836d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGE("%s: mPreviewWindow = NULL", __func__);
846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        return INVALID_OPERATION;
856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    cam_ctrl_dimension_t dim;
876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    //mDisplayLock.lock();
896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION,&dim);
906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	format = mHalCamCtrl->getPreviewFormatInfo().Hal_format;
926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	if(ret != NO_ERROR) {
936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGE("%s: display format %d is not supported", __func__, dim.prev_format);
946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        goto end;
956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    numMinUndequeuedBufs = 0;
976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(mPreviewWindow->get_min_undequeued_buffer_count) {
986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        err = mPreviewWindow->get_min_undequeued_buffer_count(mPreviewWindow, &numMinUndequeuedBufs);
996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if (err != 0) {
1006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev           ALOGE("get_min_undequeued_buffer_count  failed: %s (%d)",
1016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                strerror(-err), -err);
1026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev           ret = UNKNOWN_ERROR;
1036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev           goto end;
1046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
1056d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
1066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mHalCamCtrl->mPreviewMemoryLock.lock();
1076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mHalCamCtrl->mPreviewMemory.buffer_count = kPreviewBufferCount + numMinUndequeuedBufs;
1086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(mHalCamCtrl->isZSLMode()) {
1096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if(mHalCamCtrl->getZSLQueueDepth() > numMinUndequeuedBufs)
1106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mPreviewMemory.buffer_count +=
1116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                mHalCamCtrl->getZSLQueueDepth() - numMinUndequeuedBufs;
1126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
1136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    err = mPreviewWindow->set_buffer_count(mPreviewWindow, mHalCamCtrl->mPreviewMemory.buffer_count );
1146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if (err != 0) {
1156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGE("set_buffer_count failed: %s (%d)",
1166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    strerror(-err), -err);
1176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ret = UNKNOWN_ERROR;
1186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        goto end;
1196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
1206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    err = mPreviewWindow->set_buffers_geometry(mPreviewWindow,
1216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                dim.display_width, dim.display_height, format);
1226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if (err != 0) {
1236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGE("set_buffers_geometry failed: %s (%d)",
1246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    strerror(-err), -err);
1256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ret = UNKNOWN_ERROR;
1266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        goto end;
1276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
1286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
1296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_VFE_OUTPUT_ENABLE, &mVFEOutputs);
1306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(ret != MM_CAMERA_OK) {
1316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGE("get parm MM_CAMERA_PARM_VFE_OUTPUT_ENABLE  failed");
1326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ret = BAD_VALUE;
1336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        goto end;
1346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
1356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
1366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    //as software encoder is used to encode 720p, to enhance the performance
1376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    //cashed pmem is used here
1386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(mVFEOutputs == 1 && dim.display_height == 720)
139a3f5ef81ac4893a01a4b1bae41e9523dbbb69a9aShuzhen Wang        gralloc_usage = GRALLOC_USAGE_HW_CAMERA_WRITE | CAMERA_GRALLOC_HEAP_ID | CAMERA_GRALLOC_FALLBACK_HEAP_ID;
1406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    else
141a3f5ef81ac4893a01a4b1bae41e9523dbbb69a9aShuzhen Wang        gralloc_usage = GRALLOC_USAGE_HW_CAMERA_WRITE | CAMERA_GRALLOC_HEAP_ID | CAMERA_GRALLOC_FALLBACK_HEAP_ID |
1426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    CAMERA_GRALLOC_CACHING_ID;
1436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    err = mPreviewWindow->set_usage(mPreviewWindow, gralloc_usage);
1446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(err != 0) {
1456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    /* set_usage error out */
1466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGE("%s: set_usage rc = %d", __func__, err);
1476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ret = UNKNOWN_ERROR;
1486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        goto end;
1496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
1506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_HFR_FRAME_SKIP, &mHFRFrameSkip);
1516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(ret != MM_CAMERA_OK) {
1526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGE("get parm MM_CAMERA_PARM_HFR_FRAME_SKIP  failed");
1536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ret = BAD_VALUE;
1546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        goto end;
1556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
1566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	for (int cnt = 0; cnt < mHalCamCtrl->mPreviewMemory.buffer_count; cnt++) {
1576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		int stride;
1586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		err = mPreviewWindow->dequeue_buffer(mPreviewWindow,
1596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev										&mHalCamCtrl->mPreviewMemory.buffer_handle[cnt],
1606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev										&mHalCamCtrl->mPreviewMemory.stride[cnt]);
1616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		if(!err) {
1626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGV("%s: dequeue buf hdl =%p", __func__, *mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
1636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            err = mPreviewWindow->lock_buffer(this->mPreviewWindow,
1646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
1656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            // lock the buffer using genlock
1666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGV("%s: camera call genlock_lock, hdl=%p", __FUNCTION__, (*mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]));
1676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            if (GENLOCK_NO_ERROR != genlock_lock_buffer((native_handle_t *)(*mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]),
1686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
1696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                ALOGV("%s: genlock_lock_buffer(WRITE) failed", __FUNCTION__);
1706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_UNLOCKED;
1716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                //mHalCamCtrl->mPreviewMemoryLock.unlock();
1726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                //return -EINVAL;
1736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            } else {
1746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                ALOGV("%s: genlock_lock_buffer hdl =%p", __FUNCTION__, *mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
1756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_LOCKED;
1766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            }
1776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		} else {
1786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_NOT_OWNED;
1796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGV("%s: dequeue_buffer idx = %d err = %d", __func__, cnt, err);
1806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
1816d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
1826d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		ALOGV("%s: dequeue buf: %p\n", __func__, mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
1836d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
1846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		if(err != 0) {
1856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGE("%s: dequeue_buffer failed: %s (%d)", __func__,
1866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    strerror(-err), -err);
1876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ret = UNKNOWN_ERROR;
1886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev			for(int i = 0; i < cnt; i++) {
1896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[i]) {
1906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    ALOGV("%s: camera call genlock_unlock", __FUNCTION__);
1916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t *)
1926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                                  (*(mHalCamCtrl->mPreviewMemory.buffer_handle[i])))) {
1936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        ALOGE("%s: genlock_unlock_buffer failed: hdl =%p", __FUNCTION__, (*(mHalCamCtrl->mPreviewMemory.buffer_handle[i])) );
1946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                         //mHalCamCtrl->mPreviewMemoryLock.unlock();
1956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        //return -EINVAL;
1966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    } else {
1976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_UNLOCKED;
1986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    }
1996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                }
2006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                if( mHalCamCtrl->mPreviewMemory.local_flag[i] != BUFFER_NOT_OWNED) {
2016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                  err = mPreviewWindow->cancel_buffer(mPreviewWindow,
2026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                          mHalCamCtrl->mPreviewMemory.buffer_handle[i]);
2036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                }
2046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_NOT_OWNED;
2056d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                ALOGV("%s: cancel_buffer: hdl =%p", __func__,  (*mHalCamCtrl->mPreviewMemory.buffer_handle[i]));
2066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev				mHalCamCtrl->mPreviewMemory.buffer_handle[i] = NULL;
2076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev			}
2086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            memset(&mHalCamCtrl->mPreviewMemory, 0, sizeof(mHalCamCtrl->mPreviewMemory));
2096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev			goto end;
2106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		}
2116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
2126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt] =
2136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		    (struct private_handle_t *)(*mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
2146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#ifdef USE_ION
2156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mHalCamCtrl->mPreviewMemory.main_ion_fd[cnt] = open("/dev/ion", O_RDONLY);
2166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if (mHalCamCtrl->mPreviewMemory.main_ion_fd[cnt] < 0) {
2176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGE("%s: failed: could not open ion device\n", __func__);
2186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        } else {
2196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mPreviewMemory.ion_info_fd[cnt].fd =
2206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->fd;
2216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            if (ioctl(mHalCamCtrl->mPreviewMemory.main_ion_fd[cnt],
2226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              ION_IOC_IMPORT, &mHalCamCtrl->mPreviewMemory.ion_info_fd[cnt]) < 0)
2236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              ALOGE("ION import failed\n");
2246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
2256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#endif
2266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		mHalCamCtrl->mPreviewMemory.camera_memory[cnt] =
2276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		    mHalCamCtrl->mGetMemory(mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->fd,
2286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev			mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->size, 1, (void *)this);
2296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		ALOGV("%s: idx = %d, fd = %d, size = %d, offset = %d", __func__,
2306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            cnt, mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->fd,
2316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->size,
2326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->offset);
2336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
2346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
235f5e6f16486b1d1f657f3d143fae49b71c176f608Shuzhen Wang    //Cancel min_undequeued_buffer buffers back to the window
236f5e6f16486b1d1f657f3d143fae49b71c176f608Shuzhen Wang    for (int i = 0;  i < numMinUndequeuedBufs; i ++) {
237f5e6f16486b1d1f657f3d143fae49b71c176f608Shuzhen Wang        if( mHalCamCtrl->mPreviewMemory.local_flag[i] != BUFFER_NOT_OWNED) {
238f5e6f16486b1d1f657f3d143fae49b71c176f608Shuzhen Wang            err = mPreviewWindow->cancel_buffer(mPreviewWindow, mHalCamCtrl->mPreviewMemory.buffer_handle[i]);
239f5e6f16486b1d1f657f3d143fae49b71c176f608Shuzhen Wang        }
240f5e6f16486b1d1f657f3d143fae49b71c176f608Shuzhen Wang        mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_NOT_OWNED;
241f5e6f16486b1d1f657f3d143fae49b71c176f608Shuzhen Wang    }
2426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
2436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    memset(&mHalCamCtrl->mMetadata, 0, sizeof(mHalCamCtrl->mMetadata));
2446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    memset(mHalCamCtrl->mFace, 0, sizeof(mHalCamCtrl->mFace));
2456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
2466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV(" %s : X ",__FUNCTION__);
2476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevend:
2486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    //mDisplayLock.unlock();
2496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mHalCamCtrl->mPreviewMemoryLock.unlock();
2506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
2516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return ret;
2526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
2536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
2546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevstatus_t QCameraStream_preview::putBufferToSurface() {
2556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int err = 0;
2566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    status_t ret = NO_ERROR;
2576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
2586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV(" %s : E ", __FUNCTION__);
2596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
2606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mHalCamCtrl->mPreviewMemoryLock.lock();
2616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    for (int cnt = 0; cnt < mHalCamCtrl->mPreviewMemory.buffer_count; cnt++) {
2626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if (cnt < mHalCamCtrl->mPreviewMemory.buffer_count) {
2636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW, cnt, mCameraId,
2646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                                          CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) {
2656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                ALOGE("%s: unmapping Preview Buffer", __func__);
2666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            }
2676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            if(mHalCamCtrl->isZSLMode()) {
2686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL, cnt, mCameraId,
2696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                                          CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) {
2706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    ALOGE("%s: unmapping Thumbnail Buffer for ZSL", __func__);
2716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                }
2726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            }
2736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
2746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
2756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mHalCamCtrl->mPreviewMemory.camera_memory[cnt]->release(mHalCamCtrl->mPreviewMemory.camera_memory[cnt]);
2766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#ifdef USE_ION
2776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        struct ion_handle_data ion_handle;
2786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ion_handle.handle = mHalCamCtrl->mPreviewMemory.ion_info_fd[cnt].handle;
2796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if (ioctl(mHalCamCtrl->mPreviewMemory.main_ion_fd[cnt], ION_IOC_FREE, &ion_handle)
2806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            < 0)
2816d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGE("%s: ion free failed\n", __func__);
2826d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        close(mHalCamCtrl->mPreviewMemory.main_ion_fd[cnt]);
2836d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#endif
2846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[cnt]) {
2856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                ALOGV("%s: camera call genlock_unlock", __FUNCTION__);
2866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	        if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t *)
2876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                                    (*(mHalCamCtrl->mPreviewMemory.buffer_handle[cnt])))) {
2886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    ALOGE("%s: genlock_unlock_buffer failed, handle =%p", __FUNCTION__, (*(mHalCamCtrl->mPreviewMemory.buffer_handle[cnt])));
2896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    continue;
2906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	                //mHalCamCtrl->mPreviewMemoryLock.unlock();
2916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    //return -EINVAL;
2926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                } else {
2936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
2946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    ALOGV("%s: genlock_unlock_buffer, handle =%p", __FUNCTION__, (*(mHalCamCtrl->mPreviewMemory.buffer_handle[cnt])));
2956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_UNLOCKED;
2966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                }
2976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            }
2986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             if( mHalCamCtrl->mPreviewMemory.local_flag[cnt] != BUFFER_NOT_OWNED) {
2996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               err = mPreviewWindow->cancel_buffer(mPreviewWindow, mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
3006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               ALOGV("%s: cancel_buffer: hdl =%p", __func__,  (*mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]));
3016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             }
3026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_NOT_OWNED;
3036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		ALOGV(" put buffer %d successfully", cnt);
3056d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	}
3066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if (mDisplayBuf.preview.buf.mp != NULL) {
3086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        delete[] mDisplayBuf.preview.buf.mp;
3096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mDisplayBuf.preview.buf.mp = NULL;
3106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
3116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mHalCamCtrl->mPreviewMemoryLock.unlock();
3136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	memset(&mHalCamCtrl->mPreviewMemory, 0, sizeof(mHalCamCtrl->mPreviewMemory));
3146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV(" %s : X ",__FUNCTION__);
3156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return NO_ERROR;
3166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
3176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevvoid QCameraStream_preview::notifyROIEvent(fd_roi_t roi)
3196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
3206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    camera_memory_t *data = mHalCamCtrl->mGetMemory(-1, 1, 1, NULL);
3216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    switch (roi.type) {
3226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    case FD_ROI_TYPE_HEADER:
3236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        {
3246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mDisplayLock.lock();
3256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mNumFDRcvd = 0;
3266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            memset(mHalCamCtrl->mFace, 0, sizeof(mHalCamCtrl->mFace));
3276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mMetadata.faces = mHalCamCtrl->mFace;
3286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mMetadata.number_of_faces = roi.d.hdr.num_face_detected;
3296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            if(mHalCamCtrl->mMetadata.number_of_faces > MAX_ROI)
3306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              mHalCamCtrl->mMetadata.number_of_faces = MAX_ROI;
3316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mDisplayLock.unlock();
3326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            if (mHalCamCtrl->mMetadata.number_of_faces == 0) {
3346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                // Clear previous faces
3356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                mHalCamCtrl->mCallbackLock.lock();
3366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                camera_data_callback pcb = mHalCamCtrl->mDataCb;
3376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                mHalCamCtrl->mCallbackLock.unlock();
3386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                if (pcb && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_METADATA)){
3406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    ALOGV("%s: Face detection RIO callback", __func__);
3416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    pcb(CAMERA_MSG_PREVIEW_METADATA, data, 0, &mHalCamCtrl->mMetadata, mHalCamCtrl->mCallbackCookie);
3426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                }
3436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            }
3446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
3456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        break;
3466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    case FD_ROI_TYPE_DATA:
3476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        {
3486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        #if 1
3496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mDisplayLock.lock();
3506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            int idx = roi.d.data.idx;
3516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            if (idx >= mHalCamCtrl->mMetadata.number_of_faces) {
3526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                mDisplayLock.unlock();
3536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                ALOGE("%s: idx %d out of boundary %d", __func__, idx, mHalCamCtrl->mMetadata.number_of_faces);
3546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                break;
3556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            }
3566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].id = roi.d.data.face.id;
3586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].score = roi.d.data.face.score;
3596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            // top
3616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].rect[0] =
3626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               roi.d.data.face.face_boundary.x*2000/mHalCamCtrl->mDimension.display_width - 1000;
3636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            //right
3646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].rect[1] =
3656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               roi.d.data.face.face_boundary.y*2000/mHalCamCtrl->mDimension.display_height - 1000;
3666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            //bottom
3676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].rect[2] =  mHalCamCtrl->mFace[idx].rect[0] +
3686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               roi.d.data.face.face_boundary.dx*2000/mHalCamCtrl->mDimension.display_width;
3696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            //left
3706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].rect[3] = mHalCamCtrl->mFace[idx].rect[1] +
3716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               roi.d.data.face.face_boundary.dy*2000/mHalCamCtrl->mDimension.display_height;
3726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            // Center of left eye
3746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].left_eye[0] =
3756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              roi.d.data.face.left_eye_center[0]*2000/mHalCamCtrl->mDimension.display_width - 1000;
3766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].left_eye[1] =
3776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              roi.d.data.face.left_eye_center[1]*2000/mHalCamCtrl->mDimension.display_height - 1000;
3786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            // Center of right eye
3806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].right_eye[0] =
3816d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              roi.d.data.face.right_eye_center[0]*2000/mHalCamCtrl->mDimension.display_width - 1000;
3826d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].right_eye[1] =
3836d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              roi.d.data.face.right_eye_center[1]*2000/mHalCamCtrl->mDimension.display_height - 1000;
3846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#if 0
3856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            // Center of mouth
3866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].mouth[0] =
3876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              roi.d.data.face.mouth_center[0]*2000/mHalCamCtrl->mDimension.display_width - 1000;
3886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].mouth[1] =
3896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              roi.d.data.face.mouth_center[1]*2000/mHalCamCtrl->mDimension.display_height - 1000;
3906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].smile_degree = roi.d.data.face.smile_degree;
3926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].smile_score = roi.d.data.face.smile_confidence;
3936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].blink_detected = roi.d.data.face.blink_detected;
3946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].face_recognised = roi.d.data.face.is_face_recognised;
3956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].gaze_angle = roi.d.data.face.gaze_angle;
3966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
3976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            /* newly added */
3986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            // upscale by 2 to recover from demaen downscaling
3996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].updown_dir = roi.d.data.face.updown_dir*2;
4006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].leftright_dir = roi.d.data.face.leftright_dir*2;
4016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].roll_dir = roi.d.data.face.roll_dir*2;
4026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].leye_blink = roi.d.data.face.left_blink;
4046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].reye_blink = roi.d.data.face.right_blink;
4056d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].left_right_gaze = roi.d.data.face.left_right_gaze;
4066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mFace[idx].top_bottom_gaze = roi.d.data.face.top_bottom_gaze;
4076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGE("%s: Face(%d, %d, %d, %d), leftEye(%d, %d), rightEye(%d, %d), mouth(%d, %d), smile(%d, %d), face_recg(%d)", __func__,
4086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].rect[0],  mHalCamCtrl->mFace[idx].rect[1],
4096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].rect[2],  mHalCamCtrl->mFace[idx].rect[3],
4106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].left_eye[0], mHalCamCtrl->mFace[idx].left_eye[1],
4116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].right_eye[0], mHalCamCtrl->mFace[idx].right_eye[1],
4126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].mouth[0], mHalCamCtrl->mFace[idx].mouth[1],
4136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].smile_degree, mHalCamCtrl->mFace[idx].smile_score,
4146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].face_recognised);
4156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGE("%s: gaze(%d, %d, %d), updown(%d), leftright(%d), roll(%d), blink(%d, %d, %d)", __func__,
4166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].gaze_angle,  mHalCamCtrl->mFace[idx].left_right_gaze,
4176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].top_bottom_gaze,  mHalCamCtrl->mFace[idx].updown_dir,
4186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].leftright_dir, mHalCamCtrl->mFace[idx].roll_dir,
4196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].blink_detected,
4206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev               mHalCamCtrl->mFace[idx].leye_blink, mHalCamCtrl->mFace[idx].reye_blink);
4216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#endif
4226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             mNumFDRcvd++;
4236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             mDisplayLock.unlock();
4246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             if (mNumFDRcvd == mHalCamCtrl->mMetadata.number_of_faces) {
4266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                 mHalCamCtrl->mCallbackLock.lock();
4276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                 camera_data_callback pcb = mHalCamCtrl->mDataCb;
4286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                 mHalCamCtrl->mCallbackLock.unlock();
4296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                 if (pcb && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_METADATA)){
4316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                     ALOGV("%s: Face detection RIO callback with %d faces detected (score=%d)", __func__, mNumFDRcvd, mHalCamCtrl->mFace[idx].score);
4326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                     pcb(CAMERA_MSG_PREVIEW_METADATA, data, 0, &mHalCamCtrl->mMetadata, mHalCamCtrl->mCallbackCookie);
4336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                 }
4346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev             }
4356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        #endif
4366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
4376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        break;
4386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
4396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(NULL != data) data->release(data);
4406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
4416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevstatus_t QCameraStream_preview::initDisplayBuffers()
4436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
4446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  status_t ret = NO_ERROR;
4456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int width = 0;  /* width of channel  */
4466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int height = 0; /* height of channel */
4476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  uint32_t frame_len = 0; /* frame planner length */
4486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int buffer_num = 4, i; /* number of buffers for display */
4496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  const char *pmem_region;
4506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  uint8_t num_planes = 0;
4516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  uint32_t planes[VIDEO_MAX_PLANES];
4526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  void *vaddr = NULL;
4536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  cam_ctrl_dimension_t dim;
4546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ALOGV("%s:BEGIN",__func__);
4566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  memset(&mHalCamCtrl->mMetadata, 0, sizeof(camera_frame_metadata_t));
4576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->mPreviewMemoryLock.lock();
4586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  memset(&mHalCamCtrl->mPreviewMemory, 0, sizeof(mHalCamCtrl->mPreviewMemory));
4596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->mPreviewMemoryLock.unlock();
4606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev/* get preview size, by qury mm_camera*/
4626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
4636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  memset(&(this->mDisplayStreamBuf),0, sizeof(this->mDisplayStreamBuf));
4656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim);
4676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if (MM_CAMERA_OK != ret) {
4686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGE("%s: error - can't get camera dimension!", __func__);
4696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: X", __func__);
4706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return BAD_VALUE;
4716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }else {
4726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    width =  dim.display_width,
4736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    height = dim.display_height;
4746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
4756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ret = getBufferFromSurface();
4776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(ret != NO_ERROR) {
4786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGE("%s: cannot get memory from surface texture client, ret = %d", __func__, ret);
4796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return ret;
4806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
4816d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4826d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  /* set 4 buffers for display */
4836d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->mPreviewMemoryLock.lock();
4846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  memset(&mDisplayStreamBuf, 0, sizeof(mDisplayStreamBuf));
4856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  this->mDisplayStreamBuf.num = mHalCamCtrl->mPreviewMemory.buffer_count;
4866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  this->myMode=myMode; /*Need to assign this in constructor after translating from mask*/
4876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  num_planes = dim.display_frame_offset.num_planes;
4886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  for(i =0; i< num_planes; i++) {
4896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev     planes[i] = dim.display_frame_offset.mp[i].len;
4906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
4916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  this->mDisplayStreamBuf.frame_len = dim.display_frame_offset.frame_len;
4926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
4936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  memset(&mDisplayBuf, 0, sizeof(mDisplayBuf));
4946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mDisplayBuf.preview.buf.mp = new mm_camera_mp_buf_t[mDisplayStreamBuf.num];
4956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if (!mDisplayBuf.preview.buf.mp) {
4966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGE("%s Error allocating memory for mplanar struct ", __func__);
4976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret = NO_MEMORY;
4986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    goto error;
4996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
5006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  memset(mDisplayBuf.preview.buf.mp, 0,
5016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mDisplayStreamBuf.num * sizeof(mm_camera_mp_buf_t));
5026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
5036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  /*allocate memory for the buffers*/
5046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  for(int i = 0; i < mDisplayStreamBuf.num; i++){
505c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang      if (mHalCamCtrl->mPreviewMemory.private_buffer_handle[i] == NULL)
506c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang          continue;
5076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayStreamBuf.frame[i].fd = mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->fd;
5086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayStreamBuf.frame[i].cbcr_off = planes[0];
5096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayStreamBuf.frame[i].y_off = 0;
5106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayStreamBuf.frame[i].path = OUTPUT_TYPE_P;
511c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang      mHalCamCtrl->mPreviewMemory.addr_offset[i] =
512c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang              mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->offset;
5136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayStreamBuf.frame[i].buffer =
5146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          (long unsigned int)mHalCamCtrl->mPreviewMemory.camera_memory[i]->data;
5156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayStreamBuf.frame[i].ion_alloc.len = mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size;
5166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayStreamBuf.frame[i].ion_dev_fd = mHalCamCtrl->mPreviewMemory.main_ion_fd[i];
5176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayStreamBuf.frame[i].fd_data = mHalCamCtrl->mPreviewMemory.ion_info_fd[i];
5186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
5196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: idx = %d, fd = %d, size = %d, cbcr_offset = %d, y_offset = %d, "
5206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      "offset = %d, vaddr = 0x%x", __func__, i, mDisplayStreamBuf.frame[i].fd,
5216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size,
5226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayStreamBuf.frame[i].cbcr_off, mDisplayStreamBuf.frame[i].y_off,
5236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mHalCamCtrl->mPreviewMemory.addr_offset[i],
5246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      (uint32_t)mDisplayStreamBuf.frame[i].buffer);
5256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
5266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret = mHalCamCtrl->sendMappingBuf(
5276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW,
5286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        i,
5296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        mDisplayStreamBuf.frame[i].fd,
5306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size,
5316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        mCameraId, CAM_SOCK_MSG_TYPE_FD_MAPPING);
5326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if (NO_ERROR != ret) {
5336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGE("%s: sending mapping data Msg Failed", __func__);
5346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      goto error;
5356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
5366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
5376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(mHalCamCtrl->isZSLMode()) {
5386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev         ret = mHalCamCtrl->sendMappingBuf(
5396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL,
5406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        i,
5416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        mDisplayStreamBuf.frame[i].fd,
5426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size,
5436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                        mCameraId, CAM_SOCK_MSG_TYPE_FD_MAPPING);
5446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if (NO_ERROR != ret) {
5456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          ALOGE("%s: Send socket msg to map Failed", __func__);
5466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          goto error;
5476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
5486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
5496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mDisplayBuf.preview.buf.mp[i].frame = mDisplayStreamBuf.frame[i];
5506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mDisplayBuf.preview.buf.mp[i].frame_offset = mHalCamCtrl->mPreviewMemory.addr_offset[i];
5516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mDisplayBuf.preview.buf.mp[i].num_planes = num_planes;
5526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
5536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    /* Plane 0 needs to be set seperately. Set other planes
5546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev     * in a loop. */
5556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mDisplayBuf.preview.buf.mp[i].planes[0].length = planes[0];
5566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mDisplayBuf.preview.buf.mp[i].planes[0].m.userptr = mDisplayStreamBuf.frame[i].fd;
5576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mDisplayBuf.preview.buf.mp[i].planes[0].data_offset = 0;
5586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mDisplayBuf.preview.buf.mp[i].planes[0].reserved[0] =
5596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayBuf.preview.buf.mp[i].frame_offset;
5606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    for (int j = 1; j < num_planes; j++) {
5616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayBuf.preview.buf.mp[i].planes[j].length = planes[j];
5626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr =
5636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mDisplayStreamBuf.frame[i].fd;
5646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayBuf.preview.buf.mp[i].planes[j].data_offset = 0;
5656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0] =
5666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].planes[j-1].reserved[0] +
5676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].planes[j-1].length;
5686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
5696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
570c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang    if (mHalCamCtrl->mPreviewMemory.local_flag[i] == BUFFER_NOT_OWNED) {
571c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang      mDisplayBuf.preview.no_enqueue_flag[i] = 1;
572c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang    } else {
573c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang      mDisplayBuf.preview.no_enqueue_flag[i] = 0;
574c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang    }
5756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    for (int j = 0; j < num_planes; j++)
5766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGV("Planes: %d length: %d userptr: %lu offset: %d\n", j,
5776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].planes[j].length,
5786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr,
5796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0]);
5806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }/*end of for loop*/
5816d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
5826d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev /* register the streaming buffers for the channel*/
5836d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mDisplayBuf.ch_type = MM_CAMERA_CH_PREVIEW;
5846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mDisplayBuf.preview.num = mDisplayStreamBuf.num;
5856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->mPreviewMemoryLock.unlock();
5866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ALOGV("%s:END",__func__);
5876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  return NO_ERROR;
5886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
5896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malcheverror:
5906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mHalCamCtrl->mPreviewMemoryLock.unlock();
5916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    putBufferToSurface();
5926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
5936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: X", __func__);
5946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return ret;
5956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
5966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
5976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevvoid QCameraStream_preview::dumpFrameToFile(struct msm_frame* newFrame)
5986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
5996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#if 0
6006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int32_t enabled = 0;
6016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int frm_num;
6026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  uint32_t  skip_mode;
6036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  char value[PROPERTY_VALUE_MAX];
6046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  char buf[32];
6056d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int w, h;
6066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  static int count = 0;
6076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  cam_ctrl_dimension_t dim;
6086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int file_fd;
6096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int rc = 0;
6106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int len;
6116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  unsigned long addr;
6126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  unsigned long * tmp = (unsigned long *)newFrame->buffer;
6136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  addr = *tmp;
6146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  status_t ret = cam_config_get_parm(mHalCamCtrl->mCameraId,
6156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                 MM_CAMERA_PARM_DIMENSION, &dim);
6166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
6176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  w = dim.display_width;
6186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  h = dim.display_height;
6196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  len = (w * h)*3/2;
6206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  count++;
6216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(count < 100) {
6226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    snprintf(buf, sizeof(buf), "/data/mzhu%d.yuv", count);
6236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    file_fd = open(buf, O_RDWR | O_CREAT, 0777);
6246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
6256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    rc = write(file_fd, (const void *)addr, len);
6266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: file='%s', vaddr_old=0x%x, addr_map = 0x%p, len = %d, rc = %d",
6276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          __func__, buf, (uint32_t)newFrame->buffer, (void *)addr, len, rc);
6286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    close(file_fd);
6296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: dump %s, rc = %d, len = %d", __func__, buf, rc, len);
6306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
6316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#endif
6326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
6336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
6346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevstatus_t QCameraStream_preview::processPreviewFrameWithDisplay(
6356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mm_camera_ch_data_buf_t *frame)
6366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
6376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ALOGV("%s",__func__);
6386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int err = 0;
6396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int msgType = 0;
6406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int i;
6416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  camera_memory_t *data = NULL;
6426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  camera_frame_metadata_t *metadata = NULL;
6436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
6446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  Mutex::Autolock lock(mStopCallbackLock);
6456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(!mActive) {
6466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("Preview Stopped. Returning callback");
6476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return NO_ERROR;
6486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
6496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
6506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(mHalCamCtrl==NULL) {
6516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGE("%s: X: HAL control object not set",__func__);
6526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    /*Call buf done*/
6536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return BAD_VALUE;
6546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
6556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
6566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(mHalCamCtrl->mPauseFramedispatch) {
6576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, frame)) {
6586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGE("BUF DONE FAILED for the recylce buffer");
6596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      }
6606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      return NO_ERROR;
6616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
6626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->mCallbackLock.lock();
6636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  camera_data_timestamp_callback rcb = mHalCamCtrl->mDataCbTimestamp;
6646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  void *rdata = mHalCamCtrl->mCallbackCookie;
6656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->mCallbackLock.unlock();
6666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  nsecs_t timeStamp = seconds_to_nanoseconds(frame->def.frame->ts.tv_sec) ;
6676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  timeStamp += frame->def.frame->ts.tv_nsec;
6686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
6696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(mFirstFrameRcvd == false) {
6706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mm_camera_util_profile("HAL: First preview frame received");
6716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mFirstFrameRcvd = true;
6726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
6736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
6746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if (UNLIKELY(mHalCamCtrl->mDebugFps)) {
6756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mHalCamCtrl->debugShowPreviewFPS();
6766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
6776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  //dumpFrameToFile(frame->def.frame);
6786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_PREVIEW);
6796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
6806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->mPreviewMemoryLock.lock();
6816d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
682c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang  ALOGV("Enqueue buf handle %p, index %d\n",
683c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang  mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx], frame->def.idx);
6846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ALOGV("%s: camera call genlock_unlock", __FUNCTION__);
6856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
6866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx]) {
6876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGV("%s: genlock_unlock_buffer hdl =%p", __FUNCTION__, (*mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]));
6886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t*)
6896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                (*mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]))) {
6906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGE("%s: genlock_unlock_buffer failed", __FUNCTION__);
6916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            //mHalCamCtrl->mPreviewMemoryLock.unlock();
6926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            //return -EINVAL;
6936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        } else {
6946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx] = BUFFER_UNLOCKED;
6956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
6966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    } else {
6976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGE("%s: buffer to be enqueued is not locked", __FUNCTION__);
698f5e6f16486b1d1f657f3d143fae49b71c176f608Shuzhen Wang	    mHalCamCtrl->mPreviewMemoryLock.unlock();
699f5e6f16486b1d1f657f3d143fae49b71c176f608Shuzhen Wang        return -EINVAL;
7006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
7016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
7026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#ifdef USE_ION
7036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  struct ion_flush_data cache_inv_data;
7046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int ion_fd;
7056d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ion_fd = frame->def.frame->ion_dev_fd;
7066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  cache_inv_data.vaddr = (void *)frame->def.frame->buffer;
7076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  cache_inv_data.fd = frame->def.frame->fd;
7086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  cache_inv_data.handle = frame->def.frame->fd_data.handle;
7096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  cache_inv_data.length = frame->def.frame->ion_alloc.len;
7106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
7116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if (mHalCamCtrl->cache_ops(ion_fd, &cache_inv_data,
7126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                ION_IOC_CLEAN_INV_CACHES) < 0)
7136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGE("%s: Cache clean for Preview buffer %p fd = %d failed", __func__,
7146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      cache_inv_data.vaddr, cache_inv_data.fd);
7156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev#endif
7166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
7176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(mHFRFrameSkip == 1)
7186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  {
7196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      const char *str = mHalCamCtrl->mParameters.get(
7206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                          QCameraParameters::KEY_VIDEO_HIGH_FRAME_RATE);
7216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      if(str != NULL){
7226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      int is_hfr_off = 0;
7236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      mHFRFrameCnt++;
7246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      if(!strcmp(str, QCameraParameters::VIDEO_HFR_OFF)) {
7256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          is_hfr_off = 1;
7266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow,
7276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
7286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      } else if (!strcmp(str, QCameraParameters::VIDEO_HFR_2X)) {
7296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          mHFRFrameCnt %= 2;
7306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      } else if (!strcmp(str, QCameraParameters::VIDEO_HFR_3X)) {
7316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          mHFRFrameCnt %= 3;
7326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      } else if (!strcmp(str, QCameraParameters::VIDEO_HFR_4X)) {
7336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          mHFRFrameCnt %= 4;
7346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      }
7356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      if(mHFRFrameCnt == 0)
7366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow,
7376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
7386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      else if(!is_hfr_off)
7396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          err = this->mPreviewWindow->cancel_buffer(this->mPreviewWindow,
7406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
7416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      } else
7426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow,
7436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
7446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  } else {
7456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow,
7466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
7476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
7486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(err != 0) {
7496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGE("%s: enqueue_buffer failed, err = %d", __func__, err);
7506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  } else {
7516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev   ALOGV("%s: enqueue_buffer hdl=%p", __func__, *mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
7526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx] = BUFFER_NOT_OWNED;
7536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
7546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  buffer_handle_t *buffer_handle = NULL;
7556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int tmp_stride = 0;
7566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  err = this->mPreviewWindow->dequeue_buffer(this->mPreviewWindow,
7576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              &buffer_handle, &tmp_stride);
7586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if (err == NO_ERROR && buffer_handle != NULL) {
7596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
7606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    for(i = 0; i < mHalCamCtrl->mPreviewMemory.buffer_count; i++) {
7616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if(mHalCamCtrl->mPreviewMemory.buffer_handle[i] == buffer_handle) {
7626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_UNLOCKED;
763c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang          ALOGV("%s: dequed buf hdl =%p, index = %d", __func__, *buffer_handle, i);
7646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          break;
7656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
7666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
7676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev     if (i < mHalCamCtrl->mPreviewMemory.buffer_count ) {
7686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      err = this->mPreviewWindow->lock_buffer(this->mPreviewWindow, buffer_handle);
7696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGV("%s: camera call genlock_lock: hdl =%p", __FUNCTION__, *buffer_handle);
7706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      if (GENLOCK_FAILURE == genlock_lock_buffer((native_handle_t*)(*buffer_handle), GENLOCK_WRITE_LOCK,
7716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                                 GENLOCK_MAX_TIMEOUT)) {
7726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            ALOGE("%s: genlock_lock_buffer(WRITE) failed", __FUNCTION__);
7736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	    //mHalCamCtrl->mPreviewMemoryLock.unlock();
7746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev           // return -EINVAL;
7756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      } else  {
7766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_LOCKED;
777c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang        mm_camera_ch_data_buf_t notify;
778c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang        memset(&notify, 0, sizeof(mm_camera_ch_data_buf_t));
779c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang        notify.type = MM_CAMERA_CH_PREVIEW;
780c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang        notify.def.idx = i;
781c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang        notify.def.frame = &mDisplayStreamBuf.frame[i];
782c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang        ALOGV("%s: queueing buffer idx is %d", __func__, i);
783c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang        if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &notify)) {
784c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang            ALOGE("%s: BUF DONE FAILED");
7856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
7866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      }
7876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev     }
7886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  } else
7896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGV("%s: error in dequeue_buffer, enqueue_buffer idx = %d, no free buffer now", __func__, frame->def.idx);
7906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
7916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  /* Save the last displayed frame. We'll be using it to fill the gap between
7926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev     when preview stops and postview start during snapshot.*/
7936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mLastQueuedFrame = &(mDisplayStreamBuf.frame[frame->def.idx]);
7946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->mPreviewMemoryLock.unlock();
7956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
7966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->mCallbackLock.lock();
7976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  camera_data_callback pcb = mHalCamCtrl->mDataCb;
7986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mHalCamCtrl->mCallbackLock.unlock();
7996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ALOGV("Message enabled = 0x%x", mHalCamCtrl->mMsgEnabled);
8006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
8016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  camera_memory_t *previewMem = NULL;
8026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
8036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if (pcb != NULL) {
8046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev       ALOGV("%s: mMsgEnabled =0x%x, preview format =%d", __func__,
8056d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            mHalCamCtrl->mMsgEnabled, mHalCamCtrl->mPreviewFormat);
8066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      //Sending preview callback if corresponding Msgs are enabled
8076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
8086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          ALOGV("%s: PCB callback enabled", __func__);
8096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          msgType |=  CAMERA_MSG_PREVIEW_FRAME;
8106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          int previewBufSize;
8116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          /* The preview buffer size sent back in the callback should be (width*height*bytes_per_pixel)
8126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev           * As all preview formats we support, use 12 bits per pixel, buffer size = previewWidth * previewHeight * 3/2.
8136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev           * We need to put a check if some other formats are supported in future. (punits) */
8146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          if ((mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_NV21) || (mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_NV12) ||
8156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    (mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_YV12))
8166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          {
8176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              if (mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_YV12) {
8186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                previewBufSize = ((mHalCamCtrl->mPreviewWidth+15)/16) *16* mHalCamCtrl->mPreviewHeight +
8196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                  ((mHalCamCtrl->mPreviewWidth/2+15)/16)*16* mHalCamCtrl->mPreviewHeight;
8206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              } else {
8216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                previewBufSize = mHalCamCtrl->mPreviewWidth * mHalCamCtrl->mPreviewHeight * 3/2;
8226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              }
8236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              if(previewBufSize != mHalCamCtrl->mPreviewMemory.private_buffer_handle[frame->def.idx]->size) {
8246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                  previewMem = mHalCamCtrl->mGetMemory(mHalCamCtrl->mPreviewMemory.private_buffer_handle[frame->def.idx]->fd,
8256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                  previewBufSize, 1, mHalCamCtrl->mCallbackCookie);
8266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                  if (!previewMem || !previewMem->data) {
8276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                      ALOGE("%s: mGetMemory failed.\n", __func__);
8286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                  } else {
8296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                      data = previewMem;
8306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                  }
8316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              } else
8326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                    data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];
8336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          } else {
8346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];
8356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                ALOGE("Invalid preview format, buffer size in preview callback may be wrong.");
8366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          }
8376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      } else {
8386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          data = NULL;
8396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      }
8406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      if(msgType) {
8416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          mStopCallbackLock.unlock();
8426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          if(mActive)
8436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev            pcb(msgType, data, 0, metadata, mHalCamCtrl->mCallbackCookie);
8446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          if (previewMem)
8456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              previewMem->release(previewMem);
8466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          mStopCallbackLock.lock();
8476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      }
8486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	  ALOGV("end of cb");
8496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  } else {
8506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s PCB is not enabled", __func__);
8516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
8526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(rcb != NULL && mVFEOutputs == 1)
8536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  {
8546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      int flagwait = 1;
8556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      if(mHalCamCtrl->mStartRecording == true &&
8566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              ( mHalCamCtrl->mMsgEnabled & CAMERA_MSG_VIDEO_FRAME))
8576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      {
8586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if (mHalCamCtrl->mStoreMetaDataInFrame)
8596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        {
8606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          if(mHalCamCtrl->mRecordingMemory.metadata_memory[frame->def.idx])
8616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          {
8626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              flagwait = 1;
8636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              mStopCallbackLock.unlock();
8646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME,
8656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                      mHalCamCtrl->mRecordingMemory.metadata_memory[frame->def.idx],
8666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                      0, mHalCamCtrl->mCallbackCookie);
8676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              mStopCallbackLock.lock();
8686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          }else
8696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              flagwait = 0;
8706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      }
8716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      else
8726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      {
8736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              mStopCallbackLock.unlock();
8746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME,
8756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                      mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx],
8766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                      0, mHalCamCtrl->mCallbackCookie);
8776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              mStopCallbackLock.lock();
8786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      }
8796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
8806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      if(flagwait){
8816d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          Mutex::Autolock rLock(&mHalCamCtrl->mRecordFrameLock);
8826d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          if (mHalCamCtrl->mReleasedRecordingFrame != true) {
8836d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev              mHalCamCtrl->mRecordWait.wait(mHalCamCtrl->mRecordFrameLock);
8846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          }
8856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          mHalCamCtrl->mReleasedRecordingFrame = false;
8866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      }
8876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      }
8886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
8896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  /* Save the last displayed frame. We'll be using it to fill the gap between
8906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev     when preview stops and postview start during snapshot.*/
8916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  //mLastQueuedFrame = frame->def.frame;
8926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev/*
8936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, frame))
8946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  {
8956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGE("BUF DONE FAILED");
8966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      return BAD_VALUE;
8976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
8986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev*/
8996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  return NO_ERROR;
9006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
9016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevstatus_t QCameraStream_preview::processPreviewFrame (
9036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mm_camera_ch_data_buf_t *frame)
9046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
905c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang  return processPreviewFrameWithDisplay(frame);
9066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
9076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
9096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// QCameraStream_preview
9106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
9116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan MalchevQCameraStream_preview::
9136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan MalchevQCameraStream_preview(int cameraId, camera_mode_t mode)
9146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  : QCameraStream(cameraId,mode),
9156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mLastQueuedFrame(NULL),
9166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mNumFDRcvd(0),
9176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mFirstFrameRcvd(false)
9186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  {
9196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mHalCamCtrl = NULL;
9206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: E", __func__);
9216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: X", __func__);
9226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
9236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
9246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// QCameraStream_preview
9256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
9266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan MalchevQCameraStream_preview::~QCameraStream_preview() {
9286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: E", __func__);
9296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	if(mActive) {
9306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		stop();
9316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	}
9326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	if(mInit) {
9336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev		release();
9346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	}
9356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	mInit = false;
9366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	mActive = false;
9376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: X", __func__);
9386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
9406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
9416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// QCameraStream_preview
9426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
9436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevstatus_t QCameraStream_preview::init() {
9456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  status_t ret = NO_ERROR;
9476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ALOGV("%s: E", __func__);
9486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ret = QCameraStream::initChannel (mCameraId, MM_CAMERA_CH_PREVIEW_MASK);
9506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if (NO_ERROR!=ret) {
9516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGE("%s E: can't init native cammera preview ch\n",__func__);
9526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return ret;
9536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
9546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  /* register a notify into the mmmm_camera_t object*/
9566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  (void) cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_PREVIEW,
9576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                     preview_notify_cb,
9586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                     MM_CAMERA_REG_BUF_CB_INFINITE,
9596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                     0,this);
9606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  ALOGV("Debug : %s : cam_evt_register_buf_notify",__func__);
9616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  buffer_handle_t *buffer_handle = NULL;
9626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  int tmp_stride = 0;
9636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  mInit = true;
9646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  return ret;
9656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
9666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
9676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// QCameraStream_preview
9686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
9696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevstatus_t QCameraStream_preview::start()
9716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
9726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: E", __func__);
9736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    status_t ret = NO_ERROR;
9746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    cam_format_t previewFmt;
9756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    Mutex::Autolock lock(mStopCallbackLock);
9766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    /* call start() in parent class to start the monitor thread*/
9786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    //QCameraStream::start ();
9796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    previewFmt = mHalCamCtrl->getPreviewFormat();
9806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    setFormat(MM_CAMERA_CH_PREVIEW_MASK, previewFmt);
9816d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
982c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang    if(NO_ERROR!=initDisplayBuffers()){
983c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang        return BAD_VALUE;
9846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
9856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("Debug : %s : initDisplayBuffers",__func__);
9866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret = cam_config_prepare_buf(mCameraId, &mDisplayBuf);
9886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("Debug : %s : cam_config_prepare_buf",__func__);
9896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(ret != MM_CAMERA_OK) {
9906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGV("%s:reg preview buf err=%d\n", __func__, ret);
9916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ret = BAD_VALUE;
9926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        goto error;
9936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }else {
9946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ret = NO_ERROR;
9956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
9966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
9976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev	/* For preview, the OP_MODE we set is dependent upon whether we are
9986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev       starting camera or camcorder. For snapshot, anyway we disable preview.
9996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev       However, for ZSL we need to set OP_MODE to OP_MODE_ZSL and not
10006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev       OP_MODE_VIDEO. We'll set that for now in CamCtrl. So in case of
10016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev       ZSL we skip setting Mode here */
10026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if (!(myMode & CAMERA_ZSL_MODE)) {
10046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGV("Setting OP MODE to MM_CAMERA_OP_MODE_VIDEO");
10056d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_VIDEO;
10066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ret = cam_config_set_parm (mCameraId, MM_CAMERA_PARM_OP_MODE,
10076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                        &op_mode);
10086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGV("OP Mode Set");
10096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if(MM_CAMERA_OK != ret) {
10116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          ALOGE("%s: X :set mode MM_CAMERA_OP_MODE_VIDEO err=%d\n", __func__, ret);
10126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          ret = BAD_VALUE;
10136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          goto error;
10146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
10156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }else {
10166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ALOGV("Setting OP MODE to MM_CAMERA_OP_MODE_ZSL");
10176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_ZSL;
10186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        ret = cam_config_set_parm (mCameraId, MM_CAMERA_PARM_OP_MODE,
10196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                        &op_mode);
10206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        if(MM_CAMERA_OK != ret) {
10216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          ALOGE("%s: X :set mode MM_CAMERA_OP_MODE_ZSL err=%d\n", __func__, ret);
10226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          ret = BAD_VALUE;
10236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev          goto error;
10246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev        }
10256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev     }
10266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    /* call mm_camera action start(...)  */
10286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("Starting Preview/Video Stream. ");
10296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mFirstFrameRcvd = false;
10306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret = cam_ops_action(mCameraId, true, MM_CAMERA_OPS_PREVIEW, 0);
10316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if (MM_CAMERA_OK != ret) {
10336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGE ("%s: preview streaming start err=%d\n", __func__, ret);
10346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ret = BAD_VALUE;
10356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      goto error;
10366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
10376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("Debug : %s : Preview streaming Started",__func__);
10396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret = NO_ERROR;
10406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mActive =  true;
10426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    goto end;
10436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malcheverror:
10456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    putBufferToSurface();
10466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevend:
10476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: X", __func__);
10486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return ret;
10496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
10506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
10536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// QCameraStream_preview
10546d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
10556d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  void QCameraStream_preview::stop() {
10566d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: E", __func__);
10576d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int ret=MM_CAMERA_OK;
10586d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10596d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(!mActive) {
10606d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      return;
10616d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
10626d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    Mutex::Autolock lock(mStopCallbackLock);
10636d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mActive =  false;
10646d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    /* unregister the notify fn from the mmmm_camera_t object*/
10656d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10666d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: Stop the thread \n", __func__);
10676d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    /* call stop() in parent class to stop the monitor thread*/
10686d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret = cam_ops_action(mCameraId, false, MM_CAMERA_OPS_PREVIEW, 0);
10696d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(MM_CAMERA_OK != ret) {
10706d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGE ("%s: camera preview stop err=%d\n", __func__, ret);
10716d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
10726d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret = cam_config_unprepare_buf(mCameraId, MM_CAMERA_CH_PREVIEW);
10736d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(ret != MM_CAMERA_OK) {
10746d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGE("%s:Unreg preview buf err=%d\n", __func__, ret);
10756d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      //ret = BAD_VALUE;
10766d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
10776d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10786d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    /* In case of a clean stop, we need to clean all buffers*/
10796d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("Debug : %s : Buffer Unprepared",__func__);
10806d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    /*free camera_memory handles and return buffer back to surface*/
1081c707b1d73e29aa8df2a6d2f666eca57e816b0f6eShuzhen Wang    putBufferToSurface();
10826d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10836d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: X", __func__);
10846d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10856d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
10866d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
10876d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// QCameraStream_preview
10886d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
10896d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  void QCameraStream_preview::release() {
10906d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10916d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s : BEGIN",__func__);
10926d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    int ret=MM_CAMERA_OK,i;
10936d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
10946d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(!mInit)
10956d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    {
10966d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGE("%s : Stream not Initalized",__func__);
10976d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      return;
10986d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
10996d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
11006d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(mActive) {
11016d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      this->stop();
11026d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
11036d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
11046d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ret= QCameraStream::deinitChannel(mCameraId, MM_CAMERA_CH_PREVIEW);
11056d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("Debug : %s : De init Channel",__func__);
11066d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    if(ret != MM_CAMERA_OK) {
11076d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      ALOGE("%s:Deinit preview channel failed=%d\n", __func__, ret);
11086d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev      //ret = BAD_VALUE;
11096d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    }
11106d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
11116d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    (void)cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_PREVIEW,
11126d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                      NULL,
11136d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                      (mm_camera_register_buf_cb_type_t)NULL,
11146d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                      NULL,
11156d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                      NULL);
11166d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    mInit = false;
11176d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: END", __func__);
11186d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
11196d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
11206d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
11216d01645739c75116d8940772b80d5b7aba5c39d6Iliyan MalchevQCameraStream*
11226d01645739c75116d8940772b80d5b7aba5c39d6Iliyan MalchevQCameraStream_preview::createInstance(int cameraId,
11236d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev                                      camera_mode_t mode)
11246d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
11256d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  QCameraStream* pme = new QCameraStream_preview(cameraId, mode);
11266d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  return pme;
11276d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
11286d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
11296d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// QCameraStream_preview
11306d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
11316d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
11326d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevvoid QCameraStream_preview::deleteInstance(QCameraStream *p)
11336d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
11346d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  if (p){
11356d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: BEGIN", __func__);
11366d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    p->release();
11376d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    delete p;
11386d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    p = NULL;
11396d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    ALOGV("%s: END", __func__);
11406d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev  }
11416d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
11426d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
11436d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
11446d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev/* Temp helper function */
11456d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchevvoid *QCameraStream_preview::getLastQueuedFrame(void)
11466d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev{
11476d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev    return mLastQueuedFrame;
11486d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}
11496d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev
11506d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
11516d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// No code beyone this line
11526d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev// ---------------------------------------------------------------------------
11536d01645739c75116d8940772b80d5b7aba5c39d6Iliyan Malchev}; // namespace android
1154