应用背景:
共8路视频监控,每次播放4路,播放10s, 然后切换另外4路监控,如此循环, 程序中使用4个线程进行解码,在开始时,程序正常,执行一段时间后(可能半小时, 也可能一小时),av_codec_open2执行失败, 返回错误码-22,且导致崩溃,弹出系统的, 后经查资料, 发现av_codec_open2非线程安全, 于是给av_codec_open2添加临界区:
[C++] 纯文本查看 复制代码
CCriticalSection csH264;//全局
AVCodecContext *m_pCodecCtx;
int decode(....) //解码函数
{
if (m_pCodecCtx == NULL)
{
AVCodec *pCodec = avcodec_find_decoder(CODEC_ID_H264);
if (!pCodec)
return 0;
m_pCodecCtx = avcodec_alloc_context3(pCodec);
if(!m_pCodecCtx)
return 0;
csH264.Lock();//对open2加锁保护
if (avcodec_open2(m_pCodecCtx, pCodec, NULL) < 0)
{
reset();
csH264.Unlock();
return 0;
}
csH264.Unlock();
......//avcodec_alloc_frame
}
但是添加完锁之后发现, 依然会有失败导致的崩溃问题, 只不过时间久了点,后来又在上面代码的reset()函数中加了锁,reset函数主要是释放资源用
[C++] 纯文本查看 复制代码 int CodecH264::reset()
{
csH264.Lock();
if(m_pCodecCtx)
{
avcodec_close(m_pCodecCtx);
av_free(m_pCodecCtx);
m_pCodecCtx = NULL;
}
if(m_pFrame)
{
av_frame_free(&m_pFrame);
m_pFrame = NULL;
}
csH264.Unlock();
通过对reset也加锁之后, 崩溃问题消失, 对于avcodec_open2加锁, 是有据可依, 但不知道为何非要对reset函数也加锁呢? 请高手解答,谢谢!
|