Qcom Camera 调试技巧
1.Camera启动速度(Hal层的耗时):
Camera的启动速度,是我们经常做优化的地方,除了通过仪器去测量,还可以通过Log来查看! 搜索关键字:[KPI Perf]
01-24 17:55:57.657 371 4074 D QCamera2HWI: [KPI Perf] int qcamera::QCamera2HardwareInterface::openCamera(hw_device_t**):
E PROFILE_OPEN_CAMERA camera id 0 //这里打开摄像头
01-24 17:55:58.139 371 2380 D QCamera2HWI: [KPI Perf]
static int qcamera::QCamera2HardwareInterface::start_preview(camera_device*):
E PROFILE_START_PREVIEW
01-24 17:55:58.528 371 16975 D QCamera2HWI: int qcamera::QCamera2HardwareInterface::startPreview(): X
01-24 17:55:58.528 371 2380 D QCamera2HWI: [KPI Perf] static int qcamera::QCamera2HardwareInterface::
start_preview(camera_device*): X
01-24 17:55:58.530 2971 2971 D CameraManager: {CameraManager.initVideoCamera-199}
摄像头打开预览.
01-24 17:55:58.654 371 17015 D QCamera2HWI: [KPI Perf] static void qcamera::QCamera2HardwareInterface::
preview_stream_cb_routine(mm_camera_super_buf_t*, qcamera::QCameraStream*, void*) :
PROFILE_FIRST_PREVIEW_FRAME //第一帧预览画面出现
复制代码
打开Camera的时间点:01-24 17:55:57.657 第一帧预览画面出现的时间点:01-24 17:55:58.654 耗时:0.997s(将近1s左右) 注意这是从进入开始Hal层的计算的耗时
我们来看看源码,
int QCamera2HardwareInterface::openCamera(struct hw_device_t **hw_device)
{
···
CDBG_HIGH("[KPI Perf] %s: E PROFILE_OPEN_CAMERA camera id %d", func,mCameraId);
rc = openCamera();
···
}
复制代码
void QCamera2HardwareInterface::preview_stream_cb_routine(mm_camera_super_buf_t *super_frame,
QCameraStream * stream,
void *userdata)
{
ALOGD("[KPI Perf] %s : BEGIN", func);
···
if(pme->m_bPreviewStarted) {
CDBG_HIGH("[KPI Perf] %s : PROFILE_FIRST_PREVIEW_FRAME", func);
pme->m_bPreviewStarted = false ;
}
···
}
复制代码
事实上,高通也只是在调用地方打印了一下当前的时间点,因此如果你想分析某个功能的耗时, 就按照高通的思路,调用前后打印一下当前函数就可以了,最后再通过时间戳计算耗时! 当然了
.如何查看Camera的帧率(fps):拍照和视频
1 拍照帧率 源码: hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp
void QCamera2HardwareInterface::debugShowPreviewFPS()
{
static int n_pFrameCount = 0;
static int n_pLastFrameCount = 0;
static nsecs_t n_pLastFpsTime = 0;
static double n_pFps = 0;
n_pFrameCount++;
nsecs_t now = systemTime();
nsecs_t diff = now - n_pLastFpsTime;
if (diff > ms2ns(250)) {
n_pFps = (((double)(n_pFrameCount - n_pLastFrameCount)) *
(double)(s2ns(1))) / (double)diff;
CDBG_HIGH("[KPI Perf] %s: PROFILE_PREVIEW_FRAMES_PER_SECOND : %.4f", func, n_pFps);
n_pLastFpsTime = now;
n_pLastFrameCount = n_pFrameCount;
}
}
复制代码
hal层是如何计算实际输出的帧率:
n_pFps = (((double)(n_pFrameCount - n_pLastFrameCount)) *(double)(s2ns(1))) / (double)diff;
复制代码
搜索关键字:PROFILE_PREVIEW_FRAMES_PER_SECOND 默认fps是不输出的,需要用到adb命令打开
2.视频帧率 源码: hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp
void QCamera2HardwareInterface::debugShowVideoFPS()
{
static int n_vFrameCount = 0;
static int n_vLastFrameCount = 0;
static nsecs_t n_vLastFpsTime = 0;
static double n_vFps = 0;
n_vFrameCount++;
nsecs_t now = systemTime();
nsecs_t diff = now - n_vLastFpsTime;
if (diff > ms2ns(250)) {
n_vFps = (((double)(n_vFrameCount - n_vLastFrameCount)) *
(double)(s2ns(1))) / (double)diff;
ALOGE(“Video Frames Per Second: %.4f”, n_vFps);
n_vLastFpsTime = now;
n_vLastFrameCount = n_vFrameCount;
}
}
复制代码
搜索关键字:Video Frames Per Second 执行命令
adb root
adb shell setprop persist.debug.sf.showfps 1
adb shell
logcat | grep “Video Frames Per Second”
复制代码
3.获取数据流的帧(YUV图)
源码: hardware/qcom/camera/QCamera2/HAL/QCamera2HWICallbacks.cpp
void QCamera2HardwareInterface::dumpFrameToFile(QCameraStream *stream,
mm_ca