首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【分享】vcu-ctrl-sw里decoder的退出机制

【分享】vcu-ctrl-sw里decoder的退出机制

作者头像
hankfu
发布2021-08-06 10:12:44
3990
发布2021-08-06 10:12:44
举报
文章被收录于专栏:hankhank

有工程师询问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的创建和退出。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档