目录
-
首先剖析main函数
Main函数中主要包含了四个函数:
ParseInputString:顾名思义,解析输入参数
其实就是解析这些参数:
Pipeline.Init(&Params)中的init函数:初始化解码参数
Pipeline.PrintInfo()中的PrintInfo函数:打印输出信息
Pipeline.RunDecoding()中的RunDecoding函数:解码函数
-
剖析ParseInputString函数
这个函数没什么多说的,就是解析一些参数,重新赋值,并通过输出参数返回。
-
init函数
- 初始化读文件变量m_FileReader,其中针对不同格式的文件(H264、H265、JPEG等)做不同的初始化。
- 初始化参数:如宽、高、类型、帧率、输出类型、延迟时长等。
- m_FileReader->Init(pParams->strSrcFile);初始化读文件相关内容:如指定文件路径、初始化内存等。
- 初始化session
其中if---针对硬解码初始化;MFX_IMPL_HARDWARE_ANY是为了自动匹配合适的处理器,毕竟部分主机存在多处理器情况
else---针对软解码初始化。
注:上面的初始化并没有返回session句柄,只是初始化在底层中的一个句柄对象,如进入到InitEx下一层可能会看的更清晰:
- 接下来就是查询通过初始化后的sdk版本,处理器类型。
- 创建解码器、设置解码类型并申请数据预缓存:
- 判断是否支持插件,如果支持获取插件id,并加载插件
- InitMfxParams:解析视频头,并在成功后初始化解码参数
进入InitMfxParams可以看到:
解码视频头:
这里着重说下下面这个片段:
这个片段主要功能是判断如果视频头解析失败,而传入的流数据大小已经等于之前申请的最大内存,那么就需要重新申请内存(其实就是增加内存),并继续读取下一帧进行解码。
接下来说说ExtendMfxBitstream:
首先释放之前申请的内存,然后重新申请,并赋值。
9、紧接着就是对相关解码参数的赋值。如果使用了插件,那么也对相关插件赋值。
10、在成功解析视频头后,开始申请数据缓存,并初始化解码器:
CreateAllocator:
如果是渲染显示:则先创建显示窗口,并设置句柄供后面解码使用,然后申请渲染内存
初始化内存分配器
分配内存:
AllocBuffers(nSurfNum);
-
RunDecoding();解码函数
核心函数:SyncFrameSurfaces();
SyncOutputSurface(MSDK_DEC_WAIT_INTERVAL);
DecodeFrameAsync()
AddSurface();
由于时间关系,下一篇再剖析该函数。