summaryrefslogtreecommitdiff
authorYuxi Sun <yuxi.sun@amlogic.com>2016-08-12 05:38:49 (GMT)
committer Yuxi Sun <yuxi.sun@amlogic.com>2016-08-12 07:33:05 (GMT)
commit5432e2f4a1ef9841088a8adc9eceeb57437a5036 (patch)
tree3c94ae6e5144333ef0f1d5042ae572b275de8c7a
parentb69410a6593ae336db55036efd23626e939375c8 (diff)
downloadcamera-5432e2f4a1ef9841088a8adc9eceeb57437a5036.zip
camera-5432e2f4a1ef9841088a8adc9eceeb57437a5036.tar.gz
camera-5432e2f4a1ef9841088a8adc9eceeb57437a5036.tar.bz2
PD#130174: camera: Merge IPTV 1080p optimization to trunk
Change-Id: Ibf0a159093d17452579566ddd1d5c2b8168a4c22
Diffstat
-rw-r--r--Android.mk2
-rwxr-xr-xAppCallbackNotifier.cpp21
-rwxr-xr-xCameraHal.cpp25
-rwxr-xr-xCameraHal_Module.cpp2
-rwxr-xr-xExCameraParameters.cpp11
-rwxr-xr-xV4LCameraAdapter/V4LCameraAdapter.cpp88
-rwxr-xr-xinc/CameraHal.h20
-rwxr-xr-xinc/ExCameraParameters.h8
-rwxr-xr-xinc/V4LCameraAdapter/V4LCameraAdapter.h5
-rwxr-xr-xutils/util.cpp1
10 files changed, 176 insertions, 7 deletions
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 &params, 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 <string.h>
#include <stdlib.h>
-#include <ExCameraParameters.h>
#include "CameraHal.h"
+#include <ExCameraParameters.h>
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 <ion/ion.h>
#include <gralloc_priv.h>
+#include <MetadataBufferType.h>
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 <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <string.h>
#include "util.h"
#ifdef AMLOGIC_USB_CAMERA_SUPPORT