zoukankan      html  css  js  c++  java
  • 【分享】vcu-ctrl-sw里decoder的退出机制

    有工程师询问vcu-ctrl-sw里decoder的退出机制。 下面的内容,根据vcu-ctrl-sw 2020.2分析。

    Decoder运行的主要代码是AsyncFileInput里的run(),以线程运行。run()里调用BasicLoader里的ReadStream(),不断读取文件()。如果读到文件结束,也就是uAvailSize为0,就调用AL_Decoder_Flush(hDec),停止解码。去掉辅助代码、错误处理代码后,AsyncFileInput里的run()主要代码如下:

    void run()
    {
      while(!exit)
      {  
        pBufStream = shared_ptr<AL_TBuffer>( bufPool.GetBuffer(), &AL_Buffer_Unref);
    
        auto uAvailSize = m_Loader->ReadStream(ifFileStream, pBufStream.get());
    
        if(!uAvailSize)
        {
          // end of input
          AL_Decoder_Flush(hDec);
          break;
        }
    
        auto bRet = AL_Decoder_PushBuffer(hDec, pBufStream.get(), uAvailSize);
      }
    }
    

    SafeChannelMain()里定义了AsyncFileInput的对象,引起AsyncFileInput的run()运行。 当解码完成后,SafeChannelMain()退出,触发scopeDecoder的析构函数运行,调用之前定义的Lambda函数,从而调用AL_Decoder_Destroy(hDec)。

    void SafeChannelMain(WorkerConfig& w)
    {
    … … … 
      auto decoderAlreadyDestroyed = false;
      auto scopeDecoder = scopeExit([&]() {
        if(!decoderAlreadyDestroyed)
          AL_Decoder_Destroy(hDec);
      });
    … … … 
    
    }
    

    建议参考SafeChannelMain()实现Decoder的管理,比如实现多个decoder的创建和退出。

  • 相关阅读:
    测试类型
    测试方法
    测试评估
    测试过程
    测试用例设计方法之等价类划分法
    笔记 asp.net (写给自己的。。。)
    笔记 php (写给自己的。。。)
    Session_Start和Session_End
    笔记 javascript 写给自己的(未完。。。)
    BUTTON标签和INPUT标签的区别
  • 原文地址:https://www.cnblogs.com/hankfu/p/15074418.html
Copyright © 2011-2022 走看看