我有一个基于sws_scale的色彩空间转换功能。它将在应用程序的生命周期内从多个不同的线程调用。但是,我不知道sws_scale的线程安全性如何,我在文档中没有提到它。
我会假设每个线程都需要自己的SwsContext,因为这个参数将被共享,但这足以保证不会发生任何内部冲突吗?
答案 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);
}