我有一个基于sws_scale的色彩空间转换功能。它将在应用程序的生命周期内从多个不同的线程调用。但是,我不知道 sws_scale 的线程安全性如何,而且我没有在其文档中找到它。
我会假设每个线程都需要自己的SwsContext因为这个参数将被共享,但这足以保证不会有任何内部冲突吗?
我有一个基于sws_scale的色彩空间转换功能。它将在应用程序的生命周期内从多个不同的线程调用。但是,我不知道 sws_scale 的线程安全性如何,而且我没有在其文档中找到它。
我会假设每个线程都需要自己的SwsContext因为这个参数将被共享,但这足以保证不会有任何内部冲突吗?
只要每个线程都有自己的 SwsContext 值,您就应该是安全的。快速浏览一下 libswscale 源代码表明它不使用任何全局变量。
默认情况下,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);
}