• 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();

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

  • 相关阅读:
    spring 注解笔记
    spring boot 拦截器
    spring boot 启动流程及其原理
    Spring之BeanFactory和FactoryBean接口的区别
    微信支付
    三级联动
    搜索分页
    多选标签
    分类界面 大分类小分类
    触底下拉
  • 原文地址:https://www.cnblogs.com/SunkingYang/p/11049103.html
Copyright © 2020-2023  润新知