imx6 vpu程序分析
背景
最近公司需要将产品与外界的设备进行流媒体通信,经过一系列的方案研究确立,最终把功能完成,目前能够顺利的播放基于h264的流媒体文件,趁着闲暇时间对相关的东西做一些笔记记录,方便以后追溯。
这里主要分析imx6 的vpu 测试程序,有一部分功能是基于这个来实现的。考虑到 imx6 的 vpu 固件代码不开源,相关的vpu 操作代码根据文档来执行,其接口函数看文档就行,本篇就不过多阐述,驱动也不加以分析。简单来说,就是vpu 的应用以及注意点。
版本
linux内核版本:3.10.17
vpu 测试程序版本:imx-test-3.10.17
程序功能说明
- 处理的任务:-D 解码 -E 编码 -L Loopback模式 -C 解析文件,从文件中获取参数的设置
- 如果有多个任务,会为每个任务开启一个线程来进行处理(解码任务、编码任务)
- 输入方式为:文件 和 网络(udp),文件:对应格式的文件(h264、MP4等)
输出方式为:文件 和 网络,文件:普通文件(存储)、网络文件(发送出去),IPU(imx6x不适用),video17(调用v4l2架构直接显示)
关键源码注释
main.c main() 函数
int
#ifdef _FSL_VTS_
vputest_main(int argc, char *argv[])
#else
main(int argc, char *argv[])
#endif
{
int err, nargc, i, ret = 0;
char *pargv[32] = {0}, *dbg_env;
pthread_t sigtid;
#ifdef COMMON_INIT
vpu_versioninfo ver;
#endif
int ret_thr;
#ifndef COMMON_INIT
srand((unsigned)time(0)); /* init seed of rand() */
#endif
dbg_env=getenv("VPU_TEST_DBG");
if (dbg_env)
vpu_test_dbg_level = atoi(dbg_env);
else
vpu_test_dbg_level = 0;
/* 解析主要的参数选项 : -D(vpu解码) -E(vpu编码) -L(Loopback模式) -C(从文件中获取参数)
* 重点1:当为-C时,会在该函数中解析出文件中的参数,除此之外的,只标记是哪种任务,后面通过
* parse_args 函数进行解析
* 重点2: 解析出来的参数放在结构体 input_arg 中:它是一个全局变量,为
* static struct input_argument input_arg[MAX_NUM_INSTANCE] 结构体数组类型*/
err = parse_main_args(argc, argv);
if (err) {
goto usage;
}
/* instance: 用来标记任务实例个数的,例如输入的参数中可能包含 -D -E,即解码、编码混合,那么就是两个
* instance, 这个关系到后面的开任务的个数,如果为一个instance的话,后面将只有一个线程来处理,
* 如果有多个的话,会按照任务个数来开启对应的线程进行处理 */
if (!instance) {
goto usage;
}
info_msg("VPU test program built on %s %s\n", __DATE__, __TIME__);
#ifndef _FSL_VTS_
sigemptyset(&sigset);
sigaddset(&sigset, SIGINT);
pthread_sigmask(SIG_BLOCK, &sigset, NULL);
pthread_create(&sigtid, NULL, (void *)&signal_thread, NULL);
#endif
#ifdef COMMON_INIT
err = vpu_Init(NULL