当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]基于MPEG-4视频标准数字视频录像机的设计及实现

随着视频压缩技术的迅猛发展,新的视频压缩标准不断推出。MPEG-4是由国际运动图像专家组(MPEG)在继MPEG-1和MPEG-2之后,制订的又一个ISO/IEC标准,即ISO/IEC 14496。它能够获得更高的音/视频压缩率,具有基于内容的交互能力。目前,国内外许多公司都在开发有关MPEG-4视频标准的产品,最具代表意义的即是数字视频录像机(DVR)。

1 数字视频录像机的硬件设计

在基于S3C2410与AT2042的数字视频录像机的设计和实现中,其终端设备以Samsung公司的32位处理器S3C2410为主控处理器,利用Pentamicro公司的AT2042芯片完成双通道视频编码与解码,其视频录像功能具有高分辨率和高质量。本文将介绍此终端的系统整体设计,并详细分析系统软硬件设计,最后给出测试结果和结论。根据市场的需求,本系统预计实现下列几项指标:

(1)实现对视频数据的MPEG-4标准的编解码;

(2)编解码像素为720X576像素点,实现25 f/s;

(3)实现JPEG编码和解码;

(4)实现USB/SD卡储存。

1.1 基于S3C2410与AT2042的数字视频录像机整体设计

该系统主要依靠AT2042的编解码功能,系统的硬件框图如图1所示,它主要由视频编码子系统、主控系统、数据处理子系统和视频解码子系统4大部分构成。

韩国Pentamicro公司生产的AT2042芯片的功能模块如图2所示,AT2042是一个内置微控制器ARM946E的2通道音视频编解码(A/VCODEC)芯片,主要完成对视频和语音数据的编码和解码,支持多种音视频编解码标准,可直接与IBM,Motorola,ARM,XscaIe和Axis等多种CPU接口,无需其他附加电路。

1.2 视频编解码电路设计

视频编解码电路主要包括视频编解码电路和视频压缩/解压芯片AT2042。其中,AT2042主要负责对数字视频数据进行硬件压缩和解压缩,而视频编解码电路则是基带模拟视频信号和AT2042之间的一个接口电路,它包括一个视频编码芯片和一个视频解码芯片,主要负责视频数据的模/数和数/模转换,以及数字视频信号格式的转换。在压缩编码过程中,输入的NTSC/PAL/SECAM视频信号先经过视频解码芯片进行前端处理,产生符合AT2042视频接口标准的8 b ITU-R BT.656数字视频信号。在外部主CPU的控制下,该数字视频数据由压缩/解压芯片AT2042进行硬件压缩编码,产生的编码数据流通过芯片内部集成的Mux FIFO接口输出。网络视频服务器的解压缩编码是压缩编码的逆过程,需要解压的数据流通过AT2042内部集成的Demux FIFO接口输入。视频采集接口框图如图3所示:[!--empirenews.page--]

摄像头采集输出信号为NTSC,PAL或SECAM制式的电视信号,必须经过视频解码处理才能转化成适合AT2042进行编码的数字信号。TVP5150是TI公司生产的一款电视信号解码专用芯片,它对输入的模拟信号进行A/D转化,通过设置相应的寄存器可以使输出信号满足RGB格式或YUV422格式。由于在本系统中AT2042视频接口满足ITU.RBT656标准,故TVP5150输出配置为8位YUV422格式。如图4所示。

现在的数字电视视频接口还没有实现统一的工业标准,故在视频输出端设计时,仍使用现在比较流行的A/V接口或S-video接口。由于上述2种接口传输的为模拟电视信号,故在AT2042的视频输出端口需要增加一级处理,即将数字信号转化为模拟电视信号。在后端设计中选用SAA7121,它是一款专用的电视信号编码芯片,可以将输入的数字信号经过内部的D/A转化为适于传输的模拟电视信号,通过配置相应的寄存器可以输出满足S-video接口或复用接口的信号。

1.3 AT2042的主机接口

主控CPU(S3C2410)和AT2042是数字视频录像机的核心处理芯片,S3C2410控制整个数字视频录像机系统的运行,AT2042除完成对视频信号的硬件压缩编码外,还可对压缩后的视频数据进行硬件解压缩。AT2042压缩编码后的视频数据通过芯片内部集成的Mux FIFO接口输出后,外部主CPU负责对其进行USB存储器处理,处理后的视频数据可以存储在物理介质上,以便在需要时通过键盘操作进行回放。

图5为S3C2410与AT2042接口框图。

AT2042的CPU_SEL[2:0]是主控CPU选择引脚,经配置这几个引脚的高低电平,使AT2042可选择主控CPU,CPU_SEL[2:0]为010选择ARM结构芯片;

nCS,nWAIT等为总线控制信号线;

HCLK是AT2042主机接口的工作时钟,一般要求工作在50 MHz,当S3C2410在复位后设置FCLK为200MHz,HCLK为100 MHz,PCLK为50 MHz。故将S3C2410的PCLK引脚与AT2042的HCLK引脚相连。

通过这种机制,S3C2410可以实现简单的访问AT2042。

AT2042与CPU的通信机制如图6所示,CPU对AT2042的控制和访问主要通过AT2042的2个寄存器(status register和command register)和4个FIFO(Tx FIFO,Rx FIFO,Multiplex FIFO和De-Multiplex FIFO)完成。

[!--empirenews.page--]

2 数字视频录像机的软件实现

数字视频录像机系统的软件设计包括:Bootload代码的编写、Linux操作系统的内核生成和Linux下驱动程序和应用程序的开发、文件系统的生成和配置以及用户应用程序4大块。

数字视频录像机软件开发的整体架构如图7所示。

2.1 系统启动Bootloader程序设计编写

Bootloader是系统启动时执行的第一个程序,其主要完成对硬件系统的初始化。具体包括:S3C2410的初始化、TVP5150功能配置、SAA7121功能配置、加载AT2042固件、以太网及串口初始化。由于在开机时要显示开机画面,故除在Bootloader中初始化相应硬件资源外,还应将开机画面的图片数据,传送到AT2042SDRAM中。Bootloader整体流程图如图8所示。

显示开机画面,其主要通过AT2042的JPEG解码功能来实现。首先配置AT2042的JPEG解码功能,将要显示图像先以头文件的形式添加到程序中,当需要显示时再将图像数据发送给AT2042。

2.2 Linux系统的配置及设备驱动程序的编写

本系统使用的是Linux2.4.18内核,在内核配置中需增加以下几个内容:由于本系统中要实现对视频编码数据的存储,故要添加内核配置中USB support选项中的USB Mass storage support;在调试时需要通过以太网来烧些程序,故内核配置时需添加LAN91C111网卡驱动,方法为在NetWork device support选项下选择SMC91111 support,同时内核要支持各种文件系统,需在File system选项下进行相应配置。

系设备驱动程序主要完成以下的功能:

AT2042设备驱动子模块系统调用是操作系统内核和上层应用程序之间的接口,AT2042设备驱动子模块是操作系统内核和AT2042硬件设备之间的接口。操作系统内核向AT2042设备驱动子模块提供内核API和其他的内核支持。AT2042设备驱动子模块为上层应用程序屏蔽了AT2042硬件的细节,这样在应用程序看来,AT2042硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对AT2042硬件设备进行操作。AT2042设备驱动子模块作为系统内核的一部分,主要完成对AT2042的初始化、编解码数据的读写、以及编解码功能参数的设置。包含的功能函数主要有模块入口函数、设备操作函数集合和中断服务程序等。

2.3 数字视频录像机应用软件的设计与实现

(1)界面显示与菜单功能的设计与实现。界面和菜单的显示是通过AT2042的OSD(on Screen Display)功能来实现的,AT2042共有3个显示层面,分别为底层是背景层、中间是回放层,顶层是OSD层。

OSD层支持16色的调色板。由于AT2042自身没有相应的ROM存储OSD所要显示的图片及文字数据,故在利用OSD功能来显示图片或文字时,首先要将需显示的图片或文字数据加载到AT2042的SDRAM中,然后调用显示功能将图片或文字显示在OSD层上。

这个功能的实现过程中主要调用以下2个函数:

void at2042_load_font(uns8 * font_data,uns32font_data_size)该函数的主要功能是把要显示的数据加载到AT2042的SDRAM中,同时设置显示位置,即垂直、水平像素点的位置。

void osd_on_off(uns8 temp)该函数的功能是打开或关闭OSD模式。

(2)MPEG-4视频编码实现。该功能主要利用AT2042来实现。首先,配置相应的编码寄存器,例如编码模式、编码像素点、编码帧率及设置编码流格式(PES,PS,TS)等。本系统中采用MPEG-4模式、720X576、每秒25帧及生成PES流来对视频数据进行编码。

AT2042视频编码的流程如图9所示。

实现这一功能主要通过对以下几个函数的调用:

void set_encoder_parameter(uns16 hsize,uns16vsize,uns8 rate,uns8 mode)该函数用来设置编码参数;

void video_encoder_start(uns8 mode)该函数用来启动AT2042的编码功能;

void video_encoder_stop(uns8 mode)该函数用来关闭AT2042的编码功能;

void encoding_stream_read(uns8 * data,uns32 data_size)该函数实现将编码数据从MuxFIFO中读出。

(3)解码功能实现。实现的具体流程如图10所示。[!--empirenews.page--]

实现这些功能主要通过对以下几个函数的调用:

void set_decoder_parameter(uns16 hsize,uns16 vsize,uns8 rate,uns8 mode)该函数用来设置解码参数;

void video_decoder_start(uns8 mode)该函数用来启动AT2042的解码功能;

void video_decoder_stop(uns8 mode)该函数用来关闭AT2042的解码功能;

void get_file_length(const char * file_name)该函数用来获取文件的长度;

void video_replay(const char * file_name,uns8mode)该函主要实现对视频文件的播放控制,mode控制播放模式(暂停、快进、快退)。

3 测试结果

实验结果进行测试,可以采用2套方案来完成。

(1)使用自行设计的硬件平台,在该平台上完成对视频编解码的测试。图11为在本系统平台上对编码数据的解码播放截图。 

(2)将编码后的视频文件拷贝到PC机上,应用Media Player、暴风音影和风雷音影等视频播放软件对编码结果进行测试,同时可以对比解码播放的效果。因为本系统中视频文件是以PES流形式保存到储存介质。PES满足ISO13818标准,所以PC平台上的普通视频播放器都能播放该文件。图12是用风雷音影播放器对编码结果进行解码播放的截图。

由图可以看出,解码出的视频文件是720X576像素点,解码播放的速率为25.59 f/s。画面没有出现失真现象,没有明显的块效应。由表1中的数据可得,在使用AT2042对静止图像编码时,可实现接近100:1的压缩比,在对动态画面进行编码时,可以实现40:1的压缩比。

4 结 语

本文详细介绍基于专用视频编解码芯片AT2042的数字视频录像机系统的硬件设计和软件开发流程。该系统已实现对视频数据的编码和解码,同时实现了MPEG-4/MPEG-2/MPEG-1 H.263视频标准,并已作为成型产品推向市场。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

星标/置顶 公众号,硬核文章第一时间送达!链接| https://zhuanlan.zhihu.com/p/274473971题很多,先上题后上答案,便于大家思考问题点:1、C和C的特点与区别?2、C的多态3、虚函数实现...

关键字: 腾讯 函数 进程 AI

程序接口是操作系统为用户提供的两类接口之一,编程人员在程序中通过程序接口来请求操作系统提供服务。面向过程语言最基本的单元是过程和函数。

关键字: 程序接口 过程 函数

星标「嵌入式大杂烩」,一起进步!链接:https://www.cnblogs.com/jozochen/p/8541714.html一、问题复现稳定复现问题才能正确的对问题进行定位、解决以及验证。一般来说,越容易复现的问...

关键字: 嵌入式开发 函数 代码 寄存器

基本上,没有人会将大段的C语言代码全部塞入main()函数。更好的做法是按照复用率高、耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数。C语言代码的组合千变万化,因此函数的功能可能会比较复杂,不同的输入,常...

关键字: 函数 PEN C语言代码 C语言程序

Part1一、让自己习惯C条款01:视C为一个语言联邦C并不是一个带有一组守则的一体语言:他是从四个次语言(C、Object-OrientedC、Template、STL) 组成的联邦政府,每个次语言都有自己的规约。记住...

关键字: TI 函数 ASPECT 编译器

为什么会写篇栈变化的文章?做系统分析的话你肯定遇到过一些crash,oops等棘手问题,一般大家都会用gdb,objdump或者addr2line等工具分析pc位置来定位出错的地方。但是这些分析工具背后的本质原理就不见得...

关键字: 函数 ARM C语言 AI

前言:一转眼从事前端已经6年了,从当时的小白到如今大厂的技术专家,中间也走过不少弯路,从今天开始我会持续更新前端技术文章,并且整体的文章会进行体系梳理,整个知识体系分为:基础精讲,框架讲解,框架及工具原理,前端面试题精讲...

关键字: 函数 GE FUNCTION APP

关于C的lambda是函数还是对象,这其实不是一个一概而论的问题。先说结论:对于有捕获的lambda,其等价于对象。对于没有任何捕获的lambda,其等价于函数!首先,很多C程序员从lambda用法上反推容易发现是对象,...

关键字: 函数

1.说明在工作过程中,我发现在实际使用RTOS完成项目时,理解这些知识仅能达到会用RTOS的水平,要想用好RTOS,还需要了解一些比较细节的机制,否则容易掉坑进去,花大量时间定位问题。本文结合TencentOS-Tiny...

关键字: RTOS 函数

关注、星标公众号,直达精彩内容来源:明日科技当我们讨论指针时,通常假设它是一种可以用 void* 指针来表示的东西,在x86_64平台下是8个字节大小。例如,下面是来自 维基百科中关于x86_64的文章 的摘录:Push...

关键字: 函数

嵌入式软件

15715 篇文章

关注

发布文章

编辑精选

技术子站

关闭