1. 程式人生 > >[RK3399][Android7.1] Camera HAL中的幾個adapter

[RK3399][Android7.1] Camera HAL中的幾個adapter

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功能。

這裡寫圖片描述