C++ 如何使用ffmpeg';从多个线程进行sws_缩放?

C++ 如何使用ffmpeg';从多个线程进行sws_缩放?,c++,c,ffmpeg,C++,C,Ffmpeg,我有一个基于颜色空间转换的函数。在应用程序的生命周期内,它将从多个不同的线程调用。然而,我不知道sws_scale的线程安全性如何,我在它的文档中没有提到它 我假设每个线程都需要它自己的,因为这个参数将被共享,但这足以保证不会发生任何内部冲突吗?只要每个线程都有它自己的SwsContext值,就应该是安全的。快速查看libswscale源代码可以发现它没有使用任何全局变量。ffmpeg通常在默认情况下不是线程安全的。但是,只要每个sws上下文都在单独的线程上创建,libswsscale似乎是安全

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


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

只要每个线程都有它自己的SwsContext值,就应该是安全的。快速查看libswscale源代码可以发现它没有使用任何全局变量。

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

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

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

 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);
}

是的,我必须说你是对的。我的印象是,这也用于创建sws_上下文;但我只是检查了ffmpeg的源代码,这似乎不是真的。我将更改我的答案以反映这一点。注意:这已经过时,在较新的ffmpeg版本中不再是必需的(当编译线程感知时)。ffmpeg_lock_回调同时被弃用,并且不做任何事情。