mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-27 01:42:20 +00:00
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:
parent
7e7012d0b4
commit
ee0ff051f2
25
ffplay.c
25
ffplay.c
@ -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";
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user