1、Project: the Compression and Decompression of Video Data 2009-09-14 10:52:41| 分类: 学术论文 |字号大中小 订阅课题要求:此课题研发的是某航空遥感系统中视频数据压缩与解压的任务,以满足在有限的无限信道中传输海量的视频数据。设计指标要求视频数据传输带宽为1.92Mbps,即可以同时以1.92Mbps 传输一路视频信号或者分别以0.48Mbps 带宽传输四路视频信号;另外附加1.92Mbps 的任务数据信道,即总共拥有的信道是3.84Mbps,任务数据通过 FPGA 复接到视频数据中通过数传通道一起传回地面的控制器。系
2、统实现:机载摄像机提供的模拟视频经解码芯片 SAA7115转换为数字视频,数字视频信号数据量非常大,按照 CCIR656图像标准,并以 4:2 :2(Y:Cb:Cr,即每个像素用两个 bytes 表示)编码类型为例,可得视频数据比特流为:7205762byte8bit25帧/S165.89 Mbps,显然此数据流无论是对存储还是对传输都是不实际的,因此必须对原始解码的数字视频进行压缩,以满足带宽有限的无线信道的传输,比如此系统中,就要求在0.48Mbps 的无线信道中进行传输。此系统中采用的视频压缩标准是 JPEG2000压缩标准,其采用的是把运动的视频序列作为连续的静止图像来处理的方式,并且
3、是独立压缩每一帧(即没有采用帧间相关性来压缩,而其他压缩标准都利用了帧间相关性的差异来提高编码效率) ,所以传输错误不会影响到其它帧,以使端到端的等待时间低,即使得实时性高。另外,JPEG2000采用的是离散小波变换(DWT) ,不同其他压缩标准(H.261,H.263,H.263+,H.263+,H.264,MPEG 系列等)的 DCT(离散余弦变换) ,也就是具有对信号进行多分辨率分析和反映信号局部特征的特点。通过多级小波分解,小波系数既能表示图像中的高频信息,也能表示图像中的低频信息。下一级分解得到的系数所表示图像在水平和垂直方向的分辨率只有上一级小波系数所表示的图像的一半。所以,通过对
4、系数图像的不同级数进行解码,就可以得到具有不同空间分辨率的图像。图一:DWT 提供的不同级别的空间分辨率,可以通过设置 ADV202的固件参数设定 此系统中采用的实现 JPEG2000编解码的芯片是 ADV202。但根据上面所述的数字视频的海量数据流的问题,肯定不能直接将 SAA7115得到的 ITU656标准数字视频接入 ADV 202进行压缩,即应该在数字视频进入 ADV202前对720*576的标准图像进行压缩处理,即进行像素抽取。因此设计压缩复接卡如下:即通过 FPGA 对像素进行处理,以使处理后的数据量大大下降。因此,此系统中的第一个关键技术就是像素抽取的问题,也是此次大研所在的重点
5、。最原始的想法是对720*576的标准图像惊醒隔行跳半像素跳帧处理,即使得数据量是原来的1/8,可得压缩率变为165.89Mbps/8/0.48Mbps=43.2,相对来说是一个可以接受的压缩率。关于此 FPGA 的像素抽取问题,我已经在先前的阶段性报告中做了个人分析,并选取了适合此系统的压缩方案,即并非是720*576 360*288的抽取方案,而是选择了延迟性更小的720*576 180*576的方案(具体的个人分析见阶段性报告关于如何抽取像素的问题分析 ) 。要了解此系统的运作过程,关键在于 ADV202的应用。图二:ADV202的内部结构图熵编解码器 EC(entropy codec)
6、用来对小波系数的编码块进行建模和编码,而小波系数则根据图一的不同分辨率的要求来自小波变换引擎(wavelet engine), 并将上述分辨率的所有情况下的小波系数写入到内部存储器中。存储器系统(memory system)即用来管理小波系数,并暂时存放编码块( code block)的特征数据(比如编码块的大小:32*32或者64*32等)以及给 JPEG2000码流提供临时的存储空间,还可用作嵌入式 RISC处理器的程序和数据存储器。嵌入式 RISC 处理器是一个嵌入在 ADV202中的32位处理器,用来配置、控制和管理其他的专用硬件模块,同时分解和产生 JPEG2000视频流。内部DMA
7、 引擎可提供存储器之间的高带宽传输,如上结构图所显示,internal DMA engine 和internal bus 同处在各硬件模块的互联处,因此可提供各模块和存储器之间的高性能传输(Direct Memory Access) 。另外,通过主机接口配置的 FIFO 模块可以用来给像素数据、编码流、特征数据或者其他辅助数据提供存储空间。关于接口,ADV202提供两种:视频接口和主机接口,可以同时使用 VDATA 总线和 HDATA 总线,也可以单独使用 HDATA总线。在此系统中,采用的是前者,即通过视频接口 VDATA 接入8位的视频输入,并采用HVF 同步信号,即输入的视频加上独立的
8、H、V、F 同步信号,YCbCr 数据交错地从同一总线 VDATA 输入,而配置时则采用16位的主机接口,以及数据传输时采用8位主机接口的JDATA 模式。因此通过 FPGA 与 ADV202的接口联系是:图三:FPGA 与 ADV202的接口关系(一路)其中 ADV202的工作时钟由 FPGA 提供,从 VDATA 总线输入8位交替的YCbCr( 4:2 :2 )数字视频信号。由于经 SAA7115编码的标准 ITU656图像在 FPGA 中进行了像素抽取的处理,因此 JDATA 接口输出的模式必须指定为用户指定模式(Custom Specific Mode) ,也就是要求每幅图像的最大像素
9、采样为1048576Msamples/image(180*576*2),每幅图像的最大编码块数为 610,可以由JPEG2000参数寄存器 cbsize 控制(在初始化时需要算出,资料来源于 datasheet) 。另外一个重要的部分就是在用户指定模式下必须要配置尺寸寄存器,即与输入视频数据帧数据结构大小相关的量(根据 ADV202的应用,在其他应用模式下,即标准的 ITU656视频720*576帧大小的输入时不需要软件配置 Dimensions Registers),在此首先要了解ITU656标准的数据帧的结构以及行场同步信号。图四:一帧图像的数据结构,即在传输时所呈现的码流其中,偶数场视频
10、数据由原始图像偶数行的像素采样(2samples/1pixel) ,奇数场视频数据由原始图像奇数行的像素采样,也就是偶数场视频数据加上奇数场视频数据构成总共的有效视频数据,也就是720*576像素。而其他部分则是一些控制信号,由于此系统中采用硬件 HVF 同步,而不是内部码流 SAV/EAV 同步,所以控制信号一律填充80h(8010h).每一行的数据表示如下所示:掌握每行传输图像的数据结构对 FPGA 编程很重要,而配置尺寸寄存器则要联系到HVF 同步信号,如下图显示:图五:the meaning of Dimension Registers used for configuration对
11、ADV202用户指定模式,其尺寸寄存器的初始化配置还应该参考 FPGA 的像素抽取形式,根据关于如何抽取像素的问题分析可得此工程采用的是720*576 180*576;则设置的有关尺寸寄存器的参数如下: XTOT=06c0h(1728);YTOT=0271h(625);F0_start=0001h(1);F1_start=0139h(313);V0_start=0018h(24);V1_start=0151h(337);V0_end=0138h(312);V1_end=0270h(624);Pixel_start=0531h(1369);Pixel_end=06c0h(1728);PMODE1
12、=0005h(Video Input:8位vdata 接口,输出顺序为 Cb/Y/Cr/Y);PMODE2=000fh(设置 vclk,vsysnc,hsysnc,field 的触发沿均是上升沿);VMODE=0086h(隔行扫描,encode,采用 HVF mode).图六:180*576帧的数据结构以及 HVF 同步信号由于 ADV202的工作流程包括配置模式和编解码模式,即在初始化配置时,需要通过外部控制程序正确初始化 ADV202的内部寄存器,包括 direct registers 和 indirect registers,然后把相应的 Firmware 以及固件参数导入芯片内部的 R
13、AM 空间,然后将控制权转交给 ADV202的 Firmware,即可进入编解码模式。图六:ADV202的初始化步骤根据上图可知,未知的初始化步骤即使固件编码参数的设定,其它的按照所给要求参照对应的直接寄存器或者寄存器的地址使用 Atmega128进行配置,具体各参数寄存器的意义来源于 ADV202s datasheet.初始化程序中固件参数(即是 JPEG2000 Parameters)的设定部分,即所设参数是:04000503,01000100,02000500,0041(4f)0002,00000000 ;04: Custom Specific Mode;00:8bit precisio
14、n;05:5levels of Wavelet Transform (16 level)03:Y,Cb,Cr 均采用单极性;01:cbsize (code_block dimension),64*32;00:有损不可逆9/7压缩(irreversible 9*7 using fixed table(lossy));01:STALLPAR(跳场设计,1场) ;00:不输出属性数据,直接从 JDATA 解码输出;02:Target Quality per video field/image;000500:Quality factor,质量很高(值越低,质量越高) ;00:LRCP (JPEG200
15、0 progression style);4f:PICFG(HVF mode+ syncs polarity);00:QFACT(量化参数, 256/256factor);02:COD_STYLE(输出 JP2格式的 code stream);其它的用00填充,具体意义也没必要弄得太懂,对照 datasheet;只要能填充完从00057f0000057fff 的256个地址空间即可Atmega128初始化模块:u 其中对 ADV202的初始化步骤是核心,具体见上述对 ADV202的阐述,接下来主要了解及完成对 SAA7115和 RS232的初始化。另外,由于 ADV202的主机接口配置模式工作
16、在16位,而 Atmega128的数据总线只是8位,故需要外接锁存器74HC573;读操作写操作即执行写操作时,8位数据直接从8位数据总线写入 ADV202,但要求在写之前先将直接寄存器的地址赋给 ADV202,通过 ADDR0:3设定;当执行读操作时,需根据高四位地址 ADDR15:13通过 FPGA 产生译码信号 LE 和 Chip Select 信号,以使 ADV202得高八位数据先存入锁存器中,然后按照时序读取。由上图可知,第一片74HC573始终工作。u Atmega128对 SAA7115的初始化时通过 I2C 总线进行的,即是两线串行接口TWI,具体两个接口是指 SDA(data)和 SCL(clock).TWBR:设定比特率分频因子,在主机模式(即 Atmega128)下产生 SCL Frequency.TWCR:控制寄存器,该初始化中使能 TWI 应答(ACK 应答信号) ,使能 TWI 模式;TWSR:状态寄存器,从中读取状态,判断传输错误与否;初始化中直接将 saa7115的参数以数组形式(地址参数)导入初始化程序参照下图模型:典型数据传输中应用程序与 TWI 接口int wait_time=32;while(wait_time-); /等待数据发送while(!(TWCR & (1=288时才开始或 FIFO 的输出或临时字节的复制输出。