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