ffmpeg ----avcodec_open2()-> ff_unlock_avcodec() 导致宕问题分析

 调用ffmpeg-3.3库函数来处理音视频媒体数据是很常用的方式,但是也存在很多坑。最近在项目中遇到了一个坑,媒体流处理进程老是崩溃,查看core文件,信息如下:

#0  0x00007f2e61ab67b0 in pthread_mutex_unlock () from /lib64/libpthread.so.0
#1  0x00007f2e5f9b98f1 in default_lockmgr_cb (arg=0x7f2e60943690, op=AV_LOCK_RELEASE) at libavcodec/utils.c:96
#2  0x00007f2e5f9c5465 in ff_unlock_avcodec (codec=0x7f2e60241fe0) at libavcodec/utils.c:3956
#3 0x00007f2e5f9be0db in avcodec_open2 (avctx=0x7f2e1407e120, codec=0x7f2e60241fe0, options=0x0) at libavcodec/utils.c:1701
#4 0x0000000000411789 in Combine_Amr_H264_To_Flv (arg=0x74e858) at /root/zhaozl/lte/merge/meg_mod/../../merge/meg_mod/src/Media_Stream_Handle_Interface.c:1652
#5  0x00007f2e61ab39d1 in start_thread () from /lib64/libpthread.so.0
#6  0x00007f2e5e711b6d in clone () from /lib64/libc.so.6

最终定位在了default_lockmgr_cb 中,查看源码如下

 

static int default_lockmgr_cb(void **arg, enum AVLockOp op)
{
    void * volatile * mutex = arg;
    int err;
    
    switch (op) {
    case AV_LOCK_CREATE:
        return 0;
    case AV_LOCK_OBTAIN:
        if (!*mutex) {
            pthread_mutex_t *tmp = av_malloc(sizeof(pthread_mutex_t));
            if (!tmp)
                return AVERROR(ENOMEM);
            if ((err = pthread_mutex_init(tmp, NULL))) {
                av_free(tmp);
                return AVERROR(err);
            }
            if (avpriv_atomic_ptr_cas(mutex, NULL, tmp)) {
                pthread_mutex_destroy(tmp);
                av_free(tmp);
            }
        }

        if ((err = pthread_mutex_lock(*mutex)))        
            return AVERROR(err);
        
        return 0;
    case AV_LOCK_RELEASE:
        if(!(*mutex))
        {
            return 1;
        }

        if ((err = pthread_mutex_unlock(*mutex)))
            return AVERROR(err);

        return 0;
    case AV_LOCK_DESTROY:
        if (*mutex)
            pthread_mutex_destroy(*mutex);
        av_free(*mutex);
        avpriv_atomic_ptr_cas(mutex, *mutex, NULL);
        return 0;
    }
    return 1;
}
stat

pthread_mutex_unlock进行互斥锁释放的时候并没有防护,当*mutex为空时就导致程序崩溃了。于是添加了上述中红色标注的防护,程序不再崩溃了,虽然不够完美,但是解决了我的问题,在此记录一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值