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