등의 함수들은 보통 호출부에 뮤텍스 락을 걸어주어야 하는데 av_lockmgr_register 함수를
이용하면 이것을 간단하게 해결할 수 있다.
#include <windows.h>
extern "C" {
#include "libavformat/avformat.h"
}
static bool isInit = false;
static HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
static int lockmgr(void **mtx, enum AVLockOp op)
{
switch(op) {
case AV_LOCK_CREATE:
*mtx = CreateMutex(0, FALSE, 0);
if(!*mtx)
return 1;
return 0;
case AV_LOCK_OBTAIN:
return !!WaitForSingleObject(*mtx, INFINITE);
case AV_LOCK_RELEASE:
return !!ReleaseMutex(*mtx);
case AV_LOCK_DESTROY:
CloseHandle(*mtx);
return 0;
}
return 1;
}
void InitFFmpegLib()
{
WaitForSingleObject(hMutex, INFINITE);
if (!isInit) {
av_register_all();
if (av_lockmgr_register(lockmgr)) {
printf("Could not initialize lock manager!\n");
exit(1);
}
isInit = true;
}
ReleaseMutex(hMutex);
}
프로그램 시작부분에서 InitFFmpegLib() 함수를 호출하면 그 다음부터 thread-unsafe 한
ffmpeg api 함수들은 자동으로 뮤텍스 락을 건다.