近段在DM642上做H.264压缩录像,需要用到4:2:0格式的YUV,为了求速度,需要把默认的D1改为CIF.初始图方便就取了D1的左上角的1/4作为CIF用了,但这样有一个缺点就是视场也小了,变为了原来的1/4.于是想把整个视场抽样为CIF,一种最直接的办法可能就是对每行,列像素抽样,滤波等得到,这样做计算量稍微大了点.
查看TI的VIC文档发现DM642本身有1/2scaling功能,即可以把D1中每一行的Y分量的720pix抽样为360pix,但行数不变,还是576. 于是编了一个YUV422to420函数,完成功能为Y分量每隔两行(720pix)取352pix,UV分量每隔四行(720pix)取176pix,这其中422采样为420与我取D1的1/4左上角作为CIF时采用的方法是一样的,,,,,,,,但结果出现了bug,
主要是颜色不正,Y分量没有问题的.最后专门PS了一张图片,中间画一个十字分为四部分,分别为红,绿,蓝,黑,使其恰好充满整个sensor的靶面,发现经压缩解压缩后的图像上半部分红绿相间,且稍微往下倾斜,下半部分则为蓝黑相间,,,,,,,,,,,,,,分析一下,能判断肯定是UV采样搞错了,但到底错在哪里一时没看出来,因为用1/2scaling功能之前如此采样是没有出现问题的,仔细分析一下颜色错位的特点,判断应该是采集时出现了一个不该有的移位,所以把左边的红色会移到右边去,捣弄了半天,无果,,,,
突然想起来刚才1/2scaling后查看内存,video cap通道的Y,Cr,Cb中Cr,Cb分量好像有点异常,回头再看,发现按常理Cr,Cb都应该为180*576 = 103680的,可实际大小为105984,当时没有注意,现在用105984除以576才等于184,而不是180!!!!赶快把UV采样中的720pix改为每736pix采样176pix,重新编译下载,录像效果OK!!!
这个问题主要是1/2scaling时UV分量每行多出来了4个像素,但VIC资料中并没有提及,才浪费了偶半天时间,,,,,,,,