预览帧率trace分析:
脉冲的上升沿代表:来了一个buffer
下降沿代表:消耗了一个buffer
cameraHAL 帧率:
EmulateSensor中有threadlloop和processresult,鼠标全选整个周期,用selected range / (result的occurrences / 2) ,除以2是因为result中同时包含meta和buffer,我们只需要buffer
cameraServer帧率:
选中所有的frame capture
选中所有的cam2_frame
选中所有的previewSpacer,计算queuebuffer
cameraAPP送给surfaceFlinger的帧率:
surfaceview:选中surfaceview的所有脉冲 / 2
TextureView:选中TextureView的所有脉冲 / 2,TextureView是通过RenderThread将Camera预览Buffer和UI Buffer合并在一起的
帧率不足问题定位:
surfaceview类型:
大概率是cameraHal送的帧率不够,因为app不参与buffer处理
从cameraserver角度做第一手分析
1.HAL处理慢:cameraserver的pcr时间会很长
如果deepth是8个,fw下8个pcr,hal处理8个pcr,fw下第9个时会卡住
等第一个pcr hal处理完之后,才会接着处理第9个pcr,一直保证hal在处理8个pcr
如果camerasever camerahal::processBacthCaptureRequest很长,此时是因为hal没有及时处理request
2.app没有下pcr
同样deepth是8个,hal 只有5.6个在处理
如果camerasever dequeubuffer拿不到,preparehalrequest时间会很长,此时是因为app没有还buffer
surfaceTexture类型:
从app角度做第一手分析,看是hal送的帧率问题,还是app处理buffer导致的问题
select count(*),value from counter where track_id in (select id from counter_track where name like "%SurfaceTexture%" limit 1) group by value
录像帧率trace分析:
从graphicbuffersource 脉冲来统计录像buffer的帧率 selected range / count / 2
帧率未达到要求:
如果camerasever送的帧率不够,则camera继续分析
1.需要看下cameraserver的threadloop的帧率是否够
2.如果camerasever camerahal::processBacthCaptureRequest很长,此时是因为hal没有及时处理request
3.preparehalrequest时间长,此时是因为app没有还buffer,camerasever dequeubuffer拿不到
如果camerasever送的帧率够,则video encoder继续分析
1. Video Codec
统计HIDL::IOmxNode::fillBuffer::client的个数,
selected range / occurrences
2. codec2
统计HIDL::IComponentListener::onInputBuffersReleased::client的个数,
selected range / occurrences