你的位置:首页 > 操作系统

[操作系统]8127队列延迟一帧,和有时图像分上下断面的分析


  1、图像的延迟一帧的问题,主要原因如代码中所说,只有队列多余两帧的时候才会出队一帧。该问题对于连续的图像帧基本无影响,只是对于非连续的情况下,进来的第一帧会延后,先出来的是上一次图像序列中最后一帧。而当次图像序列的最后一帧将会被刷到队列中。

  如果将其中的2改写为1,则会出现图像上下分层现象,上层是最新的图像数据,而下方是图像之前的数据。

  但是图像的分层现象只是暂时的,在后台(找不到形容词了)vpdma还是在继续着刷新任务,所以下次同一个内存空间中,发现下层变成了上次只有上层的那一帧数据。该问题稍后分析。

 

  if (1u == pChObj->vChannelRecv)
    {
        /* This will dequeue a frame only if queue has 2 or more
           than 2 frames. */
        VpsUtils_queGet(
            &pChObj->tmpQue,
            (Ptr *)&pFrame,
            2,
            BIOS_NO_WAIT);

针对延时一帧的问题,我们的解决方案是在每次的图像帧序列的最后添加一帧,同时删除每次输出图像的第一帧。这样可以得到完整的输入图像序列。删除一帧无非是在使用图像前将其释放出队列。

 

2、之前所说的上下断面现象,个人认为是vpdma存在一个类似的乒乓机制,有两个搬空间,图像分两部分进行搬运,假设当帧A上半部分搬运完成后,上半部分的空间则去搬运帧B的上半部分空间,此时系统将帧A直接入队,如果在此时将帧A出队,则图像中只会出现帧A已经搬运完成的部分,而当队列为2时,则此时A有足够的时间进行完整帧的搬运,故显示的是完整帧。

但是有时候队列为2的情况下,还是会出现上下断面的现象,此时根据之前的猜测认为只要有如下两种原因,

  a、所搬运的帧分辨率太大。

  b、所搬运的帧所需时间太大。

两个原因可以看为同一个原因,即所进来的一帧超过了硬件的能力。 解决的方法有2:

  a、提高输入图像的时钟。增加场消隐时间

  b、减小图像尺寸,降低帧率

问题2的分析完全是在根据调试过程的现象的相关猜测,不一定正确,可以一起探讨。