diff options
author | Shuzhen Wang <shuzhenw@codeaurora.org> | 2015-01-27 22:36:25 -0800 |
---|---|---|
committer | Zhijun He <zhijunhe@google.com> | 2015-01-28 13:01:08 -0800 |
commit | c707b1d73e29aa8df2a6d2f666eca57e816b0f6e (patch) | |
tree | 0fe60fa9f12e68df739b3b0c850005c678aa8a9f | |
parent | 5c6d74bb8fc04cdf47ebbc07c0b645d0c1c37646 (diff) | |
download | mako-lollipop-mr1-wfc-release.tar.gz |
Camera: Add support to not queue all buffers up frontandroid-cts-5.1_r9android-cts-5.1_r8android-cts-5.1_r7android-cts-5.1_r6android-cts-5.1_r5android-cts-5.1_r4android-cts-5.1_r3android-cts-5.1_r28android-cts-5.1_r27android-cts-5.1_r26android-cts-5.1_r25android-cts-5.1_r24android-cts-5.1_r23android-cts-5.1_r22android-cts-5.1_r21android-cts-5.1_r20android-cts-5.1_r2android-cts-5.1_r19android-cts-5.1_r18android-cts-5.1_r17android-cts-5.1_r16android-cts-5.1_r15android-cts-5.1_r14android-cts-5.1_r13android-cts-5.1_r10android-cts-5.1_r1android-5.1.1_r9android-5.1.1_r8android-5.1.1_r7android-5.1.1_r6android-5.1.1_r5android-5.1.1_r4android-5.1.1_r38android-5.1.1_r37android-5.1.1_r36android-5.1.1_r35android-5.1.1_r34android-5.1.1_r33android-5.1.1_r30android-5.1.1_r3android-5.1.1_r29android-5.1.1_r28android-5.1.1_r26android-5.1.1_r25android-5.1.1_r24android-5.1.1_r23android-5.1.1_r22android-5.1.1_r20android-5.1.1_r2android-5.1.1_r19android-5.1.1_r18android-5.1.1_r17android-5.1.1_r16android-5.1.1_r15android-5.1.1_r14android-5.1.1_r13android-5.1.1_r12android-5.1.1_r10android-5.1.1_r1android-5.1.0_r5android-5.1.0_r4android-5.1.0_r3android-5.1.0_r1lollipop-mr1-wfc-releaselollipop-mr1-releaselollipop-mr1-fi-releaselollipop-mr1-devlollipop-mr1-cts-release
Camera HAL needs to call cancel_buffer on min_undequeued_buffers
preview buffers up front. That means not all preview buffers should
be queued into camera driver. This change adds the support.
Bug: 18630337
Change-Id: I794b0dcafa03ebfaddf4c68b66b09c74bbb206d0
-rwxr-xr-x | camera/QCameraHWI.cpp | 10 | ||||
-rwxr-xr-x | camera/QCameraHWI.h | 1 | ||||
-rw-r--r-- | camera/QCameraHWI_Preview.cpp | 403 | ||||
-rw-r--r-- | camera/QCameraHWI_Record.cpp | 4 | ||||
-rwxr-xr-x | camera/QCameraStream.h | 11 | ||||
-rw-r--r-- | camera/mm-camera-interface/mm_camera.c | 10 | ||||
-rw-r--r-- | camera/mm-camera-interface/mm_camera.h | 6 | ||||
-rwxr-xr-x | camera/mm-camera-interface/mm_camera_channel.c | 3 | ||||
-rwxr-xr-x | camera/mm-camera-interface/mm_camera_interface2.c | 32 | ||||
-rwxr-xr-x | camera/mm-camera-interface/mm_camera_interface2.h | 4 | ||||
-rw-r--r-- | camera/mm-camera-interface/mm_camera_stream.c | 88 |
11 files changed, 66 insertions, 506 deletions
diff --git a/camera/QCameraHWI.cpp b/camera/QCameraHWI.cpp index f3608f8..a26811e 100755 --- a/camera/QCameraHWI.cpp +++ b/camera/QCameraHWI.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. @@ -176,7 +176,6 @@ QCameraHardwareInterface(int cameraId, int mode) mSnapshotFormat(0), mStartRecording(0), mZslInterval(1), - mNoDisplayMode(0), mBrightness(0), mContrast(0), mEffects(0), @@ -1031,7 +1030,7 @@ status_t QCameraHardwareInterface::startPreview() ALOGV("%s: HAL::startPreview begin", __func__); if(QCAMERA_HAL_PREVIEW_START == mPreviewState && - (mPreviewWindow || isNoDisplayMode())) { + (mPreviewWindow)) { ALOGD("%s: start preview now", __func__); retVal = startPreview2(); if(retVal == NO_ERROR) @@ -2677,11 +2676,6 @@ void QCameraHardwareInterface::takePicturePrepareHardware() ALOGV("%s: X", __func__); } -bool QCameraHardwareInterface::isNoDisplayMode() -{ - return (mNoDisplayMode != 0); -} - void QCameraHardwareInterface::pausePreviewForZSL() { ALOGV("%s: mRestartPreview %d", __func__, mRestartPreview); diff --git a/camera/QCameraHWI.h b/camera/QCameraHWI.h index 4fbb9c0..1a1604c 100755 --- a/camera/QCameraHWI.h +++ b/camera/QCameraHWI.h @@ -492,7 +492,6 @@ public: char* ext, int index); preview_format_info_t getPreviewFormatInfo( ); bool isCameraReady(); - bool isNoDisplayMode(); private: int16_t zoomRatios[MAX_ZOOM_RATIOS]; 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__); diff --git a/camera/QCameraHWI_Record.cpp b/camera/QCameraHWI_Record.cpp index f9da650..b1fc886 100644 --- a/camera/QCameraHWI_Record.cpp +++ b/camera/QCameraHWI_Record.cpp @@ -1,5 +1,5 @@ /* -** Copyright (c) 2011 The Linux Foundation. All rights reserved. +** Copyright (c) 2011,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. @@ -506,6 +506,8 @@ status_t QCameraStream_record::initEncodeBuffers() mRecordBuf.video.video.buf.mp[cnt].planes[j-1].reserved[0] + mRecordBuf.video.video.buf.mp[cnt].planes[j-1].length; } + + mRecordBuf.video.video.no_enqueue_flag[cnt] = 0; } //memset(&mRecordBuf, 0, sizeof(mRecordBuf)); diff --git a/camera/QCameraStream.h b/camera/QCameraStream.h index 5724dbb..d9b0de3 100755 --- a/camera/QCameraStream.h +++ b/camera/QCameraStream.h @@ -1,6 +1,6 @@ /* ** Copyright 2008, Google Inc. -** Copyright (c) 2009-2012, The Linux Foundation. All rights reserved. +** Copyright (c) 2009-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. @@ -218,15 +218,11 @@ public: void *getLastQueuedFrame(void); /*init preview buffers with display case*/ status_t initDisplayBuffers(); - /*init preview buffers without display case*/ - status_t initPreviewOnlyBuffers(); status_t processPreviewFrame(mm_camera_ch_data_buf_t *frame); /*init preview buffers with display case*/ status_t processPreviewFrameWithDisplay(mm_camera_ch_data_buf_t *frame); - /*init preview buffers without display case*/ - status_t processPreviewFrameWithOutDisplay(mm_camera_ch_data_buf_t *frame); int setPreviewWindow(preview_stream_ops_t* window); void notifyROIEvent(fd_roi_t roi); @@ -238,10 +234,6 @@ private: status_t getBufferFromSurface(); status_t putBufferToSurface(); - /*allocate and free buffers without display case*/ - status_t getBufferNoDisplay(); - status_t freeBufferNoDisplay(); - void dumpFrameToFile(struct msm_frame* newFrame); bool mFirstFrameRcvd; @@ -254,7 +246,6 @@ private: Mutex mDisplayLock; preview_stream_ops_t *mPreviewWindow; static const int kPreviewBufferCount = PREVIEW_BUFFER_COUNT; - mm_camera_ch_data_buf_t mNotifyBuffer[16]; int8_t mNumFDRcvd; int mVFEOutputs; int mHFRFrameCnt; diff --git a/camera/mm-camera-interface/mm_camera.c b/camera/mm-camera-interface/mm_camera.c index 145fdb2..883d179 100644 --- a/camera/mm-camera-interface/mm_camera.c +++ b/camera/mm-camera-interface/mm_camera.c @@ -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. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -689,14 +689,6 @@ int32_t mm_camera_request_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf return rc; } -int32_t mm_camera_enqueue_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf) -{ - int32_t rc = -MM_CAMERA_E_GENERAL; - rc = mm_camera_ch_fn(my_obj, buf->ch_type, - MM_CAMERA_STATE_EVT_ENQUEUE_BUF, (void *)&buf->preview); - return rc; -} - int32_t mm_camera_prepare_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf) { int32_t rc = -MM_CAMERA_E_GENERAL; diff --git a/camera/mm-camera-interface/mm_camera.h b/camera/mm-camera-interface/mm_camera.h index 0d62fbe..57c229b 100644 --- a/camera/mm-camera-interface/mm_camera.h +++ b/camera/mm-camera-interface/mm_camera.h @@ -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. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -58,7 +58,6 @@ typedef enum { MM_CAMERA_STATE_EVT_GET_CROP, MM_CAMERA_STATE_EVT_DISPATCH_BUFFERED_FRAME, MM_CAMERA_STATE_EVT_REQUEST_BUF, // request amount of buffers to kernel only - MM_CAMERA_STATE_EVT_ENQUEUE_BUF, // enqueue some of buffers to kernel only MM_CAMERA_STATE_EVT_MAX } mm_camera_state_evt_type_t; @@ -114,7 +113,7 @@ typedef struct { mm_camera_frame_queue_t readyq; int32_t num_frame; uint32_t frame_len; - int8_t reg_flag; + int8_t reg_flag[MM_CAMERA_MAX_NUM_FRAMES]; uint32_t frame_offset[MM_CAMERA_MAX_NUM_FRAMES]; mm_camera_frame_t frame[MM_CAMERA_MAX_NUM_FRAMES]; int8_t ref_count[MM_CAMERA_MAX_NUM_FRAMES]; @@ -302,7 +301,6 @@ extern int32_t mm_camera_get_parm(mm_camera_obj_t * my_obj, extern int32_t mm_camera_set_parm(mm_camera_obj_t * my_obj, mm_camera_parm_t *parm); extern int32_t mm_camera_request_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf); -extern int32_t mm_camera_enqueue_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf); extern int32_t mm_camera_prepare_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf); extern int32_t mm_camera_unprepare_buf(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type); extern int mm_camera_poll_thread_launch(mm_camera_obj_t * my_obj, int ch_type); diff --git a/camera/mm-camera-interface/mm_camera_channel.c b/camera/mm-camera-interface/mm_camera_channel.c index 40f3fb0..51b0f2c 100755 --- a/camera/mm-camera-interface/mm_camera_channel.c +++ b/camera/mm-camera-interface/mm_camera_channel.c @@ -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. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -721,7 +721,6 @@ int32_t mm_camera_ch_fn(mm_camera_obj_t * my_obj, break; case MM_CAMERA_STATE_EVT_REG_BUF: case MM_CAMERA_STATE_EVT_REQUEST_BUF: - case MM_CAMERA_STATE_EVT_ENQUEUE_BUF: rc = mm_camera_ch_util_reg_buf(my_obj, ch_type, evt, val); break; case MM_CAMERA_STATE_EVT_UNREG_BUF: diff --git a/camera/mm-camera-interface/mm_camera_interface2.c b/camera/mm-camera-interface/mm_camera_interface2.c index f6ccca9..0d46afb 100755 --- a/camera/mm-camera-interface/mm_camera_interface2.c +++ b/camera/mm-camera-interface/mm_camera_interface2.c @@ -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. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -181,24 +181,6 @@ static int32_t mm_camera_cfg_request_buf(mm_camera_t * camera, return rc; } -static int32_t mm_camera_cfg_enqueue_buf(mm_camera_t * camera, - mm_camera_reg_buf_t *buf) -{ - int32_t rc = -MM_CAMERA_E_GENERAL; - uint32_t tmp; - mm_camera_obj_t * my_obj = NULL; - - pthread_mutex_lock(&g_mutex); - my_obj = g_cam_ctrl.cam_obj[camera->camera_info.camera_id]; - pthread_mutex_unlock(&g_mutex); - if(my_obj) { - pthread_mutex_lock(&my_obj->mutex); - rc = mm_camera_enqueue_buf(my_obj, buf); - pthread_mutex_unlock(&my_obj->mutex); - } - return rc; -} - static int32_t mm_camera_cfg_prepare_buf(mm_camera_t * camera, mm_camera_reg_buf_t *buf) { @@ -240,7 +222,6 @@ static mm_camera_config_t mm_camera_cfg = { .set_parm = mm_camera_cfg_set_parm, .get_parm = mm_camera_cfg_get_parm, .request_buf = mm_camera_cfg_request_buf, - .enqueue_buf = mm_camera_cfg_enqueue_buf, .prepare_buf = mm_camera_cfg_prepare_buf, .unprepare_buf = mm_camera_cfg_unprepare_buf }; @@ -799,17 +780,6 @@ int32_t cam_config_request_buf(int cam_id, mm_camera_reg_buf_t *buf) return rc; } -int32_t cam_config_enqueue_buf(int cam_id, mm_camera_reg_buf_t *buf) -{ - - int32_t rc = -1; - mm_camera_t * mm_cam = get_camera_by_id(cam_id); - if (mm_cam) { - rc = mm_cam->cfg->enqueue_buf(mm_cam, buf); - } - return rc; -} - int32_t cam_config_prepare_buf(int cam_id, mm_camera_reg_buf_t *buf) { diff --git a/camera/mm-camera-interface/mm_camera_interface2.h b/camera/mm-camera-interface/mm_camera_interface2.h index ba4dcd5..20153e4 100755 --- a/camera/mm-camera-interface/mm_camera_interface2.h +++ b/camera/mm-camera-interface/mm_camera_interface2.h @@ -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. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -177,6 +177,7 @@ typedef struct { typedef struct { int8_t num; + int8_t no_enqueue_flag[MM_CAMERA_MAX_NUM_FRAMES]; union { mm_camera_sp_buf_t sp; mm_camera_mp_buf_t *mp; @@ -463,7 +464,6 @@ int32_t cam_config_get_parm( mm_camera_parm_type_t parm_type, void* p_value); int32_t cam_config_request_buf(int cam_id, mm_camera_reg_buf_t *buf); -int32_t cam_config_enqueue_buf(int cam_id, mm_camera_reg_buf_t *buf); int32_t cam_config_prepare_buf(int cam_id, mm_camera_reg_buf_t *buf); int32_t cam_config_unprepare_buf(int cam_id, mm_camera_channel_type_t ch_type); diff --git a/camera/mm-camera-interface/mm_camera_stream.c b/camera/mm-camera-interface/mm_camera_stream.c index 6fca2db..e7d2c84 100644 --- a/camera/mm-camera-interface/mm_camera_stream.c +++ b/camera/mm-camera-interface/mm_camera_stream.c @@ -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. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -220,6 +220,10 @@ int mm_camera_read_msm_frame(mm_camera_obj_t * my_obj, stream->frame.frame[idx].frame.frame_id = vb.sequence; stream->frame.frame[idx].frame.ts.tv_sec = vb.timestamp.tv_sec; stream->frame.frame[idx].frame.ts.tv_nsec = vb.timestamp.tv_usec * 1000; + + CDBG("%s:type=%d,frame idx=%d, frame_id %d\n", __func__, + stream->stream_type, idx, vb.sequence); + return idx; } @@ -400,7 +404,7 @@ int mm_camera_stream_qbuf(mm_camera_obj_t * my_obj, mm_camera_stream_t *stream, rc = ioctl(stream->fd, VIDIOC_QBUF, &buffer); if (rc < 0) { - CDBG_ERROR("%s: VIDIOC_QBUF error = %d, stream type=%d\n", __func__, rc, stream->stream_type); + CDBG_ERROR("%s: VIDIOC_QBUF error = %d, stream type=%d, errno = %d\n", __func__, rc, stream->stream_type, errno); return rc; } CDBG("%s: X idx: %d, stream_type:%d", __func__, idx, stream->stream_type); @@ -439,40 +443,6 @@ end: return rc; } -/* This function enqueue existing buffers (not first time allocated buffers from Surface) to kernel */ -static int mm_camera_stream_util_enqueue_buf(mm_camera_obj_t * my_obj, - mm_camera_stream_t *stream, - mm_camera_buf_def_t *vbuf) -{ - int32_t i, rc = MM_CAMERA_OK, j; - - if(vbuf->num > MM_CAMERA_MAX_NUM_FRAMES) { - rc = -MM_CAMERA_E_GENERAL; - CDBG("%s: buf num %d > max limit %d\n", - __func__, vbuf->num, MM_CAMERA_MAX_NUM_FRAMES); - goto end; - } - - for(i = 0; i < vbuf->num; i++){ - int idx = vbuf->buf.mp[i].idx; - ALOGV("%s: enqueue buf index = %d\n",__func__, idx); - if(idx < MM_CAMERA_MAX_NUM_FRAMES) { - ALOGV("%s: stream_fd = %d, frame_fd = %d, frame ID = %d, offset = %d\n", - __func__, stream->fd, stream->frame.frame[i].frame.fd, - idx, stream->frame.frame_offset[idx]); - rc = mm_camera_stream_qbuf(my_obj, stream, stream->frame.frame[idx].idx); - if (rc < 0) { - CDBG("%s: VIDIOC_QBUF rc = %d\n", __func__, rc); - goto end; - } - stream->frame.ref_count[idx] = 0; - } - } - stream->frame.qbuf = 1; -end: - return rc; -} - static int mm_camera_stream_util_reg_buf(mm_camera_obj_t * my_obj, mm_camera_stream_t *stream, mm_camera_buf_def_t *vbuf) @@ -548,15 +518,20 @@ static int mm_camera_stream_util_reg_buf(mm_camera_obj_t * my_obj, stream->frame.frame_offset[i] = 0; } - rc = mm_camera_stream_qbuf(my_obj, stream, stream->frame.frame[i].idx); - if (rc < 0) { - CDBG_ERROR("%s: VIDIOC_QBUF rc = %d\n", __func__, rc); - goto end; + if (!vbuf->no_enqueue_flag[i]) { + rc = mm_camera_stream_qbuf(my_obj, stream, stream->frame.frame[i].idx); + if (rc < 0) { + CDBG_ERROR("%s: VIDIOC_QBUF rc = %d\n", __func__, rc); + goto end; + } + stream->frame.ref_count[i] = 0; + } else { + stream->frame.ref_count[i] = 1; } - stream->frame.ref_count[i] = 0; - CDBG("%s: stream_fd = %d, frame_fd = %d, frame ID = %d, offset = %d\n", + stream->frame.reg_flag[i] = vbuf->no_enqueue_flag[i]; + CDBG("%s: stream_fd = %d, frame_fd = %d, frame ID = %d, offset = %d, reg_flag = %d, ref_cnt = %d\n", __func__, stream->fd, stream->frame.frame[i].frame.fd, - i, stream->frame.frame_offset[i]); + i, stream->frame.frame_offset[i], stream->frame.reg_flag[i], stream->frame.ref_count[i]); } stream->frame.qbuf = 1; end: @@ -707,10 +682,6 @@ static int32_t mm_camera_stream_fsm_cfg(mm_camera_obj_t * my_obj, case MM_CAMERA_STATE_EVT_REQUEST_BUF: rc = mm_camera_stream_util_request_buf(my_obj, stream, ((mm_camera_buf_def_t *)val)->num); break; - case MM_CAMERA_STATE_EVT_ENQUEUE_BUF: - rc = mm_camera_stream_util_enqueue_buf(my_obj, stream, (mm_camera_buf_def_t *)val); - if(!rc) mm_camera_stream_util_set_state(stream, MM_CAMERA_STREAM_STATE_REG); - break; default: CDBG_ERROR("%s: Invalid evt=%d, stream_state=%d", __func__, evt, stream->state); @@ -796,13 +767,16 @@ static int32_t mm_camera_stream_fsm_reg(mm_camera_obj_t * my_obj, int i = 0; mm_camera_frame_t *frame; if(stream->frame.qbuf == 0) { + CDBG("%s: queueing buffers during stream on", __func__); for(i = 0; i < stream->frame.num_frame; i++) { - rc = mm_camera_stream_qbuf(my_obj, stream, - stream->frame.frame[i].idx); - if (rc < 0) { - CDBG_ERROR("%s: ioctl VIDIOC_QBUF error=%d, stream->type=%d\n", - __func__, rc, stream->stream_type); - return rc; + if (!stream->frame.reg_flag[i]) { + rc = mm_camera_stream_qbuf(my_obj, stream, + stream->frame.frame[i].idx); + if (rc < 0) { + CDBG_ERROR("%s: ioctl VIDIOC_QBUF error=%d, stream->type=%d\n", + __func__, rc, stream->stream_type); + return rc; + } } stream->frame.ref_count[i] = 0; } @@ -820,9 +794,6 @@ static int32_t mm_camera_stream_fsm_reg(mm_camera_obj_t * my_obj, mm_camera_stream_util_set_state(stream, MM_CAMERA_STREAM_STATE_ACTIVE); } break; - case MM_CAMERA_STATE_EVT_ENQUEUE_BUF: - rc = mm_camera_stream_util_enqueue_buf(my_obj, stream, (mm_camera_buf_def_t *)val); - break; default: CDBG_ERROR("%s: Invalid evt=%d, stream_state=%d", __func__, evt, stream->state); @@ -862,10 +833,7 @@ static int32_t mm_camera_stream_fsm_active(mm_camera_obj_t * my_obj, } } break; - case MM_CAMERA_STATE_EVT_ENQUEUE_BUF: - rc = mm_camera_stream_util_enqueue_buf(my_obj, stream, (mm_camera_buf_def_t *)val); - break; - default: + default: CDBG_ERROR("%s: Invalid evt=%d, stream_state=%d", __func__, evt, stream->state); return -1; |