From 5432e2f4a1ef9841088a8adc9eceeb57437a5036 Mon Sep 17 00:00:00 2001 From: Yuxi Sun Date: Fri, 12 Aug 2016 05:38:49 +0000 Subject: PD#130174: camera: Merge IPTV 1080p optimization to trunk Change-Id: Ibf0a159093d17452579566ddd1d5c2b8168a4c22 --- diff --git a/Android.mk b/Android.mk index b7b86c2..b98237a 100644 --- a/Android.mk +++ b/Android.mk @@ -23,8 +23,8 @@ CAMERA_HAL_SRC := \ CameraProperties.cpp \ MemoryManager.cpp \ Encoder_libjpeg.cpp \ - SensorListener.cpp \ NV12_resize.c + #SensorListener.cpp \ CAMERA_COMMON_SRC:= \ CameraParameters.cpp \ diff --git a/AppCallbackNotifier.cpp b/AppCallbackNotifier.cpp index c3ba65c..4b30494 100755 --- a/AppCallbackNotifier.cpp +++ b/AppCallbackNotifier.cpp @@ -727,6 +727,18 @@ void AppCallbackNotifier::copyAndSendPreviewFrame(CameraFrame* frame, int32_t ms if ( NULL != dest ) { // data sync frames don't need conversion +#ifdef METADATA_MODE_FOR_PREVIEW_CALLBACK + if (mUseMetaDataBufferMode) { + unsigned int *format_ptr; + video_metadata_t *videoMetadataBuffer = (video_metadata_t *)dest; + videoMetadataBuffer->metadataBufferType = frame->metadataBufferType; + videoMetadataBuffer->handle = (void*)frame->mBuffer; + videoMetadataBuffer->canvas = frame->mCanvas; + format_ptr = (unsigned int *)(dest + sizeof(video_metadata_t)); + *format_ptr = frame->mColorFormat; + CAMHAL_LOGDB("copyAndSendPreviewFrame Metadata mode, canvas:0x%x", videoMetadataBuffer->canvas); + }else +#endif if (CameraFrame::FRAME_DATA_SYNC == frame->mFrameType) { if ( (mPreviewMemory->size / MAX_BUFFERS) >= frame->mLength ) { memcpy(dest, (void*) src, frame->mLength); @@ -1063,13 +1075,13 @@ void AppCallbackNotifier::notifyFrame() VT_resizeFrame_Video_opt2_lp(&input, &output, NULL, 0); mapper.unlock((buffer_handle_t)vBuf); - videoMetadataBuffer->metadataBufferType = kMetadataBufferTypeCanvasSource; + videoMetadataBuffer->metadataBufferType = kMetadataBufferTypeGrallocSource; videoMetadataBuffer->handle= (void *)vBuf; videoMetadataBuffer->canvas = 0; } else { - videoMetadataBuffer->metadataBufferType = kMetadataBufferTypeCanvasSource; + videoMetadataBuffer->metadataBufferType = frame->metadataBufferType; videoMetadataBuffer->handle = (void*)frame->mBuffer; videoMetadataBuffer->canvas = frame->mCanvas; } @@ -1515,6 +1527,11 @@ status_t AppCallbackNotifier::startPreviewCallbacks(CameraParameters ¶ms, vo mPreviewPixelFormat = CameraParameters::PIXEL_FORMAT_RGB565; } +#ifdef METADATA_MODE_FOR_PREVIEW_CALLBACK + if (mUseMetaDataBufferMode) + size = sizeof(video_metadata_t) + 4; +#endif + mPreviewMemory = mRequestMemory(-1, size, AppCallbackNotifier::MAX_BUFFERS, NULL); if (!mPreviewMemory) { return NO_MEMORY; diff --git a/CameraHal.cpp b/CameraHal.cpp index f739a77..284cb36 100755 --- a/CameraHal.cpp +++ b/CameraHal.cpp @@ -410,6 +410,25 @@ int CameraHal::setParameters(const CameraParameters& params) CAMHAL_LOGDB("AutoConvergence mode is %s", params.get(ExCameraParameters::KEY_AUTOCONVERGENCE)); mParameters.set(ExCameraParameters::KEY_AUTOCONVERGENCE, valstr); } +#ifdef METADATA_MODE_FOR_PREVIEW_CALLBACK + if ((valstr = params.get(ExCameraParameters::KEY_PREVEIW_CALLBACK_IN_METADATA_ENABLE)) != NULL) + { + int metadata; + CAMHAL_LOGDB("Preview callback meta mode is %s", valstr); + mParameters.set(ExCameraParameters::KEY_PREVEIW_CALLBACK_IN_METADATA_ENABLE, valstr); + metadata = mParameters.getInt(ExCameraParameters::KEY_PREVEIW_CALLBACK_IN_METADATA_ENABLE); + if (metadata == 1) { + if ((valstr = params.get(ExCameraParameters::KEY_PREVEIW_CALLBACK_IN_METADATA_LENGTH)) != NULL) + { + mParameters.set(ExCameraParameters::KEY_PREVEIW_CALLBACK_IN_METADATA_LENGTH, valstr); + metadata = mParameters.getInt(ExCameraParameters::KEY_PREVEIW_CALLBACK_IN_METADATA_LENGTH); + CAMHAL_LOGDB("Preview callback meta mode length is %d", metadata); + if (metadata == 16) + mAppCallbackNotifier->useMetaDataBufferMode(true); + } + } + } +#endif } @@ -1409,7 +1428,7 @@ status_t CameraHal::allocVideoBufs(uint32_t width, uint32_t height, uint32_t buf } if ( NO_ERROR == ret ){ - int32_t stride; + uint32_t stride; buffer_handle_t *bufsArr = new buffer_handle_t [bufferCount]; if (bufsArr != NULL){ @@ -3611,6 +3630,10 @@ void CameraHal::initDefaultParameters() p.set(CameraParameters::KEY_VIDEO_SIZE, mCameraProperties->get(CameraProperties::VIDEO_SIZE)); //p.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO, mCameraProperties->get(CameraProperties::PREFERRED_PREVIEW_SIZE_FOR_VIDEO)); +#ifdef METADATA_MODE_FOR_PREVIEW_CALLBACK + p.set(ExCameraParameters::KEY_PREVEIW_CALLBACK_IN_METADATA_ENABLE,ExCameraParameters::PREVEIW_CALLBACK_IN_METADATA_DISABLE); + p.set(ExCameraParameters::KEY_PREVEIW_CALLBACK_IN_METADATA_LENGTH,ExCameraParameters::PREVEIW_CALLBACK_IN_METADATA_LENGTH); +#endif LOG_FUNCTION_NAME_EXIT; } diff --git a/CameraHal_Module.cpp b/CameraHal_Module.cpp index 05d407b..e32c9c9 100755 --- a/CameraHal_Module.cpp +++ b/CameraHal_Module.cpp @@ -101,6 +101,8 @@ camera_module_t HAL_MODULE_INFO_SYM = { set_callbacks: NULL, get_vendor_tag_ops: NULL, open_legacy: NULL, + set_torch_mode: NULL, + init: NULL, reserved: {0}, }; diff --git a/ExCameraParameters.cpp b/ExCameraParameters.cpp index b1c23be..7c86f45 100755 --- a/ExCameraParameters.cpp +++ b/ExCameraParameters.cpp @@ -22,8 +22,8 @@ #include #include -#include #include "CameraHal.h" +#include namespace android { @@ -198,5 +198,14 @@ const char ExCameraParameters::ORIENTATION_SENSOR_NONE[] = "0"; const char ExCameraParameters::ORIENTATION_SENSOR_90[] = "90"; const char ExCameraParameters::ORIENTATION_SENSOR_180[] = "180"; const char ExCameraParameters::ORIENTATION_SENSOR_270[] = "270"; +#ifdef METADATA_MODE_FOR_PREVIEW_CALLBACK + //extensions to add preview callback in metadata mode +const char ExCameraParameters::KEY_PREVEIW_CALLBACK_IN_METADATA_ENABLE[] = "preview-callback-in-metadata-enable"; +const char ExCameraParameters::KEY_PREVEIW_CALLBACK_IN_METADATA_LENGTH[] = "preview-callback-in-metadata-length"; +const char ExCameraParameters::PREVEIW_CALLBACK_IN_METADATA_ENABLE[] = "1"; +const char ExCameraParameters::PREVEIW_CALLBACK_IN_METADATA_DISABLE[] = "0"; +const char ExCameraParameters::PREVEIW_CALLBACK_IN_METADATA_LENGTH_NONE[] = "0"; +const char ExCameraParameters::PREVEIW_CALLBACK_IN_METADATA_LENGTH[] = "16"; +#endif }; diff --git a/V4LCameraAdapter/V4LCameraAdapter.cpp b/V4LCameraAdapter/V4LCameraAdapter.cpp index 55c26be..32528e0 100755 --- a/V4LCameraAdapter/V4LCameraAdapter.cpp +++ b/V4LCameraAdapter/V4LCameraAdapter.cpp @@ -58,9 +58,20 @@ extern "C"{ //for private_handle_t TODO move out of private header #include #include +#include static int iCamerasNum = -1; +#ifdef ION_MODE_FOR_METADATA_MODE +#define ION_IOC_MESON_PHYS_ADDR 8 + +struct meson_phys_data{ + int handle; + unsigned int phys_addr; + unsigned int size; +}; +#endif + #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif @@ -196,6 +207,12 @@ status_t V4LCameraAdapter::initialize(CameraProperties::Properties* caps) memset(mVideoInfo,0,sizeof(struct VideoInfo)); +#ifdef ION_MODE_FOR_METADATA_MODE + ion_mode = false; + mIonClient = -1; + memset(mPhyAddr, 0, sizeof(mPhyAddr)); +#endif + #ifdef AMLOGIC_USB_CAMERA_SUPPORT #ifdef AMLOGIC_TWO_CH_UVC mCamEncodeIndex = -1; @@ -1262,6 +1279,18 @@ status_t V4LCameraAdapter::startPreview() return BAD_VALUE; } +#ifdef ION_MODE_FOR_METADATA_MODE + if ((CAMHAL_GRALLOC_USAGE) & GRALLOC_USAGE_PRIVATE_1) { + mIonClient = ion_open(); + if (mIonClient >= 0) { + ion_mode = true; + memset(mPhyAddr, 0, sizeof(mPhyAddr)); + } else { + CAMHAL_LOGEA("open ion client error"); + } + } +#endif + #ifndef AMLOGIC_USB_CAMERA_SUPPORT setMirrorEffect(); @@ -1425,6 +1454,13 @@ status_t V4LCameraAdapter::stopPreview() } } +#ifdef ION_MODE_FOR_METADATA_MODE + if (mIonClient >= 0) + ion_close(mIonClient); + mIonClient = -1; + memset(mPhyAddr, 0, sizeof(mPhyAddr)); +#endif + mPreviewBufs.clear(); mPreviewIdxs.clear(); LOG_FUNCTION_NAME_EXIT; @@ -1587,6 +1623,11 @@ V4LCameraAdapter::V4LCameraAdapter(size_t sensor_index) //mImgPtr = NULL; mPreviewOriation=0; mCaptureOriation=0; +#ifdef ION_MODE_FOR_METADATA_MODE + ion_mode = false; + mIonClient = -1; + memset(mPhyAddr, 0, sizeof(mPhyAddr)); +#endif LOG_FUNCTION_NAME_EXIT; } @@ -1616,6 +1657,12 @@ V4LCameraAdapter::~V4LCameraAdapter() } #endif +#ifdef ION_MODE_FOR_METADATA_MODE + if (mIonClient >= 0) + ion_close(mIonClient); + mIonClient = -1; + memset(mPhyAddr, 0, sizeof(mPhyAddr)); +#endif if (mVideoInfo){ free(mVideoInfo); mVideoInfo = NULL; @@ -1886,10 +1933,51 @@ int V4LCameraAdapter::previewThread() frame.mOffset = 0; frame.mYuv[0] = 0; frame.mYuv[1] = 0; +#ifdef ION_MODE_FOR_METADATA_MODE + if (ion_mode) { + int iret; + struct meson_phys_data phy_data = { + .handle = ((private_handle_t *)ptr)->share_fd, + .phys_addr = 0, + .size = 0, + }; + struct ion_custom_data custom_data = { + .cmd = ION_IOC_MESON_PHYS_ADDR, + .arg = (unsigned long)&phy_data, + }; + if (mPhyAddr[index] == 0) { + iret = ioctl(mIonClient, ION_IOC_CUSTOM, (unsigned long)&custom_data); + if (iret < 0) { + CAMHAL_LOGEB("ion custom ioctl %x failed with code %d: %s\n", + ION_IOC_MESON_PHYS_ADDR, + iret, strerror(errno)); + frame.metadataBufferType = kMetadataBufferTypeGrallocSource; + frame.mCanvas = 0; + } else { + frame.mCanvas = phy_data.phys_addr; + mPhyAddr[index] = phy_data.phys_addr; + frame.metadataBufferType = kMetadataBufferTypeGrallocSource; + } + } else { + frame.mCanvas = mPhyAddr[index]; + frame.metadataBufferType = kMetadataBufferTypeGrallocSource; + } + } else { + frame.mCanvas = canvas_id; + frame.metadataBufferType = (canvas_id != 0) ? kMetadataBufferTypeCanvasSource : kMetadataBufferTypeGrallocSource; + } +#else frame.mCanvas = canvas_id; + frame.metadataBufferType = kMetadataBufferTypeGrallocSource; +#endif + if (canvas_id != 0) { + frame.mCanvas = canvas_id; + frame.metadataBufferType = kMetadataBufferTypeCanvasSource; + } frame.mWidth = width; frame.mHeight = height; frame.mPixelFmt = mPixelFormat; + frame.mColorFormat = ((private_handle_t *)ptr)->format; ret = setInitFrameRefCount(frame.mBuffer, frame.mFrameMask); if (ret){ CAMHAL_LOGEB("setInitFrameRefCount err=%d", ret); diff --git a/inc/CameraHal.h b/inc/CameraHal.h index e26e156..173e0f6 100755 --- a/inc/CameraHal.h +++ b/inc/CameraHal.h @@ -68,10 +68,20 @@ #define CONTRAST_OFFSET 100 #ifdef AMLOGIC_USB_CAMERA_SUPPORT +#define METADATA_MODE_FOR_PREVIEW_CALLBACK +#define ION_MODE_FOR_METADATA_MODE +#ifdef ION_MODE_FOR_METADATA_MODE #define CAMHAL_GRALLOC_USAGE GRALLOC_USAGE_HW_TEXTURE | \ GRALLOC_USAGE_HW_RENDER | \ - GRALLOC_USAGE_SW_READ_RARELY | \ - GRALLOC_USAGE_SW_WRITE_NEVER + GRALLOC_USAGE_SW_READ_OFTEN | \ + GRALLOC_USAGE_SW_WRITE_OFTEN | \ + GRALLOC_USAGE_AML_DMA_BUFFER +#else +#define CAMHAL_GRALLOC_USAGE GRALLOC_USAGE_HW_TEXTURE | \ + GRALLOC_USAGE_HW_RENDER | \ + GRALLOC_USAGE_SW_READ_OFTEN | \ + GRALLOC_USAGE_SW_WRITE_OFTEN +#endif #else #define CAMHAL_GRALLOC_USAGE GRALLOC_USAGE_HW_TEXTURE | \ GRALLOC_USAGE_HW_RENDER | \ @@ -263,6 +273,8 @@ class CameraFrame mYuv[0] = 0; mYuv[1] = 0; mCanvas = 0; + metadataBufferType = 0; + mColorFormat = 0; } //copy constructor @@ -285,6 +297,8 @@ class CameraFrame mYuv[0] = frame.mYuv[0]; mYuv[1] = frame.mYuv[1]; mCanvas = frame.mCanvas; + metadataBufferType = frame.metadataBufferType; + mColorFormat = frame.mColorFormat; } void *mCookie; @@ -302,6 +316,8 @@ class CameraFrame unsigned int mPixelFmt; unsigned int mYuv[2]; unsigned int mCanvas; + unsigned int metadataBufferType; + unsigned int mColorFormat; ///@todo add other member vars like stride etc }; diff --git a/inc/ExCameraParameters.h b/inc/ExCameraParameters.h index 7af46db..99afd5a 100755 --- a/inc/ExCameraParameters.h +++ b/inc/ExCameraParameters.h @@ -234,6 +234,14 @@ static const char ORIENTATION_SENSOR_270[]; static const char FACING_FRONT[]; static const char FACING_BACK[]; +#ifdef METADATA_MODE_FOR_PREVIEW_CALLBACK +static const char KEY_PREVEIW_CALLBACK_IN_METADATA_ENABLE[]; +static const char KEY_PREVEIW_CALLBACK_IN_METADATA_LENGTH[]; +static const char PREVEIW_CALLBACK_IN_METADATA_ENABLE[]; +static const char PREVEIW_CALLBACK_IN_METADATA_DISABLE[]; +static const char PREVEIW_CALLBACK_IN_METADATA_LENGTH_NONE[]; +static const char PREVEIW_CALLBACK_IN_METADATA_LENGTH[]; +#endif }; }; diff --git a/inc/V4LCameraAdapter/V4LCameraAdapter.h b/inc/V4LCameraAdapter/V4LCameraAdapter.h index aee6b43..1f1c504 100755 --- a/inc/V4LCameraAdapter/V4LCameraAdapter.h +++ b/inc/V4LCameraAdapter/V4LCameraAdapter.h @@ -419,6 +419,11 @@ private: struct VideoInfo *mVideoInfo; int mCameraHandle; +#ifdef ION_MODE_FOR_METADATA_MODE + bool ion_mode; + int mIonClient; + unsigned int mPhyAddr[NB_BUFFER]; +#endif enum device_type_e m_eDeviceType; enum v4l2_memory m_eV4l2Memory; diff --git a/utils/util.cpp b/utils/util.cpp index ea28a33..3a37f5a 100755 --- a/utils/util.cpp +++ b/utils/util.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "util.h" #ifdef AMLOGIC_USB_CAMERA_SUPPORT -- cgit