调整Hi3536的VO显示延迟

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

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

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

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

举个例子,假设输出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)的时间,怀疑内部实现是通过一个“有界阻塞队列”将视频帧发送给底层硬件),以达到减少或增加视频显示延迟的功效(其实就是微调显示帧率)!需要注意的是,只能动态微调帧率,如果帧率相差较大,液晶显示屏可能会黑屏,毕竟显示器不一定能支持这个特殊帧率的视频!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值