vcu-ctrl-sw里decoder的退出机制

今日头条

1142人已加入

描述

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

审核编辑 黄昊宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分