调整Hi3536的VO显示延迟

        Hi3536的时钟管理可以参考《Hi3536 H.265解码处理器用户指南.pdf》的“3.2.3 时钟资源分布”章节。

其中,与视频相关的PLL是vpll0和vpll1。

调整Hi3536的VO显示延迟_第1张图片

当MPP使用VHD0作为显示设备时,内部使用vpll0,涉及的寄存器为PERI_CRG_PLL4和PERI_CRG_PLL5,基地址为0x1204_0000:

调整Hi3536的VO显示延迟_第2张图片

调整Hi3536的VO显示延迟_第3张图片

调整Hi3536的VO显示延迟_第4张图片

可以理解为根据上述两组寄存器,就可以微调VO输出的频率,文档上有计算公式:

调整Hi3536的VO显示延迟_第5张图片

举个例子,假设输出1920x1080@60,理论上像素时钟是148.5MHz,我们使用himd.l命令读取寄存器:

himd.l 0x12040010 1
*** Board tools : ver0.0.1_20121120 *** 
[debug]: {source/utils/cmdshell.c:166}cmdstr:himd.l
====dump memory 0x12040010====
0000:  14000000 01002063 12000000 01002063
[END]

根据上表得知postdiv2 = 1,postdiv1 = 4,frac = 0,refdiv = 2,fbdiv = 99。

FOUT1PH0 = FOUTVCO / (pstdiv1 x pstdiv2 x 2)  = [FREF x ( fbdiv + frac/2^24) / refdiv] / (pstdiv1 x pstdiv2 x 2)  =  [24*(99 + 0)/2]/(1*4*2)MHz = 148.5MHz。

       因为HI_MPI_VO_SetDispBufLen()能设置VO内部视频缓冲区的深度,但不能设置为1,最小值为3,设置后通过HI_MPI_VO_QueryChnStat()获取视频输出通道当前占用的视频buffer 数目,发现并不起作用,形同虚设!导致调用HI_MPI_VO_SendFrame()其实并不是马上能显示的,通过调用HI_MPI_VO_GetChnPts()可以得知当前显示帧的时间戳。猜想如果能动态调整frac值,或许能加快或降慢VO接口内部使用的视频缓冲区消耗速度(减少或增加阻塞在HI_MPI_VO_SendFrame(...,-1)的时间,怀疑内部实现是通过一个“有界阻塞队列”将视频帧发送给底层硬件),以达到减少或增加视频显示延迟的功效(其实就是微调显示帧率)!需要注意的是,只能动态微调帧率,如果帧率相差较大,液晶显示屏可能会黑屏,毕竟显示器不一定能支持这个特殊帧率的视频!

你可能感兴趣的:(海思视频处理器)