Intel Media SDK decode_sample剖析(一)——初始化及解码数据头

目录

 

首先剖析main函数

剖析ParseInputString函数

init函数

RunDecoding();解码函数


  • 首先剖析main函数

Main函数中主要包含了四个函数:

ParseInputString:顾名思义,解析输入参数

其实就是解析这些参数:

Pipeline.Init(&Params)中的init函数:初始化解码参数

Pipeline.PrintInfo()中的PrintInfo函数:打印输出信息

Pipeline.RunDecoding()中的RunDecoding函数:解码函数

  • 剖析ParseInputString函数

这个函数没什么多说的,就是解析一些参数,重新赋值,并通过输出参数返回。

  • init函数

  1. 初始化读文件变量m_FileReader,其中针对不同格式的文件(H264、H265、JPEG等)做不同的初始化。

  1. 初始化参数:如宽、高、类型、帧率、输出类型、延迟时长等。

  1. m_FileReader->Init(pParams->strSrcFile);初始化读文件相关内容:如指定文件路径、初始化内存等。
  2. 初始化session

其中if---针对硬解码初始化;MFX_IMPL_HARDWARE_ANY是为了自动匹配合适的处理器,毕竟部分主机存在多处理器情况

else---针对软解码初始化。

注:上面的初始化并没有返回session句柄,只是初始化在底层中的一个句柄对象,如进入到InitEx下一层可能会看的更清晰:

  1. 接下来就是查询通过初始化后的sdk版本,处理器类型。

  1. 创建解码器、设置解码类型并申请数据预缓存:

  1. 判断是否支持插件,如果支持获取插件id,并加载插件

  1. InitMfxParams:解析视频头,并在成功后初始化解码参数

进入InitMfxParams可以看到:

解码视频头:

这里着重说下下面这个片段:

这个片段主要功能是判断如果视频头解析失败,而传入的流数据大小已经等于之前申请的最大内存,那么就需要重新申请内存(其实就是增加内存),并继续读取下一帧进行解码。

接下来说说ExtendMfxBitstream:

首先释放之前申请的内存,然后重新申请,并赋值。

9、紧接着就是对相关解码参数的赋值。如果使用了插件,那么也对相关插件赋值。

10、在成功解析视频头后,开始申请数据缓存,并初始化解码器:

CreateAllocator:

如果是渲染显示:则先创建显示窗口,并设置句柄供后面解码使用,然后申请渲染内存

初始化内存分配器

分配内存:

AllocBuffers(nSurfNum);

  • RunDecoding();解码函数

核心函数:SyncFrameSurfaces();

SyncOutputSurface(MSDK_DEC_WAIT_INTERVAL);

DecodeFrameAsync()

AddSurface();

由于时间关系,下一篇再剖析该函数。

posted @ 2019-02-14 11:33  SunkingYang  阅读(911)  评论(0编辑  收藏  举报