[RK3399][Android7.1] Camera HAL中的幾個adapter
阿新 • • 發佈:2019-01-24
Platform: rk3399
OS: Android 7.1
Kernel: v4.4.83
HAL中在new CamaerHal物件的時候會根據不同型別的sensor建立不同的adapter,以下是區別:
- CameraUSBAdapter: USB介面型別的攝像頭,走v4l2.
- CameraIspSOCAdapter:dvp介面,isp控制器接收。
- CameraIspAdapter:mipi介面,isp控制器接收,不走v4l2.
- CameraSOCAdapter:dvp介面,VIP控制器接收。
到rk3399上, 據說VIP控制器已經沒有了,TRM不知道是因為不全還是沒有寫VIP的資訊,至少ISP的內容也是沒看到的。
畫素低的camera,一般用yuv格式,用dvp介面傳輸;
畫素高的camera,一般用raw格式,用mipi來傳輸,因為相對來說raw的資料量更小,mipi傳輸的速率更高。
呼叫在CameraHal.cpp:
if((strcmp(gCamInfos[cameraId].driver,"uvcvideo") == 0)) {
LOGD("it is a uvc camera!");
mCameraAdapter = new CameraUSBAdapter(cameraId);
}
else if (gCamInfos[cameraId].pcam_total_info->mHardInfo.mSensorInfo.mPhy.type == CamSys_Phy_Cif){
LOGD("it is a isp soc camera");
if(gCamInfos[cameraId].pcam_total_info->mHardInfo.mSensorInfo.mPhy.info.cif.fmt == CamSys_Fmt_Raw_10b
|| gCamInfos[cameraId].pcam_total_info ->mHardInfo.mSensorInfo.mPhy.info.cif.fmt == CamSys_Fmt_Raw_12b)
mCameraAdapter = new CameraIspSOCAdapter(cameraId);
else
mCameraAdapter = new CameraIspAdapter(cameraId);
}
else if(gCamInfos[cameraId].pcam_total_info->mHardInfo.mSensorInfo.mPhy.type == CamSys_Phy_Mipi){
LOGD("it is a isp camera");
mCameraAdapter = new CameraIspAdapter(cameraId);
}
else{
LOGD("it is a soc camera!");
mCameraAdapter = new CameraSOCAdapter(cameraId);
//mCameraAdapter->is_cif_driver = true;
mCameraAdapter->cif_driver_iommu = gCamInfos[cameraId].pcam_total_info->mIsIommuEnabled;
mPreviewBuf->is_cif_driver = true;
mVideoBuf->is_cif_driver = true;
mRawBuf->is_cif_driver = true;
mJpegBuf->is_cif_driver = true;
}
VIP:
VIP全稱Video Input Processer, 用於將外部的Camera資料傳送到memory中,其中YUV資料的話會被獨立成Y和UV資料,然後傳給memory,而Raw data不做處理直接傳輸。
另外VIP還是有Crop功能。