客户发现播放个别码流中的节目,时间一长,会出现黑白现象(彩色消失)。

实际原因是,生成CVBS彩色副载波的时钟误差太大导致,因为该时钟是依赖于节目PCR,如果PCR抖动厉害,导致该时钟偏离。

我们的软件过滤节目PCR,和本地STC值进行比较,计算偏差设置时钟模块相关参数以使内部时钟和节目PCR同步 --- 称为fractal PLL或者Sigma/Delta PLL。

项目里面调整时钟输出的函数是tmhwClockFractPllOffset(0, fDelta)。

实验发现(手动输入fDelta),如果fDelta值太大或太小,电视会出现黑白现象,比较安全的范围是[-120, 120]。所以软件里面的正确改动应该是:
(fDeltaGlobal + fDelta) > 120 || (fDeltaGlobal + fDelta) < -120,情况下不设置锁相参数。

猜测 --- 然而这样的话对于码流中pcr的不算严重的抖动不能很好适应而可能导致丢帧,马赛克等;又或者不能适应个别不太准确的时钟晶振元件。

下面就软件对pcr的处理算法做简要描述:
StcOpen: 创建线程pcrExtraction_Thread()
StcClose: 关闭线程
StcSetPcrPid: 设置pcr过滤器
StcClearPcrPid: 关闭pcr过滤器
pcrExtraction_thread():
   初始化pcr和stc记录数组;
   while(1){
     读取pcr;
     如果发生discontinuity,重置pcr和stc记录数组,continue;
     和上次pcr的值进行比较,如果大于0.5秒,则进行下面的处理;//其中45000/(27M/300)=0.5s
     {
        记录本次pcr和pcr到达时的stc值;
        当记录数组满;//数组大小为40
        {
           比较最新和最老的pcr差值;
           比较最新和最老的stc差值;
           比较上面两个差值的差值得到pcr和stc的时钟源差异;
           通过上面的差异计算出Sigma/Delta的锁相参数进行设置;
        }
     }