我们在做camera的拍照驱动时, 需要考虑到在应用程序的拍照界面, 在拍照前的帧率应该比较高而图像输出小如640x480, 这样sensor负荷才小, 否则散热不好就会变色, 在拍照那一小段时间内如500ms内, sensor要被设成帧率低尺寸大如2048x1536, 然后再设回预览模式帧率高尺寸小。
拍照时, 执行TakeStillPicture, 三星的源码中主要有以下代码
SetSensorFormat(STILL);
CameraSetRegisters(STILL_CAPTURE_BUFFER);
CameraCaptureControl(STILL_CAPTURE_BUFFER,TRUE);
实现了拍照的开启初始化。所以可修改如下:
// 1, 启动AF, 等到AF完成后函数才返回
CameraAF(TRUE);
// 2, 采集图片
CameraCaptureControl(VIDEO_CAPTURE_BUFFER,FALSE);
CameraCaptureControl(STILL_CAPTURE_BUFFER,FALSE);
CameraCaptureControl(PREVIEW_CAPTURE_BUFFER,FALSE);//设置新的拍照分辨率
CameraStill();SetSensorFormat(PREVIEW);
SetSensorFormat(STILL);CameraSetRegisters(PREVIEW_CAPTURE_BUFFER);
CameraSetRegisters(STILL_CAPTURE_BUFFER);
CameraCaptureControl(PREVIEW_CAPTURE_BUFFER,TRUE);
CameraCaptureControl(STILL_CAPTURE_BUFFER,TRUE);
这样就实现了, 拍照的初始化, 如果有闪光灯, 可以在 CameraCaptureThread 中进行开关控制, 在第1帧时打开, 在第三帧即取照片后关闭, 这样就能保证取出来的照片是在闪关时间内的, 为了体现所见即所得, 应用程序一般都是取完照片后即显示该图片1~2秒钟。
好, 取完照片后我们需要把sensor 设回预览模式。我注意到CameraCaptureThread ->pfnCameraHandleStillFrame(dwCameraDriverContext) -> CameraStillFrameCallback ........->FillBuffer, 那么在FillBuffer中memcpy(pImage, (void *)m_CameraHWStillBuffer.VirtAddr, dwRet)后面可以执行如下代码
// 1, 关闭AF
CameraAF(FALSE);
CameraCaptureControl(VIDEO_CAPTURE_BUFFER,FALSE);
CameraCaptureControl(STILL_CAPTURE_BUFFER,FALSE);
CameraCaptureControl(PREVIEW_CAPTURE_BUFFER,FALSE);/ /设置新的拍照分辨率
CameraPreview();SetSensorFormat(PREVIEW);
//SetSensorFormat(STILL);
CameraSetRegisters(PREVIEW_CAPTURE_BUFFER);
//CameraSetRegisters(STILL_CAPTURE_BUFFER);
//CameraCaptureControl(STILL_CAPTURE_BUFFER,TRUE);
CameraCaptureControl(PREVIEW_CAPTURE_BUFFER,TRUE);即可实现由拍照分辨率变为预览分辨率。
---amo 原创
6410 camera驱动之拍照设置
最新推荐文章于 2024-08-14 09:20:54 发布