1e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/*
2e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** Copyright (c) 2012 The Linux Foundation. All rights reserved.
3e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev**
4e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** Licensed under the Apache License, Version 2.0 (the "License");
5e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** you may not use this file except in compliance with the License.
6e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** You may obtain a copy of the License at
7e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev**
8e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev**     http://www.apache.org/licenses/LICENSE-2.0
9e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev**
10e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** Unless required by applicable law or agreed to in writing, software
11e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** distributed under the License is distributed on an "AS IS" BASIS,
12e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** See the License for the specific language governing permissions and
14e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev** limitations under the License.
15e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev*/
16e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
17e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/*#error uncomment this for compiler test!*/
18e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
19e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define ALOG_NDEBUG 0
20e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define ALOG_NIDEBUG 0
21e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define LOG_TAG "QCameraHWI_Preview"
22e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <utils/Log.h>
23e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <utils/threads.h>
24e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <fcntl.h>
25e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <sys/mman.h>
26e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
27e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include "QCameraHAL.h"
28e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include "QCameraHWI.h"
29e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <gralloc_priv.h>
30e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#include <genlock.h>
31e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
32e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev#define UNLIKELY(exp) __builtin_expect(!!(exp), 0)
33e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
34e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* QCameraHWI_Preview class implementation goes here*/
35e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* following code implement the preview mode's image capture & display logic of this class*/
36e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
37e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevnamespace android {
38e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
39e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
40e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// Preview Callback
41e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
42e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatic void preview_notify_cb(mm_camera_ch_data_buf_t *frame,
43e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                void *user_data)
44e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
45e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  QCameraStream_preview *pme = (QCameraStream_preview *)user_data;
46e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mm_camera_ch_data_buf_t *bufs_used = 0;
47e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGV("%s: E", __func__);
48e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  /* for peview data, there is no queue, so directly use*/
49e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if(pme==NULL) {
50e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: X : Incorrect cookie",__func__);
51e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*Call buf done*/
52e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return;
53e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
54e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
55e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  pme->processPreviewFrame(frame);
56e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGV("%s: X", __func__);
57e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
58e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
59e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_preview::setPreviewWindow(preview_stream_ops_t* window)
60e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
61e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t retVal = NO_ERROR;
62e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE(" %s: E ", __FUNCTION__);
63e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if( window == NULL) {
64e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ALOGW(" Setting NULL preview window ");
65e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* TODO: Current preview window will be invalidated.
66e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         * Release all the buffers back */
67e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       // relinquishBuffers();
68e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
69e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mDisplayLock.lock();
70e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mPreviewWindow = window;
71e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mDisplayLock.unlock();
72e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGV(" %s : X ", __FUNCTION__ );
73e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return retVal;
74e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
75e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
76e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_preview::getBufferFromSurface() {
77e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int err = 0;
78e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int numMinUndequeuedBufs = 0;
79e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	int format = 0;
80e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	status_t ret = NO_ERROR;
81e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
82e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGI(" %s : E ", __FUNCTION__);
83e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
84e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if( mPreviewWindow == NULL) {
85e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		ALOGE("%s: mPreviewWindow = NULL", __func__);
86e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return INVALID_OPERATION;
87e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	}
88e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_ctrl_dimension_t dim;
89e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
90e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	//mDisplayLock.lock();
91e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION,&dim);
92e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
93e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	format = mHalCamCtrl->getPreviewFormatInfo().Hal_format;
94e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	if(ret != NO_ERROR) {
95e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ALOGE("%s: display format %d is not supported", __func__, dim.prev_format);
96e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		goto end;
97e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	}
98e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	numMinUndequeuedBufs = 0;
99e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	if(mPreviewWindow->get_min_undequeued_buffer_count) {
100e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    err = mPreviewWindow->get_min_undequeued_buffer_count(mPreviewWindow, &numMinUndequeuedBufs);
101e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		if (err != 0) {
102e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			 ALOGE("get_min_undequeued_buffer_count  failed: %s (%d)",
103e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev						strerror(-err), -err);
104e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			 ret = UNKNOWN_ERROR;
105e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			 goto end;
106e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		}
107e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	}
108e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->mPreviewMemoryLock.lock();
109e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->mPreviewMemory.buffer_count = kPreviewBufferCount + numMinUndequeuedBufs;;
110e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    err = mPreviewWindow->set_buffer_count(mPreviewWindow, mHalCamCtrl->mPreviewMemory.buffer_count );
111e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (err != 0) {
112e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         ALOGE("set_buffer_count failed: %s (%d)",
113e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    strerror(-err), -err);
114e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         ret = UNKNOWN_ERROR;
115e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		 goto end;
116e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
117e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    err = mPreviewWindow->set_buffers_geometry(mPreviewWindow,
118e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                dim.display_width, dim.display_height, format);
119e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (err != 0) {
120e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         ALOGE("set_buffers_geometry failed: %s (%d)",
121e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    strerror(-err), -err);
122e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         ret = UNKNOWN_ERROR;
123e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		 goto end;
124e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
125e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    err = mPreviewWindow->set_usage(mPreviewWindow,
126e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                GRALLOC_USAGE_PRIVATE_ADSP_HEAP |
127e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                GRALLOC_USAGE_PRIVATE_UNCACHED);
128e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	if(err != 0) {
129e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        /* set_usage error out */
130e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		ALOGE("%s: set_usage rc = %d", __func__, err);
131e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		ret = UNKNOWN_ERROR;
132e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		goto end;
133e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	}
134e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	for (int cnt = 0; cnt < mHalCamCtrl->mPreviewMemory.buffer_count; cnt++) {
135e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		int stride;
136e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		err = mPreviewWindow->dequeue_buffer(mPreviewWindow,
137e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev										&mHalCamCtrl->mPreviewMemory.buffer_handle[cnt],
138e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev										&mHalCamCtrl->mPreviewMemory.stride[cnt]);
139e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		if(!err) {
140e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    err = mPreviewWindow->lock_buffer(this->mPreviewWindow,
141e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                       mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
142e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
143e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    // lock the buffer using genlock
144e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    ALOGD("%s: camera call genlock_lock", __FUNCTION__);
145e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    if (GENLOCK_NO_ERROR != genlock_lock_buffer((native_handle_t *)(*mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]),
146e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                      GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) {
147e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                       ALOGE("%s: genlock_lock_buffer(WRITE) failed", __FUNCTION__);
148e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                       mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_UNLOCKED;
149e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	               mHalCamCtrl->mPreviewMemoryLock.unlock();
150e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                       return -EINVAL;
151e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                   }
152e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		   mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_LOCKED;
153e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		} else
154e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			ALOGE("%s: dequeue_buffer idx = %d err = %d", __func__, cnt, err);
155e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
156e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		ALOGE("%s: dequeue buf: %u\n", __func__, (unsigned int)mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
157e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
158e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		if(err != 0) {
159e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ALOGE("%s: dequeue_buffer failed: %s (%d)", __func__,
160e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    strerror(-err), -err);
161e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ret = UNKNOWN_ERROR;
162e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			for(int i = 0; i < cnt; i++) {
163e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                        ALOGD("%s: camera call genlock_unlock", __FUNCTION__);
164e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                        if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[i]) {
165e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                             if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t *)
166e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                          (*(mHalCamCtrl->mPreviewMemory.buffer_handle[i])))) {
167e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                ALOGE("%s: genlock_unlock_buffer failed", __FUNCTION__);
168e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	                        mHalCamCtrl->mPreviewMemoryLock.unlock();
169e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                return -EINVAL;
170e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                             }
171e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                        }
172e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		        err = mPreviewWindow->cancel_buffer(mPreviewWindow,
173e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev										mHalCamCtrl->mPreviewMemory.buffer_handle[i]);
174e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev				mHalCamCtrl->mPreviewMemory.buffer_handle[i] = NULL;
175e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev				mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_UNLOCKED;
176e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			}
177e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			goto end;
178e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		}
179e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt] =
180e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		    (struct private_handle_t *)(*mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
181e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		mHalCamCtrl->mPreviewMemory.camera_memory[cnt] =
182e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		    mHalCamCtrl->mGetMemory(mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->fd,
183e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->size, 1, (void *)this);
184e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		ALOGE("%s: idx = %d, fd = %d, size = %d, offset = %d", __func__,
185e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            cnt, mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->fd,
186e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->size,
187e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->offset);
188e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	}
189e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
190e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
191e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	memset(&mHalCamCtrl->mMetadata, 0, sizeof(mHalCamCtrl->mMetadata));
192e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	memset(mHalCamCtrl->mFace, 0, sizeof(mHalCamCtrl->mFace));
193e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
194e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGI(" %s : X ",__FUNCTION__);
195e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
196e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	//mDisplayLock.unlock();
197e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	mHalCamCtrl->mPreviewMemoryLock.unlock();
198e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
199e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return NO_ERROR;
200e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
201e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
202e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_preview::putBufferToSurface() {
203e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int err = 0;
204e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	status_t ret = NO_ERROR;
205e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
206e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGI(" %s : E ", __FUNCTION__);
207e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
208e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //mDisplayLock.lock();
209e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl->mPreviewMemoryLock.lock();
210e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	for (int cnt = 0; cnt < mHalCamCtrl->mPreviewMemory.buffer_count; cnt++) {
211e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mHalCamCtrl->mPreviewMemory.camera_memory[cnt]->release(mHalCamCtrl->mPreviewMemory.camera_memory[cnt]);
212e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[cnt]) {
213e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                ALOGD("%s: camera call genlock_unlock", __FUNCTION__);
214e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	        if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t *)
215e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                    (*(mHalCamCtrl->mPreviewMemory.buffer_handle[cnt])))) {
216e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    ALOGE("%s: genlock_unlock_buffer failed", __FUNCTION__);
217e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	            mHalCamCtrl->mPreviewMemoryLock.unlock();
218e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    return -EINVAL;
219e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                } else {
220e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    mHalCamCtrl->mPreviewMemory.local_flag[cnt] = BUFFER_UNLOCKED;
221e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                }
222e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
223e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            err = mPreviewWindow->cancel_buffer(mPreviewWindow, mHalCamCtrl->mPreviewMemory.buffer_handle[cnt]);
224e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		ALOGE(" put buffer %d successfully", cnt);
225e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	}
226e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	memset(&mHalCamCtrl->mPreviewMemory, 0, sizeof(mHalCamCtrl->mPreviewMemory));
227e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	mHalCamCtrl->mPreviewMemoryLock.unlock();
228e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	//mDisplayLock.unlock();
229e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGI(" %s : X ",__FUNCTION__);
230e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return NO_ERROR;
231e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
232e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
233e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_preview::notifyROIEvent(fd_roi_t roi)
234e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
235e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    switch (roi.type) {
236e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    case FD_ROI_TYPE_HEADER:
237e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        {
238e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mDisplayLock.lock();
239e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mNumFDRcvd = 0;
240e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            memset(mHalCamCtrl->mFace, 0, sizeof(mHalCamCtrl->mFace));
241e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mMetadata.faces = mHalCamCtrl->mFace;
242e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mMetadata.number_of_faces = roi.d.hdr.num_face_detected;
243e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if(mHalCamCtrl->mMetadata.number_of_faces > MAX_ROI)
244e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              mHalCamCtrl->mMetadata.number_of_faces = MAX_ROI;
245e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mDisplayLock.unlock();
246e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
247e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (mHalCamCtrl->mMetadata.number_of_faces == 0) {
248e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                // Clear previous faces
249e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                mHalCamCtrl->mCallbackLock.lock();
250e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                camera_data_callback pcb = mHalCamCtrl->mDataCb;
251e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                mHalCamCtrl->mCallbackLock.unlock();
252e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
253e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                if (pcb && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_METADATA)){
254e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    ALOGE("%s: Face detection RIO callback", __func__);
255e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                    pcb(CAMERA_MSG_PREVIEW_METADATA, NULL, 0, &mHalCamCtrl->mMetadata, mHalCamCtrl->mCallbackCookie);
256e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                }
257e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
258e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
259e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        break;
260e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    case FD_ROI_TYPE_DATA:
261e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        {
262e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mDisplayLock.lock();
263e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            int idx = roi.d.data.idx;
264e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            if (idx >= mHalCamCtrl->mMetadata.number_of_faces) {
265e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                mDisplayLock.unlock();
266e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                ALOGE("%s: idx %d out of boundary %d", __func__, idx, mHalCamCtrl->mMetadata.number_of_faces);
267e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                break;
268e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            }
269e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
270e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].id = roi.d.data.face.id;
271e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].score = roi.d.data.face.score / 10; // keep within range 0~100
272e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
273e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            // top
274e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].rect[0] =
275e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               roi.d.data.face.face_boundary.x*2000/mHalCamCtrl->mDimension.display_width - 1000;
276e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            //right
277e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].rect[1] =
278e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               roi.d.data.face.face_boundary.y*2000/mHalCamCtrl->mDimension.display_height - 1000;
279e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            //bottom
280e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].rect[2] =  mHalCamCtrl->mFace[idx].rect[0] +
281e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               roi.d.data.face.face_boundary.dx*2000/mHalCamCtrl->mDimension.display_width;
282e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            //left
283e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].rect[3] = mHalCamCtrl->mFace[idx].rect[1] +
284e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               roi.d.data.face.face_boundary.dy*2000/mHalCamCtrl->mDimension.display_height;
285e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
286e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            // Center of left eye
287e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].left_eye[0] =
288e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              roi.d.data.face.left_eye_center[0]*2000/mHalCamCtrl->mDimension.display_width - 1000;
289e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].left_eye[1] =
290e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              roi.d.data.face.left_eye_center[1]*2000/mHalCamCtrl->mDimension.display_height - 1000;
291e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
292e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            // Center of right eye
293e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].right_eye[0] =
294e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              roi.d.data.face.right_eye_center[0]*2000/mHalCamCtrl->mDimension.display_width - 1000;
295e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].right_eye[1] =
296e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              roi.d.data.face.right_eye_center[1]*2000/mHalCamCtrl->mDimension.display_height - 1000;
297e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
298e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            // Center of mouth
299e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].mouth[0] =
300e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              roi.d.data.face.mouth_center[0]*2000/mHalCamCtrl->mDimension.display_width - 1000;
301e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].mouth[1] =
302e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              roi.d.data.face.mouth_center[1]*2000/mHalCamCtrl->mDimension.display_height - 1000;
303e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
304e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].smile_degree = roi.d.data.face.smile_degree;
305e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].smile_score = roi.d.data.face.smile_confidence;
306e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].blink_detected = roi.d.data.face.blink_detected;
307e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].face_recognised = roi.d.data.face.is_face_recognised;
308e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].gaze_angle = roi.d.data.face.gaze_angle;
309e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
310e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            /* newly added */
311e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            // upscale by 2 to recover from demaen downscaling
312e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].updown_dir = roi.d.data.face.updown_dir*2;
313e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].leftright_dir = roi.d.data.face.leftright_dir*2;
314e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].roll_dir = roi.d.data.face.roll_dir*2;
315e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
316e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].leye_blink = roi.d.data.face.left_blink;
317e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].reye_blink = roi.d.data.face.right_blink;
318e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].left_right_gaze = roi.d.data.face.left_right_gaze;
319e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mFace[idx].top_bottom_gaze = roi.d.data.face.top_bottom_gaze;
320e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
321e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ALOGE("%s: Face(%d, %d, %d, %d), leftEye(%d, %d), rightEye(%d, %d), mouth(%d, %d), smile(%d, %d), blinked(%d)", __func__,
322e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               mHalCamCtrl->mFace[idx].rect[0],  mHalCamCtrl->mFace[idx].rect[1],
323e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               mHalCamCtrl->mFace[idx].rect[2],  mHalCamCtrl->mFace[idx].rect[3],
324e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               mHalCamCtrl->mFace[idx].left_eye[0], mHalCamCtrl->mFace[idx].left_eye[1],
325e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               mHalCamCtrl->mFace[idx].right_eye[0], mHalCamCtrl->mFace[idx].right_eye[1],
326e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               mHalCamCtrl->mFace[idx].mouth[0], mHalCamCtrl->mFace[idx].mouth[1],
327e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev               roi.d.data.face.smile_degree, roi.d.data.face.smile_confidence, roi.d.data.face.blink_detected);
328e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
329e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             mNumFDRcvd++;
330e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             mDisplayLock.unlock();
331e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
332e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             if (mNumFDRcvd == mHalCamCtrl->mMetadata.number_of_faces) {
333e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 mHalCamCtrl->mCallbackLock.lock();
334e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 camera_data_callback pcb = mHalCamCtrl->mDataCb;
335e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 mHalCamCtrl->mCallbackLock.unlock();
336e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
337e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 if (pcb && (mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_METADATA)){
338e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                     ALOGE("%s: Face detection RIO callback with %d faces detected (score=%d)", __func__, mNumFDRcvd, mHalCamCtrl->mFace[idx].score);
339e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                     pcb(CAMERA_MSG_PREVIEW_METADATA, NULL, 0, &mHalCamCtrl->mMetadata, mHalCamCtrl->mCallbackCookie);
340e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 }
341e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev             }
342e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
343e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        break;
344e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
345e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
346e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
347e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_preview::initDisplayBuffers()
348e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
349e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
350e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int width = 0;  /* width of channel  */
351e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int height = 0; /* height of channel */
352e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint32_t frame_len = 0; /* frame planner length */
353e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int buffer_num = 4; /* number of buffers for display */
354e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    const char *pmem_region;
355e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint8_t num_planes = 0;
356e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    uint32_t planes[VIDEO_MAX_PLANES];
357e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
358e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    cam_ctrl_dimension_t dim;
359e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
360e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s:BEGIN",__func__);
361e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	memset(&mHalCamCtrl->mMetadata, 0, sizeof(camera_frame_metadata_t));
362e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	mHalCamCtrl->mPreviewMemoryLock.lock();
363e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	memset(&mHalCamCtrl->mPreviewMemory, 0, sizeof(mHalCamCtrl->mPreviewMemory));
364e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	mHalCamCtrl->mPreviewMemoryLock.unlock();
365e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	memset(&mNotifyBuffer, 0, sizeof(mNotifyBuffer));
366e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
367e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  /* get preview size, by qury mm_camera*/
368e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&dim, 0, sizeof(cam_ctrl_dimension_t));
369e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
370e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    memset(&(this->mDisplayStreamBuf),0, sizeof(this->mDisplayStreamBuf));
371e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
372e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim);
373e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (MM_CAMERA_OK != ret) {
374e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ALOGE("%s: error - can't get camera dimension!", __func__);
375e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ALOGE("%s: X", __func__);
376e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      return BAD_VALUE;
377e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }else {
378e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      width =  dim.display_width,
379e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      height = dim.display_height;
380e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
381e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
382e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	ret = getBufferFromSurface();
383e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	if(ret != NO_ERROR) {
384e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	 ALOGE("%s: cannot get memory from surface texture client, ret = %d", __func__, ret);
385e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	 return ret;
386e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	}
387e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
388e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  /* set 4 buffers for display */
389e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  memset(&mDisplayStreamBuf, 0, sizeof(mDisplayStreamBuf));
390e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mHalCamCtrl->mPreviewMemoryLock.lock();
391e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  this->mDisplayStreamBuf.num = mHalCamCtrl->mPreviewMemory.buffer_count;
392e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  this->myMode=myMode; /*Need to assign this in constructor after translating from mask*/
393e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  num_planes = 2;
394e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  planes[0] = dim.display_frame_offset.mp[0].len;
395e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  planes[1] = dim.display_frame_offset.mp[1].len;
396e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  this->mDisplayStreamBuf.frame_len = dim.display_frame_offset.frame_len;
397e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
398e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mDisplayBuf.preview.buf.mp = new mm_camera_mp_buf_t[mDisplayStreamBuf.num];
399e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if (!mDisplayBuf.preview.buf.mp) {
400e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	  ALOGE("%s Error allocating memory for mplanar struct ", __func__);
401e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
402e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  memset(mDisplayBuf.preview.buf.mp, 0,
403e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mDisplayStreamBuf.num * sizeof(mm_camera_mp_buf_t));
404e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
405e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  /*allocate memory for the buffers*/
406e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  void *vaddr = NULL;
407e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  for(int i = 0; i < mDisplayStreamBuf.num; i++){
408e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	  if (mHalCamCtrl->mPreviewMemory.private_buffer_handle[i] == NULL)
409e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  continue;
410e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mDisplayStreamBuf.frame[i].fd = mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->fd;
411e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mDisplayStreamBuf.frame[i].cbcr_off = planes[0];
412e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mDisplayStreamBuf.frame[i].y_off = 0;
413e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mDisplayStreamBuf.frame[i].path = OUTPUT_TYPE_P;
414e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	  mHalCamCtrl->mPreviewMemory.addr_offset[i] =
415e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	      mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->offset;
416e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mDisplayStreamBuf.frame[i].buffer =
417e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          (long unsigned int)mHalCamCtrl->mPreviewMemory.camera_memory[i]->data;
418e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
419e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	  ALOGE("%s: idx = %d, fd = %d, size = %d, cbcr_offset = %d, y_offset = %d, offset = %d, vaddr = 0x%x",
420e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  __func__, i,
421e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  mDisplayStreamBuf.frame[i].fd,
422e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size,
423e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  mDisplayStreamBuf.frame[i].cbcr_off,
424e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  mDisplayStreamBuf.frame[i].y_off,
425e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  mHalCamCtrl->mPreviewMemory.addr_offset[i],
426e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  (uint32_t)mDisplayStreamBuf.frame[i].buffer);
427e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
428e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
429e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].frame = mDisplayStreamBuf.frame[i];
430e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].frame_offset = mHalCamCtrl->mPreviewMemory.addr_offset[i];
431e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].num_planes = num_planes;
432e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
433e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		/* Plane 0 needs to be set seperately. Set other planes
434e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev         * in a loop. */
435e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].planes[0].length = planes[0];
436e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].planes[0].m.userptr = mDisplayStreamBuf.frame[i].fd;
437e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].planes[0].data_offset = 0;
438e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mDisplayBuf.preview.buf.mp[i].planes[0].reserved[0] =
439e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          mDisplayBuf.preview.buf.mp[i].frame_offset;
440e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        for (int j = 1; j < num_planes; j++) {
441e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          mDisplayBuf.preview.buf.mp[i].planes[j].length = planes[j];
442e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr =
443e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mDisplayStreamBuf.frame[i].fd;
444e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  mDisplayBuf.preview.buf.mp[i].planes[j].data_offset = 0;
445e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0] =
446e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mDisplayBuf.preview.buf.mp[i].planes[j-1].reserved[0] +
447e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mDisplayBuf.preview.buf.mp[i].planes[j-1].length;
448e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
449e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
450e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		for (int j = 0; j < num_planes; j++) {
451e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			ALOGE("Planes: %d length: %d userptr: %lu offset: %d\n",
452e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev				 j, mDisplayBuf.preview.buf.mp[i].planes[j].length,
453e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev				 mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr,
454e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev				 mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0]);
455e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		}
456e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
457e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }/*end of for loop*/
458e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
459e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev /* register the streaming buffers for the channel*/
460e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mDisplayBuf.ch_type = MM_CAMERA_CH_PREVIEW;
461e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mDisplayBuf.preview.num = mDisplayStreamBuf.num;
462e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mHalCamCtrl->mPreviewMemoryLock.unlock();
463e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGE("%s:END",__func__);
464e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  return NO_ERROR;
465e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
466e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevend:
467e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if (MM_CAMERA_OK == ret ) {
468e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGV("%s: X - NO_ERROR ", __func__);
469e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return NO_ERROR;
470e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
471e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
472e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGV("%s: out of memory clean up", __func__);
473e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  /* release the allocated memory */
474e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
475e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGV("%s: X - BAD_VALUE ", __func__);
476e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  return BAD_VALUE;
477e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
478e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
479e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_preview::dumpFrameToFile(struct msm_frame* newFrame)
480e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
481e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  int32_t enabled = 0;
482e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  int frm_num;
483e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  uint32_t  skip_mode;
484e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  char value[PROPERTY_VALUE_MAX];
485e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  char buf[32];
486e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  int w, h;
487e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  static int count = 0;
488e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  cam_ctrl_dimension_t dim;
489e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  int file_fd;
490e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  int rc = 0;
491e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  int len;
492e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  unsigned long addr;
493e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  unsigned long * tmp = (unsigned long *)newFrame->buffer;
494e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  addr = *tmp;
495e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  status_t ret = cam_config_get_parm(mHalCamCtrl->mCameraId,
496e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                 MM_CAMERA_PARM_DIMENSION, &dim);
497e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
498e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  w = dim.display_width;
499e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  h = dim.display_height;
500e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  len = (w * h)*3/2;
501e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  count++;
502e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if(count < 100) {
503e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    snprintf(buf, sizeof(buf), "/data/mzhu%d.yuv", count);
504e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    file_fd = open(buf, O_RDWR | O_CREAT, 0777);
505e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
506e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    rc = write(file_fd, (const void *)addr, len);
507e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: file='%s', vaddr_old=0x%x, addr_map = 0x%p, len = %d, rc = %d",
508e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          __func__, buf, (uint32_t)newFrame->buffer, (void *)addr, len, rc);
509e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    close(file_fd);
510e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: dump %s, rc = %d, len = %d", __func__, buf, rc, len);
511e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
512e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
513e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
514e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_preview::processPreviewFrame(mm_camera_ch_data_buf_t *frame)
515e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
516e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGV("%s",__func__);
517e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  int err = 0;
518e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  int msgType = 0;
519e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  camera_memory_t *data = NULL;
520e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  camera_frame_metadata_t *metadata = NULL;
521e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
522e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  Mutex::Autolock lock(mStopCallbackLock);
523e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if(!mActive) {
524e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("Preview Stopped. Returning callback");
525e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return NO_ERROR;
526e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
527e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if(mHalCamCtrl==NULL) {
528e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: X: HAL control object not set",__func__);
529e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /*Call buf done*/
530e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return BAD_VALUE;
531e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
532e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
533e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mHalCamCtrl->mCallbackLock.lock();
534e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  camera_data_timestamp_callback rcb = mHalCamCtrl->mDataCbTimestamp;
535e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  void *rdata = mHalCamCtrl->mCallbackCookie;
536e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mHalCamCtrl->mCallbackLock.unlock();
537e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
538e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if (UNLIKELY(mHalCamCtrl->mDebugFps)) {
539e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      mHalCamCtrl->debugShowPreviewFPS();
540e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
541e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  //dumpFrameToFile(frame->def.frame);
542e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_PREVIEW);
543e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
544e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  nsecs_t timeStamp = systemTime();
545e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
546e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mHalCamCtrl->mPreviewMemoryLock.lock();
547e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mNotifyBuffer[frame->def.idx] = *frame;
548e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  // mzhu fix me, need to check meta data also.
549e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
550e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGI("Enqueue buf handle %p\n",
551e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
552e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGD("%s: camera call genlock_unlock", __FUNCTION__);
553e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx]) {
554e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t*)
555e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	            (*mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]))) {
556e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ALOGE("%s: genlock_unlock_buffer failed", __FUNCTION__);
557e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	    mHalCamCtrl->mPreviewMemoryLock.unlock();
558e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            return -EINVAL;
559e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        } else {
560e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx] = BUFFER_UNLOCKED;
561e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
562e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    } else {
563e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ALOGE("%s: buffer to be enqueued is not locked", __FUNCTION__);
564e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	mHalCamCtrl->mPreviewMemoryLock.unlock();
565e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return -EINVAL;
566e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
567e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow,
568e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]);
569e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if(err != 0) {
570e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: enqueue_buffer failed, err = %d", __func__, err);
571e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
572e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  buffer_handle_t *buffer_handle = NULL;
573e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  int tmp_stride = 0;
574e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  err = this->mPreviewWindow->dequeue_buffer(this->mPreviewWindow,
575e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              &buffer_handle, &tmp_stride);
576e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if (err == NO_ERROR && buffer_handle != NULL) {
577e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      err = this->mPreviewWindow->lock_buffer(this->mPreviewWindow, buffer_handle);
578e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ALOGD("%s: camera call genlock_lock", __FUNCTION__);
579e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      if (GENLOCK_FAILURE == genlock_lock_buffer((native_handle_t*)(*buffer_handle), GENLOCK_WRITE_LOCK,
580e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                                 GENLOCK_MAX_TIMEOUT)) {
581e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            ALOGE("%s: genlock_lock_buffer(WRITE) failed", __FUNCTION__);
582e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	    mHalCamCtrl->mPreviewMemoryLock.unlock();
583e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            return -EINVAL;
584e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      }
585e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      for(int i = 0; i < mHalCamCtrl->mPreviewMemory.buffer_count; i++) {
586e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  ALOGD("h1: %p h2: %p\n", mHalCamCtrl->mPreviewMemory.buffer_handle[i], buffer_handle);
587e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  if(mHalCamCtrl->mPreviewMemory.buffer_handle[i] == buffer_handle) {
588e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	          mm_camera_ch_data_buf_t tmp_frame;
589e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                  mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_LOCKED;
590e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mNotifyBuffer[i])) {
591e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                  ALOGD("BUF DONE FAILED");
592e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                  mHalCamCtrl->mPreviewMemoryLock.unlock();
593e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                  return BAD_VALUE;
594e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              }
595e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev			  break;
596e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		  }
597e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	  }
598e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  } else
599e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ALOGE("%s: error in dequeue_buffer, enqueue_buffer idx = %d, no free buffer now", __func__, frame->def.idx);
600e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  /* Save the last displayed frame. We'll be using it to fill the gap between
601e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev     when preview stops and postview start during snapshot.*/
602e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mLastQueuedFrame = &(mDisplayStreamBuf.frame[frame->def.idx]);
603e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mHalCamCtrl->mPreviewMemoryLock.unlock();
604e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
605e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mHalCamCtrl->mCallbackLock.lock();
606e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  camera_data_callback pcb = mHalCamCtrl->mDataCb;
607e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mHalCamCtrl->mCallbackLock.unlock();
608e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGD("Message enabled = 0x%x", mHalCamCtrl->mMsgEnabled);
609e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
610e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if (pcb != NULL) {
611e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      //Sending preview callback if corresponding Msgs are enabled
612e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
613e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          msgType |=  CAMERA_MSG_PREVIEW_FRAME;
614e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];//mPreviewHeap->mBuffers[frame->def.idx];
615e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      } else {
616e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          data = NULL;
617e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      }
618e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      if(msgType) {
619e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          mStopCallbackLock.unlock();
620e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          pcb(msgType, data, 0, metadata, mHalCamCtrl->mCallbackCookie);
621e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      }
622e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	  ALOGD("end of cb");
623e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
624e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if(rcb != NULL)
625e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  {
626e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mHalCamCtrl->mStoreMetaDataInFrame)
627e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    {
628e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          mStopCallbackLock.unlock();
629e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          if(mHalCamCtrl->mStartRecording == true &&( mHalCamCtrl->mMsgEnabled & CAMERA_MSG_VIDEO_FRAME))
630e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME,
631e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              mHalCamCtrl->mRecordingMemory.metadata_memory[frame->def.idx],
632e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              0, mHalCamCtrl->mCallbackCookie);
633e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
634e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    else
635e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    {
636e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(mHalCamCtrl->mStartRecording == true &&( mHalCamCtrl->mMsgEnabled & CAMERA_MSG_VIDEO_FRAME))
637e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        {
638e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            mStopCallbackLock.unlock();
639e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev            rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME,
640e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx],
641e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev              0, mHalCamCtrl->mCallbackCookie);
642e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
643e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
644e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
645e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
646e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  /* Save the last displayed frame. We'll be using it to fill the gap between
647e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev     when preview stops and postview start during snapshot.*/
648e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  //mLastQueuedFrame = frame->def.frame;
649e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/*
650e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, frame))
651e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  {
652e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ALOGE("BUF DONE FAILED");
653e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      return BAD_VALUE;
654e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
655e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev*/
656e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  return NO_ERROR;
657e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
658e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
659e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
660e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// QCameraStream_preview
661e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
662e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
663e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevQCameraStream_preview::
664e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevQCameraStream_preview(int cameraId, camera_mode_t mode)
665e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  : QCameraStream(cameraId,mode),
666e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mLastQueuedFrame(NULL),
667e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mNumFDRcvd(0)
668e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  {
669e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mHalCamCtrl = NULL;
670e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: E", __func__);
671e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: X", __func__);
672e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
673e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
674e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// QCameraStream_preview
675e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
676e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
677e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevQCameraStream_preview::~QCameraStream_preview() {
678e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGV("%s: E", __func__);
679e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	if(mActive) {
680e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		stop();
681e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	}
682e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	if(mInit) {
683e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev		release();
684e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	}
685e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	mInit = false;
686e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	mActive = false;
687e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGV("%s: X", __func__);
688e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
689e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
690e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
691e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// QCameraStream_preview
692e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
693e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
694e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_preview::init() {
695e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
696e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  status_t ret = NO_ERROR;
697e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGV("%s: E", __func__);
698e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
699e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ret = QCameraStream::initChannel (mCameraId, MM_CAMERA_CH_PREVIEW_MASK);
700e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if (NO_ERROR!=ret) {
701e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s E: can't init native cammera preview ch\n",__func__);
702e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return ret;
703e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
704e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
705e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGE("Debug : %s : initChannel",__func__);
706e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  /* register a notify into the mmmm_camera_t object*/
707e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  (void) cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_PREVIEW,
708e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                     preview_notify_cb, MM_CAMERA_REG_BUF_CB_INFINITE, 0, this);
709e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  ALOGE("Debug : %s : cam_evt_register_buf_notify",__func__);
710e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  buffer_handle_t *buffer_handle = NULL;
711e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  int tmp_stride = 0;
712e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  mInit = true;
713e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  return ret;
714e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
715e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
716e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// QCameraStream_preview
717e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
718e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
719e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_preview::start()
720e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
721e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGV("%s: E", __func__);
722e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    status_t ret = NO_ERROR;
723e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mm_camera_reg_buf_t *reg_buf=&mDisplayBuf;
724e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
725e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    Mutex::Autolock lock(mStopCallbackLock);
726e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
727e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* call start() in parent class to start the monitor thread*/
728e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    //QCameraStream::start ();
729e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    setFormat(MM_CAMERA_CH_PREVIEW_MASK);
730e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
731e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(NO_ERROR!=initDisplayBuffers()){
732e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        return BAD_VALUE;
733e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
734e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("Debug : %s : initDisplayBuffers",__func__);
735e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_prepare_buf(mCameraId, reg_buf);
736e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("Debug : %s : cam_config_prepare_buf",__func__);
737e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(ret != MM_CAMERA_OK) {
738e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ALOGV("%s:reg preview buf err=%d\n", __func__, ret);
739e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = BAD_VALUE;
740e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }else
741e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = NO_ERROR;
742e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
743e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	/* For preview, the OP_MODE we set is dependent upon whether we are
744e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       starting camera or camcorder. For snapshot, anyway we disable preview.
745e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       However, for ZSL we need to set OP_MODE to OP_MODE_ZSL and not
746e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       OP_MODE_VIDEO. We'll set that for now in CamCtrl. So in case of
747e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev       ZSL we skip setting Mode here */
748e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
749e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (!(myMode & CAMERA_ZSL_MODE)) {
750e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ALOGE("Setting OP MODE to MM_CAMERA_OP_MODE_VIDEO");
751e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_VIDEO;
752e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = cam_config_set_parm (mCameraId, MM_CAMERA_PARM_OP_MODE,
753e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        &op_mode);
754e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ALOGE("OP Mode Set");
755e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
756e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(MM_CAMERA_OK != ret) {
757e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          ALOGE("%s: X :set mode MM_CAMERA_OP_MODE_VIDEO err=%d\n", __func__, ret);
758e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          return BAD_VALUE;
759e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
760e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }else {
761e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ALOGE("Setting OP MODE to MM_CAMERA_OP_MODE_ZSL");
762e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_ZSL;
763e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        ret = cam_config_set_parm (mCameraId, MM_CAMERA_PARM_OP_MODE,
764e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                        &op_mode);
765e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        if(MM_CAMERA_OK != ret) {
766e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          ALOGE("%s: X :set mode MM_CAMERA_OP_MODE_ZSL err=%d\n", __func__, ret);
767e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev          return BAD_VALUE;
768e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        }
769e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev     }
770e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
771e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* call mm_camera action start(...)  */
772e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("Starting Preview/Video Stream. ");
773e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_ops_action(mCameraId, TRUE, MM_CAMERA_OPS_PREVIEW, 0);
774e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
775e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (MM_CAMERA_OK != ret) {
776e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ALOGE ("%s: preview streaming start err=%d\n", __func__, ret);
777e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      return BAD_VALUE;
778e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
779e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
780e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("Debug : %s : Preview streaming Started",__func__);
781e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = NO_ERROR;
782e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
783e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mActive =  true;
784e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: X", __func__);
785e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return NO_ERROR;
786e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
787e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
788e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
789e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
790e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// QCameraStream_preview
791e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
792e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  void QCameraStream_preview::stop() {
793e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: E", __func__);
794e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int ret=MM_CAMERA_OK;
795e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
796e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!mActive) {
797e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      return;
798e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
799e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    mActive =  false;
800e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    Mutex::Autolock lock(mStopCallbackLock);
801e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* unregister the notify fn from the mmmm_camera_t object*/
802e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
803e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    /* call stop() in parent class to stop the monitor thread*/
804e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_ops_action(mCameraId, FALSE, MM_CAMERA_OPS_PREVIEW, 0);
805e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(MM_CAMERA_OK != ret) {
806e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ALOGE ("%s: camera preview stop err=%d\n", __func__, ret);
807e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
808e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("Debug : %s : Preview streaming Stopped",__func__);
809e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret = cam_config_unprepare_buf(mCameraId, MM_CAMERA_CH_PREVIEW);
810e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(ret != MM_CAMERA_OK) {
811e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ALOGE("%s:Unreg preview buf err=%d\n", __func__, ret);
812e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      //ret = BAD_VALUE;
813e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
814e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
815e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("Debug : %s : Buffer Unprepared",__func__);
816e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if (mDisplayBuf.preview.buf.mp != NULL) {
817e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev        delete[] mDisplayBuf.preview.buf.mp;
818e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
819e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	/*free camera_memory handles and return buffer back to surface*/
820e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    putBufferToSurface();
821e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
822e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: X", __func__);
823e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
824e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
825e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
826e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// QCameraStream_preview
827e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
828e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  void QCameraStream_preview::release() {
829e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
830e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s : BEGIN",__func__);
831e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    int ret=MM_CAMERA_OK,i;
832e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
833e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(!mInit)
834e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    {
835e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ALOGE("%s : Stream not Initalized",__func__);
836e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      return;
837e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
838e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
839e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(mActive) {
840e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      this->stop();
841e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
842e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
843e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ret= QCameraStream::deinitChannel(mCameraId, MM_CAMERA_CH_PREVIEW);
844e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("Debug : %s : De init Channel",__func__);
845e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    if(ret != MM_CAMERA_OK) {
846e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      ALOGE("%s:Deinit preview channel failed=%d\n", __func__, ret);
847e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev      //ret = BAD_VALUE;
848e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    }
849e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
850e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    (void)cam_evt_register_buf_notify(mCameraId, MM_CAMERA_CH_PREVIEW,
851e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                      NULL,
852e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev					(mm_camera_register_buf_cb_type_t)NULL,
853e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev					NULL,
854e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev					NULL);
855e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev	mInit = false;
856e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGE("%s: END", __func__);
857e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
858e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
859e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
860e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevQCameraStream*
861e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan MalchevQCameraStream_preview::createInstance(int cameraId,
862e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev                                      camera_mode_t mode)
863e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
864e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  QCameraStream* pme = new QCameraStream_preview(cameraId, mode);
865e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  return pme;
866e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
867e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
868e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// QCameraStream_preview
869e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
870e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
871e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid QCameraStream_preview::deleteInstance(QCameraStream *p)
872e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
873e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  if (p){
874e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGV("%s: BEGIN", __func__);
875e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    p->release();
876e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    delete p;
877e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    p = NULL;
878e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    ALOGV("%s: END", __func__);
879e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  }
880e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
881e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
882e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
883e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev/* Temp helper function */
884e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevvoid *QCameraStream_preview::getLastQueuedFrame(void)
885e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
886e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    return mLastQueuedFrame;
887e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
888e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
889e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchevstatus_t QCameraStream_preview::initPreviewOnlyBuffers()
890e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev{
891e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  /*1. for 7x27a, this shall not called;
892e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    2. this file shall be removed ASAP
893e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev    so put a dummy function to just pass the compile*/
894e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev  return INVALID_OPERATION;
895e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}
896e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev
897e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
898e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// No code beyone this line
899e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev// ---------------------------------------------------------------------------
900e6e5b199f1d8d2d10d9ca66210e8ee9315d65a50Iliyan Malchev}; // namespace android
901