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