APP下载

基于ARM的无线视频传输系统的设计

2011-03-14徐驰

电子设计工程 2011年10期
关键词:接收端线程解码

徐驰

(南京工程学院江苏南京211167)

个人计算机设备及其外设的无线化一直是行业趋势,随着科技进步,无线鼠标、无线键盘、无线路由等无线设备纷纷问世。但是目前几乎所有在使用的投影仪都使用线缆和计算机连接,在商务、科研的会议或展示场合,这往往会带来不便。

视频传输数据量大、实时要求高,而完成无线视频传输,无线链路的数据吞吐量必须大于视频数据流量。近年来Wi-Fi标准不断演进,传输速度越来越高;另一方面,嵌入式处理器的处理能力越来越强,并且芯片厂商会在某些嵌入式处理器中集成DSP核心,使得嵌入式系统的视频解码能力有了一个大幅提高,完全能够完成高解析度的视频解码,这使得传送经过压缩的视频数据成为可能,从而间接地降低了视频数据流所占带宽的大小。这一切,使得无线视频传输成为可能。

1 系统硬件构成

1.1 系统整体框架

该系统由视频发送端和视频接收端组成,它们之间以Wi-Fi作为通信链路。如图1所示,视频发送端是需要进行幻灯片播放的普通计算机,视频接收端是采用ARM11处理器的嵌入式系统,它负责接收、解码视频信号,并通过VGA接口将视频信号传送至大屏幕显示设备上(如投影仪,大屏幕平板电视等)。

图1 系统示意图Fig.1Sketch map of system

1.2 视频接收端硬件构成

图像接收端采用以三星公司S3C6410芯片为主控的嵌入式系统。S3C6410芯片采用65 nm制程,最高主频可达667 Mhz。其内部采用了ARM11核心作为主控部分,并集成了存储器控制器、USB控制器、LCD控制器等多种外部设备控制、接口;与此同时,S3C6410还集成了多媒体加速内核(Multimedia Acceleration)[1]。S3C6410芯片如图2所示。

该芯片中集成的多媒体处理核心包括了JPEG编译码器,可以实现对JPEG格式图片的硬件解码,从而大大提高了系统对JPEG图片的处理能力。它最大支持编解码65 535×65 535分辨率的JPEG图片[2]。接收系统框图如图3所示。

视频接收端配备了Marvell 8636为主控的Wi-Fi模块,其支持802.11 b/g标准,通过SDIO接口与系统相连。

视频数据经解压后输出到数模转换模块上,最终转换为VGA信号送至投影仪。

图2 三星S3C6410芯片框图Fig.2Block diagram of S3C6410

图3 接收端系统框图Fig.3Block diagram of the receiver

2 系统软件设计

2.1 系统软件框架

视频发送端软件的主要功能:采集当前屏幕显示图像,压缩图像,传送经压缩的图像。除此以外发送端软件还需要完成与接收端连接的建立、断开功能。与之对应的,接收端软件的主要功能是:接收经过压缩的图像数据,进行图像解码,显示图像。发送端和接收端之间通过Wi-Fi链路传输数据。系统软件构架框图如图4所示。

图4 系统软件构架框图Fig.4Block diagram of the software stacks of the system

在会议场合,典型的演示方式是播放幻灯片,在这种应用场合下,图像在大部分时间下都是准静态的,所以在这种情况下视频的刷新速度可以保持在一个较低的数值上,这里我们设定为8帧每秒。此时,若计算机的屏幕分辨率是1 280×800,色深是24 bit,则视频流的速率是197 Mb/s。

而目前普遍采用的802.11 g Wi-Fi标准,其标称速度只有54 Mbps,并不能满足以上所需的数据带宽。所以需要对数据经行压缩。在1 280×800的分辨率下,压缩率需要在5:1以上,可以考虑选用JPEG标准。JPEG压缩品质比较如图5所示[5]。

JPEG是很灵活的编码标准,其Q值可以在100以内任意取值。但如果图片质量过高,不但增加了图像编码时CPU的负担,而且增加了数据传输量;而图片质量过低又会影响演示质量。需要在图像质量和数据流量之间找到一个平衡点。

图5 JPEG压缩品质比较[3]Fig.5Comparison of JPEG image quality

图5是图片在不同的JPEG编码质量下的效果比较,当Q取50时,进过压缩的图片在肉眼观察下任然拥有较高的画质。而此时,压缩率是15:1,大于前面分析中提出的5:1压缩率要求,在这种情况下数据速率为13 Mb/s,能够在802.11 g提供的带宽下进行传输。可见,Q=50时,图像质量和数据流量之间可以取得一个较好的平衡。

2.2 视频发送端软件设计

该系统的发送端软件基于windows设计。其实现的主要功能可以概括为:采集当前屏幕显示图像,压缩图像,传送经压缩的图像。发送端软件流程图如图6所示。

图6 发送端软件流程图Fig.6Flow chart of sender

在windows环境下捕捉当前屏幕的方法有:GDI,DirectX,以及Windows media API[4]。其中采用GDI时效率不高,不适合应用在该系统中,这里选用DirectX。

在DirectX中提供了g_pd3dDevice对象,这是一个IDirect3DDevice9对象,可以调用IDirect3DSurface9::LockRect()方法来获得一个指针,这个指针指向当前显示缓存的首地址,再使用合适的算法计算出当前显示缓存区的大小,就可以很方便地复制显示缓存的内容至指定内存区域,并采用JEPG标准压缩所采集到的数据。具体原理和过程如下:每一个DirectX程序都包含了后台缓存,与此同时,每个程序在默认状态下都可以访问前台缓存,前台缓存即存储了当前的Windows桌面内容。访问这个前台缓存就可以捕捉当前桌面所显示的画面。以下是捕捉屏幕的关键代码。

在以下的代码片中,g_pd3dDevice是一个IDirect3DDevice9对象,这里假设它已经被初始化过了。这段代码捕获了所需的桌面图像,其后需要对所捕捉到的位图进行处理。此时可以调用IDirect3DSurface9::LockRect()方法,来获得一个指向所所捕获到的位图首字节的指针,然后根据屏幕的尺寸来确定位图的大小,最终将所需的位图数据复制到事先定义好的缓存中。

extern void*pBits;

extern IDirect3DDevice9*g_pd3dDevice;

IDirect3DSurface9*pSurface;

g_pd3dDevice->CreateOffscreenPlainSurface(ScreenWidth,ScreenHeight,

D3DFMT_A8R8G8B8,D3DPOOL_SCRATCH,

&pSurface,NULL);

g_pd3dDevice->GetFrontBufferData(0,pSurface);

D3DLOCKED_RECT lockedRect;

pSurface->LockRect(&lockedRect,NULL,

D3DLOCK_NO_DIRTY_UPDATE|

D3DLOCK_NOSYSLOCK|D3DLOCK_

READONLY)));

for(int i=0;i<ScreenHeight;i++)

{

memcpy((BYTE*)pBits+i*ScreenWidth*BITSPERPIXEL/8,

(BYTE*)lockedRect.pBits+i*lockedRect.Pitch,

ScreenWidth*BITSPERPIXEL/8);

}

g_pSurface->UnlockRect();

pSurface->Release();

需要注意的是,以上代码中所捕捉到的位图,它的宽度不一定就是屏幕的实际宽度,这是由于在存储位图时采用了内存对齐的方法,在位图中内存被按字(word)对齐,所以在每行的结尾处可能需要添加额外的字节来完成内存对其,从而使位图宽度大于实际屏幕宽度。此时可以使用lockedRect.Pitch来获得每行的实际宽度。

捕捉图像和压缩图像时采用双缓冲模式:在0时隙内,捕捉线程将数据写入Buffer A中,压缩线程Buffer B中的图像,Buffer B中存储了在上个时隙中采集完毕的图像数据;在1时隙,捕捉线程将数据写入Buffer B,压缩线程处理Buffer A中的图像。

图像捕捉线程和图像压缩线程构成了一个典型的“生产者-消费者”系统,在采用双缓冲的基础上再增加信号机制,可以很好地解决系统中同步与互斥问题。双缓冲示意图如图7所示。

图7 双缓冲示意图Fig.7Schematic diagram of double buffer

发送部分调用windows中所提供的相关Winsock(套接字)函数来完成网络传输功能,这里选用UDP协议,并采用丢包、错包不重传机制。(接收端的图像每1/8秒刷新一次,丢弃部分图像数据并不会明显降低用户的使用体验。)

考虑到在该系统所应用的实际场合中,往往会遇到演示画面在较长一段时间内(数秒至数分钟)并不发生任何变换的情况,可以在图像发送端软件中加入前一帧数据与当前帧比较的功能,若数据未发生改变,则不压缩也不传送图像数据,而只是传送给接收端一个特殊的保持信号,这样可以大大降低处理器负荷以及无线网络的传输负荷,使得无线网络还有余力完成其他用户的其他任务。

2.3 视频接收端软件设计

图像接收端采用嵌入式Linux操作系统。Linux具有内核可剪裁、开放源代码、开发周期短等优点,并且支持完整的TCP/IP协议栈[5]。

接收端软件主要功能为:接收经压缩的图像数据,控制处理器中多媒体处理核心解码JPEG图像,显示图像。这里也可以采用相似的双缓冲方法,在接收和解压线程之间设立双缓冲,各自拥有一个轮回跳动的指针来交替对两片缓冲区经行操作。

图像解压模块负责将接收到的JPEG图像还原为位图。它将利用S3C6410芯片内部的硬件解码来加速系统的执行效率。解压后的数据将被直接写入显示缓存中。

6410的JPEG解码过程如下:初始化用CreateFile打开"JPG1:"解码驱动,每次解码首先要获取Stream Buffer(IOCTL_JPG_GET_STRBUF),将JPEG数据拷贝到Stream Buffer,接着调用解码(IOCTL_JPG_DECODE),最后通过获取Frame Buffer(IOCTL_JPG_GET_FRMBUF)得到解码后数据。

在系统运行过程中若出现数据量超出处理能力的情况,则采用直接丢弃的处理方法。接收端软件流程图如图8所示。

图8 接收端软件流程图Fig.8Flow chart of receiver

3 结束语

本系统基于三星公司的S3C6410处理器以及Wi-Fi技术,能够完成8帧/秒的无线视频传输,并提供了较好的图像质量(JPEG品质因数50)。图像接收端能够完成对JPEG图片的实时解码。适合应用在低帧速视频传输场合,如幻灯片播放,计算机操作演示、教学等。该系统中的视频接收端的硬件成本可以控制在600元以内。其在图像帧速、图像质量、对发送端处理能力要求、接收端系统成本等因素之间,找到了一个较好的平衡点。

[1]Samsung.S3C6410Datasheet[EB/OL].[2011-01-20].http://www.findthatfile.com/search-5715165-hPDF/downloaddocuments-s3c6410datasheet-0408-pdf.htm.

[2]Samsung.S3C6410 Product Technical Brief[EB/OL].[2011-01-19].http://www.samsung.com/global/system/business/semiconductor/prod uc t/2008/4/2 3/3 70911ptb_s3c6410_rev20.pdf.

[3]JPEG.wiki[EB/OL].[2011-01-20].http://en.wikipedia.org/wiki/JPEG.

[4]Gopalakrishna P.Various methods for capturing the screen[EB/OL].[2011-01-20].http://www.codeproject.com/KB/dialog/screencap.aspx.

[5]Hallinan C.嵌入式LINUX开发(英文版)[M].北京:人民邮电出版社,2008.

[6]Tanenbaum A S.Computer networks[M].北京:清华大学出版社,2008.

猜你喜欢

接收端线程解码
《解码万吨站》
基于扰动观察法的光通信接收端优化策略
基于C#线程实验探究
顶管接收端脱壳及混凝土浇筑关键技术
基于多接收线圈的无线电能传输系统优化研究
基于国产化环境的线程池模型研究与实现
解码eUCP2.0
酸槽内钢带位置测量传感器
NAD C368解码/放大器一体机
Quad(国都)Vena解码/放大器一体机