簡體   English   中英

LibAv / FFMpeg的線程安全性?

[英]Thread Safety of LibAv/FFMpeg?

LibAV / FFMpeg線程安全嗎? 例如。 我可以在一個線程中使用AVFormatContext *從一個文件中讀取並通過簡單添加的互斥量將讀取數據包解碼到另一個文件中,或者是“不知道不關心”類型交易的庫的線程安全性嗎? 我知道libav對編碼器線程有基本的支持,但我正在嘗試更多的黑盒類型方法,我把它分解成多個線程(源 - >解碼器 - >過濾器 - >編碼器 - >接收器)並試圖了解並發症這樣的。

任何對ffmpeg和線程有任何經驗的人都希望與任何其他與此相關的信息相互關聯,也將非常感激。

您可以注冊自己的鎖管理器。 ffmpeg庫將控制線程安全性。

例:

 ::av_lockmgr_register(&my_lockmgr_cb);


 //// ..........

 int my_lockmgr_cb(void **mutex, enum AVLockOp op)
 {
  if (NULL == mutex)
   return -1;

   switch(op)
   {
   case AV_LOCK_CREATE:
   {
    *mutex = NULL;
    boost::mutex * m = new boost::mutex();
    *mutex = static_cast<void*>(m);
    break;
   }
   case AV_LOCK_OBTAIN:
   {
    boost::mutex * m =  static_cast<boost::mutex*>(*mutex);
    m->lock();
    break;
   }
   case AV_LOCK_RELEASE:
   {
    boost::mutex * m = static_cast<boost::mutex*>(*mutex);
    m->unlock();
    break;
   }
   case AV_LOCK_DESTROY:
   {
    boost::mutex * m = static_cast<boost::mutex*>(*mutex);
    delete m;
    break;
   }
   default:
   break;
}
return 0;

}

擴展現有答案:

ffmpeg的av_lockmgr_register是處理鎖定的方法。

帶有線程的ffmpeg構建(以及比LIBAVCODEC_VERSION_MAJOR 55更高版本,LIBAVCODEC_VERSION_MINOR 38和LIBAVCODEC_VERSION_MICRO 100 - 大約在2013年10月左右,請參閱ffmpeg commit添加默認lockmgr )將具有您可以使用的默認鎖定管理器。

如果您需要與libav兼容(在撰寫本文時,2016年9月),這還沒有默認的鎖定管理器,您需要提供自己的。

這是一個純C pthread的實現:

static int ffmpeg_lockmgr_cb(void **arg, enum AVLockOp op)
{
    pthread_mutex_t *mutex = *arg;
    int err;

    switch (op) {
    case AV_LOCK_CREATE:
        mutex = malloc(sizeof(*mutex));
        if (!mutex)
            return AVERROR(ENOMEM);
        if ((err = pthread_mutex_init(mutex, NULL))) {
            free(mutex);
            return AVERROR(err);
        }
        *arg = mutex;
        return 0;
    case AV_LOCK_OBTAIN:
        if ((err = pthread_mutex_lock(mutex)))
            return AVERROR(err);

        return 0;
    case AV_LOCK_RELEASE:
        if ((err = pthread_mutex_unlock(mutex)))
            return AVERROR(err);

        return 0;
    case AV_LOCK_DESTROY:
        if (mutex)
            pthread_mutex_destroy(mutex);
        free(mutex);
        *arg = NULL;
        return 0;
    }
    return 1;
}

注冊如下:

ret = av_lockmgr_register(ffmpeg_lockmgr_cb);
if (ret < 0)
{
    fprintf(stderr, "av_lockmgr_register failed (%d)\n", ret);
    abort();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM