1

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

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

4

2 回答 2

3

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

于 2013-04-22T21:36:31.210 回答
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);
}
于 2013-04-23T22:38:25.920 回答