diff options
author | Marton Balint | 2011-08-22 22:26:53 +0200 |
---|---|---|
committer | Michael Niedermayer | 2011-08-25 04:06:09 +0200 |
commit | ee0ff051f2e0dcc3279a586c97ec756ba102813a (patch) | |
tree | 0634eeebee3b484dd8186be8d18f2984613af8e3 /ffplay.c | |
parent | 7e7012d0b491453b8de8ca34846f9d48501dc6c5 (diff) |
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>
Diffstat (limited to 'ffplay.c')
-rw-r--r-- | ffplay.c | 25 |
1 files changed, 25 insertions, 0 deletions
@@ -891,6 +891,7 @@ static void do_exit(VideoState *is) if (is) { stream_close(is); } + av_lockmgr_register(NULL); uninit_opts(); #if CONFIG_AVFILTER avfilter_uninit(); @@ -2988,6 +2989,25 @@ static int opt_help(const char *opt, const char *arg) 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 */ 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_USEREVENT, SDL_IGNORE); + if (av_lockmgr_register(lockmgr)) { + fprintf(stderr, "Could not initialize lock manager!\n"); + do_exit(NULL); + } + av_init_packet(&flush_pkt); flush_pkt.data= "FLUSH"; |