海思HI35xx平台软件开发快速入门之MPEG解码实例

前言

  海思平台开发MPEG视频解码需要有HIMPP解码库API相关的知识,如果不具备基础的背景知识,请移步我的博文《海思HI35xx平台软件开发快速入门之背景知识》了解海思平台开发的基本步骤和相关知识基础。遵循海思平台软件开发架构,我们一步一步实现一个MPEG视频解码实例。先科普一下什么是MPEG视频,MPEG(Moving Picture Experts Group,动态图像专家组)是ISO成立针对运动图像和语音压缩制定国际标准的组织,MPEG标准主要有以下五个,MPEG-1、MPEG-2、MPEG-4、MPEG-7及MPEG-21等。目前应用较多的是MPEG-4,我们熟悉的DVD就普遍使用了MPEG-4解码标准,反过来说DVD的普及使用也促成了MPEG-4解码标准的知名度。目前MPEG4在数字电视、实时多媒体监控、低比特率下的移动多媒体通信、网络视频流与可视游戏、网络会议、交互多媒体应用、演播电视等领域应用广泛,更多相关MPEG的知识请参阅其官网。对于音视频开发者来说,有必要学习了解一下,如何在海思平台上实现MPEG解码。

 

知识背景

 

  海思平台音视频编解码架构遵循下图所示的数据处理流程,我们的MPEG解码实例要实现播放MPEG样例视频,故走的是HARD DISK->VDEC->VPSS->VO->显示器的流程,这个流程一定要熟悉牢记,代码实现都是围绕这条主线来编写的。

 

 

实例源码

  实例源码很简单,先来了解一下实现MPEG解码实例的几个函数,以达到了解实例源码大概构造组成,然后再对每个函数进行具体分析。

/*
**函数描述:linux标准信号捕捉函数
**函数功用:退出HIMPP调用,销毁缓冲
*/
HI_VOID SAMPLE_VDEC_HandleSig(HI_S32 signo)
{
	......
}
/*
**函数描述:用于音视频文件读写推流
**函数功用:用fread等文件操作函数读取音视频文件,并解析后推送HIMPP进行解码
*/
int SAMPLE_COMM_VDEC_JPEG_SendStream( VdecThreadParam *pArgs)
{
	......
}
/*
**函数描述:HIMPP系统初始化
**函数功用:配置HIMPP系统的各项参数以满足对目标进行编解码
*/
HI_S32 SAMPLE_VDEC_VdhMpeg4(char *filename)
{
	......
}
 
/*
**主函数
*/
int main(int argc, char *argv[])
{
	......
}

   main函数讲解,main函数的完成的功能主要有两,一是对信号的初始化,信号的捕捉函数用来接收来之linux的内核消息,如进程退出等;二是将main函数的参数传递给MPEG解码样例函数。以下是main函数的详细内容:

int main(int argc, char *argv[])
{ 
	if(argc != 2)
	{
		printf("Usage: mpeg <vedio source filename>\n");
		exit(0);
	}
    signal(SIGINT, SAMPLE_VDEC_HandleSig);
    signal(SIGTERM, SAMPLE_VDEC_HandleSig);
    SAMPLE_VDEC_VdhMpeg4(argv[1]);
    return 0;
}

   下面重点讲解SAMPLE_VDEC_VdhMpeg4(char *filename)这个函数,它是MPEG解码样例的重点函数。HIMPP系统的API函数是海思提供的SDK开发包,调用它相关的接口,在编译时必须将其提供的相应库文件进行包含编译。下面结合样例程序讲述如何使用HIMPP提供的API实现自己的业务逻辑。MPEG视频解码实例走的是HARDDISK->VDEC->VPSS->VO->显示器流程,这个过程可以细分为八大步骤,这八大步骤在其他类型的音视频编解码样例也类似,可以说这八大步骤是使用海思HIMPP API的灵魂。下面简单介绍这个八大步骤的内容:

Step1:初始化HIMPP SYS和通用VB缓冲,包括设置缓冲区的大小,缓冲区块的数目。需要注意的是,在设置通用VB参数之前,必须确保HIMPP系统已经退出,否则设置失败。

Step2:设置通用缓冲区的公共缓冲池属性。

Step3:配置解码器,包括指定解码类型,这里是MPEG解码样例,当然选PT_MP4VIDEO啦,然后指定视频大小、解码优先级等等。然后创建解码通道,并是能加收解码流。

Step4:配置VPSS参数,VPSS是对VDEC解码后的流进行处理,如裁剪、降噪等,MPEG解码实例从简单应用出发,仅仅按默认的方式配置VPSS。

Step5:配置VO参数,这一步也很关键,因为它指定了画面输出,包括常见的HDMI和VGA,主要是配置输出显示,图层属性设置、输出位置等信息。

Step6:绑定VDEC与VPSS,实现MPEG解码流程。

Step7:绑定VPSS与VO,实现MPEG解码流程。

Step8:推送视频流数据,这一步需要文件读写配合使用。

  完整源码,请参阅SAMPLE_VDEC_VdhMpeg4(char*filename)源码,为了演示各个步骤需要配置的参数信息,不少变量需要时才定义,同时整个函数避免了使用不必要的子函数调用,尽量使用简单顺序结构的程序设计,以达到对这八大步骤一目了然。  SAMPLE_COMM_VDEC_JPEG_SendStream(VdecThreadParam *pArgs)函数实现的功能是读取文件,解析文件的视频帧头(I帧),然后推送至解码器。这一函数实现的功能简单,但是涉及解析视频帧头等内容,代码量有点多,不适合粘贴出来。SAMPLE_VDEC_HandleSig(HI_S32 signo)函数主要作用就是退出程序时,对HIMPP系统资源进行释放,否则显示器上会残留视频图像,并影响下一次使用HIMPP提供的API。

HI_VOID SAMPLE_VDEC_HandleSig(HI_S32 signo)
{
	 HI_S32 i;
    if (SIGINT == signo || SIGTSTP == signo || SIGTERM == signo)
    {
		HI_MPI_SYS_Exit();
		for(i=0;i<VB_MAX_USER;i++)
		{
			HI_MPI_VB_ExitModCommPool(i);
		}
		for(i=0; i<VB_MAX_POOLS; i++)
		{
			HI_MPI_VB_DestroyPool(i);
		}	
		HI_MPI_VB_Exit();
        printf("\033[0;31mprogram exit abnormally!\033[0;39m\n");
    }
    exit(0);
}

总结

  MPEG解码实例参考了海思提供的样例及库,程序源码及相关库文件请点击这里,修改不同的编译链工具,即可在不同HI35XX系列平台运行,整个MPEG解码实例提供了最简单的解码实现方式,当然还可以实现快进播放、暂停播放、等常用的视频播放控制逻辑,这需要读者进一步摸索。

 

转载来源 https://blog.csdn.net/dosthing/article/details/80488131

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值