ffplay: use lock manager callback to make libavcodec thread-safe

Altough ffplay is working pretty well without using a lock manager, it is still
a multithreaded application calling libavcodec functions from multiple threads,
so using a lock manager is probably a good idea.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Marton Balint 2011-08-22 22:26:53 +02:00 committed by Michael Niedermayer
parent 7e7012d0b4
commit ee0ff051f2

View File

@ -891,6 +891,7 @@ static void do_exit(VideoState *is)
if (is) { if (is) {
stream_close(is); stream_close(is);
} }
av_lockmgr_register(NULL);
uninit_opts(); uninit_opts();
#if CONFIG_AVFILTER #if CONFIG_AVFILTER
avfilter_uninit(); avfilter_uninit();
@ -2988,6 +2989,25 @@ static int opt_help(const char *opt, const char *arg)
return 0; return 0;
} }
static int lockmgr(void **mtx, enum AVLockOp op)
{
switch(op) {
case AV_LOCK_CREATE:
*mtx = SDL_CreateMutex();
if(!*mtx)
return 1;
return 0;
case AV_LOCK_OBTAIN:
return !!SDL_LockMutex(*mtx);
case AV_LOCK_RELEASE:
return !!SDL_UnlockMutex(*mtx);
case AV_LOCK_DESTROY:
SDL_DestroyMutex(*mtx);
return 0;
}
return 1;
}
/* Called from the main */ /* Called from the main */
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
@ -3046,6 +3066,11 @@ int main(int argc, char **argv)
SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE); SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
SDL_EventState(SDL_USEREVENT, SDL_IGNORE); SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
if (av_lockmgr_register(lockmgr)) {
fprintf(stderr, "Could not initialize lock manager!\n");
do_exit(NULL);
}
av_init_packet(&flush_pkt); av_init_packet(&flush_pkt);
flush_pkt.data= "FLUSH"; flush_pkt.data= "FLUSH";