如何从多个线程使用ffmpeg的sws_scale?

时间:2013-04-22 18:32:28

标签: c++ c ffmpeg

我有一个基于sws_scale的色彩空间转换功能。它将在应用程序的生命周期内从多个不同的线程调用。但是,我不知道sws_scale的线程安全性如何,我在文档中没有提到它。

我会假设每个线程都需要自己的SwsContext,因为这个参数将被共享,但这足以保证不会发生任何内部冲突吗?

2 个答案:

答案 0 :(得分:3)

只要每个线程都有自己的SwsContext值,就应该是安全的。快速浏览libswscale源代码表明它不使用任何全局变量。

答案 1 :(得分:0)

默认情况下,ffmpeg通常不是线程安全的。但是,只要每个sws上下文都是在一个单独的线程上创建的,libswsscale似乎是安全的。

但是,使用avcodec操作时,可以使用回调机制 为您的解码步骤(或其他与avcodec相关的操作)启用线程安全:

**请注意,我使用此任意Mutex类进行说明:

 int ffmpeg_lock_callback(void **mutex, enum AVLockOp op)
   {
      static Mutex m;

      switch(op)
      {
          case AV_LOCK_CREATE:
          {
              *mutex = &m;
              break;
          }
          case AV_LOCK_OBTAIN:
          {
              // TODO: Lock you mutex here
              break;
          }
          case AV_LOCK_RELEASE:
          {
              // TODO: Unlock your mutex here
              break;
          }
          case AV_LOCK_DESTROY:
          {
              *mutex = 0;
              break;
          }

      }
      return 0;
  }

...

这就在你的.h文件中:

extern "C"{
#include "libavcodec/avcodec.h"
}

extern "C"
{
    int ffmpeg_lock_callback(void **mutex, enum AVLockOp op);
}