1a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* 2a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Copyright (c) 2011-2012 Code Aurora Forum. All rights reserved. 3a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** 4a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Licensed under the Apache License, Version 2.0 (the "License"); 5a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** you may not use this file except in compliance with the License. 6a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** You may obtain a copy of the License at 7a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** 8a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** http://www.apache.org/licenses/LICENSE-2.0 9a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** 10a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** Unless required by applicable law or agreed to in writing, software 11a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** distributed under the License is distributed on an "AS IS" BASIS, 12a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** See the License for the specific language governing permissions and 14a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang** limitations under the License. 15a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang*/ 16a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 17a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/*#error uncomment this for compiler test!*/ 18a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 19a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define ALOG_TAG "QCameraHWI_Preview" 20a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/Log.h> 21a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/threads.h> 22a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <fcntl.h> 23a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <sys/mman.h> 24a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include "QCameraHAL.h" 25a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include "QCameraHWI.h" 26a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <genlock.h> 27a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <gralloc_priv.h> 28a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 29a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define UNLIKELY(exp) __builtin_expect(!!(exp), 0) 30a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 31a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* QCameraHWI_Preview class implementation goes here*/ 32a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* following code implement the preview mode's image capture & display logic of this class*/ 33a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 34a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangnamespace android { 35a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 36a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream_preview::setPreviewWindow(const camera2_stream_ops_t* window) 37a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 38a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang status_t retVal = NO_ERROR; 39a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE(" %s: E ", __FUNCTION__); 40a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if( window == NULL) { 41a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGW(" Setting NULL preview window "); 42a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* TODO: Current preview window will be invalidated. 43a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * Release all the buffers back */ 44a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang // relinquishBuffers(); 45a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 46a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock lock(mLock); 47a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewWindow = window; 48a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV(" %s : X ", __FUNCTION__ ); 49a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return retVal; 50a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 51a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 52a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint QCameraStream_preview::registerStreamBuffers(int num_buffers, 53a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang buffer_handle_t *buffers) 54a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 55a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int err; 56a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 57a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mNumBuffers = num_buffers; 58a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemory.buffer_count = num_buffers; 59a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for (int i = 0; i < num_buffers; i++) { 60a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemory.buffer_handle[i] = buffers[i]; 61a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemory.private_buffer_handle[i] = (struct private_handle_t *)buffers[i]; 62a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGD("%s:Buffer Size:%d",__func__, mPreviewMemory.private_buffer_handle[i]->size); 63a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 64a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf = new mm_camera_buf_def_t[num_buffers]; 65a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (!mDisplayBuf) { 66a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Unable to allocate mDisplayBuf"); 67a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NO_MEMORY; 68a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 69a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 70a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return OK; 71a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 72a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 73a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream_preview::initBuffers() 74a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 75a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang status_t ret = NO_ERROR; 76a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int width = mWidth; /* width of channel */ 77a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int height = mHeight; /* height of channel */ 78a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t frame_len = mFrameOffsetInfo.frame_len; /* frame planner length */ 79a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int buffer_num = mNumBuffers; /* number of buffers for display */ 80a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang const char *pmem_region; 81a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint8_t num_planes = mFrameOffsetInfo.num_planes; 82a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t planes[VIDEO_MAX_PLANES]; 83a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang void *vaddr = NULL; 84a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang buffer_handle_t *buffer_handle; 85a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 86a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s:BEGIN",__func__); 87a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang memset(mNotifyBuffer, 0, sizeof(mNotifyBuffer)); 88a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 89a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang this->myMode=myMode; /*Need to assign this in constructor after translating from mask*/ 90a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang num_planes = mFrameOffsetInfo.num_planes; 91a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for(int i=0; i < num_planes; i++) 92a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang planes[i] = mFrameOffsetInfo.mp[i].len; 93a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 94a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 95a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemoryLock.lock(); 96a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang memset(mDisplayBuf, 0, sizeof(mm_camera_buf_def_t) * mNumBuffers); 97a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 98a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /*allocate memory for the buffers*/ 99a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for(int i = 0; i < mNumBuffers; i++){ 100a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].num_planes = num_planes; 101a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].buf_idx = i; 102a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 103a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* Plane 0 needs to be set seperately. Set other planes 104a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * in a loop. */ 105a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[0].length = planes[0]; 106a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[0].m.userptr = mPreviewMemory.private_buffer_handle[i]->fd; 107a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[0].data_offset = mFrameOffsetInfo.mp[0].offset; 108a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[0].reserved[0] =0; 109a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for (int j = 1; j < num_planes; j++) { 110a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[j].length = planes[j]; 111a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[j].m.userptr = mPreviewMemory.private_buffer_handle[i]->fd; 112a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[j].data_offset = mFrameOffsetInfo.mp[j].offset; 113a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[j].reserved[0] = 114a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[j-1].reserved[0] + 115a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[j-1].length; 116a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 117a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 118a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for (int j = 0; j < num_planes; j++) 119a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Planes: %d length: %d userptr: %lu offset: %d\n", j, 120a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[j].length, 121a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[j].m.userptr, 122a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].planes[j].reserved[0]); 123a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 124a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].stream_id = mMmStreamId; 125a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].fd = mPreviewMemory.private_buffer_handle[i]->fd; 126a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("DEBUG2:Display buf[%d] fd:%d",i,mDisplayBuf[i].fd); 127a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf[i].frame_len = mFrameOffsetInfo.frame_len; 128a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang }/*end of for loop*/ 129a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 130a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* Dequeue N frames from native window and queue into interface. Only dequeue our requested buffers */ 131a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for (int i = 0; i < mNumBuffers; i++) 132a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemory.local_flag[i] = BUFFER_NOT_REGGED; 133a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for (int i = 0; i < OPAQUE_BUFFER_COUNT; i++) { 134a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("mPreview Window %p",mPreviewWindow); 135a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int err = mPreviewWindow->dequeue_buffer(mPreviewWindow, &buffer_handle); 136a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (err == NO_ERROR && buffer_handle) { 137a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int j; 138a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for (j = 0; j < mPreviewMemory.buffer_count; j++) { 139a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mPreviewMemory.buffer_handle[j] == *buffer_handle) { 140a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemory.local_flag[j] = BUFFER_OWNED; 141a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: [%d]: local_flag = 1", __func__, j); 142a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 143a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 144a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 145a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (j == mPreviewMemory.buffer_count) { 146a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Cannot find matching handle in the table."); 147a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return INVALID_OPERATION; 148a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 149a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } else { 150a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("dequeue_buffer failed."); 151a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return INVALID_OPERATION; 152a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 153a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 154a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 155a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* register the streaming buffers for the channel*/ 156a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemoryLock.unlock(); 157a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s:END",__func__); 158a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NO_ERROR; 159a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 160a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangerror: 161a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemoryLock.unlock(); 162a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 163a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: X", __func__); 164a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return ret; 165a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 166a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 167a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream_preview::deinitBuffers() 168a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 169a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemoryLock.lock(); 170a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for (int i = 0; i < mNumBuffers; i++) { 171a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mPreviewMemory.local_flag[i] == BUFFER_OWNED) { 172a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewWindow->cancel_buffer(mPreviewWindow, 173a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang &mPreviewMemory.buffer_handle[i]); 174a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemory.local_flag[i] = BUFFER_NOT_OWNED; 175a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 176a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 177a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemoryLock.unlock(); 178a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 179a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 180a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream_preview::dumpFrameToFile(mm_camera_buf_def_t *newFrame) 181a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 182a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int32_t enabled = 0; 183a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int frm_num; 184a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t skip_mode; 185a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang char value[PROPERTY_VALUE_MAX]; 186a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang char buf[32]; 187a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int w, h; 188a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang static int count = 0; 189a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int file_fd; 190a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int rc = 0; 191a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int len; 192a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang unsigned long addr; 193a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang unsigned long * tmp = (unsigned long *)newFrame->buffer; 194a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang addr = *tmp; 195a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 196a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang len = newFrame->frame_len; 197a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang count++; 198a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(count < 100) { 199a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang snprintf(buf, sizeof(buf), "/data/mzhu%d.yuv", count); 200a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang file_fd = open(buf, O_RDWR | O_CREAT, 0777); 201a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 202a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang rc = write(file_fd, (const void *)addr, len); 203a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: file='%s', vaddr_old=0x%x, addr_map = 0x%p, len = %d, rc = %d", 204a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang __func__, buf, (uint32_t)newFrame->buffer, (void *)addr, len, rc); 205a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang close(file_fd); 206a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: dump %s, rc = %d, len = %d", __func__, buf, rc, len); 207a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 208a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 209a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 210a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint QCameraStream_preview::prepareStream() 211a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 212a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_img_mode img_mode; 213a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang cam_format_t format; 214a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang struct private_handle_t *private_handle = mPreviewMemory.private_buffer_handle[0]; 215a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 216a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: private_handle->format = %d, flags = %d", __func__, 217a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang private_handle->format, private_handle->flags); 218a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (private_handle->flags & private_handle_t::PRIV_FLAGS_VIDEO_ENCODER) 219a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang img_mode = MM_CAMERA_VIDEO; 220a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang else if (private_handle->flags & private_handle_t::PRIV_FLAGS_CAMERA_WRITE) 221a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang img_mode = MM_CAMERA_PREVIEW; 222a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang else { 223a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: Invalid flags %d\n", __func__, private_handle->flags); 224a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return BAD_VALUE; 225a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 226a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 227a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang switch (private_handle->format) { 228a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_SP: 229a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang format = CAMERA_YUV_420_NV12; 230a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 231a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang case HAL_PIXEL_FORMAT_YCrCb_420_SP: 232a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang format = CAMERA_YUV_420_NV21; 233a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 234a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang default: 235a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: Invalid format!!!", __func__); 236a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return BAD_VALUE; 237a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 238a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(NO_ERROR!=initStream(img_mode, format)) { 239a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Init stream failed"); 240a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return BAD_VALUE; 241a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 242a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return OK; 243a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 244a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 245a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream_preview::processPreviewFrame ( 246a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_super_buf_t *frame) 247a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 248a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s",__func__); 249a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int err = 0; 250a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int msgType = 0; 251a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int i; 252a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang camera_frame_metadata_t *metadata = NULL; 253a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 254a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock lock(mLock); 255a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(!mActive) { 256a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Preview Stopped. Returning callback"); 257a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NO_ERROR; 258a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 259a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 260a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(mHalCamCtrl==NULL) { 261a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: X: HAL control object not set",__func__); 262a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /*Call buf done*/ 263a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return BAD_VALUE; 264a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 265a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang nsecs_t timeStamp = seconds_to_nanoseconds(frame->bufs[0]->ts.tv_sec) ; 266a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang timeStamp += frame->bufs[0]->ts.tv_nsec; 267a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 268a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(mFirstFrameRcvd == false) { 269a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang //mm_camera_util_profile("HAL: First preview frame received"); 270a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mFirstFrameRcvd = true; 271a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 272a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 273a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang // dumpFrameToFile(frame->bufs[0]); 274a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 275a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemoryLock.lock(); 276a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mNotifyBuffer[frame->bufs[0]->buf_idx] = *frame; 277a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("processPreviewFrame: timeStamp = %lld", (int64_t)timeStamp); 278a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang err = mPreviewWindow->enqueue_buffer(mPreviewWindow, (int64_t)timeStamp, 279a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang &mPreviewMemory.buffer_handle[frame->bufs[0]->buf_idx]); 280a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(err != 0) { 281a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: enqueue_buffer failed, err = %d", __func__, err); 282a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 283a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemory.local_flag[frame->bufs[0]->buf_idx] = BUFFER_NOT_OWNED; 284a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 285a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang buffer_handle_t *buffer_handle = NULL; 286a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang err = mPreviewWindow->dequeue_buffer(mPreviewWindow, &buffer_handle); 287a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (err == NO_ERROR && buffer_handle != NULL) { 288a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int rc = MM_CAMERA_OK; 289a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGD("%s: dequed buf hdl =%p", __func__, *buffer_handle); 290a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang for(i = 0; i < mPreviewMemory.buffer_count; i++) { 291a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(mPreviewMemory.buffer_handle[i] == *buffer_handle) { 292a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("<DEBUG2>:Found buffer in idx:%d",i); 293a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 294a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 295a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 296a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mPreviewMemory.local_flag[i] == BUFFER_NOT_REGGED) { 297a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_buf_def_t buf = mDisplayBuf[i]; 298a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemory.local_flag[i] = BUFFER_OWNED; 299a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang rc = p_mm_ops->ops->qbuf(mCameraHandle, mChannelId, &buf); 300a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } else { 301a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemory.local_flag[i] = BUFFER_OWNED; 302a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang rc = p_mm_ops->ops->qbuf(mCameraHandle, mChannelId, mNotifyBuffer[i].bufs[0]); 303a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 304a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 305a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(rc != MM_CAMERA_OK) { 306a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* how to handle the error of qbuf? */ 307a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("BUF DONE FAILED"); 308a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 309a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 310a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* Save the last displayed frame. We'll be using it to fill the gap between 311a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang when preview stops and postview start during snapshot.*/ 312a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mLastQueuedFrame = &(mDisplayBuf[frame->bufs[0]->buf_idx]); 313a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mPreviewMemoryLock.unlock(); 314a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 315a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return NO_ERROR; 316a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 317a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 318a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 319a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview 320a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 321a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 322a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream_preview::QCameraStream_preview(uint32_t CameraHandle, 323a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t ChannelId, 324a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t Width, 325a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t Height, 326a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int requestedFormat, 327a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_vtbl_t *mm_ops, 328a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang camera_mode_t mode) : 329a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang QCameraStream(CameraHandle, 330a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ChannelId, 331a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Width, 332a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Height, 333a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_ops, 334a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mode), 335a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mLastQueuedFrame(NULL), 336a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf(NULL), 337a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mNumFDRcvd(0) 338a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 339a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mHalCamCtrl = NULL; 340a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: E", __func__); 341a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 342a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mStreamId = allocateStreamId(); 343a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 344a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang switch (requestedFormat) { 345a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang case CAMERA2_HAL_PIXEL_FORMAT_OPAQUE: 346a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mMaxBuffers = 5; 347a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 348a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang case HAL_PIXEL_FORMAT_BLOB: 349a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mMaxBuffers = 1; 350a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 351a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang default: 352a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Unsupported requested format %d", requestedFormat); 353a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mMaxBuffers = 1; 354a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang break; 355a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 356a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /*TODO: There has to be a better way to do this*/ 357a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: X", __func__); 358a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 359a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 360a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview 361a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 362a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 363a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream_preview::~QCameraStream_preview() { 364a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: E", __func__); 365a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(mActive) { 366a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang streamOff(0); 367a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 368a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(mInit) { 369a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang deinitStream(); 370a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 371a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mInit = false; 372a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mActive = false; 373a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (mDisplayBuf) { 374a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang delete[] mDisplayBuf; 375a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mDisplayBuf = NULL; 376a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 377a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang deallocateStreamId(mStreamId); 378a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: X", __func__); 379a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 380a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 381a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 382a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview 383a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 384a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 385a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream_preview::init() 386a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 387a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang status_t ret = NO_ERROR; 388a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: E", __func__); 389a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 390a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#if 0 391a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (!(myMode & CAMERA_ZSL_MODE)) { 392a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Setting OP MODE to MM_CAMERA_OP_MODE_VIDEO"); 393a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_VIDEO; 394a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = p_mm_ops->ops->set_parm (mCameraHandle, MM_CAMERA_PARM_OP_MODE, 395a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang &op_mode); 396a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("OP Mode Set"); 397a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 398a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(MM_CAMERA_OK != ret) { 399a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: X :set mode MM_CAMERA_OP_MODE_VIDEO err=%d\n", __func__, ret); 400a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return BAD_VALUE; 401a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 402a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang }else { 403a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Setting OP MODE to MM_CAMERA_OP_MODE_ZSL"); 404a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_op_mode_type_t op_mode=MM_CAMERA_OP_MODE_ZSL; 405a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret =p_mm_ops->ops->set_parm (mCameraHandle, MM_CAMERA_PARM_OP_MODE, 406a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang &op_mode); 407a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(MM_CAMERA_OK != ret) { 408a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: X :set mode MM_CAMERA_OP_MODE_ZSL err=%d\n", __func__, ret); 409a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return BAD_VALUE; 410a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 411a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 412a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 413a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang setFormat(); 414a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = QCameraStream::initStream(); 415a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (NO_ERROR!=ret) { 416a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s E: can't init native cammera preview ch\n",__func__); 417a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return ret; 418a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 419a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 420a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mInit = true; 421a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#endif 422a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return ret; 423a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 424a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 425a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview 426a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 427a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 428a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatus_t QCameraStream_preview::start() 429a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 430a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: E", __func__); 431a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang status_t ret = NO_ERROR; 432a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 433a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock lock(mLock); 434a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 435a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* call start() in parent class to start the monitor thread*/ 436a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang //QCameraStream::start (); 437a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 438a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#if 0 439a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = cam_config_prepare_buf(mCameraId, &mDisplayBuf); 440a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Debug : %s : cam_config_prepare_buf",__func__); 441a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(ret != MM_CAMERA_OK) { 442a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s:reg preview buf err=%d\n", __func__, ret); 443a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = BAD_VALUE; 444a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang goto error; 445a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang }else { 446a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = NO_ERROR; 447a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 448a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#endif 449a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* For preview, the OP_MODE we set is dependent upon whether we are 450a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang starting camera or camcorder. For snapshot, anyway we disable preview. 451a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang However, for ZSL we need to set OP_MODE to OP_MODE_ZSL and not 452a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang OP_MODE_VIDEO. We'll set that for now in CamCtrl. So in case of 453a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ZSL we skip setting Mode here */ 454a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 455a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 456a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* call mm_camera action start(...) */ 457a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Starting Preview/Video Stream. "); 458a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mFirstFrameRcvd = false; 459a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 460a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Starting Preview/Video Stream. "); 461a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = streamOn(); 462a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (MM_CAMERA_OK != ret) { 463a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE ("%s: preview streaming start err=%d\n", __func__, ret); 464a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = BAD_VALUE; 465a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang goto end; 466a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 467a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 468a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Debug : %s : Preview streaming Started",__func__); 469a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = NO_ERROR; 470a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 471a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mActive = true; 472a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang goto end; 473a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 474a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangend: 475a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: X", __func__); 476a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return ret; 477a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 478a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 479a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 480a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 481a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview 482a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 483a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang void QCameraStream_preview::stop() { 484a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: E", __func__); 485a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int ret=MM_CAMERA_OK; 486a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 487a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(!mActive) { 488a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return; 489a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 490a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Mutex::Autolock lock(mLock); 491a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mActive = false; 492a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* unregister the notify fn from the mmmm_camera_t object*/ 493a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 494a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGI("%s: Stop the thread \n", __func__); 495a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* call stop() in parent class to stop the monitor thread*/ 496a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang //stream_info = mHalCamCtrl->getChannelInterface(); 497a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 498a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = streamOff(0); 499a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(MM_CAMERA_OK != ret) { 500a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE ("%s: camera preview stop err=%d\n", __func__, ret); 501a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 502a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#if 0 503a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret = cam_config_unprepare_buf(mCameraId, MM_CAMERA_CH_PREVIEW); 504a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(ret != MM_CAMERA_OK) { 505a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s:Unreg preview buf err=%d\n", __func__, ret); 506a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang //ret = BAD_VALUE; 507a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 508a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#endif 509a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /* In case of a clean stop, we need to clean all buffers*/ 510a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("Debug : %s : Buffer Unprepared",__func__); 511a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang /*free camera_memory handles and return buffer back to surface*/ 512a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ret= QCameraStream::deinitStream(); 513a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE(": %s : De init Channel",__func__); 514a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(ret != MM_CAMERA_OK) { 515a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s:Deinit preview channel failed=%d\n", __func__, ret); 516a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang //ret = BAD_VALUE; 517a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 518a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: X", __func__); 519a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 520a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 521a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 522a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview 523a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 524a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang void QCameraStream_preview::release() { 525a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 526a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s : BEGIN",__func__); 527a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int ret=MM_CAMERA_OK,i; 528a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 529a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(!mInit) 530a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang { 531a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s : Stream not Initalized",__func__); 532a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return; 533a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 534a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 535a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(mActive) { 536a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang this->streamOff(0); 537a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 538a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 539a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 540a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if(mInit) { 541a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang deinitStream(); 542a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 543a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mInit = false; 544a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGE("%s: END", __func__); 545a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 546a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 547a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 548a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream* 549a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraStream_preview::createInstance(uint32_t CameraHandle, 550a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t ChannelId, 551a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t Width, 552a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang uint32_t Height, 553a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang int requestedFormat, 554a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_camera_vtbl_t *mm_ops, 555a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang camera_mode_t mode) 556a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 557a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang QCameraStream* pme = new QCameraStream_preview(CameraHandle, 558a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ChannelId, 559a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Width, 560a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang Height, 561a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang requestedFormat, 562a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mm_ops, 563a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang mode); 564a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return pme; 565a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 566a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 567a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// QCameraStream_preview 568a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 569a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 570a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid QCameraStream_preview::deleteInstance(QCameraStream *p) 571a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 572a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang if (p){ 573a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: BEGIN", __func__); 574a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p->release(); 575a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang delete p; 576a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang p = NULL; 577a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang ALOGV("%s: END", __func__); 578a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang } 579a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 580a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 581a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 582a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* Temp helper function */ 583a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid *QCameraStream_preview::getLastQueuedFrame(void) 584a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{ 585a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang return mLastQueuedFrame; 586a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} 587a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang 588a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 589a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// No code beyone this line 590a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang// --------------------------------------------------------------------------- 591a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}; // namespace android 592