最近有个项目用测方头,需要raw12数据流。驱动调通HAL1,没调HAL3,客户apk用camera ndk开发,走平台默认HAL version,好死不死是HAL3,所以问高通如何默认走HAL1,然后QC简单粗暴告诉我直接不支持HAL3就好了,牛逼牛逼!
hal3 支持raw12的;
关闭hal3命令:
adb root,
adb shell setprop persist.vendor.camera.HAL3.enabled 0
默认关闭hal3的话需要更改代码,
persist.vendor.camera.HAL3.enabled置为0即可。
另外,提及一下QC camera HAL适配RAW12数据:
项目中有用到特殊的摄像头,用的是raw12数据,底层都已打通,和上层的连接出现问题,主要是QC msm8953支持raw12但没有完善代码,需要odm自己适配。
patch如下:
Index: hardware/qcom/camera/QCamera2/HAL3/QCamera3Channel.cpp
===================================================================
--- hardware/qcom/camera/QCamera2/HAL3/QCamera3Channel.cpp (版本 121)
+++ hardware/qcom/camera/QCamera2/HAL3/QCamera3Channel.cpp (工作副本)
@@ -1483,6 +1483,10 @@
streamType = CAM_STREAM_TYPE_RAW;
streamFormat = CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG;
break;
+ case HAL_PIXEL_FORMAT_RAW12:
+ streamType = CAM_STREAM_TYPE_RAW;
+ streamFormat = CAM_FORMAT_BAYER_MIPI_RAW_12BPP_BGGR;
+ break;
default:
return -EINVAL;
}
Index: hardware/qcom/camera/QCamera2/HAL3/QCamera3HWI.cpp
===================================================================
--- hardware/qcom/camera/QCamera2/HAL3/QCamera3HWI.cpp (版本 121)
+++ hardware/qcom/camera/QCamera2/HAL3/QCamera3HWI.cpp (工作副本)
@@ -1037,6 +1037,7 @@
case ANDROID_SCALER_AVAILABLE_FORMATS_RAW16:
case ANDROID_SCALER_AVAILABLE_FORMATS_RAW_OPAQUE:
case HAL_PIXEL_FORMAT_RAW10:
+ case HAL_PIXEL_FORMAT_RAW12:
count = MIN(gCamCapability[mCameraId]->supported_raw_dim_cnt, MAX_SIZES_CNT);
for (size_t i = 0; i < count; i++) {
if ((gCamCapability[mCameraId]->raw_dim[i].width == (int32_t)rotatedWidth) &&
@@ -1141,6 +1142,7 @@
switch(streamList->streams[i]->format) {
case HAL_PIXEL_FORMAT_RAW_OPAQUE:
case HAL_PIXEL_FORMAT_RAW10:
+ case HAL_PIXEL_FORMAT_RAW12:
case HAL_PIXEL_FORMAT_RAW16:
case HAL_PIXEL_FORMAT_BLOB:
break;
@@ -1625,6 +1627,7 @@
}
break;
case HAL_PIXEL_FORMAT_RAW10:
+ case HAL_PIXEL_FORMAT_RAW12:
case HAL_PIXEL_FORMAT_RAW_OPAQUE:
case HAL_PIXEL_FORMAT_RAW16:
rawStreamCnt++;
@@ -2041,6 +2044,7 @@
case HAL_PIXEL_FORMAT_RAW_OPAQUE:
case HAL_PIXEL_FORMAT_RAW16:
case HAL_PIXEL_FORMAT_RAW10:
+ case HAL_PIXEL_FORMAT_RAW12:
mStreamConfigInfo.type[mStreamConfigInfo.num_streams] = CAM_STREAM_TYPE_RAW;
mStreamConfigInfo.postprocess_mask[mStreamConfigInfo.num_streams] = CAM_QCOM_FEATURE_NONE;
isRawStreamRequested = true;
@@ -2172,6 +2176,7 @@
case HAL_PIXEL_FORMAT_RAW_OPAQUE:
case HAL_PIXEL_FORMAT_RAW16:
case HAL_PIXEL_FORMAT_RAW10:
+ case HAL_PIXEL_FORMAT_RAW12:
mRawChannel = new QCamera3RawChannel(
mCameraHandle->camera_handle, mChannelHandle,
mCameraHandle->ops, captureResultCb,
@@ -2560,6 +2565,7 @@
maxJpegDim = dimension;
} else if ((*it)->stream->format == HAL_PIXEL_FORMAT_RAW_OPAQUE ||
(*it)->stream->format == HAL_PIXEL_FORMAT_RAW10 ||
+ (*it)->stream->format == HAL_PIXEL_FORMAT_RAW12 ||
(*it)->stream->format == HAL_PIXEL_FORMAT_RAW16) {
if (dimension > maxRawDim)
maxRawDim = dimension;
@@ -2628,6 +2634,7 @@
hasJpegStream = true;
else if (stream->format == HAL_PIXEL_FORMAT_RAW_OPAQUE ||
stream->format == HAL_PIXEL_FORMAT_RAW10 ||
+ stream->format == HAL_PIXEL_FORMAT_RAW12 ||
stream->format == HAL_PIXEL_FORMAT_RAW16)
hasRawStream = true;
}
@@ -6839,6 +6846,7 @@
it != mStreamInfo.end();) {
if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_OPAQUE &&
(*it)->stream->format != HAL_PIXEL_FORMAT_RAW10 &&
+ (*it)->stream->format != HAL_PIXEL_FORMAT_RAW12 &&
(*it)->stream->format != HAL_PIXEL_FORMAT_RAW16) {
newStreamInfo.push_back(*it);
it = mStreamInfo.erase(it);
@@ -7552,6 +7560,7 @@
ANDROID_SCALER_AVAILABLE_FORMATS_YCbCr_420_888,
ANDROID_SCALER_AVAILABLE_FORMATS_BLOB,
HAL_PIXEL_FORMAT_RAW10,
+ HAL_PIXEL_FORMAT_RAW12,
HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED};
size_t scalar_formats_count = sizeof(scalar_formats) / sizeof(int32_t);
staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
@@ -7682,6 +7691,7 @@
case ANDROID_SCALER_AVAILABLE_FORMATS_RAW16:
case ANDROID_SCALER_AVAILABLE_FORMATS_RAW_OPAQUE:
case HAL_PIXEL_FORMAT_RAW10:
+ case HAL_PIXEL_FORMAT_RAW12:
for (size_t i = 0; i < MIN(MAX_SIZES_CNT,
gCamCapability[cameraId]->supported_raw_dim_cnt); i++) {
addStreamConfig(available_stream_configs, scalar_formats[j],
@@ -7740,6 +7750,7 @@
case ANDROID_SCALER_AVAILABLE_FORMATS_RAW16:
case ANDROID_SCALER_AVAILABLE_FORMATS_RAW_OPAQUE:
case HAL_PIXEL_FORMAT_RAW10:
+ case HAL_PIXEL_FORMAT_RAW12:
for (size_t i = 0; i < MIN(MAX_SIZES_CNT,
gCamCapability[cameraId]->supported_raw_dim_cnt); i++) {
available_min_durations.add(scalar_formats[j]);
其实只要在有raw10的地方加上raw12即可。