walle的启动流程:
系统开机启动,在init.rc中启动可执行程序mediaserver。他通过一系列的调用,调用到cameraserver的onFirstRef函数。mWalleHardware->initWalle进而调用HAL层的HAL_camera_device_open函数。则启动previewthread线程。进而开始运行walle算法。预览是不运行的,也就是window和buf不需要设置。
注意mWalleHardware->initWalle与普通的初始化的区别就是没有设置显示的window和buf。
第三方APK启动流程:
Apk启动,apk初始化经过一系列的调用,调用到cameraserver的connect函数。这里只是打开预览要使用的window和buf。同时new Client,这样上层的apk就可以与HAL通讯,将预览数据显示到屏幕上。只是设置了window和buf。
Apk会调用startpreview函数,进而调用cameraserver的startpreview,进而调用Hal的setwindows和startpreview。则显示预览到window上。
拍照,apk会发送onShutterButtonClick: mCameraState=1,进而CameraService( 1129): takePicture函数,进而调用HAL的mHardware->takePicture。HAL中stoppreview和启动拍照线程。
Stoppreview中会停止预览线程的显示,
拍照线程中会自己从v4l2中读取到frame的数据并处理(大小,格式),保存为图片。
拍照完成后,就会继续stoppreview和startpreview开启prethread,进行预览显示。
1V/camera ( 1810): onShutterButtonClick: mCameraState=1
1.1V/CameraService( 1130): setParameters(0)
1.2V/CameraService( 1130): enableMsgType(0)
1.3V/CameraService( 1130): takePicture(0)
2V/camera ( 1810): mShutterLag = 323ms
3V/camera ( 1810): mShutterToRawCallbackTime = 70ms
4V/camera ( 1810): mPictureDisplayedToJpegCallbackTime = 44ms
5V/camera ( 1810): stopPreview
6V/camera ( 1810): stopPreview
7V/camera ( 1810): Set picture size.640x480
8V/camera ( 1810): Preview size is 640x480
9V/camera ( 1810): startPreview
录像流程:
1.V/camera ( 1814): stopPreview
2.V/videocamera( 1814): startVideoRecording
3 V/videocamera( 1814): initializeRecorder
4V/CameraService( 1130): startRecording(0)
停止录像:
1E/videocamera( 1814): onShutterButtonClick, call stopVideoRecording()
E/videocamera( 1814): onStopVideoRecording, call stopVideoRecording()
V/videocamera( 1814): stopVideoRecording
2V/videocamera( 1814): Setting current video filename: /mnt/sdcard/DCIM/Camera/VID_19700102_080126.mp4
退出流程:可以只是在apk上调用stoppreview,也可以在apk在调用release函数,而这个函数会导致HAL的stoppreview和release函数被调用。
1E/videocamera( 1814): finishRecorderAndCloseCamera,case not mMediaRecorderRecording,call stopVideoRecording()
V/videocamera( 1814): stopVideoRecording
V/videocamera( 1814): Releasing media recorder.
V/videocamera( 1814): closeCamera
2V/CameraService( 1130): stopPreview(0)
3V/CameraService( 1130): stopPreview(0)
4V/CameraService( 1130): release(0)这里面要释放buffer和关闭算法,关闭v4l2。
Apk的stoppreview只有执行mHardware->stopPreview();函数。
Apk的Release(closeCamera)包括mHardware->stopPreview();和mHardware->release();
Walle的720P与640x480的转换问题
现在的驱动(不一定是驱动的问题)和HAL的配合,会导致,反复切换两者时会导致camera崩溃。无法继续使用,只能重启机器。
驱动中有一个同步有一定的几率会同步上,所以出问题。