既存の回答を拡張するには:
ffmpeg の av_lockmgr_register は、ロックを処理する方法です。
スレッドを使用した ffmpeg ビルド (および LIBAVCODEC_VERSION_MAJOR 55、LIBAVCODEC_VERSION_MINOR 38、および LIBAVCODEC_VERSION_MICRO 100 より後のバージョン - およそ 2013 年 10月頃、デフォルトの lockmgr を追加する ffmpeg commit を参照) には、使用できるデフォルトのロック マネージャーがあります。
libav との互換性が必要な場合 (2016 年 9 月の執筆時点)、これにはまだデフォルトのロックマネージャーがなく、独自のものを提供する必要があります。
以下は、純粋な C pthread の実装です。
static int ffmpeg_lockmgr_cb(void **arg, enum AVLockOp op)
{
pthread_mutex_t *mutex = *arg;
int err;
switch (op) {
case AV_LOCK_CREATE:
mutex = malloc(sizeof(*mutex));
if (!mutex)
return AVERROR(ENOMEM);
if ((err = pthread_mutex_init(mutex, NULL))) {
free(mutex);
return AVERROR(err);
}
*arg = mutex;
return 0;
case AV_LOCK_OBTAIN:
if ((err = pthread_mutex_lock(mutex)))
return AVERROR(err);
return 0;
case AV_LOCK_RELEASE:
if ((err = pthread_mutex_unlock(mutex)))
return AVERROR(err);
return 0;
case AV_LOCK_DESTROY:
if (mutex)
pthread_mutex_destroy(mutex);
free(mutex);
*arg = NULL;
return 0;
}
return 1;
}
次のように登録されます。
ret = av_lockmgr_register(ffmpeg_lockmgr_cb);
if (ret < 0)
{
fprintf(stderr, "av_lockmgr_register failed (%d)\n", ret);
abort();
}