status_t QCameraStream_Rdi::processRdiFrame( mm_camera_ch_data_buf_t *frame) { ALOGV("%s",__func__); int err = 0; int msgType = 0; int i; camera_memory_t *data = NULL; Mutex::Autolock lock(mStopCallbackLock); if(!mActive) { ALOGD("RDI Streaming Stopped. Returning callback"); return NO_ERROR; } if(mHalCamCtrl==NULL) { ALOGE("%s: X: HAL control object not set",__func__); /*Call buf done*/ return BAD_VALUE; } mHalCamCtrl->mRdiMemoryLock.lock(); mNotifyBuffer[frame->def.idx] = *frame; mHalCamCtrl->mRdiMemoryLock.unlock(); mHalCamCtrl->mCallbackLock.lock(); camera_data_callback pcb = mHalCamCtrl->mDataCb; mHalCamCtrl->mCallbackLock.unlock(); ALOGD("Message enabled = 0x%x", mHalCamCtrl->mMsgEnabled); mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_RDI); #ifdef USE_ION struct ion_flush_data cache_inv_data; int ion_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; ion_fd = frame->def.frame->ion_dev_fd; if (mHalCamCtrl->cache_ops(ion_fd, &cache_inv_data, ION_IOC_CLEAN_CACHES) < 0) ALOGE("%s: Cache clean for RDI buffer %p fd = %d failed", __func__, cache_inv_data.vaddr, cache_inv_data.fd); #endif if (pcb != NULL) { //Sending rdi callback if corresponding Msgs are enabled if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) { msgType |= CAMERA_MSG_PREVIEW_FRAME; data = mHalCamCtrl->mRdiMemory.camera_memory[frame->def.idx]; } else { data = NULL; } if(msgType) { mStopCallbackLock.unlock(); if(mActive) pcb(msgType, data, 0, NULL, mHalCamCtrl->mCallbackCookie); } ALOGD("end of cb"); } if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mNotifyBuffer[frame->def.idx])) { ALOGE("BUF DONE FAILED"); } return NO_ERROR; }
status_t QCameraStream_preview::processPreviewFrame(mm_camera_ch_data_buf_t *frame) { ALOGV("%s",__func__); int err = 0; int msgType = 0; camera_memory_t *data = NULL; camera_frame_metadata_t *metadata = NULL; Mutex::Autolock lock(mStopCallbackLock); if(!mActive) { ALOGE("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; } mHalCamCtrl->mCallbackLock.lock(); camera_data_timestamp_callback rcb = mHalCamCtrl->mDataCbTimestamp; void *rdata = mHalCamCtrl->mCallbackCookie; mHalCamCtrl->mCallbackLock.unlock(); if (UNLIKELY(mHalCamCtrl->mDebugFps)) { mHalCamCtrl->debugShowPreviewFPS(); } //dumpFrameToFile(frame->def.frame); mHalCamCtrl->dumpFrameToFile(frame->def.frame, HAL_DUMP_FRM_PREVIEW); nsecs_t timeStamp = systemTime(); mHalCamCtrl->mPreviewMemoryLock.lock(); mNotifyBuffer[frame->def.idx] = *frame; // mzhu fix me, need to check meta data also. ALOGI("Enqueue buf handle %p\n", mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]); ALOGD("%s: camera call genlock_unlock", __FUNCTION__); if (BUFFER_LOCKED == mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx]) { if (GENLOCK_FAILURE == genlock_unlock_buffer((native_handle_t*) (*mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]))) { ALOGE("%s: genlock_unlock_buffer failed", __FUNCTION__); mHalCamCtrl->mPreviewMemoryLock.unlock(); return -EINVAL; } else { mHalCamCtrl->mPreviewMemory.local_flag[frame->def.idx] = BUFFER_UNLOCKED; } } else { ALOGE("%s: buffer to be enqueued is not locked", __FUNCTION__); mHalCamCtrl->mPreviewMemoryLock.unlock(); return -EINVAL; } err = this->mPreviewWindow->enqueue_buffer(this->mPreviewWindow, (buffer_handle_t *)mHalCamCtrl->mPreviewMemory.buffer_handle[frame->def.idx]); if(err != 0) { ALOGE("%s: enqueue_buffer failed, err = %d", __func__, err); } buffer_handle_t *buffer_handle = NULL; int tmp_stride = 0; err = this->mPreviewWindow->dequeue_buffer(this->mPreviewWindow, &buffer_handle, &tmp_stride); if (err == NO_ERROR && buffer_handle != NULL) { err = this->mPreviewWindow->lock_buffer(this->mPreviewWindow, buffer_handle); ALOGD("%s: camera call genlock_lock", __FUNCTION__); if (GENLOCK_FAILURE == genlock_lock_buffer((native_handle_t*)(*buffer_handle), GENLOCK_WRITE_LOCK, GENLOCK_MAX_TIMEOUT)) { ALOGE("%s: genlock_lock_buffer(WRITE) failed", __FUNCTION__); mHalCamCtrl->mPreviewMemoryLock.unlock(); return -EINVAL; } for(int i = 0; i < mHalCamCtrl->mPreviewMemory.buffer_count; i++) { ALOGD("h1: %p h2: %p\n", mHalCamCtrl->mPreviewMemory.buffer_handle[i], buffer_handle); if(mHalCamCtrl->mPreviewMemory.buffer_handle[i] == buffer_handle) { mm_camera_ch_data_buf_t tmp_frame; mHalCamCtrl->mPreviewMemory.local_flag[i] = BUFFER_LOCKED; if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, &mNotifyBuffer[i])) { ALOGD("BUF DONE FAILED"); mHalCamCtrl->mPreviewMemoryLock.unlock(); return BAD_VALUE; } break; } } } else ALOGE("%s: error in dequeue_buffer, enqueue_buffer idx = %d, no free buffer now", __func__, frame->def.idx); /* 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(); ALOGD("Message enabled = 0x%x", mHalCamCtrl->mMsgEnabled); if (pcb != NULL) { //Sending preview callback if corresponding Msgs are enabled if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) { msgType |= CAMERA_MSG_PREVIEW_FRAME; data = mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx];//mPreviewHeap->mBuffers[frame->def.idx]; } else { data = NULL; } if(msgType) { mStopCallbackLock.unlock(); pcb(msgType, data, 0, metadata, mHalCamCtrl->mCallbackCookie); } ALOGD("end of cb"); } if(rcb != NULL) { if (mHalCamCtrl->mStoreMetaDataInFrame) { mStopCallbackLock.unlock(); if(mHalCamCtrl->mStartRecording == true &&( mHalCamCtrl->mMsgEnabled & CAMERA_MSG_VIDEO_FRAME)) rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME, mHalCamCtrl->mRecordingMemory.metadata_memory[frame->def.idx], 0, mHalCamCtrl->mCallbackCookie); } else { if(mHalCamCtrl->mStartRecording == true &&( mHalCamCtrl->mMsgEnabled & CAMERA_MSG_VIDEO_FRAME)) { mStopCallbackLock.unlock(); rcb(timeStamp, CAMERA_MSG_VIDEO_FRAME, mHalCamCtrl->mPreviewMemory.camera_memory[frame->def.idx], 0, mHalCamCtrl->mCallbackCookie); } } } /* Save the last displayed frame. We'll be using it to fill the gap between when preview stops and postview start during snapshot.*/ //mLastQueuedFrame = frame->def.frame; /* if(MM_CAMERA_OK != cam_evt_buf_done(mCameraId, frame)) { ALOGE("BUF DONE FAILED"); return BAD_VALUE; } */ return NO_ERROR; }