diff options
Diffstat (limited to 'camera/QCameraHWI_Preview.cpp')
-rw-r--r-- | camera/QCameraHWI_Preview.cpp | 403 |
1 files changed, 25 insertions, 378 deletions
diff --git a/camera/QCameraHWI_Preview.cpp b/camera/QCameraHWI_Preview.cpp index 658bd84..30927c5 100644 --- a/camera/QCameraHWI_Preview.cpp +++ b/camera/QCameraHWI_Preview.cpp @@ -1,5 +1,5 @@ /* -** Copyright (c) 2011-2012 The Linux Foundation. All rights reserved. +** Copyright (c) 2011-2012,2015 The Linux Foundation. All rights reserved. ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -315,96 +315,6 @@ status_t QCameraStream_preview::putBufferToSurface() { return NO_ERROR; } - -status_t QCameraStream_preview::getBufferNoDisplay( ) -{ - int err = 0; - status_t ret = NO_ERROR; - int i, num_planes, frame_len, y_off, cbcr_off; - cam_ctrl_dimension_t dim; - uint32_t planes[VIDEO_MAX_PLANES]; - - ALOGV("%s : E ", __FUNCTION__); - - - ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim); - if(ret != NO_ERROR) { - ALOGE("%s: display format %d is not supported", __func__, dim.prev_format); - goto end; - } - mHalCamCtrl->mPreviewMemoryLock.lock(); - mHalCamCtrl->mNoDispPreviewMemory.buffer_count = kPreviewBufferCount; - if(mHalCamCtrl->isZSLMode()) { - if(mHalCamCtrl->getZSLQueueDepth() > kPreviewBufferCount - 3) - mHalCamCtrl->mNoDispPreviewMemory.buffer_count = - mHalCamCtrl->getZSLQueueDepth() + 3; - } - - num_planes = dim.display_frame_offset.num_planes; - for ( i = 0; i < num_planes; i++) { - planes[i] = dim.display_frame_offset.mp[i].len; - } - - frame_len = dim.picture_frame_offset.frame_len; - y_off = dim.picture_frame_offset.mp[0].offset; - cbcr_off = dim.picture_frame_offset.mp[1].offset; - ALOGV("%s: main image: rotation = %d, yoff = %d, cbcroff = %d, size = %d, width = %d, height = %d", - __func__, dim.rotation, y_off, cbcr_off, frame_len, - dim.display_width, dim.display_height); - if (mHalCamCtrl->initHeapMem(&mHalCamCtrl->mNoDispPreviewMemory, - mHalCamCtrl->mNoDispPreviewMemory.buffer_count, - frame_len, y_off, cbcr_off, MSM_PMEM_MAINIMG, - NULL,NULL, num_planes, planes) < 0) { - ret = NO_MEMORY; - goto end; - }; - - memset(&mHalCamCtrl->mMetadata, 0, sizeof(mHalCamCtrl->mMetadata)); - memset(mHalCamCtrl->mFace, 0, sizeof(mHalCamCtrl->mFace)); - - ALOGV(" %s : X ",__FUNCTION__); -end: - //mDisplayLock.unlock(); - mHalCamCtrl->mPreviewMemoryLock.unlock(); - - return NO_ERROR; -} - -status_t QCameraStream_preview::freeBufferNoDisplay() -{ - int err = 0; - status_t ret = NO_ERROR; - - ALOGV(" %s : E ", __FUNCTION__); - - //mDisplayLock.lock(); - mHalCamCtrl->mPreviewMemoryLock.lock(); - for (int cnt = 0; cnt < mHalCamCtrl->mNoDispPreviewMemory.buffer_count; cnt++) { - if (cnt < mHalCamCtrl->mNoDispPreviewMemory.buffer_count) { - if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW, - cnt, mCameraId, CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) { - ALOGE("%s: sending data Msg Failed", __func__); - } - if(mHalCamCtrl->isZSLMode()) { - if (NO_ERROR != mHalCamCtrl->sendUnMappingBuf(MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL, cnt, mCameraId, - CAM_SOCK_MSG_TYPE_FD_UNMAPPING)) { - ALOGE("%s: Send socket msg to Unmap Failed", __func__); - } - } - } - } - mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mNoDispPreviewMemory); - memset(&mHalCamCtrl->mNoDispPreviewMemory, 0, sizeof(mHalCamCtrl->mNoDispPreviewMemory)); - if (mDisplayBuf.preview.buf.mp != NULL) { - delete[] mDisplayBuf.preview.buf.mp; - mDisplayBuf.preview.buf.mp = NULL; - } - - mHalCamCtrl->mPreviewMemoryLock.unlock(); - ALOGV(" %s : X ",__FUNCTION__); - return NO_ERROR; -} - void QCameraStream_preview::notifyROIEvent(fd_roi_t roi) { camera_memory_t *data = mHalCamCtrl->mGetMemory(-1, 1, 1, NULL); @@ -547,7 +457,6 @@ status_t QCameraStream_preview::initDisplayBuffers() mHalCamCtrl->mPreviewMemoryLock.lock(); memset(&mHalCamCtrl->mPreviewMemory, 0, sizeof(mHalCamCtrl->mPreviewMemory)); mHalCamCtrl->mPreviewMemoryLock.unlock(); - memset(&mNotifyBuffer, 0, sizeof(mNotifyBuffer)); /* get preview size, by qury mm_camera*/ memset(&dim, 0, sizeof(cam_ctrl_dimension_t)); @@ -593,14 +502,14 @@ status_t QCameraStream_preview::initDisplayBuffers() /*allocate memory for the buffers*/ for(int i = 0; i < mDisplayStreamBuf.num; i++){ - if (mHalCamCtrl->mPreviewMemory.private_buffer_handle[i] == NULL) - continue; + if (mHalCamCtrl->mPreviewMemory.private_buffer_handle[i] == NULL) + continue; mDisplayStreamBuf.frame[i].fd = mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->fd; mDisplayStreamBuf.frame[i].cbcr_off = planes[0]; mDisplayStreamBuf.frame[i].y_off = 0; mDisplayStreamBuf.frame[i].path = OUTPUT_TYPE_P; - mHalCamCtrl->mPreviewMemory.addr_offset[i] = - mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->offset; + mHalCamCtrl->mPreviewMemory.addr_offset[i] = + mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->offset; mDisplayStreamBuf.frame[i].buffer = (long unsigned int)mHalCamCtrl->mPreviewMemory.camera_memory[i]->data; mDisplayStreamBuf.frame[i].ion_alloc.len = mHalCamCtrl->mPreviewMemory.private_buffer_handle[i]->size; @@ -658,6 +567,11 @@ status_t QCameraStream_preview::initDisplayBuffers() mDisplayBuf.preview.buf.mp[i].planes[j-1].length; } + if (mHalCamCtrl->mPreviewMemory.local_flag[i] == BUFFER_NOT_OWNED) { + mDisplayBuf.preview.no_enqueue_flag[i] = 1; + } else { + mDisplayBuf.preview.no_enqueue_flag[i] = 0; + } for (int j = 0; j < num_planes; j++) ALOGV("Planes: %d length: %d userptr: %lu offset: %d\n", j, mDisplayBuf.preview.buf.mp[i].planes[j].length, @@ -680,151 +594,6 @@ error: return ret; } -status_t QCameraStream_preview::initPreviewOnlyBuffers() -{ - status_t ret = NO_ERROR; - int width = 0; /* width of channel */ - int height = 0; /* height of channel */ - uint32_t frame_len = 0; /* frame planner length */ - int buffer_num = 4; /* number of buffers for display */ - const char *pmem_region; - uint8_t num_planes = 0; - uint32_t planes[VIDEO_MAX_PLANES]; - - cam_ctrl_dimension_t dim; - - ALOGV("%s:BEGIN",__func__); - memset(&mHalCamCtrl->mMetadata, 0, sizeof(camera_frame_metadata_t)); - mHalCamCtrl->mPreviewMemoryLock.lock(); - memset(&mHalCamCtrl->mNoDispPreviewMemory, 0, sizeof(mHalCamCtrl->mNoDispPreviewMemory)); - mHalCamCtrl->mPreviewMemoryLock.unlock(); - memset(&mNotifyBuffer, 0, sizeof(mNotifyBuffer)); - -/* get preview size, by qury mm_camera*/ - memset(&dim, 0, sizeof(cam_ctrl_dimension_t)); - ret = cam_config_get_parm(mCameraId, MM_CAMERA_PARM_DIMENSION, &dim); - if (MM_CAMERA_OK != ret) { - ALOGE("%s: error - can't get camera dimension!", __func__); - ALOGV("%s: X", __func__); - return BAD_VALUE; - }else { - width = dim.display_width; - height = dim.display_height; - } - - ret = getBufferNoDisplay( ); - if(ret != NO_ERROR) { - ALOGE("%s: cannot get memory from surface texture client, ret = %d", __func__, ret); - return ret; - } - - /* set 4 buffers for display */ - memset(&mDisplayStreamBuf, 0, sizeof(mDisplayStreamBuf)); - mHalCamCtrl->mPreviewMemoryLock.lock(); - this->mDisplayStreamBuf.num = mHalCamCtrl->mNoDispPreviewMemory.buffer_count; - this->myMode=myMode; /*Need to assign this in constructor after translating from mask*/ - num_planes = dim.display_frame_offset.num_planes; - for (int i = 0; i < num_planes; i++) { - planes[i] = dim.display_frame_offset.mp[i].len; - } - this->mDisplayStreamBuf.frame_len = dim.display_frame_offset.frame_len; - - memset(&mDisplayBuf, 0, sizeof(mDisplayBuf)); - mDisplayBuf.preview.buf.mp = new mm_camera_mp_buf_t[mDisplayStreamBuf.num]; - if (!mDisplayBuf.preview.buf.mp) { - ALOGE("%s Error allocating memory for mplanar struct ", __func__); - } - memset(mDisplayBuf.preview.buf.mp, 0, - mDisplayStreamBuf.num * sizeof(mm_camera_mp_buf_t)); - - /*allocate memory for the buffers*/ - void *vaddr = NULL; - for(int i = 0; i < mDisplayStreamBuf.num; i++){ - if (mHalCamCtrl->mNoDispPreviewMemory.camera_memory[i] == NULL) - continue; - mDisplayStreamBuf.frame[i].fd = mHalCamCtrl->mNoDispPreviewMemory.fd[i]; - mDisplayStreamBuf.frame[i].cbcr_off = planes[0]; - mDisplayStreamBuf.frame[i].y_off = 0; - mDisplayStreamBuf.frame[i].path = OUTPUT_TYPE_P; - mDisplayStreamBuf.frame[i].buffer = - (long unsigned int)mHalCamCtrl->mNoDispPreviewMemory.camera_memory[i]->data; - mDisplayStreamBuf.frame[i].ion_dev_fd = mHalCamCtrl->mNoDispPreviewMemory.main_ion_fd[i]; - mDisplayStreamBuf.frame[i].fd_data = mHalCamCtrl->mNoDispPreviewMemory.ion_info_fd[i]; - - ALOGV("%s: idx = %d, fd = %d, size = %d, cbcr_offset = %d, y_offset = %d, " - "vaddr = 0x%x", __func__, i, mDisplayStreamBuf.frame[i].fd, - frame_len, - mDisplayStreamBuf.frame[i].cbcr_off, mDisplayStreamBuf.frame[i].y_off, - (uint32_t)mDisplayStreamBuf.frame[i].buffer); - - if (NO_ERROR != mHalCamCtrl->sendMappingBuf( - MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW, - i, - mDisplayStreamBuf.frame[i].fd, - mHalCamCtrl->mNoDispPreviewMemory.size, - mCameraId, CAM_SOCK_MSG_TYPE_FD_MAPPING)) { - ALOGE("%s: sending mapping data Msg Failed", __func__); - } - - if(mHalCamCtrl->isZSLMode()) { - if (NO_ERROR != mHalCamCtrl->sendMappingBuf( - MSM_V4L2_EXT_CAPTURE_MODE_THUMBNAIL, - i, - mDisplayStreamBuf.frame[i].fd, - mHalCamCtrl->mNoDispPreviewMemory.size, - mCameraId, CAM_SOCK_MSG_TYPE_FD_MAPPING)) { - ALOGE("%s: sending mapping data Msg Failed", __func__); - } - } - mDisplayBuf.preview.buf.mp[i].frame = mDisplayStreamBuf.frame[i]; - mDisplayBuf.preview.buf.mp[i].frame_offset = mDisplayStreamBuf.frame[i].y_off; - mDisplayBuf.preview.buf.mp[i].num_planes = num_planes; - - /* Plane 0 needs to be set seperately. Set other planes - * in a loop. */ - mDisplayBuf.preview.buf.mp[i].planes[0].length = planes[0]; - mDisplayBuf.preview.buf.mp[i].planes[0].m.userptr = mDisplayStreamBuf.frame[i].fd; - mDisplayBuf.preview.buf.mp[i].planes[0].data_offset = 0; - mDisplayBuf.preview.buf.mp[i].planes[0].reserved[0] = - mDisplayBuf.preview.buf.mp[i].frame_offset; - for (int j = 1; j < num_planes; j++) { - mDisplayBuf.preview.buf.mp[i].planes[j].length = planes[j]; - mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr = - mDisplayStreamBuf.frame[i].fd; - mDisplayBuf.preview.buf.mp[i].planes[j].data_offset = 0; - mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0] = - mDisplayBuf.preview.buf.mp[i].planes[j-1].reserved[0] + - mDisplayBuf.preview.buf.mp[i].planes[j-1].length; - } - - for (int j = 0; j < num_planes; j++) - ALOGV("Planes: %d length: %d userptr: %lu offset: %d\n", j, - mDisplayBuf.preview.buf.mp[i].planes[j].length, - mDisplayBuf.preview.buf.mp[i].planes[j].m.userptr, - mDisplayBuf.preview.buf.mp[i].planes[j].reserved[0]); - }/*end of for loop*/ - - /* register the streaming buffers for the channel*/ - mDisplayBuf.ch_type = MM_CAMERA_CH_PREVIEW; - mDisplayBuf.preview.num = mDisplayStreamBuf.num; - mHalCamCtrl->mPreviewMemoryLock.unlock(); - ALOGV("%s:END",__func__); - return NO_ERROR; - -end: - if (MM_CAMERA_OK == ret ) { - ALOGV("%s: X - NO_ERROR ", __func__); - return NO_ERROR; - } - - ALOGV("%s: out of memory clean up", __func__); - /* release the allocated memory */ - - ALOGV("%s: X - BAD_VALUE ", __func__); - return BAD_VALUE; -} - - void QCameraStream_preview::dumpFrameToFile(struct msm_frame* newFrame) { #if 0 @@ -909,10 +678,9 @@ status_t QCameraStream_preview::processPreviewFrameWithDisplay( mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_PREVIEW); mHalCamCtrl->mPreviewMemoryLock.lock(); - mNotifyBuffer[frame->def.idx] = *frame; - ALOGV("Enqueue buf handle %p\n", - mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]); + ALOGV("Enqueue buf handle %p, index %d\n", + mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx], frame->def.idx); ALOGV("%s: camera call genlock_unlock", __FUNCTION__); if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx]) { @@ -989,10 +757,10 @@ status_t QCameraStream_preview::processPreviewFrameWithDisplay( &buffer_handle, &tmp_stride); if (err == NO_ERROR && buffer_handle != NULL) { - ALOGV("%s: dequed buf hdl =%p", __func__, *buffer_handle); for(i = 0; i < mHalCamCtrl->mPreviewMemory.buffer_count; i++) { if(mHalCamCtrl->mPreviewMemory.buffer_handle[i] == buffer_handle) { mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_UNLOCKED; + ALOGV("%s: dequed buf hdl =%p, index = %d", __func__, *buffer_handle, i); break; } } @@ -1006,9 +774,14 @@ status_t QCameraStream_preview::processPreviewFrameWithDisplay( // return -EINVAL; } else { mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_LOCKED; - - if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mNotifyBuffer[i])) { - ALOGE("BUF DONE FAILED"); + mm_camera_ch_data_buf_t notify; + memset(¬ify, 0, sizeof(mm_camera_ch_data_buf_t)); + notify.type = MM_CAMERA_CH_PREVIEW; + notify.def.idx = i; + notify.def.frame = &mDisplayStreamBuf.frame[i]; + ALOGV("%s: queueing buffer idx is %d", __func__, i); + if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, ¬ify)) { + ALOGE("%s: BUF DONE FAILED"); } } } @@ -1126,126 +899,10 @@ status_t QCameraStream_preview::processPreviewFrameWithDisplay( return NO_ERROR; } - -status_t QCameraStream_preview::processPreviewFrameWithOutDisplay( - mm_camera_ch_data_buf_t *frame) -{ - ALOGV("%s",__func__); - int err = 0; - int msgType = 0; - int i; - camera_memory_t *data = NULL; - camera_frame_metadata_t *metadata = NULL; - - Mutex::Autolock lock(mStopCallbackLock); - if(!mActive) { - ALOGV("Preview Stopped. Returning callback"); - return NO_ERROR; - } - if(mHalCamCtrl==NULL) { - ALOGE("%s: X: HAL control object not set",__func__); - /*Call buf done*/ - return BAD_VALUE; - } - - if (UNLIKELY(mHalCamCtrl->mDebugFps)) { - mHalCamCtrl->debugShowPreviewFPS(); - } - //dumpFrameToFile(frame->def.frame); - mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_PREVIEW); - - mHalCamCtrl->mPreviewMemoryLock.lock(); - mNotifyBuffer[frame->def.idx] = *frame; - - /* Save the last displayed frame. We'll be using it to fill the gap between - when preview stops and postview start during snapshot.*/ - mLastQueuedFrame = &(mDisplayStreamBuf.frame[frame->def.idx]); - mHalCamCtrl->mPreviewMemoryLock.unlock(); - - mHalCamCtrl->mCallbackLock.lock(); - camera_data_callback pcb = mHalCamCtrl->mDataCb; - mHalCamCtrl->mCallbackLock.unlock(); - ALOGV("Message enabled = 0x%x", mHalCamCtrl->mMsgEnabled); - - camera_memory_t *previewMem = NULL; - int previewWidth, previewHeight; - mHalCamCtrl->mParameters.getPreviewSize(&previewWidth, &previewHeight); - -#ifdef USE_ION - struct ion_flush_data cache_inv_data; - int ion_fd; - ion_fd = frame->def.frame->ion_dev_fd; - cache_inv_data.vaddr = (void *)frame->def.frame->buffer; - cache_inv_data.fd = frame->def.frame->fd; - cache_inv_data.handle = frame->def.frame->fd_data.handle; - cache_inv_data.length = frame->def.frame->ion_alloc.len; - - if (mHalCamCtrl->cache_ops(ion_fd, &cache_inv_data, - ION_IOC_CLEAN_INV_CACHES) < 0) - ALOGE("%s: Cache clean for Preview buffer %p fd = %d failed", __func__, - cache_inv_data.vaddr, cache_inv_data.fd); -#endif - - if (pcb != NULL) { - //Sending preview callback if corresponding Msgs are enabled - if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) { - msgType |= CAMERA_MSG_PREVIEW_FRAME; - int previewBufSize; - /* For CTS : Forcing preview memory buffer lenth to be - 'previewWidth * previewHeight * 3/2'. - Needed when gralloc allocated extra memory.*/ - //Can add this check for other formats as well. - if( mHalCamCtrl->mPreviewFormat == CAMERA_YUV_420_NV21) { - previewBufSize = previewWidth * previewHeight * 3/2; - if(previewBufSize != mHalCamCtrl->mPreviewMemory.private_buffer_handle[frame->def.idx]->size) { - previewMem = mHalCamCtrl->mGetMemory(mHalCamCtrl->mPreviewMemory.private_buffer_handle[frame->def.idx]->fd, - previewBufSize, 1, mHalCamCtrl->mCallbackCookie); - if (!previewMem || !previewMem->data) { - ALOGE("%s: mGetMemory failed.\n", __func__); - } else { - data = previewMem; - } - } else - data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];//mPreviewHeap->mBuffers[frame->def.idx]; - } else - data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];//mPreviewHeap->mBuffers[frame->def.idx]; - } else { - data = NULL; - } - - if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_METADATA){ - msgType |= CAMERA_MSG_PREVIEW_METADATA; - metadata = &mHalCamCtrl->mMetadata; - } else { - metadata = NULL; - } - if(msgType) { - mStopCallbackLock.unlock(); - if(mActive) - pcb(msgType, data, 0, metadata, mHalCamCtrl->mCallbackCookie); - if (previewMem) - previewMem->release(previewMem); - mStopCallbackLock.lock(); - } - - if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mNotifyBuffer[frame->def.idx])) { - ALOGE("BUF DONE FAILED"); - } - - ALOGV("end of cb"); - } - - return NO_ERROR; -} - status_t QCameraStream_preview::processPreviewFrame ( mm_camera_ch_data_buf_t *frame) { - if (mHalCamCtrl->isNoDisplayMode()) { - return processPreviewFrameWithOutDisplay(frame); - } else { - return processPreviewFrameWithDisplay(frame); - } + return processPreviewFrameWithDisplay(frame); } // --------------------------------------------------------------------------- @@ -1322,14 +979,8 @@ status_t QCameraStream_preview::start() previewFmt = mHalCamCtrl->getPreviewFormat(); setFormat(MM_CAMERA_CH_PREVIEW_MASK, previewFmt); - if (mHalCamCtrl->isNoDisplayMode()) { - if(NO_ERROR!=initPreviewOnlyBuffers()){ - return BAD_VALUE; - } - } else { - if(NO_ERROR!=initDisplayBuffers()){ - return BAD_VALUE; - } + if(NO_ERROR!=initDisplayBuffers()){ + return BAD_VALUE; } ALOGV("Debug : %s : initDisplayBuffers",__func__); @@ -1427,11 +1078,7 @@ end: /* In case of a clean stop, we need to clean all buffers*/ ALOGV("Debug : %s : Buffer Unprepared",__func__); /*free camera_memory handles and return buffer back to surface*/ - if (! mHalCamCtrl->isNoDisplayMode() ) { - putBufferToSurface(); - } else { - freeBufferNoDisplay( ); - } + putBufferToSurface(); ALOGV("%s: X", __func__); |