1bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/*
2bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** Copyright (c) 2011-2012 Code Aurora Forum. All rights reserved.
3bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani**
4bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** Licensed under the Apache License, Version 2.0 (the "License");
5bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** you may not use this file except in compliance with the License.
6bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** You may obtain a copy of the License at
7bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani**
8bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani**     http://www.apache.org/licenses/LICENSE-2.0
9bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani**
10bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** Unless required by applicable law or agreed to in writing, software
11bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** distributed under the License is distributed on an "AS IS" BASIS,
12bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** See the License for the specific language governing permissions and
14bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** limitations under the License.
15bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani*/
16bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
17bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/*#error uncomment this for compiler test!*/
18bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
19fece04335ca331d76bf84f75d8818f1b24916f4eAjay Dudani#define LOG_TAG "QCameraHWI_Preview"
20bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <utils/Log.h>
21bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <utils/threads.h>
22bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <fcntl.h>
23bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <sys/mman.h>
24bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include "QCameraHAL.h"
25bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include "QCameraHWI.h"
26bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <genlock.h>
27bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <gralloc_priv.h>
28bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
29bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#define UNLIKELY(exp) __builtin_expect(!!(exp), 0)
30bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
31bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/* QCameraHWI_Preview class implementation goes here*/
32bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/* following code implement the preview mode's image capture & display logic of this class*/
33bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
34bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudaninamespace android {
35bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
36bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
37bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// Preview Callback
38bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
39bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatic void preview_notify_cb(mm_camera_ch_data_buf_t *frame,
40bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                void *user_data)
41bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
42bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  QCameraStream_preview *pme = (QCameraStream_preview *)user_data;
43bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mm_camera_ch_data_buf_t *bufs_used = 0;
44bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ALOGV("%s: E", __func__);
45bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  /* for peview data, there is no queue, so directly use*/
46bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(pme==NULL) {
47bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s: X : Incorrect cookie",__func__);
48bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /*Call buf done*/
49bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return;
50bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
51bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
52bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  pme->processPreviewFrame(frame);
53bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ALOGV("%s: X", __func__);
54bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
55bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
56bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t QCameraStream_preview::setPreviewWindow(preview_stream_ops_t* window)
57bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
58bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    status_t retVal = NO_ERROR;
59135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV(" %s: E ", __FUNCTION__);
60bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if( window == NULL) {
61bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ALOGW(" Setting NULL preview window ");
62bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        /* TODO: Current preview window will be invalidated.
63bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani         * Release all the buffers back */
64bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani       // relinquishBuffers();
65bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
66bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    Mutex::Autolock lock(mStopCallbackLock);
67bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mPreviewWindow = window;
68bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGV(" %s : X ", __FUNCTION__ );
69bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return retVal;
70bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
71bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
72a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choistatus_t QCameraStream_preview::getBufferFromSurface()
73a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi{
74bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    int err = 0;
75bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    int numMinUndequeuedBufs = 0;
76a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    int format = 0;
77a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    status_t ret = NO_ERROR;
78a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    int gralloc_usage;
79bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
80135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV(" %s : E ", __FUNCTION__);
81bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
82bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if( mPreviewWindow == NULL) {
83135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim        ALOGE("%s: mPreviewWindow = NULL", __func__);
84bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        return INVALID_OPERATION;
85a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    }
86bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    cam_ctrl_dimension_t dim;
87bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
88a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    //mDisplayLock.lock();
89bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION,&dim);
90bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
91bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	format = mHalCamCtrl->getPreviewFormatInfo().Hal_format;
92bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	if(ret != NO_ERROR) {
93bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ALOGE("%s: display format %d is not supported", __func__, dim.prev_format);
94a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        goto end;
95a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    }
96a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    numMinUndequeuedBufs = 0;
97a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    if(mPreviewWindow->get_min_undequeued_buffer_count) {
98a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        err = mPreviewWindow->get_min_undequeued_buffer_count(mPreviewWindow, &numMinUndequeuedBufs);
99a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        if (err != 0) {
100a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi           ALOGE("get_min_undequeued_buffer_count  failed: %s (%d)",
101a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                strerror(-err), -err);
102a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi           ret = UNKNOWN_ERROR;
103a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi           goto end;
104a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        }
105bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
106bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mHalCamCtrl->mPreviewMemoryLock.lock();
107bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mHalCamCtrl->mPreviewMemory.buffer_count = kPreviewBufferCount + numMinUndequeuedBufs;
108bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(mHalCamCtrl->isZSLMode()) {
109a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        if(mHalCamCtrl->getZSLQueueDepth() > numMinUndequeuedBufs)
110a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi            mHalCamCtrl->mPreviewMemory.buffer_count +=
111a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                mHalCamCtrl->getZSLQueueDepth() - numMinUndequeuedBufs;
112bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
113bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    err = mPreviewWindow->set_buffer_count(mPreviewWindow, mHalCamCtrl->mPreviewMemory.buffer_count );
114bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if (err != 0) {
115a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        ALOGE("set_buffer_count failed: %s (%d)",
116bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                    strerror(-err), -err);
117a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        ret = UNKNOWN_ERROR;
118a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        goto end;
119bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
120bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    err = mPreviewWindow->set_buffers_geometry(mPreviewWindow,
121bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                dim.display_width, dim.display_height, format);
122bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if (err != 0) {
123a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        ALOGE("set_buffers_geometry failed: %s (%d)",
124bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                    strerror(-err), -err);
125a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        ret = UNKNOWN_ERROR;
126a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        goto end;
127bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
128bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
129bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_VFE_OUTPUT_ENABLE, &mVFEOutputs);
130bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(ret != MM_CAMERA_OK) {
131bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ALOGE("get parm MM_CAMERA_PARM_VFE_OUTPUT_ENABLE  failed");
132bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ret = BAD_VALUE;
133bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        goto end;
134bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
135bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
136bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    //as software encoder is used to encode 720p, to enhance the performance
137bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    //cashed pmem is used here
138bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(mVFEOutputs == 1 && dim.display_height == 720)
139bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        gralloc_usage = CAMERA_GRALLOC_HEAP_ID | CAMERA_GRALLOC_FALLBACK_HEAP_ID;
140bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    else
141bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        gralloc_usage = CAMERA_GRALLOC_HEAP_ID | CAMERA_GRALLOC_FALLBACK_HEAP_ID |
142bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                    CAMERA_GRALLOC_CACHING_ID;
143bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    err = mPreviewWindow->set_usage(mPreviewWindow, gralloc_usage);
144bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(err != 0) {
145bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /* set_usage error out */
146bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ALOGE("%s: set_usage rc = %d", __func__, err);
147bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ret = UNKNOWN_ERROR;
148bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        goto end;
149bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
150bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_HFR_FRAME_SKIP, &mHFRFrameSkip);
151bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(ret != MM_CAMERA_OK) {
152bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ALOGE("get parm MM_CAMERA_PARM_HFR_FRAME_SKIP  failed");
153bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ret = BAD_VALUE;
154bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        goto end;
155bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
156bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	for (int cnt = 0; cnt < mHalCamCtrl->mPreviewMemory.buffer_count; cnt++) {
157bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		int stride;
158bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		err = mPreviewWindow->dequeue_buffer(mPreviewWindow,
159bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani										&mHalCamCtrl->mPreviewMemory.buffer_handle[cnt],
160bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani										&mHalCamCtrl->mPreviewMemory.stride[cnt]);
161bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		if(!err) {
162a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi            ALOGV("%s: dequeue buf hdl =%p", __func__, *mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
163a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi            err = mPreviewWindow->lock_buffer(this->mPreviewWindow,
164a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                        mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
165a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi            // lock the buffer using genlock
166a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi            ALOGV("%s: camera call genlock_lock, hdl=%p", __FUNCTION__, (*mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]));
167a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi            if (GENLOCK_NO_ERROR != genlock_lock_buffer((native_handle_t *)(*mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]),
168a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                    GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
169a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                ALOGV("%s: genlock_lock_buffer(WRITE) failed", __FUNCTION__);
170a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_UNLOCKED;
171a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                //mHalCamCtrl->mPreviewMemoryLock.unlock();
172a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                //return -EINVAL;
173a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi            } else {
174a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                ALOGV("%s: genlock_lock_buffer hdl =%p", __FUNCTION__, *mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
175a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_LOCKED;
176a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi            }
177bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		} else {
178a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi            mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_NOT_OWNED;
179a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi            ALOGV("%s: dequeue_buffer idx = %d err = %d", __func__, cnt, err);
180bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
181bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
182fece04335ca331d76bf84f75d8818f1b24916f4eAjay Dudani		ALOGV("%s: dequeue buf: %p\n", __func__, mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
183bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
184bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		if(err != 0) {
185135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim            ALOGE("%s: dequeue_buffer failed: %s (%d)", __func__,
186bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                    strerror(-err), -err);
187bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            ret = UNKNOWN_ERROR;
188bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani			for(int i = 0; i < cnt; i++) {
189bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[i]) {
190a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                    ALOGV("%s: camera call genlock_unlock", __FUNCTION__);
191a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                    if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t *)
192bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                                  (*(mHalCamCtrl->mPreviewMemory.buffer_handle[i])))) {
193135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim                        ALOGE("%s: genlock_unlock_buffer failed: hdl =%p", __FUNCTION__, (*(mHalCamCtrl->mPreviewMemory.buffer_handle[i])) );
194bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                         //mHalCamCtrl->mPreviewMemoryLock.unlock();
195bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        //return -EINVAL;
196a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                    } else {
197a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                        mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_UNLOCKED;
198a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                    }
199bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                }
200bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                if( mHalCamCtrl->mPreviewMemory.local_flag[i] != BUFFER_NOT_OWNED) {
201bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  err = mPreviewWindow->cancel_buffer(mPreviewWindow,
202bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                          mHalCamCtrl->mPreviewMemory.buffer_handle[i]);
203bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                }
204bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_NOT_OWNED;
205a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                ALOGV("%s: cancel_buffer: hdl =%p", __func__,  (*mHalCamCtrl->mPreviewMemory.buffer_handle[i]));
206bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani				mHalCamCtrl->mPreviewMemory.buffer_handle[i] = NULL;
207bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani			}
208bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            memset(&mHalCamCtrl->mPreviewMemory, 0, sizeof(mHalCamCtrl->mPreviewMemory));
209bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani			goto end;
210bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		}
211bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
212bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt] =
213bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		    (struct private_handle_t *)(*mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
214bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#ifdef USE_ION
215bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mHalCamCtrl->mPreviewMemory.main_ion_fd[cnt] = open("/dev/ion", O_RDONLY);
216bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if (mHalCamCtrl->mPreviewMemory.main_ion_fd[cnt] < 0) {
217bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            ALOGE("%s: failed: could not open ion device\n", __func__);
218bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        } else {
219bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mPreviewMemory.ion_info_fd[cnt].fd =
220bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->fd;
221bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            if (ioctl(mHalCamCtrl->mPreviewMemory.main_ion_fd[cnt],
222bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              ION_IOC_IMPORT, &mHalCamCtrl->mPreviewMemory.ion_info_fd[cnt]) < 0)
223bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              ALOGE("ION import failed\n");
224bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
225bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif
226bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		mHalCamCtrl->mPreviewMemory.camera_memory[cnt] =
227bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		    mHalCamCtrl->mGetMemory(mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->fd,
228bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani			mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->size, 1, (void *)this);
229a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi		ALOGV("%s: idx = %d, fd = %d, size = %d, offset = %d", __func__,
230bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            cnt, mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->fd,
231a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->size,
232a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->offset);
233a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    }
234bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
235bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
236a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    memset(&mHalCamCtrl->mMetadata, 0, sizeof(mHalCamCtrl->mMetadata));
237a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    memset(mHalCamCtrl->mFace, 0, sizeof(mHalCamCtrl->mFace));
238bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
239135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV(" %s : X ",__FUNCTION__);
240bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudaniend:
241a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    //mDisplayLock.unlock();
242a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    mHalCamCtrl->mPreviewMemoryLock.unlock();
243bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
244bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return ret;
245bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
246bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
247bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t QCameraStream_preview::putBufferToSurface() {
248bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    int err = 0;
249bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    status_t ret = NO_ERROR;
250bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
251135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV(" %s : E ", __FUNCTION__);
252bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
253bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mHalCamCtrl->mPreviewMemoryLock.lock();
2549e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed    for (int cnt = 0; cnt < mHalCamCtrl->mPreviewMemory.buffer_count; cnt++) {
255bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if (cnt < mHalCamCtrl->mPreviewMemory.buffer_count) {
256bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW, cnt, mCameraId,
257bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                                          CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) {
2589cf33ef69be12d3498cf1c6351b289644ef06a67Azam Sadiq Pasha Kapatrala Syed                ALOGE("%s: unmapping Preview Buffer", __func__);
259bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            }
2609e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed            if(mHalCamCtrl->isZSLMode()) {
2619e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL, cnt, mCameraId,
2629e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                                                          CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) {
2639cf33ef69be12d3498cf1c6351b289644ef06a67Azam Sadiq Pasha Kapatrala Syed                    ALOGE("%s: unmapping Thumbnail Buffer for ZSL", __func__);
2649e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                }
2659e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed            }
266bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
267bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
268bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mHalCamCtrl->mPreviewMemory.camera_memory[cnt]->release(mHalCamCtrl->mPreviewMemory.camera_memory[cnt]);
269bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#ifdef USE_ION
270bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        struct ion_handle_data ion_handle;
271bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ion_handle.handle = mHalCamCtrl->mPreviewMemory.ion_info_fd[cnt].handle;
272bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if (ioctl(mHalCamCtrl->mPreviewMemory.main_ion_fd[cnt], ION_IOC_FREE, &ion_handle)
273bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            < 0)
274bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            ALOGE("%s: ion free failed\n", __func__);
275bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        close(mHalCamCtrl->mPreviewMemory.main_ion_fd[cnt]);
276bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif
277bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[cnt]) {
278a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                ALOGV("%s: camera call genlock_unlock", __FUNCTION__);
279bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	        if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t *)
280bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                                    (*(mHalCamCtrl->mPreviewMemory.buffer_handle[cnt])))) {
281135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim                    ALOGE("%s: genlock_unlock_buffer failed, handle =%p", __FUNCTION__, (*(mHalCamCtrl->mPreviewMemory.buffer_handle[cnt])));
282bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                    continue;
283bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	                //mHalCamCtrl->mPreviewMemoryLock.unlock();
284bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                    //return -EINVAL;
285bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                } else {
286bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
287a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                    ALOGV("%s: genlock_unlock_buffer, handle =%p", __FUNCTION__, (*(mHalCamCtrl->mPreviewMemory.buffer_handle[cnt])));
288bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                    mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_UNLOCKED;
289bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                }
290bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            }
291bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani             if( mHalCamCtrl->mPreviewMemory.local_flag[cnt] != BUFFER_NOT_OWNED) {
292bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               err = mPreviewWindow->cancel_buffer(mPreviewWindow, mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
293a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi               ALOGV("%s: cancel_buffer: hdl =%p", __func__,  (*mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]));
294bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani             }
295bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani             mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_NOT_OWNED;
296bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
297a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi		ALOGV(" put buffer %d successfully", cnt);
298bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	}
299bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
300bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if (mDisplayBuf.preview.buf.mp != NULL) {
301bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        delete[] mDisplayBuf.preview.buf.mp;
302bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp = NULL;
303bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
304bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
305bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mHalCamCtrl->mPreviewMemoryLock.unlock();
306bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	memset(&mHalCamCtrl->mPreviewMemory, 0, sizeof(mHalCamCtrl->mPreviewMemory));
307135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV(" %s : X ",__FUNCTION__);
308bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return NO_ERROR;
309bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
310bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
311bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
312bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t  QCameraStream_preview::getBufferNoDisplay( )
313bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
314bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int err = 0;
315bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  status_t ret = NO_ERROR;
316bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int i, num_planes, frame_len, y_off, cbcr_off;
317bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cam_ctrl_dimension_t dim;
318bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  uint32_t planes[VIDEO_MAX_PLANES];
319bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
320135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim  ALOGV("%s : E ", __FUNCTION__);
321bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
322bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
323bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim);
324bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(ret != NO_ERROR) {
325bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      ALOGE("%s: display format %d is not supported", __func__, dim.prev_format);
326bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    goto end;
327bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
328bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.lock();
329bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mNoDispPreviewMemory.buffer_count = kPreviewBufferCount;
330bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(mHalCamCtrl->isZSLMode()) {
331bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(mHalCamCtrl->getZSLQueueDepth() > kPreviewBufferCount - 3)
332bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mHalCamCtrl->mNoDispPreviewMemory.buffer_count =
333bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mHalCamCtrl->getZSLQueueDepth() + 3;
334bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
335bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
336bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  num_planes = dim.display_frame_offset.num_planes;
337bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  for ( i = 0; i < num_planes; i++) {
338bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    planes[i] = dim.display_frame_offset.mp[i].len;
339bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
340bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
341bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  frame_len = dim.picture_frame_offset.frame_len;
342bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  y_off = dim.picture_frame_offset.mp[0].offset;
343bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cbcr_off = dim.picture_frame_offset.mp[1].offset;
344a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi  ALOGV("%s: main image: rotation = %d, yoff = %d, cbcroff = %d, size = %d, width = %d, height = %d",
345bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani       __func__, dim.rotation, y_off, cbcr_off, frame_len,
346bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani       dim.display_width, dim.display_height);
347bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (mHalCamCtrl->initHeapMem(&mHalCamCtrl->mNoDispPreviewMemory,
348bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     mHalCamCtrl->mNoDispPreviewMemory.buffer_count,
349bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     frame_len, y_off, cbcr_off, MSM_PMEM_MAINIMG,
350bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     NULL,NULL, num_planes, planes) < 0) {
351bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              ret = NO_MEMORY;
352bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              goto end;
353bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  };
354bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
355bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mHalCamCtrl->mMetadata, 0, sizeof(mHalCamCtrl->mMetadata));
356bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(mHalCamCtrl->mFace, 0, sizeof(mHalCamCtrl->mFace));
357bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
358a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi  ALOGV(" %s : X ",__FUNCTION__);
359bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudaniend:
360bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  //mDisplayLock.unlock();
361bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.unlock();
362bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
363bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  return NO_ERROR;
364bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
365bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
366bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t   QCameraStream_preview::freeBufferNoDisplay()
367bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
368bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int err = 0;
369bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  status_t ret = NO_ERROR;
370bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
371135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim  ALOGV(" %s : E ", __FUNCTION__);
372bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
373bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  //mDisplayLock.lock();
374bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.lock();
375bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  for (int cnt = 0; cnt < mHalCamCtrl->mNoDispPreviewMemory.buffer_count; cnt++) {
376bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if (cnt < mHalCamCtrl->mNoDispPreviewMemory.buffer_count) {
377bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW,
378bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                       cnt, mCameraId, CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) {
379bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              ALOGE("%s: sending data Msg Failed", __func__);
380bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          }
3819e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed          if(mHalCamCtrl->isZSLMode()) {
3829e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed              if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL, cnt, mCameraId,
3839e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                                                            CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) {
3849e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                  ALOGE("%s: Send socket msg to Unmap Failed", __func__);
3859e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed              }
3869e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed          }
387bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
388bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
389bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mNoDispPreviewMemory);
390bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mHalCamCtrl->mNoDispPreviewMemory, 0, sizeof(mHalCamCtrl->mNoDispPreviewMemory));
391bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (mDisplayBuf.preview.buf.mp != NULL) {
392bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      delete[] mDisplayBuf.preview.buf.mp;
393bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp = NULL;
394bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
395bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
396bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.unlock();
397135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim  ALOGV(" %s : X ",__FUNCTION__);
398bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  return NO_ERROR;
399bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
400bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
401bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanivoid QCameraStream_preview::notifyROIEvent(fd_roi_t roi)
402bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
403dc0f71059fd78f5dcf09aca4967b14439a6611b1insup.choi    camera_memory_t *data = mHalCamCtrl->mGetMemory(-1, 1, 1, NULL);
404bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    switch (roi.type) {
405bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    case FD_ROI_TYPE_HEADER:
406bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        {
407bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mDisplayLock.lock();
408bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mNumFDRcvd = 0;
409bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            memset(mHalCamCtrl->mFace, 0, sizeof(mHalCamCtrl->mFace));
410bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mMetadata.faces = mHalCamCtrl->mFace;
411bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mMetadata.number_of_faces = roi.d.hdr.num_face_detected;
412bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            if(mHalCamCtrl->mMetadata.number_of_faces > MAX_ROI)
413bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              mHalCamCtrl->mMetadata.number_of_faces = MAX_ROI;
414bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mDisplayLock.unlock();
415bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
416bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            if (mHalCamCtrl->mMetadata.number_of_faces == 0) {
417bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                // Clear previous faces
418bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                mHalCamCtrl->mCallbackLock.lock();
419bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                camera_data_callback pcb = mHalCamCtrl->mDataCb;
420bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                mHalCamCtrl->mCallbackLock.unlock();
421bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
422bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                if (pcb && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_METADATA)){
423a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                    ALOGV("%s: Face detection RIO callback", __func__);
424dc0f71059fd78f5dcf09aca4967b14439a6611b1insup.choi                    pcb(CAMERA_MSG_PREVIEW_METADATA, data, 0, &mHalCamCtrl->mMetadata, mHalCamCtrl->mCallbackCookie);
425bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                }
426bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            }
427bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
428bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        break;
429bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    case FD_ROI_TYPE_DATA:
430bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        {
431dc0f71059fd78f5dcf09aca4967b14439a6611b1insup.choi        #if 1
432bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mDisplayLock.lock();
433bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            int idx = roi.d.data.idx;
434bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            if (idx >= mHalCamCtrl->mMetadata.number_of_faces) {
435bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                mDisplayLock.unlock();
436bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                ALOGE("%s: idx %d out of boundary %d", __func__, idx, mHalCamCtrl->mMetadata.number_of_faces);
437bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                break;
438bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            }
439bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
440bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].id = roi.d.data.face.id;
441bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].score = roi.d.data.face.score;
442bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
443bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            // top
444bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].rect[0] =
445bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               roi.d.data.face.face_boundary.x*2000/mHalCamCtrl->mDimension.display_width - 1000;
446bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            //right
447bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].rect[1] =
448bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               roi.d.data.face.face_boundary.y*2000/mHalCamCtrl->mDimension.display_height - 1000;
449bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            //bottom
450bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].rect[2] =  mHalCamCtrl->mFace[idx].rect[0] +
451bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               roi.d.data.face.face_boundary.dx*2000/mHalCamCtrl->mDimension.display_width;
452bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            //left
453bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].rect[3] = mHalCamCtrl->mFace[idx].rect[1] +
454bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               roi.d.data.face.face_boundary.dy*2000/mHalCamCtrl->mDimension.display_height;
455bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
456bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            // Center of left eye
457bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].left_eye[0] =
458bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              roi.d.data.face.left_eye_center[0]*2000/mHalCamCtrl->mDimension.display_width - 1000;
459bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].left_eye[1] =
460bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              roi.d.data.face.left_eye_center[1]*2000/mHalCamCtrl->mDimension.display_height - 1000;
461bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
462bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            // Center of right eye
463bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].right_eye[0] =
464bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              roi.d.data.face.right_eye_center[0]*2000/mHalCamCtrl->mDimension.display_width - 1000;
465bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].right_eye[1] =
466bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              roi.d.data.face.right_eye_center[1]*2000/mHalCamCtrl->mDimension.display_height - 1000;
467dc0f71059fd78f5dcf09aca4967b14439a6611b1insup.choi#if 0
468bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            // Center of mouth
469bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].mouth[0] =
470bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              roi.d.data.face.mouth_center[0]*2000/mHalCamCtrl->mDimension.display_width - 1000;
471bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].mouth[1] =
472bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              roi.d.data.face.mouth_center[1]*2000/mHalCamCtrl->mDimension.display_height - 1000;
473bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
474bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].smile_degree = roi.d.data.face.smile_degree;
475bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].smile_score = roi.d.data.face.smile_confidence;
476bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].blink_detected = roi.d.data.face.blink_detected;
477bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].face_recognised = roi.d.data.face.is_face_recognised;
478bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].gaze_angle = roi.d.data.face.gaze_angle;
4790ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
480bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            /* newly added */
4810ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            // upscale by 2 to recover from demaen downscaling
4820ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            mHalCamCtrl->mFace[idx].updown_dir = roi.d.data.face.updown_dir*2;
4830ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            mHalCamCtrl->mFace[idx].leftright_dir = roi.d.data.face.leftright_dir*2;
4840ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed            mHalCamCtrl->mFace[idx].roll_dir = roi.d.data.face.roll_dir*2;
4850ac1f42da2fc99003156c512fcea3fc6338912ceAzam Sadiq Pasha Kapatrala Syed
486bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].leye_blink = roi.d.data.face.left_blink;
487bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].reye_blink = roi.d.data.face.right_blink;
488bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].left_right_gaze = roi.d.data.face.left_right_gaze;
489bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mFace[idx].top_bottom_gaze = roi.d.data.face.top_bottom_gaze;
490bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            ALOGE("%s: Face(%d, %d, %d, %d), leftEye(%d, %d), rightEye(%d, %d), mouth(%d, %d), smile(%d, %d), face_recg(%d)", __func__,
491bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].rect[0],  mHalCamCtrl->mFace[idx].rect[1],
492bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].rect[2],  mHalCamCtrl->mFace[idx].rect[3],
493bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].left_eye[0], mHalCamCtrl->mFace[idx].left_eye[1],
494bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].right_eye[0], mHalCamCtrl->mFace[idx].right_eye[1],
495bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].mouth[0], mHalCamCtrl->mFace[idx].mouth[1],
496bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].smile_degree, mHalCamCtrl->mFace[idx].smile_score,
497bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].face_recognised);
498bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            ALOGE("%s: gaze(%d, %d, %d), updown(%d), leftright(%d), roll(%d), blink(%d, %d, %d)", __func__,
499bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].gaze_angle,  mHalCamCtrl->mFace[idx].left_right_gaze,
500bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].top_bottom_gaze,  mHalCamCtrl->mFace[idx].updown_dir,
501bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].leftright_dir, mHalCamCtrl->mFace[idx].roll_dir,
502bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].blink_detected,
503bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani               mHalCamCtrl->mFace[idx].leye_blink, mHalCamCtrl->mFace[idx].reye_blink);
504dc0f71059fd78f5dcf09aca4967b14439a6611b1insup.choi#endif
505bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani             mNumFDRcvd++;
506bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani             mDisplayLock.unlock();
507bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
508bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani             if (mNumFDRcvd == mHalCamCtrl->mMetadata.number_of_faces) {
509bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                 mHalCamCtrl->mCallbackLock.lock();
510bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                 camera_data_callback pcb = mHalCamCtrl->mDataCb;
511bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                 mHalCamCtrl->mCallbackLock.unlock();
512bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
513bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                 if (pcb && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_METADATA)){
514a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi                     ALOGV("%s: Face detection RIO callback with %d faces detected (score=%d)", __func__, mNumFDRcvd, mHalCamCtrl->mFace[idx].score);
515dc0f71059fd78f5dcf09aca4967b14439a6611b1insup.choi                     pcb(CAMERA_MSG_PREVIEW_METADATA, data, 0, &mHalCamCtrl->mMetadata, mHalCamCtrl->mCallbackCookie);
516bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                 }
517bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani             }
518bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        #endif
519bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
520bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        break;
521bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
522dc0f71059fd78f5dcf09aca4967b14439a6611b1insup.choi    if(NULL != data) data->release(data);
523bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
524bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
525bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t QCameraStream_preview::initDisplayBuffers()
526bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
527bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  status_t ret = NO_ERROR;
528bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int width = 0;  /* width of channel  */
529bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int height = 0; /* height of channel */
530bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  uint32_t frame_len = 0; /* frame planner length */
531f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed  int buffer_num = 4, i; /* number of buffers for display */
532bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  const char *pmem_region;
533bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  uint8_t num_planes = 0;
534bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  uint32_t planes[VIDEO_MAX_PLANES];
535bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  void *vaddr = NULL;
536bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cam_ctrl_dimension_t dim;
537bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
538135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim  ALOGV("%s:BEGIN",__func__);
539bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mHalCamCtrl->mMetadata, 0, sizeof(camera_frame_metadata_t));
540bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.lock();
541bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mHalCamCtrl->mPreviewMemory, 0, sizeof(mHalCamCtrl->mPreviewMemory));
542bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.unlock();
543bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mNotifyBuffer, 0, sizeof(mNotifyBuffer));
544bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
545bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/* get preview size, by qury mm_camera*/
546bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
547bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
548bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&(this->mDisplayStreamBuf),0, sizeof(this->mDisplayStreamBuf));
549bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
550bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim);
551bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (MM_CAMERA_OK != ret) {
552bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s: error - can't get camera dimension!", __func__);
553135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV("%s: X", __func__);
554bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return BAD_VALUE;
555bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }else {
556bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    width =  dim.display_width,
557bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    height = dim.display_height;
558bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
559bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
560bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ret = getBufferFromSurface();
561bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(ret != NO_ERROR) {
562bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s: cannot get memory from surface texture client, ret = %d", __func__, ret);
563bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return ret;
564bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
565bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
566bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  /* set 4 buffers for display */
567bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.lock();
568bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mDisplayStreamBuf, 0, sizeof(mDisplayStreamBuf));
569bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  this->mDisplayStreamBuf.num = mHalCamCtrl->mPreviewMemory.buffer_count;
570bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  this->myMode=myMode; /*Need to assign this in constructor after translating from mask*/
571f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed  num_planes = dim.display_frame_offset.num_planes;
572f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed  for(i =0; i< num_planes; i++) {
573f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed     planes[i] = dim.display_frame_offset.mp[i].len;
574f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed  }
575bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  this->mDisplayStreamBuf.frame_len = dim.display_frame_offset.frame_len;
576bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
577bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mDisplayBuf, 0, sizeof(mDisplayBuf));
578bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mDisplayBuf.preview.buf.mp = new mm_camera_mp_buf_t[mDisplayStreamBuf.num];
579bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (!mDisplayBuf.preview.buf.mp) {
580bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s Error allocating memory for mplanar struct ", __func__);
581bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ret = NO_MEMORY;
582bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    goto error;
583bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
584bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(mDisplayBuf.preview.buf.mp, 0,
585bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayStreamBuf.num * sizeof(mm_camera_mp_buf_t));
586bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
587bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  /*allocate memory for the buffers*/
588bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  for(int i = 0; i < mDisplayStreamBuf.num; i++){
589bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	  if (mHalCamCtrl->mPreviewMemory.private_buffer_handle[i] == NULL)
590bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		  continue;
591bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].fd = mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->fd;
592bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].cbcr_off = planes[0];
593bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].y_off = 0;
594bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].path = OUTPUT_TYPE_P;
595bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	  mHalCamCtrl->mPreviewMemory.addr_offset[i] =
596bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	      mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->offset;
597bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].buffer =
598bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          (long unsigned int)mHalCamCtrl->mPreviewMemory.camera_memory[i]->data;
599bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].ion_alloc.len = mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size;
600bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].ion_dev_fd = mHalCamCtrl->mPreviewMemory.main_ion_fd[i];
601bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].fd_data = mHalCamCtrl->mPreviewMemory.ion_info_fd[i];
602bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
603a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("%s: idx = %d, fd = %d, size = %d, cbcr_offset = %d, y_offset = %d, "
604bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      "offset = %d, vaddr = 0x%x", __func__, i, mDisplayStreamBuf.frame[i].fd,
605bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size,
606bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].cbcr_off, mDisplayStreamBuf.frame[i].y_off,
607bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mHalCamCtrl->mPreviewMemory.addr_offset[i],
608bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      (uint32_t)mDisplayStreamBuf.frame[i].buffer);
609bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
610bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ret = mHalCamCtrl->sendMappingBuf(
611bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW,
612bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        i,
613bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        mDisplayStreamBuf.frame[i].fd,
614bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size,
615bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        mCameraId, CAM_SOCK_MSG_TYPE_FD_MAPPING);
616bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if (NO_ERROR != ret) {
617bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      ALOGE("%s: sending mapping data Msg Failed", __func__);
618bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      goto error;
619bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
620bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
6219e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed    if(mHalCamCtrl->isZSLMode()) {
6229e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed         ret = mHalCamCtrl->sendMappingBuf(
6239e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                        MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL,
6249e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                        i,
6259e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                        mDisplayStreamBuf.frame[i].fd,
6269e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                        mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size,
6279e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                        mCameraId, CAM_SOCK_MSG_TYPE_FD_MAPPING);
6289e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed        if (NO_ERROR != ret) {
6299e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed          ALOGE("%s: Send socket msg to map Failed", __func__);
6309e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed          goto error;
6319e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed        }
6329e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed    }
633bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].frame = mDisplayStreamBuf.frame[i];
634bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].frame_offset = mHalCamCtrl->mPreviewMemory.addr_offset[i];
635bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].num_planes = num_planes;
636bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
637bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /* Plane 0 needs to be set seperately. Set other planes
638bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     * in a loop. */
639bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].planes[0].length = planes[0];
640bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].planes[0].m.userptr = mDisplayStreamBuf.frame[i].fd;
641bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].planes[0].data_offset = 0;
642bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].planes[0].reserved[0] =
643bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp[i].frame_offset;
644bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    for (int j = 1; j < num_planes; j++) {
645bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp[i].planes[j].length = planes[j];
646bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr =
647bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayStreamBuf.frame[i].fd;
648bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp[i].planes[j].data_offset = 0;
649bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0] =
650bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp[i].planes[j-1].reserved[0] +
651bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp[i].planes[j-1].length;
652bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
653bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
654bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    for (int j = 0; j < num_planes; j++)
655a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi      ALOGV("Planes: %d length: %d userptr: %lu offset: %d\n", j,
656bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp[i].planes[j].length,
657bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr,
658bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0]);
659bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }/*end of for loop*/
660bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
661bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani /* register the streaming buffers for the channel*/
662bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mDisplayBuf.ch_type = MM_CAMERA_CH_PREVIEW;
663bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mDisplayBuf.preview.num = mDisplayStreamBuf.num;
664bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.unlock();
665135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim  ALOGV("%s:END",__func__);
666bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  return NO_ERROR;
667bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
668bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanierror:
669bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mHalCamCtrl->mPreviewMemoryLock.unlock();
670bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    putBufferToSurface();
671bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
672bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGV("%s: X", __func__);
673bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return ret;
674bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
675bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
676bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t QCameraStream_preview::initPreviewOnlyBuffers()
677bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
678bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  status_t ret = NO_ERROR;
679bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int width = 0;  /* width of channel  */
680bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int height = 0; /* height of channel */
681bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  uint32_t frame_len = 0; /* frame planner length */
682bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int buffer_num = 4; /* number of buffers for display */
683bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  const char *pmem_region;
684bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  uint8_t num_planes = 0;
685bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  uint32_t planes[VIDEO_MAX_PLANES];
686bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
687bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cam_ctrl_dimension_t dim;
688bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
689135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim  ALOGV("%s:BEGIN",__func__);
690bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mHalCamCtrl->mMetadata, 0, sizeof(camera_frame_metadata_t));
691bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.lock();
692bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mHalCamCtrl->mNoDispPreviewMemory, 0, sizeof(mHalCamCtrl->mNoDispPreviewMemory));
693bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.unlock();
694bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mNotifyBuffer, 0, sizeof(mNotifyBuffer));
695bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
696bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/* get preview size, by qury mm_camera*/
697bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
698bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim);
699bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (MM_CAMERA_OK != ret) {
700bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s: error - can't get camera dimension!", __func__);
701135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV("%s: X", __func__);
702bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return BAD_VALUE;
703bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }else {
704bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    width =  dim.display_width;
705bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    height = dim.display_height;
706bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
707bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
708bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ret = getBufferNoDisplay( );
709bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(ret != NO_ERROR) {
710bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s: cannot get memory from surface texture client, ret = %d", __func__, ret);
711bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return ret;
712bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
713bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
714bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  /* set 4 buffers for display */
715bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mDisplayStreamBuf, 0, sizeof(mDisplayStreamBuf));
716bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.lock();
717bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  this->mDisplayStreamBuf.num = mHalCamCtrl->mNoDispPreviewMemory.buffer_count;
718bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  this->myMode=myMode; /*Need to assign this in constructor after translating from mask*/
719bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  num_planes = dim.display_frame_offset.num_planes;
720bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  for (int i = 0; i < num_planes; i++) {
721bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    planes[i] = dim.display_frame_offset.mp[i].len;
722bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
723bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  this->mDisplayStreamBuf.frame_len = dim.display_frame_offset.frame_len;
724bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
725bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(&mDisplayBuf, 0, sizeof(mDisplayBuf));
726bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mDisplayBuf.preview.buf.mp = new mm_camera_mp_buf_t[mDisplayStreamBuf.num];
727bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (!mDisplayBuf.preview.buf.mp) {
728bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s Error allocating memory for mplanar struct ", __func__);
729bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
730bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  memset(mDisplayBuf.preview.buf.mp, 0,
731bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayStreamBuf.num * sizeof(mm_camera_mp_buf_t));
732bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
733bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  /*allocate memory for the buffers*/
734bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  void *vaddr = NULL;
735bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  for(int i = 0; i < mDisplayStreamBuf.num; i++){
736bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	  if (mHalCamCtrl->mNoDispPreviewMemory.camera_memory[i] == NULL)
737bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		  continue;
738bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].fd = mHalCamCtrl->mNoDispPreviewMemory.fd[i];
739bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].cbcr_off = planes[0];
740bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].y_off = 0;
741bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].path = OUTPUT_TYPE_P;
742bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].buffer =
743bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          (long unsigned int)mHalCamCtrl->mNoDispPreviewMemory.camera_memory[i]->data;
744bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].ion_dev_fd = mHalCamCtrl->mNoDispPreviewMemory.main_ion_fd[i];
745bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].fd_data = mHalCamCtrl->mNoDispPreviewMemory.ion_info_fd[i];
746bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
747a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("%s: idx = %d, fd = %d, size = %d, cbcr_offset = %d, y_offset = %d, "
748bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      "vaddr = 0x%x", __func__, i, mDisplayStreamBuf.frame[i].fd,
749bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      frame_len,
750bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayStreamBuf.frame[i].cbcr_off, mDisplayStreamBuf.frame[i].y_off,
751bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      (uint32_t)mDisplayStreamBuf.frame[i].buffer);
752bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
753bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if (NO_ERROR != mHalCamCtrl->sendMappingBuf(
754bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW,
755bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        i,
756bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        mDisplayStreamBuf.frame[i].fd,
757bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        mHalCamCtrl->mNoDispPreviewMemory.size,
758bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                        mCameraId, CAM_SOCK_MSG_TYPE_FD_MAPPING)) {
759bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      ALOGE("%s: sending mapping data Msg Failed", __func__);
760bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
761bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
7629e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed    if(mHalCamCtrl->isZSLMode()) {
7639e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed        if (NO_ERROR != mHalCamCtrl->sendMappingBuf(
7649e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                    MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL,
7659e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                    i,
7669e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                    mDisplayStreamBuf.frame[i].fd,
7679e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                    mHalCamCtrl->mNoDispPreviewMemory.size,
7689e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed                    mCameraId, CAM_SOCK_MSG_TYPE_FD_MAPPING)) {
7699e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed            ALOGE("%s: sending mapping data Msg Failed", __func__);
7709e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed        }
7719e512d97d308ba0b78fe4c9e16bbc5b19223357dAzam Sadiq Pasha Kapatrala Syed    }
772bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].frame = mDisplayStreamBuf.frame[i];
773bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].frame_offset = mDisplayStreamBuf.frame[i].y_off;
774bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].num_planes = num_planes;
775bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
776bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /* Plane 0 needs to be set seperately. Set other planes
777bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     * in a loop. */
778bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].planes[0].length = planes[0];
779bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].planes[0].m.userptr = mDisplayStreamBuf.frame[i].fd;
780bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].planes[0].data_offset = 0;
781bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mDisplayBuf.preview.buf.mp[i].planes[0].reserved[0] =
782bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp[i].frame_offset;
783bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    for (int j = 1; j < num_planes; j++) {
784bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp[i].planes[j].length = planes[j];
785bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr =
786bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayStreamBuf.frame[i].fd;
787bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp[i].planes[j].data_offset = 0;
788bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0] =
789bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp[i].planes[j-1].reserved[0] +
790bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp[i].planes[j-1].length;
791bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
792bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
793bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    for (int j = 0; j < num_planes; j++)
794a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi      ALOGV("Planes: %d length: %d userptr: %lu offset: %d\n", j,
795bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp[i].planes[j].length,
796bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr,
797bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0]);
798bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }/*end of for loop*/
799bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
800bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani /* register the streaming buffers for the channel*/
801bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mDisplayBuf.ch_type = MM_CAMERA_CH_PREVIEW;
802bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mDisplayBuf.preview.num = mDisplayStreamBuf.num;
803bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.unlock();
804135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim  ALOGV("%s:END",__func__);
805bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  return NO_ERROR;
806bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
807bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudaniend:
808bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (MM_CAMERA_OK == ret ) {
809bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGV("%s: X - NO_ERROR ", __func__);
810bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return NO_ERROR;
811bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
812bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
813a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("%s: out of memory clean up", __func__);
814bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  /* release the allocated memory */
815bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
816bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ALOGV("%s: X - BAD_VALUE ", __func__);
817bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  return BAD_VALUE;
818bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
819bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
820bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
821bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanivoid QCameraStream_preview::dumpFrameToFile(struct msm_frame* newFrame)
822bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
82352fd019ffdd706751564b7eef71fa5e68a647987Azam Sadiq Pasha Kapatrala Syed#if 0
824bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int32_t enabled = 0;
825bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int frm_num;
826bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  uint32_t  skip_mode;
827bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  char value[PROPERTY_VALUE_MAX];
828bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  char buf[32];
829bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int w, h;
830bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  static int count = 0;
831bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cam_ctrl_dimension_t dim;
832bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int file_fd;
833bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int rc = 0;
834bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int len;
835bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  unsigned long addr;
836bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  unsigned long * tmp = (unsigned long *)newFrame->buffer;
837bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  addr = *tmp;
838bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  status_t ret = cam_config_get_parm(mHalCamCtrl->mCameraId,
839bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                 MM_CAMERA_PARM_DIMENSION, &dim);
840bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
841bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  w = dim.display_width;
842bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  h = dim.display_height;
843bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  len = (w * h)*3/2;
844bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  count++;
845bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(count < 100) {
846bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    snprintf(buf, sizeof(buf), "/data/mzhu%d.yuv", count);
847bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    file_fd = open(buf, O_RDWR | O_CREAT, 0777);
848bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
849bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    rc = write(file_fd, (const void *)addr, len);
850a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("%s: file='%s', vaddr_old=0x%x, addr_map = 0x%p, len = %d, rc = %d",
851bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          __func__, buf, (uint32_t)newFrame->buffer, (void *)addr, len, rc);
852bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    close(file_fd);
853a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("%s: dump %s, rc = %d, len = %d", __func__, buf, rc, len);
854bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
85552fd019ffdd706751564b7eef71fa5e68a647987Azam Sadiq Pasha Kapatrala Syed#endif
856bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
857bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
858bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t QCameraStream_preview::processPreviewFrameWithDisplay(
859bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mm_camera_ch_data_buf_t *frame)
860bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
861bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ALOGV("%s",__func__);
862bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int err = 0;
863bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int msgType = 0;
864bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int i;
865bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  camera_memory_t *data = NULL;
866bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  camera_frame_metadata_t *metadata = NULL;
867bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
868bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  Mutex::Autolock lock(mStopCallbackLock);
869bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(!mActive) {
870a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("Preview Stopped. Returning callback");
871bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return NO_ERROR;
872bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
873bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
874bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(mHalCamCtrl==NULL) {
875bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s: X: HAL control object not set",__func__);
876bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /*Call buf done*/
877bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return BAD_VALUE;
878bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
87990ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed
88090ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed  if(mHalCamCtrl->mPauseFramedispatch) {
88190ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed      if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, frame)) {
88290ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed            ALOGE("BUF DONE FAILED for the recylce buffer");
88390ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed      }
88490ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed      return NO_ERROR;
88590ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed  }
886bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mCallbackLock.lock();
887bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  camera_data_timestamp_callback rcb = mHalCamCtrl->mDataCbTimestamp;
888bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  void *rdata = mHalCamCtrl->mCallbackCookie;
889bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mCallbackLock.unlock();
890bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  nsecs_t timeStamp = seconds_to_nanoseconds(frame->def.frame->ts.tv_sec) ;
891bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  timeStamp += frame->def.frame->ts.tv_nsec;
892bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
893bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(mFirstFrameRcvd == false) {
894bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mm_camera_util_profile("HAL: First preview frame received");
895bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mFirstFrameRcvd = true;
896bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
897bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
898bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (UNLIKELY(mHalCamCtrl->mDebugFps)) {
899bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mHalCamCtrl->debugShowPreviewFPS();
900bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
901bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  //dumpFrameToFile(frame->def.frame);
902bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_PREVIEW);
903bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
904bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.lock();
905bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mNotifyBuffer[frame->def.idx] = *frame;
906bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
907a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi  ALOGV("Enqueue buf handle %p\n",
908bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
909994c0a3c531677b4b16825a988b4a89dc0af58e8Azam Sadiq Pasha Kapatrala Syed  ALOGV("%s: camera call genlock_unlock", __FUNCTION__);
91090ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed
911bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx]) {
912a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi      ALOGV("%s: genlock_unlock_buffer hdl =%p", __FUNCTION__, (*mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]));
913bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t*)
91490ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed                (*mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]))) {
915bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            ALOGE("%s: genlock_unlock_buffer failed", __FUNCTION__);
91690ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed            //mHalCamCtrl->mPreviewMemoryLock.unlock();
917bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            //return -EINVAL;
918bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        } else {
919bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx] = BUFFER_UNLOCKED;
920bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
921bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    } else {
922bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ALOGE("%s: buffer to be enqueued is not locked", __FUNCTION__);
923bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	    //mHalCamCtrl->mPreviewMemoryLock.unlock();
924bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        //return -EINVAL;
925bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
926bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
927bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#ifdef USE_ION
928bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  struct ion_flush_data cache_inv_data;
929bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int ion_fd;
930bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ion_fd = frame->def.frame->ion_dev_fd;
931bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cache_inv_data.vaddr = (void *)frame->def.frame->buffer;
932bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cache_inv_data.fd = frame->def.frame->fd;
933bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cache_inv_data.handle = frame->def.frame->fd_data.handle;
934bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cache_inv_data.length = frame->def.frame->ion_alloc.len;
935bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
936ac1fa4b9f4985a4ead0b219a7b3318cdd0da43aataeyol.kim  if (mHalCamCtrl->cache_ops(ion_fd, &cache_inv_data,
937ac1fa4b9f4985a4ead0b219a7b3318cdd0da43aataeyol.kim                                ION_IOC_CLEAN_INV_CACHES) < 0)
938bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s: Cache clean for Preview buffer %p fd = %d failed", __func__,
939bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      cache_inv_data.vaddr, cache_inv_data.fd);
940bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif
941bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
942bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(mHFRFrameSkip == 1)
943bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  {
944bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      const char *str = mHalCamCtrl->mParameters.get(
945bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                          QCameraParameters::KEY_VIDEO_HIGH_FRAME_RATE);
946bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(str != NULL){
947bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      int is_hfr_off = 0;
948bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mHFRFrameCnt++;
949bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(!strcmp(str, QCameraParameters::VIDEO_HFR_OFF)) {
950bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          is_hfr_off = 1;
951bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow,
952bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
953bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      } else if (!strcmp(str, QCameraParameters::VIDEO_HFR_2X)) {
954bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          mHFRFrameCnt %= 2;
955bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      } else if (!strcmp(str, QCameraParameters::VIDEO_HFR_3X)) {
956bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          mHFRFrameCnt %= 3;
957bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      } else if (!strcmp(str, QCameraParameters::VIDEO_HFR_4X)) {
958bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          mHFRFrameCnt %= 4;
959bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
960bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(mHFRFrameCnt == 0)
961bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow,
962bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
963bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      else if(!is_hfr_off)
964bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          err = this->mPreviewWindow->cancel_buffer(this->mPreviewWindow,
965bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
966bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      } else
967bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow,
968bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
969bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  } else {
970bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow,
971bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
972bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
973bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(err != 0) {
974bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s: enqueue_buffer failed, err = %d", __func__, err);
975bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  } else {
976a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi   ALOGV("%s: enqueue_buffer hdl=%p", __func__, *mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
977bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx] = BUFFER_NOT_OWNED;
978bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
979bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  buffer_handle_t *buffer_handle = NULL;
980bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int tmp_stride = 0;
981bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  err = this->mPreviewWindow->dequeue_buffer(this->mPreviewWindow,
982bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              &buffer_handle, &tmp_stride);
983bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (err == NO_ERROR && buffer_handle != NULL) {
984bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
985a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("%s: dequed buf hdl =%p", __func__, *buffer_handle);
986bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    for(i = 0; i < mHalCamCtrl->mPreviewMemory.buffer_count; i++) {
987bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if(mHalCamCtrl->mPreviewMemory.buffer_handle[i] == buffer_handle) {
988bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_UNLOCKED;
989bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          break;
990bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
991bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
992bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     if (i < mHalCamCtrl->mPreviewMemory.buffer_count ) {
993bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      err = this->mPreviewWindow->lock_buffer(this->mPreviewWindow, buffer_handle);
994a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi      ALOGV("%s: camera call genlock_lock: hdl =%p", __FUNCTION__, *buffer_handle);
995bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if (GENLOCK_FAILURE == genlock_lock_buffer((native_handle_t*)(*buffer_handle), GENLOCK_WRITE_LOCK,
996bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                                 GENLOCK_MAX_TIMEOUT)) {
997bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            ALOGE("%s: genlock_lock_buffer(WRITE) failed", __FUNCTION__);
998bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	    //mHalCamCtrl->mPreviewMemoryLock.unlock();
999bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani           // return -EINVAL;
1000bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      } else  {
1001bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_LOCKED;
1002bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1003bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mNotifyBuffer[i])) {
1004bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            ALOGE("BUF DONE FAILED");
1005bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
1006bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1007bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     }
1008bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  } else
1009994c0a3c531677b4b16825a988b4a89dc0af58e8Azam Sadiq Pasha Kapatrala Syed      ALOGV("%s: error in dequeue_buffer, enqueue_buffer idx = %d, no free buffer now", __func__, frame->def.idx);
101090ffa5ddcc420439f1bbebd472200722b6e06ba7Azam Sadiq Pasha Kapatrala Syed
1011bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  /* Save the last displayed frame. We'll be using it to fill the gap between
1012bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     when preview stops and postview start during snapshot.*/
1013bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mLastQueuedFrame = &(mDisplayStreamBuf.frame[frame->def.idx]);
1014bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.unlock();
1015bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1016bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mCallbackLock.lock();
1017bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  camera_data_callback pcb = mHalCamCtrl->mDataCb;
1018bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mCallbackLock.unlock();
1019a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi  ALOGV("Message enabled = 0x%x", mHalCamCtrl->mMsgEnabled);
1020bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1021bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  camera_memory_t *previewMem = NULL;
1022bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1023bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (pcb != NULL) {
1024a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi       ALOGV("%s: mMsgEnabled =0x%x, preview format =%d", __func__,
1025bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            mHalCamCtrl->mMsgEnabled, mHalCamCtrl->mPreviewFormat);
1026bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      //Sending preview callback if corresponding Msgs are enabled
1027bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
1028a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi          ALOGV("%s: PCB callback enabled", __func__);
1029bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          msgType |=  CAMERA_MSG_PREVIEW_FRAME;
1030bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          int previewBufSize;
1031bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          /* The preview buffer size sent back in the callback should be (width*height*bytes_per_pixel)
1032bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani           * As all preview formats we support, use 12 bits per pixel, buffer size = previewWidth * previewHeight * 3/2.
1033bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani           * We need to put a check if some other formats are supported in future. (punits) */
1034f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed          if ((mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_NV21) || (mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_NV12) ||
1035bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                    (mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_YV12))
1036bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          {
1037f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed              if (mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_YV12) {
1038f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed                previewBufSize = ((mHalCamCtrl->mPreviewWidth+15)/16) *16* mHalCamCtrl->mPreviewHeight +
1039f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed                  ((mHalCamCtrl->mPreviewWidth/2+15)/16)*16* mHalCamCtrl->mPreviewHeight;
1040f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed              } else {
1041f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed                previewBufSize = mHalCamCtrl->mPreviewWidth * mHalCamCtrl->mPreviewHeight * 3/2;
1042f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed              }
1043bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              if(previewBufSize != mHalCamCtrl->mPreviewMemory.private_buffer_handle[frame->def.idx]->size) {
1044bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  previewMem = mHalCamCtrl->mGetMemory(mHalCamCtrl->mPreviewMemory.private_buffer_handle[frame->def.idx]->fd,
1045bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  previewBufSize, 1, mHalCamCtrl->mCallbackCookie);
1046bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  if (!previewMem || !previewMem->data) {
1047bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                      ALOGE("%s: mGetMemory failed.\n", __func__);
1048bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  } else {
1049bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                      data = previewMem;
1050bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  }
1051bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              } else
1052bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                    data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];
1053bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          } else {
1054bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];
1055bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                ALOGE("Invalid preview format, buffer size in preview callback may be wrong.");
1056bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          }
1057bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      } else {
1058bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          data = NULL;
1059bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1060bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(msgType) {
1061bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          mStopCallbackLock.unlock();
1062bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          if(mActive)
1063bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            pcb(msgType, data, 0, metadata, mHalCamCtrl->mCallbackCookie);
1064bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          if (previewMem)
1065bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              previewMem->release(previewMem);
1066f75ebaae844a8898f3bd2999165ce877c1b9871fAzam Sadiq Pasha Kapatrala Syed          mStopCallbackLock.lock();
1067bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1068fece04335ca331d76bf84f75d8818f1b24916f4eAjay Dudani	  ALOGV("end of cb");
1069bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  } else {
1070a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("%s PCB is not enabled", __func__);
1071bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1072bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(rcb != NULL && mVFEOutputs == 1)
1073bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  {
1074bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      int flagwait = 1;
1075bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(mHalCamCtrl->mStartRecording == true &&
1076bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              ( mHalCamCtrl->mMsgEnabled & CAMERA_MSG_VIDEO_FRAME))
1077bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      {
1078bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if (mHalCamCtrl->mStoreMetaDataInFrame)
1079bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        {
1080bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          if(mHalCamCtrl->mRecordingMemory.metadata_memory[frame->def.idx])
1081bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          {
1082bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              flagwait = 1;
1083bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              mStopCallbackLock.unlock();
1084bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME,
1085bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                      mHalCamCtrl->mRecordingMemory.metadata_memory[frame->def.idx],
1086bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                      0, mHalCamCtrl->mCallbackCookie);
1087f75ebaae844a8898f3bd2999165ce877c1b9871fAzam Sadiq Pasha Kapatrala Syed              mStopCallbackLock.lock();
1088bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          }else
1089bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              flagwait = 0;
1090bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1091bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      else
1092bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      {
1093bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              mStopCallbackLock.unlock();
1094bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME,
1095bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                      mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx],
1096bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                      0, mHalCamCtrl->mCallbackCookie);
1097f75ebaae844a8898f3bd2999165ce877c1b9871fAzam Sadiq Pasha Kapatrala Syed              mStopCallbackLock.lock();
1098bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1099bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1100bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(flagwait){
1101bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          Mutex::Autolock rLock(&mHalCamCtrl->mRecordFrameLock);
1102bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          if (mHalCamCtrl->mReleasedRecordingFrame != true) {
1103bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              mHalCamCtrl->mRecordWait.wait(mHalCamCtrl->mRecordFrameLock);
1104bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          }
1105bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          mHalCamCtrl->mReleasedRecordingFrame = false;
1106bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1107bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1108bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1109bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  /* Save the last displayed frame. We'll be using it to fill the gap between
1110bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     when preview stops and postview start during snapshot.*/
1111bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  //mLastQueuedFrame = frame->def.frame;
1112bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/*
1113bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, frame))
1114bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  {
1115bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      ALOGE("BUF DONE FAILED");
1116bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      return BAD_VALUE;
1117bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1118bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani*/
1119bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  return NO_ERROR;
1120bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
1121bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1122bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1123bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t QCameraStream_preview::processPreviewFrameWithOutDisplay(
1124bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mm_camera_ch_data_buf_t *frame)
1125bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
1126bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ALOGV("%s",__func__);
1127bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int err = 0;
1128bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int msgType = 0;
1129bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int i;
1130bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  camera_memory_t *data = NULL;
1131bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  camera_frame_metadata_t *metadata = NULL;
1132bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1133bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  Mutex::Autolock lock(mStopCallbackLock);
1134bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(!mActive) {
1135a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("Preview Stopped. Returning callback");
1136bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return NO_ERROR;
1137bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1138bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if(mHalCamCtrl==NULL) {
1139bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s: X: HAL control object not set",__func__);
1140bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /*Call buf done*/
1141bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return BAD_VALUE;
1142bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1143bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1144bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (UNLIKELY(mHalCamCtrl->mDebugFps)) {
1145bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      mHalCamCtrl->debugShowPreviewFPS();
1146bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1147bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  //dumpFrameToFile(frame->def.frame);
1148bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_PREVIEW);
1149bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1150bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.lock();
1151bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mNotifyBuffer[frame->def.idx] = *frame;
1152bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1153bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  /* Save the last displayed frame. We'll be using it to fill the gap between
1154bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     when preview stops and postview start during snapshot.*/
1155bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mLastQueuedFrame = &(mDisplayStreamBuf.frame[frame->def.idx]);
1156bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mPreviewMemoryLock.unlock();
1157bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1158bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mCallbackLock.lock();
1159bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  camera_data_callback pcb = mHalCamCtrl->mDataCb;
1160bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mCallbackLock.unlock();
1161a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi  ALOGV("Message enabled = 0x%x", mHalCamCtrl->mMsgEnabled);
1162bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1163bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  camera_memory_t *previewMem = NULL;
1164bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int previewWidth, previewHeight;
1165bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mHalCamCtrl->mParameters.getPreviewSize(&previewWidth, &previewHeight);
1166bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1167bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#ifdef USE_ION
1168bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  struct ion_flush_data cache_inv_data;
1169bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int ion_fd;
1170bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ion_fd = frame->def.frame->ion_dev_fd;
1171bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cache_inv_data.vaddr = (void *)frame->def.frame->buffer;
1172bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cache_inv_data.fd = frame->def.frame->fd;
1173bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cache_inv_data.handle = frame->def.frame->fd_data.handle;
1174bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  cache_inv_data.length = frame->def.frame->ion_alloc.len;
1175bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1176ac1fa4b9f4985a4ead0b219a7b3318cdd0da43aataeyol.kim  if (mHalCamCtrl->cache_ops(ion_fd, &cache_inv_data,
1177ac1fa4b9f4985a4ead0b219a7b3318cdd0da43aataeyol.kim                                ION_IOC_CLEAN_INV_CACHES) < 0)
1178bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s: Cache clean for Preview buffer %p fd = %d failed", __func__,
1179bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      cache_inv_data.vaddr, cache_inv_data.fd);
1180bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif
1181bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1182bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (pcb != NULL) {
1183bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      //Sending preview callback if corresponding Msgs are enabled
1184bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
1185bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          msgType |=  CAMERA_MSG_PREVIEW_FRAME;
1186bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          int previewBufSize;
1187bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          /* For CTS : Forcing preview memory buffer lenth to be
1188bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani             'previewWidth * previewHeight * 3/2'.
1189bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              Needed when gralloc allocated extra memory.*/
1190bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          //Can add this check for other formats as well.
1191bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          if( mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_NV21) {
1192bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              previewBufSize = previewWidth * previewHeight * 3/2;
1193bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              if(previewBufSize != mHalCamCtrl->mPreviewMemory.private_buffer_handle[frame->def.idx]->size) {
1194bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  previewMem = mHalCamCtrl->mGetMemory(mHalCamCtrl->mPreviewMemory.private_buffer_handle[frame->def.idx]->fd,
1195bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  previewBufSize, 1, mHalCamCtrl->mCallbackCookie);
1196bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  if (!previewMem || !previewMem->data) {
1197bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                      ALOGE("%s: mGetMemory failed.\n", __func__);
1198bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  } else {
1199bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                      data = previewMem;
1200bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                  }
1201bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              } else
1202bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                    data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];//mPreviewHeap->mBuffers[frame->def.idx];
1203bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          } else
1204bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];//mPreviewHeap->mBuffers[frame->def.idx];
1205bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      } else {
1206bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          data = NULL;
1207bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1208bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1209bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_METADATA){
1210bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          msgType  |= CAMERA_MSG_PREVIEW_METADATA;
1211bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          metadata = &mHalCamCtrl->mMetadata;
1212bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      } else {
1213bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          metadata = NULL;
1214bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1215bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(msgType) {
1216bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          mStopCallbackLock.unlock();
1217bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          if(mActive)
1218bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            pcb(msgType, data, 0, metadata, mHalCamCtrl->mCallbackCookie);
1219bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          if (previewMem)
1220bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani              previewMem->release(previewMem);
1221f75ebaae844a8898f3bd2999165ce877c1b9871fAzam Sadiq Pasha Kapatrala Syed          mStopCallbackLock.lock();
1222bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1223bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1224bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mNotifyBuffer[frame->def.idx])) {
1225bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          ALOGE("BUF DONE FAILED");
1226bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      }
1227bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1228135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim      ALOGV("end of cb");
1229bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1230bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1231bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  return NO_ERROR;
1232bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
1233bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1234bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t QCameraStream_preview::processPreviewFrame (
1235bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mm_camera_ch_data_buf_t *frame)
1236bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
1237bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (mHalCamCtrl->isNoDisplayMode()) {
1238bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return processPreviewFrameWithOutDisplay(frame);
1239bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  } else {
1240bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return processPreviewFrameWithDisplay(frame);
1241bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1242bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
1243bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1244bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1245bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// QCameraStream_preview
1246bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1247bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1248bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniQCameraStream_preview::
1249bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniQCameraStream_preview(int cameraId, camera_mode_t mode)
1250bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  : QCameraStream(cameraId,mode),
1251bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mLastQueuedFrame(NULL),
1252bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mNumFDRcvd(0),
1253bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mFirstFrameRcvd(false)
1254bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  {
1255bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mHalCamCtrl = NULL;
1256135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV("%s: E", __func__);
1257135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV("%s: X", __func__);
1258bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1259bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1260bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// QCameraStream_preview
1261bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1262bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1263bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniQCameraStream_preview::~QCameraStream_preview() {
1264bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGV("%s: E", __func__);
1265bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	if(mActive) {
1266bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		stop();
1267bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	}
1268bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	if(mInit) {
1269bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani		release();
1270bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	}
1271bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	mInit = false;
1272bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	mActive = false;
1273bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGV("%s: X", __func__);
1274bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1275bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
1276bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1277bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// QCameraStream_preview
1278bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1279bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1280bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t QCameraStream_preview::init() {
1281bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1282bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  status_t ret = NO_ERROR;
1283bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ALOGV("%s: E", __func__);
1284bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1285bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  ret = QCameraStream::initChannel (mCameraId, MM_CAMERA_CH_PREVIEW_MASK);
1286bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (NO_ERROR!=ret) {
1287bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGE("%s E: can't init native cammera preview ch\n",__func__);
1288bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return ret;
1289bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1290bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1291bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  /* register a notify into the mmmm_camera_t object*/
1292bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  (void) cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_PREVIEW,
1293bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                     preview_notify_cb,
1294bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                     MM_CAMERA_REG_BUF_CB_INFINITE,
1295bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                     0,this);
1296a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi  ALOGV("Debug : %s : cam_evt_register_buf_notify",__func__);
1297bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  buffer_handle_t *buffer_handle = NULL;
1298bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  int tmp_stride = 0;
1299bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  mInit = true;
1300bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  return ret;
1301bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
1302bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1303bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// QCameraStream_preview
1304bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1305bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1306bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t QCameraStream_preview::start()
1307bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
1308bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGV("%s: E", __func__);
1309bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    status_t ret = NO_ERROR;
1310f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed    cam_format_t previewFmt;
1311bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    Mutex::Autolock lock(mStopCallbackLock);
1312bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1313bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /* call start() in parent class to start the monitor thread*/
1314bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    //QCameraStream::start ();
1315f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed    previewFmt = mHalCamCtrl->getPreviewFormat();
1316f38403d65e5e98eaea2a0f76f5e428c0b27afb23Azam Sadiq Pasha Kapatrala Syed    setFormat(MM_CAMERA_CH_PREVIEW_MASK, previewFmt);
1317bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1318bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if (mHalCamCtrl->isNoDisplayMode()) {
1319bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if(NO_ERROR!=initPreviewOnlyBuffers()){
1320bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            return BAD_VALUE;
1321bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
1322bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    } else {
1323bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if(NO_ERROR!=initDisplayBuffers()){
1324bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani            return BAD_VALUE;
1325bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
1326bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
1327a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("Debug : %s : initDisplayBuffers",__func__);
1328bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1329bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ret = cam_config_prepare_buf(mCameraId, &mDisplayBuf);
1330a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("Debug : %s : cam_config_prepare_buf",__func__);
1331bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(ret != MM_CAMERA_OK) {
1332a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        ALOGV("%s:reg preview buf err=%d\n", __func__, ret);
1333bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ret = BAD_VALUE;
1334bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        goto error;
1335bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }else {
1336bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ret = NO_ERROR;
1337bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
1338bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1339bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani	/* For preview, the OP_MODE we set is dependent upon whether we are
1340bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani       starting camera or camcorder. For snapshot, anyway we disable preview.
1341bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani       However, for ZSL we need to set OP_MODE to OP_MODE_ZSL and not
1342bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani       OP_MODE_VIDEO. We'll set that for now in CamCtrl. So in case of
1343bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani       ZSL we skip setting Mode here */
1344bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1345bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if (!(myMode & CAMERA_ZSL_MODE)) {
1346a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        ALOGV("Setting OP MODE to MM_CAMERA_OP_MODE_VIDEO");
1347bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_VIDEO;
1348bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ret = cam_config_set_parm (mCameraId, MM_CAMERA_PARM_OP_MODE,
1349bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                        &op_mode);
1350a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        ALOGV("OP Mode Set");
1351bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1352bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if(MM_CAMERA_OK != ret) {
1353bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          ALOGE("%s: X :set mode MM_CAMERA_OP_MODE_VIDEO err=%d\n", __func__, ret);
1354bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          ret = BAD_VALUE;
1355bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          goto error;
1356bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
1357bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }else {
1358a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi        ALOGV("Setting OP MODE to MM_CAMERA_OP_MODE_ZSL");
1359bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_ZSL;
1360bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        ret = cam_config_set_parm (mCameraId, MM_CAMERA_PARM_OP_MODE,
1361bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                        &op_mode);
1362bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        if(MM_CAMERA_OK != ret) {
1363bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          ALOGE("%s: X :set mode MM_CAMERA_OP_MODE_ZSL err=%d\n", __func__, ret);
1364bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          ret = BAD_VALUE;
1365bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani          goto error;
1366bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani        }
1367bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani     }
1368bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1369bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /* call mm_camera action start(...)  */
1370a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("Starting Preview/Video Stream. ");
1371bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mFirstFrameRcvd = false;
1372f5198bf2ec5f39e8a46552172124bd7411f5c63fShuzhen Wang    ret = cam_ops_action(mCameraId, true, MM_CAMERA_OPS_PREVIEW, 0);
1373bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1374bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if (MM_CAMERA_OK != ret) {
1375bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      ALOGE ("%s: preview streaming start err=%d\n", __func__, ret);
1376bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      ret = BAD_VALUE;
1377bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      goto error;
1378bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
1379bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1380a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("Debug : %s : Preview streaming Started",__func__);
1381bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ret = NO_ERROR;
1382bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1383bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mActive =  true;
1384bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    goto end;
1385bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1386bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanierror:
1387bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    putBufferToSurface();
1388bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudaniend:
1389135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV("%s: X", __func__);
1390bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return ret;
1391bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1392bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1393bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1394bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1395bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// QCameraStream_preview
1396bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1397bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  void QCameraStream_preview::stop() {
1398135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV("%s: E", __func__);
1399bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    int ret=MM_CAMERA_OK;
1400bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1401bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(!mActive) {
1402bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      return;
1403bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
1404bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    Mutex::Autolock lock(mStopCallbackLock);
1405bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mActive =  false;
1406bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /* unregister the notify fn from the mmmm_camera_t object*/
1407bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1408a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("%s: Stop the thread \n", __func__);
1409bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /* call stop() in parent class to stop the monitor thread*/
1410f5198bf2ec5f39e8a46552172124bd7411f5c63fShuzhen Wang    ret = cam_ops_action(mCameraId, false, MM_CAMERA_OPS_PREVIEW, 0);
1411bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(MM_CAMERA_OK != ret) {
1412bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      ALOGE ("%s: camera preview stop err=%d\n", __func__, ret);
1413bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
1414bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ret = cam_config_unprepare_buf(mCameraId, MM_CAMERA_CH_PREVIEW);
1415bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(ret != MM_CAMERA_OK) {
1416bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      ALOGE("%s:Unreg preview buf err=%d\n", __func__, ret);
1417bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      //ret = BAD_VALUE;
1418bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
1419bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1420bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /* In case of a clean stop, we need to clean all buffers*/
1421a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("Debug : %s : Buffer Unprepared",__func__);
1422bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    /*free camera_memory handles and return buffer back to surface*/
1423bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if (! mHalCamCtrl->isNoDisplayMode() ) {
1424bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      putBufferToSurface();
1425bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    } else {
1426bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      freeBufferNoDisplay( );
1427bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
1428bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1429135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV("%s: X", __func__);
1430bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1431bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1432bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1433bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// QCameraStream_preview
1434bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1435bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  void QCameraStream_preview::release() {
1436bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1437135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV("%s : BEGIN",__func__);
1438bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    int ret=MM_CAMERA_OK,i;
1439bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1440bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(!mInit)
1441bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    {
1442bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      ALOGE("%s : Stream not Initalized",__func__);
1443bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      return;
1444bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
1445bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1446bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(mActive) {
1447bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      this->stop();
1448bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
1449bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1450bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ret= QCameraStream::deinitChannel(mCameraId, MM_CAMERA_CH_PREVIEW);
1451a3190bcca19c607dc60c0aae919dabb64419fb69Sungmin Choi    ALOGV("Debug : %s : De init Channel",__func__);
1452bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    if(ret != MM_CAMERA_OK) {
1453bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      ALOGE("%s:Deinit preview channel failed=%d\n", __func__, ret);
1454bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani      //ret = BAD_VALUE;
1455bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    }
1456bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1457bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    (void)cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_PREVIEW,
1458bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                      NULL,
1459bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                      (mm_camera_register_buf_cb_type_t)NULL,
1460bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                      NULL,
1461bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                      NULL);
1462bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    mInit = false;
1463135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim    ALOGV("%s: END", __func__);
1464bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1465bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1466bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1467bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniQCameraStream*
1468bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniQCameraStream_preview::createInstance(int cameraId,
1469bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani                                      camera_mode_t mode)
1470bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
1471bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  QCameraStream* pme = new QCameraStream_preview(cameraId, mode);
1472bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  return pme;
1473bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
1474bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1475bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// QCameraStream_preview
1476bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1477bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1478bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanivoid QCameraStream_preview::deleteInstance(QCameraStream *p)
1479bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
1480bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  if (p){
1481bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGV("%s: BEGIN", __func__);
1482bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    p->release();
1483bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    delete p;
1484bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    p = NULL;
1485bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    ALOGV("%s: END", __func__);
1486bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani  }
1487bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
1488bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1489bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1490bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/* Temp helper function */
1491bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanivoid *QCameraStream_preview::getLastQueuedFrame(void)
1492bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{
1493bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani    return mLastQueuedFrame;
1494bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}
1495bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani
1496bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1497bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// No code beyone this line
1498bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani// ---------------------------------------------------------------------------
1499bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}; // namespace android
1500