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