把4:2:2格式转换成4:2:O格式,要保留所有的Y,并取第0,2,4,……行的U和第1,3,5……行的V。采用基于描述符列表“大”模式的MDMA,需要三对描述符source_y,dest_y,SOurce_u,dest_u,SOUrce_v,dest_v,形成源和目的两个描述符链表,进行Y,U和V的从交织的4:2:2格式的源数据区到Y,U和V分离的目的数据区的搬移。
当一帧CIF 4:2:2格式数据通过PPI填充到一个Blackfin处理器的视频帧缓冲区中,产生中断,在中断处理子程序中启动MDMA,分离亮度值和色度值,然后交给H.264编码器进行编码。
2.3 H.264编码
等待产生一帧4:2:O格式数据后,对这一帧数据执行H.264编码,之后继续等待4:2:0格式数据的产生,直至编码结束。
3 实验结果与分析
实验中,H.264编码器对摄像头采集到的图像编码,并将压缩码流以文件的形式保存在本地存储器中。编码结束后,用H.264的解码器对压缩码流解码,用YUVviewerPlus.exe播放解码后的视频文件。
实验中,编码器可达到每秒钟编码15帧图像的速度。解码后的图像清晰度与在VisualDsp++5.0中用Image Viewer查看的相比,图像质量基本相同,图像很清晰。OV7660采集图像的速度是每秒钟30帧,H.264编码器没有达到实时编码。
实验中,基于BF561的H.264编码器没有达到实时编码的原因是没有对H.264开源代码优化。由于CIF格式图像数据比较大,需要存储在外部存储器中,处理器访问外部存储器时间比较长;DCT和运动估计算法函数比较耗时,用C语言实现;程序中有一些辅助函数和打印信息等,从而影响了编码器的速度口。
4 结 语
基于BF561的H.264编码器没有达到实时编码。未来的工作重点是利用VisualDSP++开发环境的C编译器,进行代码优化;充分利用内部存储空间资源和尽可能通过DMA、高速缓存等减少存储分配带来的片内外数据调度对系统性能的影响;对一些系统调用比较频繁、耗时较多的模块,如DCT和运动估计等,充分利用BF561的指令集,用汇编语言实现;去掉源程序中不必要的辅助函数和打印信息,以实现基于BF561的H.264编码器实时编码。
随着消费类电子产品进一步进入普通家庭,应用H.264标准的视频会议、可视电话以及无人监控系统等也将会得到越来越广泛的应用。