zoukankan      html  css  js  c++  java
  • 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();

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

  • 相关阅读:
    如何在iTerm2中配置oh my zsh?
    sublime中格式化jsx文件
    ES6 new syntax of Literal
    ES6 new syntax of Rest and Spread Operators
    How to preview html file in our browser at sublime text?
    ES6 new syntax of Default Function Parameters
    ES6 new syntax of Arrow Function
    七牛云2018春招笔试题
    Spring-使用注解开发(十二)
    Spring-声明式事物(十一)
  • 原文地址:https://www.cnblogs.com/SunkingYang/p/11049103.html
Copyright © 2011-2022 走看看