From 86666cc6ef99fa0a2761dc0c56e30df7cbb8e52c Mon Sep 17 00:00:00 2001 From: Ziyan Date: Sat, 11 Apr 2015 23:15:11 +0200 Subject: Remove common omap4 modules domx: remove for move to omap4-next edid/hwc: remove for move to omap4-next include / kernel-headers: remove for move to omap4-next libcorkscrew: remove for move to omap4-next libion_ti: remove for move to omap4-next libtiutils: remove for move to omap4-next pvr-source / pvrsrvinit: remove for move to omap4-next remove gralloc symlink for move to omap4-next Change-Id: I1ade011fd5e0adedbcb19cbf941fdde5ef4f96b6 symlinks: remove for move to omap4-next --- camera/AppCallbackNotifier.cpp | 1923 ---------------------------------------- 1 file changed, 1923 deletions(-) delete mode 100644 camera/AppCallbackNotifier.cpp (limited to 'camera/AppCallbackNotifier.cpp') diff --git a/camera/AppCallbackNotifier.cpp b/camera/AppCallbackNotifier.cpp deleted file mode 100644 index 90f63a9..0000000 --- a/camera/AppCallbackNotifier.cpp +++ /dev/null @@ -1,1923 +0,0 @@ -/* - * Copyright (C) Texas Instruments - http://www.ti.com/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "CameraHal.h" -#include "VideoMetadata.h" -#include "Encoder_libjpeg.h" -#include -#include -#include -#include "NV12_resize.h" -#include "TICameraParameters.h" - -namespace Ti { -namespace Camera { - -const int AppCallbackNotifier::NOTIFIER_TIMEOUT = -1; -android::KeyedVector > gEncoderQueue; - -void AppCallbackNotifierEncoderCallback(void* main_jpeg, - void* thumb_jpeg, - CameraFrame::FrameType type, - void* cookie1, - void* cookie2, - void* cookie3, - void* cookie4, - bool canceled) -{ - if (cookie1 && !canceled) { - AppCallbackNotifier* cb = (AppCallbackNotifier*) cookie1; - cb->EncoderDoneCb(main_jpeg, thumb_jpeg, type, cookie2, cookie3, cookie4); - } - - if (main_jpeg) { - free(main_jpeg); - } - - if (thumb_jpeg) { - if (((Encoder_libjpeg::params *) thumb_jpeg)->dst) { - free(((Encoder_libjpeg::params *) thumb_jpeg)->dst); - } - free(thumb_jpeg); - } -} - -/*--------------------NotificationHandler Class STARTS here-----------------------------*/ - -void AppCallbackNotifier::EncoderDoneCb(void* main_jpeg, void* thumb_jpeg, CameraFrame::FrameType type, void* cookie1, void* cookie2, void *cookie3) -{ - camera_memory_t* encoded_mem = NULL; - Encoder_libjpeg::params *main_param = NULL, *thumb_param = NULL; - size_t jpeg_size; - uint8_t* src = NULL; - CameraBuffer *camera_buffer = NULL; - android::sp encoder = NULL; - - LOG_FUNCTION_NAME; - - camera_memory_t* picture = NULL; - - { - android::AutoMutex lock(mLock); - - if (!main_jpeg) { - goto exit; - } - - encoded_mem = (camera_memory_t*) cookie1; - main_param = (Encoder_libjpeg::params *) main_jpeg; - jpeg_size = main_param->jpeg_size; - camera_buffer = (CameraBuffer *)cookie3; - src = main_param->src; - - if(encoded_mem && encoded_mem->data && (jpeg_size > 0)) { - if (cookie2) { - ExifElementsTable* exif = (ExifElementsTable*) cookie2; - Section_t* exif_section = NULL; - - exif->insertExifToJpeg((unsigned char*) encoded_mem->data, jpeg_size); - - if(thumb_jpeg) { - thumb_param = (Encoder_libjpeg::params *) thumb_jpeg; - exif->insertExifThumbnailImage((const char*)thumb_param->dst, - (int)thumb_param->jpeg_size); - } - - exif_section = FindSection(M_EXIF); - - if (exif_section) { - picture = mRequestMemory(-1, jpeg_size + exif_section->Size, 1, NULL); - if (picture && picture->data) { - exif->saveJpeg((unsigned char*) picture->data, jpeg_size + exif_section->Size); - } - } - delete exif; - cookie2 = NULL; - } else { - picture = mRequestMemory(-1, jpeg_size, 1, NULL); - if (picture && picture->data) { - memcpy(picture->data, encoded_mem->data, jpeg_size); - } - } - } - } // scope for mutex lock - - if (!mRawAvailable) { - dummyRaw(); - } else { - mRawAvailable = false; - } - - // Send the callback to the application only if the notifier is started and the message is enabled - if(picture && (mNotifierState==AppCallbackNotifier::NOTIFIER_STARTED) && - (mCameraHal->msgTypeEnabled(CAMERA_MSG_COMPRESSED_IMAGE))) - { - android::AutoMutex lock(mBurstLock); - -#ifdef OMAP_ENHANCEMENT_BURST_CAPTURE - if ( mBurst ) - { - mDataCb(CAMERA_MSG_COMPRESSED_BURST_IMAGE, picture, 0, NULL, mCallbackCookie); - - } - else -#endif - { - mDataCb(CAMERA_MSG_COMPRESSED_IMAGE, picture, 0, NULL, mCallbackCookie); - } - } - - exit: - - if (picture) { - picture->release(picture); - } - - if (mNotifierState == AppCallbackNotifier::NOTIFIER_STARTED) { - if (encoded_mem) { - encoded_mem->release(encoded_mem); - } - if (cookie2) { - delete (ExifElementsTable*) cookie2; - } - encoder = gEncoderQueue.valueFor(src); - if (encoder.get()) { - gEncoderQueue.removeItem(src); - encoder.clear(); - } - mFrameProvider->returnFrame(camera_buffer, type); - } - - LOG_FUNCTION_NAME_EXIT; -} - -/** - * NotificationHandler class - */ - -///Initialization function for AppCallbackNotifier -status_t AppCallbackNotifier::initialize() -{ - LOG_FUNCTION_NAME; - - mPreviewMemory = 0; - - mMeasurementEnabled = false; - - mNotifierState = NOTIFIER_STOPPED; - - ///Create the app notifier thread - mNotificationThread = new NotificationThread(this); - if(!mNotificationThread.get()) - { - CAMHAL_LOGEA("Couldn't create Notification thread"); - return NO_MEMORY; - } - - ///Start the display thread - status_t ret = mNotificationThread->run("NotificationThread", android::PRIORITY_URGENT_DISPLAY); - if(ret!=NO_ERROR) - { - CAMHAL_LOGEA("Couldn't run NotificationThread"); - mNotificationThread.clear(); - return ret; - } - - mUseMetaDataBufferMode = true; - mRawAvailable = false; - - mRecording = false; - mPreviewing = false; - - LOG_FUNCTION_NAME_EXIT; - - return ret; -} - -void AppCallbackNotifier::setCallbacks(CameraHal* cameraHal, - camera_notify_callback notify_cb, - camera_data_callback data_cb, - camera_data_timestamp_callback data_cb_timestamp, - camera_request_memory get_memory, - void *user) -{ - android::AutoMutex lock(mLock); - - LOG_FUNCTION_NAME; - - mCameraHal = cameraHal; - mNotifyCb = notify_cb; - mDataCb = data_cb; - mDataCbTimestamp = data_cb_timestamp; - mRequestMemory = get_memory; - mCallbackCookie = user; - - LOG_FUNCTION_NAME_EXIT; -} - -void AppCallbackNotifier::setMeasurements(bool enable) -{ - android::AutoMutex lock(mLock); - - LOG_FUNCTION_NAME; - - mMeasurementEnabled = enable; - - if ( enable ) - { - mFrameProvider->enableFrameNotification(CameraFrame::FRAME_DATA_SYNC); - } - - LOG_FUNCTION_NAME_EXIT; -} - - -//All sub-components of Camera HAL call this whenever any error happens -void AppCallbackNotifier::errorNotify(int error) -{ - LOG_FUNCTION_NAME; - - CAMHAL_LOGEB("AppCallbackNotifier received error %d", error); - - // If it is a fatal error abort here! - // If TILER is Out of memory we notify Mediaserver so that Memory is cleared and we can restart usecase - if((error == CAMERA_ERROR_FATAL) || (error == CAMERA_ERROR_HARD) || (error == -ENOMEM)) - { - //We kill media server if we encounter these errors as there is - //no point continuing and apps also don't handle errors other - //than media server death always. - abort(); - return; - } - - if ( ( NULL != mCameraHal ) && - ( NULL != mNotifyCb ) && - ( mCameraHal->msgTypeEnabled(CAMERA_MSG_ERROR) ) ) - { - CAMHAL_LOGEB("AppCallbackNotifier mNotifyCb %d", error); - mNotifyCb(CAMERA_MSG_ERROR, CAMERA_ERROR_UNKNOWN, 0, mCallbackCookie); - } - - LOG_FUNCTION_NAME_EXIT; -} - -bool AppCallbackNotifier::notificationThread() -{ - bool shouldLive = true; - status_t ret; - - LOG_FUNCTION_NAME; - - //CAMHAL_LOGDA("Notification Thread waiting for message"); - ret = Utils::MessageQueue::waitForMsg(&mNotificationThread->msgQ(), - &mEventQ, - &mFrameQ, - AppCallbackNotifier::NOTIFIER_TIMEOUT); - - //CAMHAL_LOGDA("Notification Thread received message"); - - if (mNotificationThread->msgQ().hasMsg()) { - ///Received a message from CameraHal, process it - CAMHAL_LOGDA("Notification Thread received message from Camera HAL"); - shouldLive = processMessage(); - if(!shouldLive) { - CAMHAL_LOGDA("Notification Thread exiting."); - return shouldLive; - } - } - - if(mEventQ.hasMsg()) { - ///Received an event from one of the event providers - CAMHAL_LOGSVA("Notification Thread received an event from event provider (CameraAdapter)"); - notifyEvent(); - } - - if(mFrameQ.hasMsg()) { - ///Received a frame from one of the frame providers - CAMHAL_LOGSVA("Notification Thread received a frame from frame provider (CameraAdapter)"); - notifyFrame(); - } - - LOG_FUNCTION_NAME_EXIT; - return shouldLive; -} - -void AppCallbackNotifier::notifyEvent() -{ - ///Receive and send the event notifications to app - Utils::Message msg; - LOG_FUNCTION_NAME; - { - android::AutoMutex lock(mLock); - if ( !mEventQ.hasMsg() ) { - return; - } else { - mEventQ.get(&msg); - } - } - bool ret = true; - CameraHalEvent *evt = NULL; - CameraHalEvent::FocusEventData *focusEvtData; - CameraHalEvent::ZoomEventData *zoomEvtData; - CameraHalEvent::MetaEventData metaEvtData; - - if(mNotifierState != AppCallbackNotifier::NOTIFIER_STARTED) - { - return; - } - - switch(msg.command) - { - case AppCallbackNotifier::NOTIFIER_CMD_PROCESS_EVENT: - - evt = ( CameraHalEvent * ) msg.arg1; - - if ( NULL == evt ) - { - CAMHAL_LOGEA("Invalid CameraHalEvent"); - return; - } - - switch(evt->mEventType) - { - case CameraHalEvent::EVENT_SHUTTER: - - if ( ( NULL != mCameraHal ) && - ( NULL != mNotifyCb ) && - ( mCameraHal->msgTypeEnabled(CAMERA_MSG_SHUTTER) ) ) - { - mNotifyCb(CAMERA_MSG_SHUTTER, 0, 0, mCallbackCookie); - } - mRawAvailable = false; - - break; - - case CameraHalEvent::EVENT_FOCUS_LOCKED: - case CameraHalEvent::EVENT_FOCUS_ERROR: - if ( mCameraHal && mNotifyCb ) { - focusEvtData = &evt->mEventData->focusEvent; - - switch ( focusEvtData->focusStatus ) { - case CameraHalEvent::FOCUS_STATUS_SUCCESS: - if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS) ) { - mCameraHal->disableMsgType(CAMERA_MSG_FOCUS); - mNotifyCb(CAMERA_MSG_FOCUS, true, 0, mCallbackCookie); - } - break; - - case CameraHalEvent::FOCUS_STATUS_FAIL: - if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS) ) { - mCameraHal->disableMsgType(CAMERA_MSG_FOCUS); - mNotifyCb(CAMERA_MSG_FOCUS, false, 0, mCallbackCookie); - } - break; - -#ifdef ANDROID_API_JB_OR_LATER - case CameraHalEvent::FOCUS_STATUS_PENDING: - if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS_MOVE) ) { - mNotifyCb(CAMERA_MSG_FOCUS_MOVE, true, 0, mCallbackCookie); - } - break; - - case CameraHalEvent::FOCUS_STATUS_DONE: - if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_FOCUS_MOVE) ) { - mNotifyCb(CAMERA_MSG_FOCUS_MOVE, false, 0, mCallbackCookie); - } - break; -#endif - } - } - - break; - - case CameraHalEvent::EVENT_ZOOM_INDEX_REACHED: - - zoomEvtData = &evt->mEventData->zoomEvent; - - if ( ( NULL != mCameraHal ) && - ( NULL != mNotifyCb) && - ( mCameraHal->msgTypeEnabled(CAMERA_MSG_ZOOM) ) ) - { - mNotifyCb(CAMERA_MSG_ZOOM, zoomEvtData->currentZoomIndex, zoomEvtData->targetZoomIndexReached, mCallbackCookie); - } - - break; - - case CameraHalEvent::EVENT_METADATA: - - metaEvtData = evt->mEventData->metadataEvent; - - if ( ( NULL != mCameraHal ) && - ( NULL != mNotifyCb) && - ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_METADATA) ) ) - { - // WA for an issue inside CameraService - camera_memory_t *tmpBuffer = mRequestMemory(-1, 1, 1, NULL); - - mDataCb(CAMERA_MSG_PREVIEW_METADATA, - tmpBuffer, - 0, - metaEvtData->getMetadataResult(), - mCallbackCookie); - - metaEvtData.clear(); - - if ( NULL != tmpBuffer ) { - tmpBuffer->release(tmpBuffer); - } - - } - - break; - - case CameraHalEvent::ALL_EVENTS: - break; - default: - break; - } - - break; - } - - if ( NULL != evt ) - { - delete evt; - } - - - LOG_FUNCTION_NAME_EXIT; - -} - -static void alignYV12(int width, - int height, - size_t &yStride, - size_t &uvStride, - size_t &ySize, - size_t &uvSize, - size_t &size) -{ - yStride = ( width + 0xF ) & ~0xF; - uvStride = ( yStride / 2 + 0xF ) & ~0xF; - ySize = yStride * height; - uvSize = uvStride * height / 2; - size = ySize + uvSize * 2; -} - -static void copy2Dto1D(void *dst, - void *src, - int width, - int height, - size_t stride, - uint32_t offset, - unsigned int bytesPerPixel, - size_t length, - const char *pixelFormat) -{ - unsigned int alignedRow, row; - unsigned char *bufferDst, *bufferSrc; - unsigned char *bufferDstEnd, *bufferSrcEnd; - uint16_t *bufferSrc_UV; - - unsigned int *y_uv = (unsigned int *)src; - - CAMHAL_LOGVB("copy2Dto1D() y= %p ; uv=%p.",y_uv[0], y_uv[1]); - CAMHAL_LOGVB("pixelFormat = %s; offset=%d",pixelFormat,offset); - - if (pixelFormat!=NULL) { - if (strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { - bytesPerPixel = 2; - bufferSrc = ( unsigned char * ) y_uv[0] + offset; - uint32_t xOff = offset % stride; - uint32_t yOff = offset / stride; - uint8_t *bufferSrcUV = ((uint8_t*)y_uv[1] + (stride/2)*yOff + xOff); - uint8_t *bufferSrcUVEven = bufferSrcUV; - - uint8_t *bufferDstY = ( uint8_t * ) dst; - uint8_t *bufferDstU = bufferDstY + 1; - uint8_t *bufferDstV = bufferDstY + 3; - - // going to convert from NV12 here and return - for ( int i = 0 ; i < height; i ++ ) { - for ( int j = 0 ; j < width / 2 ; j++ ) { - - // Y - *bufferDstY = *bufferSrc; - bufferSrc++; - bufferDstY += 2; - - *bufferDstY = *bufferSrc; - bufferSrc++; - bufferDstY += 2; - - // V - *bufferDstV = *(bufferSrcUV + 1); - bufferDstV += 4; - - // U - *bufferDstU = *bufferSrcUV; - bufferDstU += 4; - - bufferSrcUV += 2; - } - if ( i % 2 ) { - bufferSrcUV += ( stride - width); - bufferSrcUVEven = bufferSrcUV; - } else { - bufferSrcUV = bufferSrcUVEven; - } - bufferSrc += ( stride - width); - } - - return; - } else if (strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || - strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV420P) == 0) { - bytesPerPixel = 1; - bufferDst = ( unsigned char * ) dst; - bufferDstEnd = ( unsigned char * ) dst + width*height*bytesPerPixel; - bufferSrc = ( unsigned char * ) y_uv[0] + offset; - bufferSrcEnd = ( unsigned char * ) ( ( size_t ) y_uv[0] + length + offset); - row = width*bytesPerPixel; - alignedRow = stride-width; - int stride_bytes = stride / 8; - uint32_t xOff = offset % stride; - uint32_t yOff = offset / stride; - - // going to convert from NV12 here and return - // Step 1: Y plane: iterate through each row and copy - for ( int i = 0 ; i < height ; i++) { - memcpy(bufferDst, bufferSrc, row); - bufferSrc += stride; - bufferDst += row; - if ( ( bufferSrc > bufferSrcEnd ) || ( bufferDst > bufferDstEnd ) ) { - break; - } - } - - bufferSrc_UV = ( uint16_t * ) ((uint8_t*)y_uv[1] + (stride/2)*yOff + xOff); - - if (strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) { - uint16_t *bufferDst_UV; - - // Step 2: UV plane: convert NV12 to NV21 by swapping U & V - bufferDst_UV = (uint16_t *) (((uint8_t*)dst)+row*height); - - for (int i = 0 ; i < height/2 ; i++, bufferSrc_UV += alignedRow/2) { - int n = width; - asm volatile ( - " pld [%[src], %[src_stride], lsl #2] \n\t" - " cmp %[n], #32 \n\t" - " blt 1f \n\t" - "0: @ 32 byte swap \n\t" - " sub %[n], %[n], #32 \n\t" - " vld2.8 {q0, q1} , [%[src]]! \n\t" - " vswp q0, q1 \n\t" - " cmp %[n], #32 \n\t" - " vst2.8 {q0,q1},[%[dst]]! \n\t" - " bge 0b \n\t" - "1: @ Is there enough data? \n\t" - " cmp %[n], #16 \n\t" - " blt 3f \n\t" - "2: @ 16 byte swap \n\t" - " sub %[n], %[n], #16 \n\t" - " vld2.8 {d0, d1} , [%[src]]! \n\t" - " vswp d0, d1 \n\t" - " cmp %[n], #16 \n\t" - " vst2.8 {d0,d1},[%[dst]]! \n\t" - " bge 2b \n\t" - "3: @ Is there enough data? \n\t" - " cmp %[n], #8 \n\t" - " blt 5f \n\t" - "4: @ 8 byte swap \n\t" - " sub %[n], %[n], #8 \n\t" - " vld2.8 {d0, d1} , [%[src]]! \n\t" - " vswp d0, d1 \n\t" - " cmp %[n], #8 \n\t" - " vst2.8 {d0[0],d1[0]},[%[dst]]! \n\t" - " bge 4b \n\t" - "5: @ end \n\t" -#ifdef NEEDS_ARM_ERRATA_754319_754320 - " vmov s0,s0 @ add noop for errata item \n\t" -#endif - : [dst] "+r" (bufferDst_UV), [src] "+r" (bufferSrc_UV), [n] "+r" (n) - : [src_stride] "r" (stride_bytes) - : "cc", "memory", "q0", "q1" - ); - } - } else if (strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV420P) == 0) { - uint16_t *bufferDst_U; - uint16_t *bufferDst_V; - - // Step 2: UV plane: convert NV12 to YV12 by de-interleaving U & V - // TODO(XXX): This version of CameraHal assumes NV12 format it set at - // camera adapter to support YV12. Need to address for - // USBCamera - - size_t yStride, uvStride, ySize, uvSize, size; - alignYV12(width, height, yStride, uvStride, ySize, uvSize, size); - - bufferDst_V = (uint16_t *) (((uint8_t*)dst) + ySize); - bufferDst_U = (uint16_t *) (((uint8_t*)dst) + ySize + uvSize); - int inc = (uvStride - width/2)/2; - - for (int i = 0 ; i < height/2 ; i++, bufferSrc_UV += alignedRow/2) { - int n = width; - asm volatile ( - " pld [%[src], %[src_stride], lsl #2] \n\t" - " cmp %[n], #32 \n\t" - " blt 1f \n\t" - "0: @ 32 byte swap \n\t" - " sub %[n], %[n], #32 \n\t" - " vld2.8 {q0, q1} , [%[src]]! \n\t" - " cmp %[n], #32 \n\t" - " vst1.8 {q1},[%[dst_v]]! \n\t" - " vst1.8 {q0},[%[dst_u]]! \n\t" - " bge 0b \n\t" - "1: @ Is there enough data? \n\t" - " cmp %[n], #16 \n\t" - " blt 3f \n\t" - "2: @ 16 byte swap \n\t" - " sub %[n], %[n], #16 \n\t" - " vld2.8 {d0, d1} , [%[src]]! \n\t" - " cmp %[n], #16 \n\t" - " vst1.8 {d1},[%[dst_v]]! \n\t" - " vst1.8 {d0},[%[dst_u]]! \n\t" - " bge 2b \n\t" - "3: @ Is there enough data? \n\t" - " cmp %[n], #8 \n\t" - " blt 5f \n\t" - "4: @ 8 byte swap \n\t" - " sub %[n], %[n], #8 \n\t" - " vld2.8 {d0, d1} , [%[src]]! \n\t" - " cmp %[n], #8 \n\t" - " vst1.8 {d1[0]},[%[dst_v]]! \n\t" - " vst1.8 {d0[0]},[%[dst_u]]! \n\t" - " bge 4b \n\t" - "5: @ end \n\t" -#ifdef NEEDS_ARM_ERRATA_754319_754320 - " vmov s0,s0 @ add noop for errata item \n\t" -#endif - : [dst_u] "+r" (bufferDst_U), [dst_v] "+r" (bufferDst_V), - [src] "+r" (bufferSrc_UV), [n] "+r" (n) - : [src_stride] "r" (stride_bytes) - : "cc", "memory", "q0", "q1" - ); - - bufferDst_U += inc; - bufferDst_V += inc; - } - - } - return ; - - } else if(strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_RGB565) == 0) { - bytesPerPixel = 2; - } - } - - bufferDst = ( unsigned char * ) dst; - bufferSrc = ( unsigned char * ) y_uv[0]; - row = width*bytesPerPixel; - alignedRow = ( row + ( stride -1 ) ) & ( ~ ( stride -1 ) ); - - //iterate through each row - for ( int i = 0 ; i < height ; i++, bufferSrc += alignedRow, bufferDst += row) { - memcpy(bufferDst, bufferSrc, row); - } -} - -void AppCallbackNotifier::copyAndSendPictureFrame(CameraFrame* frame, int32_t msgType) -{ - camera_memory_t* picture = NULL; - void *dest = NULL, *src = NULL; - - // scope for lock - if (mCameraHal->msgTypeEnabled(msgType)) { - android::AutoMutex lock(mLock); - - if(mNotifierState != AppCallbackNotifier::NOTIFIER_STARTED) { - goto exit; - } - - picture = mRequestMemory(-1, frame->mLength, 1, NULL); - - if (NULL != picture) { - dest = picture->data; - if (NULL != dest) { - src = (void *) ((unsigned int) frame->mBuffer->mapped + frame->mOffset); - memcpy(dest, src, frame->mLength); - } - } - } - - exit: - mFrameProvider->returnFrame(frame->mBuffer, (CameraFrame::FrameType) frame->mFrameType); - - if(picture) { - if((mNotifierState == AppCallbackNotifier::NOTIFIER_STARTED) && - mCameraHal->msgTypeEnabled(msgType)) { - mDataCb(msgType, picture, 0, NULL, mCallbackCookie); - } - picture->release(picture); - } -} - -void AppCallbackNotifier::copyAndSendPreviewFrame(CameraFrame* frame, int32_t msgType) -{ - camera_memory_t* picture = NULL; - CameraBuffer * dest = NULL; - - // scope for lock - { - android::AutoMutex lock(mLock); - - if(mNotifierState != AppCallbackNotifier::NOTIFIER_STARTED) { - goto exit; - } - - if (!mPreviewMemory || !frame->mBuffer) { - CAMHAL_LOGDA("Error! One of the buffer is NULL"); - goto exit; - } - - dest = &mPreviewBuffers[mPreviewBufCount]; - - CAMHAL_LOGVB("%d:copy2Dto1D(%p, %p, %d, %d, %d, %d, %d,%s)", - __LINE__, - dest, - frame->mBuffer, - mPreviewWidth, - mPreviewHeight, - mPreviewStride, - 2, - frame->mLength, - mPreviewPixelFormat); - - /* FIXME map dest */ - if ( NULL != dest && dest->mapped != NULL ) { - // data sync frames don't need conversion - if (CameraFrame::FRAME_DATA_SYNC == frame->mFrameType) { - if ( (mPreviewMemory->size / MAX_BUFFERS) >= frame->mLength ) { - memcpy(dest->mapped, (void*) frame->mBuffer->mapped, frame->mLength); - } else { - memset(dest->mapped, 0, (mPreviewMemory->size / MAX_BUFFERS)); - } - } else { - if ((0 == frame->mYuv[0]) || (0 == frame->mYuv[1])){ //NULL == frame->mYuv - CAMHAL_LOGEA("Error! One of the YUV Pointer is 0"); //is NULL - goto exit; - } - else{ - copy2Dto1D(dest->mapped, - frame->mYuv, - mPreviewWidth, - mPreviewHeight, - mPreviewStride, - frame->mOffset, - 2, - frame->mLength, - mPreviewPixelFormat); - } - } - } - } - - exit: - mFrameProvider->returnFrame(frame->mBuffer, (CameraFrame::FrameType) frame->mFrameType); - - if((mNotifierState == AppCallbackNotifier::NOTIFIER_STARTED) && - mCameraHal->msgTypeEnabled(msgType) && - (dest != NULL) && (dest->mapped != NULL)) { - android::AutoMutex locker(mLock); - if ( mPreviewMemory ) - mDataCb(msgType, mPreviewMemory, mPreviewBufCount, NULL, mCallbackCookie); - } - - // increment for next buffer - mPreviewBufCount = (mPreviewBufCount + 1) % AppCallbackNotifier::MAX_BUFFERS; -} - -status_t AppCallbackNotifier::dummyRaw() -{ - LOG_FUNCTION_NAME; - - if ( NULL == mRequestMemory ) { - CAMHAL_LOGEA("Can't allocate memory for dummy raw callback!"); - return NO_INIT; - } - - if ( ( NULL != mCameraHal ) && - ( NULL != mDataCb) && - ( NULL != mNotifyCb ) ){ - - if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE) ) { - camera_memory_t *dummyRaw = mRequestMemory(-1, 1, 1, NULL); - - if ( NULL == dummyRaw ) { - CAMHAL_LOGEA("Dummy raw buffer allocation failed!"); - return NO_MEMORY; - } - - mDataCb(CAMERA_MSG_RAW_IMAGE, dummyRaw, 0, NULL, mCallbackCookie); - - dummyRaw->release(dummyRaw); - } else if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE_NOTIFY) ) { - mNotifyCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mCallbackCookie); - } - } - - LOG_FUNCTION_NAME_EXIT; - - return NO_ERROR; -} - -void AppCallbackNotifier::notifyFrame() -{ - ///Receive and send the frame notifications to app - Utils::Message msg; - CameraFrame *frame; - android::MemoryHeapBase *heap; - android::MemoryBase *buffer = NULL; - android::sp memBase; - void *buf = NULL; - - LOG_FUNCTION_NAME; - - { - android::AutoMutex lock(mLock); - if(!mFrameQ.isEmpty()) { - mFrameQ.get(&msg); - } else { - return; - } - } - - bool ret = true; - - frame = NULL; - switch(msg.command) - { - case AppCallbackNotifier::NOTIFIER_CMD_PROCESS_FRAME: - - frame = (CameraFrame *) msg.arg1; - if(!frame) - { - break; - } - - if ( (CameraFrame::RAW_FRAME == frame->mFrameType )&& - ( NULL != mCameraHal ) && - ( NULL != mDataCb) && - ( NULL != mNotifyCb ) ) - { - - if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE) ) - { -#ifdef COPY_IMAGE_BUFFER - copyAndSendPictureFrame(frame, CAMERA_MSG_RAW_IMAGE); -#else - //TODO: Find a way to map a Tiler buffer to a MemoryHeapBase -#endif - } - else { - if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE_NOTIFY) ) { - mNotifyCb(CAMERA_MSG_RAW_IMAGE_NOTIFY, 0, 0, mCallbackCookie); - } - mFrameProvider->returnFrame(frame->mBuffer, - (CameraFrame::FrameType) frame->mFrameType); - } - - mRawAvailable = true; - - } - else if ( (CameraFrame::IMAGE_FRAME == frame->mFrameType) && - (NULL != mCameraHal) && - (NULL != mDataCb) && - (CameraFrame::ENCODE_RAW_YUV422I_TO_JPEG & frame->mQuirks) ) - { - - int encode_quality = 100, tn_quality = 100; - int tn_width, tn_height; - unsigned int current_snapshot = 0; - Encoder_libjpeg::params *main_jpeg = NULL, *tn_jpeg = NULL; - void* exif_data = NULL; - const char *previewFormat = NULL; - camera_memory_t* raw_picture = mRequestMemory(-1, frame->mLength, 1, NULL); - - if(raw_picture) { - buf = raw_picture->data; - } - - android::CameraParameters parameters; - char *params = mCameraHal->getParameters(); - const android::String8 strParams(params); - parameters.unflatten(strParams); - - encode_quality = parameters.getInt(android::CameraParameters::KEY_JPEG_QUALITY); - if (encode_quality < 0 || encode_quality > 100) { - encode_quality = 100; - } - - tn_quality = parameters.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); - if (tn_quality < 0 || tn_quality > 100) { - tn_quality = 100; - } - - if (CameraFrame::HAS_EXIF_DATA & frame->mQuirks) { - exif_data = frame->mCookie2; - } - - main_jpeg = (Encoder_libjpeg::params*) - malloc(sizeof(Encoder_libjpeg::params)); - - // Video snapshot with LDCNSF on adds a few bytes start offset - // and a few bytes on every line. They must be skipped. - int rightCrop = frame->mAlignment/2 - frame->mWidth; - - CAMHAL_LOGDB("Video snapshot right crop = %d", rightCrop); - CAMHAL_LOGDB("Video snapshot offset = %d", frame->mOffset); - - if (main_jpeg) { - main_jpeg->src = (uint8_t *)frame->mBuffer->mapped; - main_jpeg->src_size = frame->mLength; - main_jpeg->dst = (uint8_t*) buf; - main_jpeg->dst_size = frame->mLength; - main_jpeg->quality = encode_quality; - main_jpeg->in_width = frame->mAlignment/2; // use stride here - main_jpeg->in_height = frame->mHeight; - main_jpeg->out_width = frame->mAlignment/2; - main_jpeg->out_height = frame->mHeight; - main_jpeg->right_crop = rightCrop; - main_jpeg->start_offset = frame->mOffset; - if ( CameraFrame::FORMAT_YUV422I_UYVY & frame->mQuirks) { - main_jpeg->format = TICameraParameters::PIXEL_FORMAT_YUV422I_UYVY; - } - else { //if ( CameraFrame::FORMAT_YUV422I_YUYV & frame->mQuirks) - main_jpeg->format = android::CameraParameters::PIXEL_FORMAT_YUV422I; - } - } - - tn_width = parameters.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); - tn_height = parameters.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); - previewFormat = parameters.getPreviewFormat(); - - if ((tn_width > 0) && (tn_height > 0) && ( NULL != previewFormat )) { - tn_jpeg = (Encoder_libjpeg::params*) - malloc(sizeof(Encoder_libjpeg::params)); - // if malloc fails just keep going and encode main jpeg - if (!tn_jpeg) { - tn_jpeg = NULL; - } - } - - if (tn_jpeg) { - int width, height; - parameters.getPreviewSize(&width,&height); - current_snapshot = (mPreviewBufCount + MAX_BUFFERS - 1) % MAX_BUFFERS; - tn_jpeg->src = (uint8_t *)mPreviewBuffers[current_snapshot].mapped; - tn_jpeg->src_size = mPreviewMemory->size / MAX_BUFFERS; - tn_jpeg->dst_size = calculateBufferSize(tn_width, - tn_height, - previewFormat); - tn_jpeg->dst = (uint8_t*) malloc(tn_jpeg->dst_size); - tn_jpeg->quality = tn_quality; - tn_jpeg->in_width = width; - tn_jpeg->in_height = height; - tn_jpeg->out_width = tn_width; - tn_jpeg->out_height = tn_height; - tn_jpeg->right_crop = 0; - tn_jpeg->start_offset = 0; - tn_jpeg->format = android::CameraParameters::PIXEL_FORMAT_YUV420SP;; - } - - android::sp encoder = new Encoder_libjpeg(main_jpeg, - tn_jpeg, - AppCallbackNotifierEncoderCallback, - (CameraFrame::FrameType)frame->mFrameType, - this, - raw_picture, - exif_data, frame->mBuffer); - gEncoderQueue.add(frame->mBuffer->mapped, encoder); - encoder->run(); - encoder.clear(); - if (params != NULL) - { - mCameraHal->putParameters(params); - } - } - else if ( ( CameraFrame::IMAGE_FRAME == frame->mFrameType ) && - ( NULL != mCameraHal ) && - ( NULL != mDataCb) ) - { - - // CTS, MTS requirements: Every 'takePicture()' call - // who registers a raw callback should receive one - // as well. This is not always the case with - // CameraAdapters though. - if (!mCameraHal->msgTypeEnabled(CAMERA_MSG_RAW_IMAGE)) { - dummyRaw(); - } else { - mRawAvailable = false; - } - -#ifdef COPY_IMAGE_BUFFER - { - android::AutoMutex lock(mBurstLock); -#ifdef OMAP_ENHANCEMENT_BURST_CAPTURE - if ( mBurst ) - { - copyAndSendPictureFrame(frame, CAMERA_MSG_COMPRESSED_BURST_IMAGE); - } - else -#endif - { - copyAndSendPictureFrame(frame, CAMERA_MSG_COMPRESSED_IMAGE); - } - } -#else - //TODO: Find a way to map a Tiler buffer to a MemoryHeapBase -#endif - } - else if ( ( CameraFrame::VIDEO_FRAME_SYNC == frame->mFrameType ) && - ( NULL != mCameraHal ) && - ( NULL != mDataCb) && - ( mCameraHal->msgTypeEnabled(CAMERA_MSG_VIDEO_FRAME) ) ) - { - android::AutoMutex locker(mRecordingLock); - if(mRecording) - { - if(mUseMetaDataBufferMode) - { - camera_memory_t *videoMedatadaBufferMemory = - mVideoMetadataBufferMemoryMap.valueFor(frame->mBuffer->opaque); - video_metadata_t *videoMetadataBuffer = (video_metadata_t *) videoMedatadaBufferMemory->data; - - if( (NULL == videoMedatadaBufferMemory) || (NULL == videoMetadataBuffer) || (NULL == frame->mBuffer) ) - { - CAMHAL_LOGEA("Error! One of the video buffers is NULL"); - break; - } - - if ( mUseVideoBuffers ) - { - CameraBuffer *vBuf = mVideoMap.valueFor(frame->mBuffer->opaque); - android::GraphicBufferMapper &mapper = android::GraphicBufferMapper::get(); - android::Rect bounds; - bounds.left = 0; - bounds.top = 0; - bounds.right = mVideoWidth; - bounds.bottom = mVideoHeight; - - void *y_uv[2]; - mapper.lock((buffer_handle_t)vBuf, CAMHAL_GRALLOC_USAGE, bounds, y_uv); - y_uv[1] = y_uv[0] + mVideoHeight*4096; - - structConvImage input = {(mmInt32)frame->mWidth, - (mmInt32)frame->mHeight, - 4096, - IC_FORMAT_YCbCr420_lp, - (mmByte *)frame->mYuv[0], - (mmByte *)frame->mYuv[1], - (mmInt32)frame->mOffset}; - - structConvImage output = {mVideoWidth, - mVideoHeight, - 4096, - IC_FORMAT_YCbCr420_lp, - (mmByte *)y_uv[0], - (mmByte *)y_uv[1], - 0}; - - VT_resizeFrame_Video_opt2_lp(&input, &output, NULL, 0); - mapper.unlock((buffer_handle_t)vBuf->opaque); - videoMetadataBuffer->metadataBufferType = (int) android::kMetadataBufferTypeCameraSource; - /* FIXME remove cast */ - videoMetadataBuffer->handle = (void *)vBuf->opaque; - videoMetadataBuffer->offset = 0; - } - else - { - videoMetadataBuffer->metadataBufferType = (int) android::kMetadataBufferTypeCameraSource; - videoMetadataBuffer->handle = camera_buffer_get_omx_ptr(frame->mBuffer); - videoMetadataBuffer->offset = frame->mOffset; - } - - CAMHAL_LOGVB("mDataCbTimestamp : frame->mBuffer=0x%x, videoMetadataBuffer=0x%x, videoMedatadaBufferMemory=0x%x", - frame->mBuffer->opaque, videoMetadataBuffer, videoMedatadaBufferMemory); - - mDataCbTimestamp(frame->mTimestamp, CAMERA_MSG_VIDEO_FRAME, - videoMedatadaBufferMemory, 0, mCallbackCookie); - } - else - { - //TODO: Need to revisit this, should ideally be mapping the TILER buffer using mRequestMemory - camera_memory_t* fakebuf = mRequestMemory(-1, sizeof(buffer_handle_t), 1, NULL); - if( (NULL == fakebuf) || ( NULL == fakebuf->data) || ( NULL == frame->mBuffer)) - { - CAMHAL_LOGEA("Error! One of the video buffers is NULL"); - break; - } - - *reinterpret_cast(fakebuf->data) = reinterpret_cast(frame->mBuffer->mapped); - mDataCbTimestamp(frame->mTimestamp, CAMERA_MSG_VIDEO_FRAME, fakebuf, 0, mCallbackCookie); - fakebuf->release(fakebuf); - } - } - } - else if(( CameraFrame::SNAPSHOT_FRAME == frame->mFrameType ) && - ( NULL != mCameraHal ) && - ( NULL != mDataCb) && - ( NULL != mNotifyCb)) { - //When enabled, measurement data is sent instead of video data - if ( !mMeasurementEnabled ) { - copyAndSendPreviewFrame(frame, CAMERA_MSG_POSTVIEW_FRAME); - } else { - mFrameProvider->returnFrame(frame->mBuffer, - (CameraFrame::FrameType) frame->mFrameType); - } - } - else if ( ( CameraFrame::PREVIEW_FRAME_SYNC== frame->mFrameType ) && - ( NULL != mCameraHal ) && - ( NULL != mDataCb) && - ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME)) ) { - //When enabled, measurement data is sent instead of video data - if ( !mMeasurementEnabled ) { - copyAndSendPreviewFrame(frame, CAMERA_MSG_PREVIEW_FRAME); - } else { - mFrameProvider->returnFrame(frame->mBuffer, - (CameraFrame::FrameType) frame->mFrameType); - } - } - else if ( ( CameraFrame::FRAME_DATA_SYNC == frame->mFrameType ) && - ( NULL != mCameraHal ) && - ( NULL != mDataCb) && - ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME)) ) { - copyAndSendPreviewFrame(frame, CAMERA_MSG_PREVIEW_FRAME); - } else { - mFrameProvider->returnFrame(frame->mBuffer, - ( CameraFrame::FrameType ) frame->mFrameType); - CAMHAL_LOGDB("Frame type 0x%x is still unsupported!", frame->mFrameType); - } - - break; - - default: - - break; - - }; - -exit: - - if ( NULL != frame ) - { - delete frame; - } - - LOG_FUNCTION_NAME_EXIT; -} - -void AppCallbackNotifier::frameCallbackRelay(CameraFrame* caFrame) -{ - LOG_FUNCTION_NAME; - AppCallbackNotifier *appcbn = (AppCallbackNotifier*) (caFrame->mCookie); - appcbn->frameCallback(caFrame); - LOG_FUNCTION_NAME_EXIT; -} - -void AppCallbackNotifier::frameCallback(CameraFrame* caFrame) -{ - ///Post the event to the event queue of AppCallbackNotifier - Utils::Message msg; - CameraFrame *frame; - - LOG_FUNCTION_NAME; - - if ( NULL != caFrame ) - { - - frame = new CameraFrame(*caFrame); - if ( NULL != frame ) - { - msg.command = AppCallbackNotifier::NOTIFIER_CMD_PROCESS_FRAME; - msg.arg1 = frame; - mFrameQ.put(&msg); - } - else - { - CAMHAL_LOGEA("Not enough resources to allocate CameraFrame"); - } - - } - - LOG_FUNCTION_NAME_EXIT; -} - -void AppCallbackNotifier::flushAndReturnFrames() -{ - LOG_FUNCTION_NAME; - - Utils::Message msg; - CameraFrame *frame; - - android::AutoMutex lock(mLock); - while (!mFrameQ.isEmpty()) { - mFrameQ.get(&msg); - frame = (CameraFrame*) msg.arg1; - if (frame) { - mFrameProvider->returnFrame(frame->mBuffer, - (CameraFrame::FrameType) frame->mFrameType); - } - } - - LOG_FUNCTION_NAME_EXIT; -} - -void AppCallbackNotifier::eventCallbackRelay(CameraHalEvent* chEvt) -{ - LOG_FUNCTION_NAME; - AppCallbackNotifier *appcbn = (AppCallbackNotifier*) (chEvt->mCookie); - appcbn->eventCallback(chEvt); - LOG_FUNCTION_NAME_EXIT; -} - -void AppCallbackNotifier::eventCallback(CameraHalEvent* chEvt) -{ - - ///Post the event to the event queue of AppCallbackNotifier - Utils::Message msg; - CameraHalEvent *event; - - - LOG_FUNCTION_NAME; - - if ( NULL != chEvt ) - { - - event = new CameraHalEvent(*chEvt); - if ( NULL != event ) - { - msg.command = AppCallbackNotifier::NOTIFIER_CMD_PROCESS_EVENT; - msg.arg1 = event; - { - android::AutoMutex lock(mLock); - mEventQ.put(&msg); - } - } - else - { - CAMHAL_LOGEA("Not enough resources to allocate CameraHalEvent"); - } - - } - - LOG_FUNCTION_NAME_EXIT; -} - - -void AppCallbackNotifier::flushEventQueue() -{ - - { - android::AutoMutex lock(mLock); - mEventQ.clear(); - } -} - - -bool AppCallbackNotifier::processMessage() -{ - ///Retrieve the command from the command queue and process it - Utils::Message msg; - - LOG_FUNCTION_NAME; - - CAMHAL_LOGDA("+Msg get..."); - mNotificationThread->msgQ().get(&msg); - CAMHAL_LOGDA("-Msg get..."); - bool ret = true; - - switch(msg.command) - { - case NotificationThread::NOTIFIER_EXIT: - { - CAMHAL_LOGD("Received NOTIFIER_EXIT command from Camera HAL"); - mNotifierState = AppCallbackNotifier::NOTIFIER_EXITED; - ret = false; - break; - } - default: - { - CAMHAL_LOGEA("Error: ProcessMsg() command from Camera HAL"); - break; - } - } - - LOG_FUNCTION_NAME_EXIT; - - return ret; - - -} - -AppCallbackNotifier::~AppCallbackNotifier() -{ - LOG_FUNCTION_NAME; - - ///Stop app callback notifier if not already stopped - stop(); - - ///Unregister with the frame provider - if ( NULL != mFrameProvider ) - { - mFrameProvider->disableFrameNotification(CameraFrame::ALL_FRAMES); - } - - //unregister with the event provider - if ( NULL != mEventProvider ) - { - mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS); - } - - Utils::Message msg = {0,0,0,0,0,0}; - msg.command = NotificationThread::NOTIFIER_EXIT; - - ///Post the message to display thread - mNotificationThread->msgQ().put(&msg); - - //Exit and cleanup the thread - mNotificationThread->requestExit(); - mNotificationThread->join(); - - //Delete the display thread - mNotificationThread.clear(); - - - ///Free the event and frame providers - if ( NULL != mEventProvider ) - { - ///Deleting the event provider - CAMHAL_LOGDA("Stopping Event Provider"); - delete mEventProvider; - mEventProvider = NULL; - } - - if ( NULL != mFrameProvider ) - { - ///Deleting the frame provider - CAMHAL_LOGDA("Stopping Frame Provider"); - delete mFrameProvider; - mFrameProvider = NULL; - } - - releaseSharedVideoBuffers(); - - LOG_FUNCTION_NAME_EXIT; -} - -//Free all video heaps and buffers -void AppCallbackNotifier::releaseSharedVideoBuffers() -{ - LOG_FUNCTION_NAME; - - if(mUseMetaDataBufferMode) - { - camera_memory_t* videoMedatadaBufferMemory; - for (unsigned int i = 0; i < mVideoMetadataBufferMemoryMap.size(); i++) - { - videoMedatadaBufferMemory = mVideoMetadataBufferMemoryMap.valueAt(i); - if(NULL != videoMedatadaBufferMemory) - { - videoMedatadaBufferMemory->release(videoMedatadaBufferMemory); - CAMHAL_LOGDB("Released videoMedatadaBufferMemory=%p", videoMedatadaBufferMemory); - } - } - - mVideoMetadataBufferMemoryMap.clear(); - mVideoMetadataBufferReverseMap.clear(); - if (mUseVideoBuffers) - { - mVideoMap.clear(); - } - } - - LOG_FUNCTION_NAME_EXIT; -} - -void AppCallbackNotifier::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier) -{ - - LOG_FUNCTION_NAME; - ///@remarks There is no NULL check here. We will check - ///for NULL when we get start command from CameraHal - ///@Remarks Currently only one event provider (CameraAdapter) is supported - ///@todo Have an array of event providers for each event bitmask - mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay); - if ( NULL == mEventProvider ) - { - CAMHAL_LOGEA("Error in creating EventProvider"); - } - else - { - mEventProvider->enableEventNotification(eventMask); - } - - LOG_FUNCTION_NAME_EXIT; -} - -void AppCallbackNotifier::setFrameProvider(FrameNotifier *frameNotifier) -{ - LOG_FUNCTION_NAME; - ///@remarks There is no NULL check here. We will check - ///for NULL when we get the start command from CameraAdapter - mFrameProvider = new FrameProvider(frameNotifier, this, frameCallbackRelay); - if ( NULL == mFrameProvider ) - { - CAMHAL_LOGEA("Error in creating FrameProvider"); - } - else - { - //Register only for captured images and RAW for now - //TODO: Register for and handle all types of frames - mFrameProvider->enableFrameNotification(CameraFrame::IMAGE_FRAME); - mFrameProvider->enableFrameNotification(CameraFrame::RAW_FRAME); - } - - LOG_FUNCTION_NAME_EXIT; -} - -size_t AppCallbackNotifier::calculateBufferSize(size_t width, size_t height, const char *pixelFormat) -{ - size_t res = 0; - - LOG_FUNCTION_NAME - - if(strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { - res = width*height*2; - } else if(strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV420SP) == 0) { - res = (width*height*3)/2; - } else if(strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_RGB565) == 0) { - res = width*height*2; - } else if (strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV420P) == 0) { - size_t yStride, uvStride, ySize, uvSize; - alignYV12(width, height, yStride, uvStride, ySize, uvSize, res); - mPreviewPixelFormat = android::CameraParameters::PIXEL_FORMAT_YUV420P; - } - - LOG_FUNCTION_NAME_EXIT; - - return res; -} - -const char* AppCallbackNotifier::getContstantForPixelFormat(const char *pixelFormat) { - if (!pixelFormat) { - // returning NV12 as default - return android::CameraParameters::PIXEL_FORMAT_YUV420SP; - } - - if(strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { - return android::CameraParameters::PIXEL_FORMAT_YUV422I; - } else if(strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 ) { - return android::CameraParameters::PIXEL_FORMAT_YUV420SP; - } else if(strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_RGB565) == 0) { - return android::CameraParameters::PIXEL_FORMAT_RGB565; - } else if(strcmp(pixelFormat, android::CameraParameters::PIXEL_FORMAT_YUV420P) == 0) { - return android::CameraParameters::PIXEL_FORMAT_YUV420P; - } else { - // returning NV12 as default - return android::CameraParameters::PIXEL_FORMAT_YUV420SP; - } -} - -status_t AppCallbackNotifier::startPreviewCallbacks(android::CameraParameters ¶ms, CameraBuffer *buffers, uint32_t *offsets, int fd, size_t length, size_t count) -{ - unsigned int *bufArr; - int size = 0; - - LOG_FUNCTION_NAME; - - android::AutoMutex lock(mLock); - - if ( NULL == mFrameProvider ) - { - CAMHAL_LOGEA("Trying to start video recording without FrameProvider"); - return -EINVAL; - } - - if ( mPreviewing ) - { - CAMHAL_LOGDA("+Already previewing"); - return NO_INIT; - } - - int w,h; - ///Get preview size - params.getPreviewSize(&w, &h); - - // save preview pixel format, size and stride - mPreviewWidth = w; - mPreviewHeight = h; - mPreviewStride = 4096; - mPreviewPixelFormat = getContstantForPixelFormat(params.getPreviewFormat()); - size = calculateBufferSize(w, h, mPreviewPixelFormat); - - mPreviewMemory = mRequestMemory(-1, size, AppCallbackNotifier::MAX_BUFFERS, NULL); - if (!mPreviewMemory) { - return NO_MEMORY; - } - - for (int i=0; i < AppCallbackNotifier::MAX_BUFFERS; i++) { - mPreviewBuffers[i].type = CAMERA_BUFFER_MEMORY; - mPreviewBuffers[i].opaque = (unsigned char*) mPreviewMemory->data + (i*size); - mPreviewBuffers[i].mapped = mPreviewBuffers[i].opaque; - } - - if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_PREVIEW_FRAME ) ) { - mFrameProvider->enableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); - } - - if ( mCameraHal->msgTypeEnabled(CAMERA_MSG_POSTVIEW_FRAME) ) { - mFrameProvider->enableFrameNotification(CameraFrame::SNAPSHOT_FRAME); - } - - mPreviewBufCount = 0; - - mPreviewing = true; - - LOG_FUNCTION_NAME_EXIT; - - return NO_ERROR; -} - -void AppCallbackNotifier::setBurst(bool burst) -{ - LOG_FUNCTION_NAME; - - android::AutoMutex lock(mBurstLock); - - mBurst = burst; - - LOG_FUNCTION_NAME_EXIT; -} - -void AppCallbackNotifier::useVideoBuffers(bool useVideoBuffers) -{ - LOG_FUNCTION_NAME; - - mUseVideoBuffers = useVideoBuffers; - - LOG_FUNCTION_NAME_EXIT; -} - -bool AppCallbackNotifier::getUesVideoBuffers() -{ - return mUseVideoBuffers; -} - -void AppCallbackNotifier::setVideoRes(int width, int height) -{ - LOG_FUNCTION_NAME; - - mVideoWidth = width; - mVideoHeight = height; - - LOG_FUNCTION_NAME_EXIT; -} - -status_t AppCallbackNotifier::stopPreviewCallbacks() -{ - LOG_FUNCTION_NAME; - - if ( NULL == mFrameProvider ) - { - CAMHAL_LOGEA("Trying to stop preview callbacks without FrameProvider"); - return -EINVAL; - } - - if ( !mPreviewing ) - { - return NO_INIT; - } - - mFrameProvider->disableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); - mFrameProvider->disableFrameNotification(CameraFrame::SNAPSHOT_FRAME); - - { - android::AutoMutex lock(mLock); - mPreviewMemory->release(mPreviewMemory); - mPreviewMemory = 0; - } - - mPreviewing = false; - - LOG_FUNCTION_NAME_EXIT; - - return NO_ERROR; - -} - -status_t AppCallbackNotifier::useMetaDataBufferMode(bool enable) -{ - mUseMetaDataBufferMode = enable; - - return NO_ERROR; -} - - -status_t AppCallbackNotifier::startRecording() -{ - status_t ret = NO_ERROR; - - LOG_FUNCTION_NAME; - - android::AutoMutex lock(mRecordingLock); - - if ( NULL == mFrameProvider ) - { - CAMHAL_LOGEA("Trying to start video recording without FrameProvider"); - ret = -1; - } - - if(mRecording) - { - return NO_INIT; - } - - if ( NO_ERROR == ret ) - { - mFrameProvider->enableFrameNotification(CameraFrame::VIDEO_FRAME_SYNC); - } - - mRecording = true; - - LOG_FUNCTION_NAME_EXIT; - - return ret; -} - -//Allocate metadata buffers for video recording -status_t AppCallbackNotifier::initSharedVideoBuffers(CameraBuffer *buffers, uint32_t *offsets, int fd, size_t length, size_t count, CameraBuffer *vidBufs) -{ - status_t ret = NO_ERROR; - LOG_FUNCTION_NAME; - - if(mUseMetaDataBufferMode) - { - camera_memory_t* videoMedatadaBufferMemory = NULL; - - if(NULL == buffers) - { - CAMHAL_LOGEA("Error! Video buffers are NULL"); - return BAD_VALUE; - } - - for (uint32_t i = 0; i < count; i++) - { - videoMedatadaBufferMemory = mRequestMemory(-1, sizeof(video_metadata_t), 1, NULL); - if((NULL == videoMedatadaBufferMemory) || (NULL == videoMedatadaBufferMemory->data)) - { - CAMHAL_LOGEA("Error! Could not allocate memory for Video Metadata Buffers"); - return NO_MEMORY; - } - - // FIXME remove cast - mVideoMetadataBufferMemoryMap.add((void *)buffers[i].opaque, videoMedatadaBufferMemory); - mVideoMetadataBufferReverseMap.add(videoMedatadaBufferMemory->data, &buffers[i]); - CAMHAL_LOGDB("buffers[%d]=%p, videoMedatadaBufferMemory=%p, videoMedatadaBufferMemory->data=%p", - i, &buffers[i], videoMedatadaBufferMemory, videoMedatadaBufferMemory->data); - - if (vidBufs != NULL) - { - //ASSERT(buffers[i].type == CAMERA_BUFFER_GRALLOC); - // FIXME remove cast - mVideoMap.add((void *)buffers[i].opaque, &vidBufs[i]); - CAMHAL_LOGVB("buffers[%d]=%p, vBuffArr[%d]=%p", i, &buffers[i], i, &vidBufs[i]); - } - } - } - -exit: - LOG_FUNCTION_NAME_EXIT; - - return ret; -} - -status_t AppCallbackNotifier::stopRecording() -{ - status_t ret = NO_ERROR; - - LOG_FUNCTION_NAME; - - android::AutoMutex lock(mRecordingLock); - - if ( NULL == mFrameProvider ) - { - CAMHAL_LOGEA("Trying to stop video recording without FrameProvider"); - ret = -1; - } - - if(!mRecording) - { - return NO_INIT; - } - - if ( NO_ERROR == ret ) - { - mFrameProvider->disableFrameNotification(CameraFrame::VIDEO_FRAME_SYNC); - } - - ///Release the shared video buffers - releaseSharedVideoBuffers(); - - mRecording = false; - - LOG_FUNCTION_NAME_EXIT; - - return ret; -} - -status_t AppCallbackNotifier::releaseRecordingFrame(const void* mem) -{ - status_t ret = NO_ERROR; - CameraBuffer *frame = NULL; - - LOG_FUNCTION_NAME; - if ( NULL == mFrameProvider ) - { - CAMHAL_LOGEA("Trying to stop video recording without FrameProvider"); - ret = -1; - } - - if ( NULL == mem ) - { - CAMHAL_LOGEA("Video Frame released is invalid"); - ret = -1; - } - - if( NO_ERROR != ret ) - { - return ret; - } - - if(mUseMetaDataBufferMode) - { - video_metadata_t *videoMetadataBuffer = (video_metadata_t *) mem ; - /* FIXME remove cast */ - frame = mVideoMetadataBufferReverseMap.valueFor(videoMetadataBuffer); - CAMHAL_LOGVB("Releasing frame with videoMetadataBuffer=0x%x, videoMetadataBuffer->handle=0x%x & frame handle=0x%x\n", - videoMetadataBuffer, videoMetadataBuffer->handle, frame); - } - else - { - /* FIXME this won't work */ - frame = (CameraBuffer *)(void*)(*((uint32_t *)mem)); - } - - if ( NO_ERROR == ret ) - { - ret = mFrameProvider->returnFrame(frame, CameraFrame::VIDEO_FRAME_SYNC); - } - - LOG_FUNCTION_NAME_EXIT; - - return ret; -} - -status_t AppCallbackNotifier::enableMsgType(int32_t msgType) -{ - if( msgType & CAMERA_MSG_PREVIEW_FRAME ) { - mFrameProvider->enableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); - } - - if( msgType & CAMERA_MSG_POSTVIEW_FRAME ) { - mFrameProvider->enableFrameNotification(CameraFrame::SNAPSHOT_FRAME); - } - - if(msgType & CAMERA_MSG_RAW_IMAGE) { - mFrameProvider->enableFrameNotification(CameraFrame::RAW_FRAME); - } - - return NO_ERROR; -} - -status_t AppCallbackNotifier::disableMsgType(int32_t msgType) -{ - if( msgType & CAMERA_MSG_PREVIEW_FRAME ) { - mFrameProvider->disableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC); - } - - if( msgType & CAMERA_MSG_POSTVIEW_FRAME ) { - mFrameProvider->disableFrameNotification(CameraFrame::SNAPSHOT_FRAME); - } - - if(msgType & CAMERA_MSG_RAW_IMAGE) { - mFrameProvider->disableFrameNotification(CameraFrame::RAW_FRAME); - } - - return NO_ERROR; - -} - -status_t AppCallbackNotifier::start() -{ - LOG_FUNCTION_NAME; - if(mNotifierState==AppCallbackNotifier::NOTIFIER_STARTED) - { - CAMHAL_LOGDA("AppCallbackNotifier already running"); - LOG_FUNCTION_NAME_EXIT; - return ALREADY_EXISTS; - } - - ///Check whether initial conditions are met for us to start - ///A frame provider should be available, if not return error - if(!mFrameProvider) - { - ///AppCallbackNotifier not properly initialized - CAMHAL_LOGEA("AppCallbackNotifier not properly initialized - Frame provider is NULL"); - LOG_FUNCTION_NAME_EXIT; - return NO_INIT; - } - - ///At least one event notifier should be available, if not return error - ///@todo Modify here when there is an array of event providers - if(!mEventProvider) - { - CAMHAL_LOGEA("AppCallbackNotifier not properly initialized - Event provider is NULL"); - LOG_FUNCTION_NAME_EXIT; - ///AppCallbackNotifier not properly initialized - return NO_INIT; - } - - mNotifierState = AppCallbackNotifier::NOTIFIER_STARTED; - CAMHAL_LOGDA(" --> AppCallbackNotifier NOTIFIER_STARTED \n"); - - gEncoderQueue.clear(); - - LOG_FUNCTION_NAME_EXIT; - - return NO_ERROR; - -} - -status_t AppCallbackNotifier::stop() -{ - LOG_FUNCTION_NAME; - - if(mNotifierState!=AppCallbackNotifier::NOTIFIER_STARTED) - { - CAMHAL_LOGDA("AppCallbackNotifier already in stopped state"); - LOG_FUNCTION_NAME_EXIT; - return ALREADY_EXISTS; - } - { - android::AutoMutex lock(mLock); - - mNotifierState = AppCallbackNotifier::NOTIFIER_STOPPED; - CAMHAL_LOGDA(" --> AppCallbackNotifier NOTIFIER_STOPPED \n"); - } - - while(!gEncoderQueue.isEmpty()) { - android::sp encoder = gEncoderQueue.valueAt(0); - camera_memory_t* encoded_mem = NULL; - ExifElementsTable* exif = NULL; - - if(encoder.get()) { - encoder->cancel(); - - encoder->getCookies(NULL, (void**) &encoded_mem, (void**) &exif); - if (encoded_mem) { - encoded_mem->release(encoded_mem); - } - if (exif) { - delete exif; - } - - encoder.clear(); - } - gEncoderQueue.removeItemsAt(0); - } - - LOG_FUNCTION_NAME_EXIT; - return NO_ERROR; -} - - -/*--------------------NotificationHandler Class ENDS here-----------------------------*/ - - - -} // namespace Camera -} // namespace Ti -- cgit v1.1