summaryrefslogtreecommitdiff
path: root/libavcodec/utils.c
diff options
context:
space:
mode:
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>2015-10-01 15:36:56 +0100
committerLuca Barbato <lu_zero@gentoo.org>2015-10-04 13:21:16 +0200
commiteae58428bd199f7d4670bf471f56ed204430878e (patch)
tree139dd5cff906a0a0b081ece6225ecbdbe394d8a1 /libavcodec/utils.c
parentabe9adfb31566c415fd830a8d4977c79512d4385 (diff)
avcodec: Do not lock during open for codecs marked as having threadsafe init
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com> Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
Diffstat (limited to 'libavcodec/utils.c')
-rw-r--r--libavcodec/utils.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 1721c09129..a1aece7fd1 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -845,20 +845,21 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
av_dict_copy(&tmp, *options, 0);
/* If there is a user-supplied mutex locking routine, call it. */
- if (lockmgr_cb) {
- if ((*lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
- return -1;
- }
+ if (!(codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE)) {
+ if (lockmgr_cb) {
+ if ((*lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
+ return -1;
+ }
- entangled_thread_counter++;
- if (entangled_thread_counter != 1 &&
- !(codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE)) {
- av_log(avctx, AV_LOG_ERROR,
- "Insufficient thread locking. At least %d threads are "
- "calling avcodec_open2() at the same time right now.\n",
- entangled_thread_counter);
- ret = -1;
- goto end;
+ entangled_thread_counter++;
+ if (entangled_thread_counter != 1) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Insufficient thread locking. At least %d threads are "
+ "calling avcodec_open2() at the same time right now.\n",
+ entangled_thread_counter);
+ ret = -1;
+ goto end;
+ }
}
avctx->internal = av_mallocz(sizeof(AVCodecInternal));
@@ -1085,12 +1086,15 @@ FF_ENABLE_DEPRECATION_WARNINGS
#endif
}
end:
- entangled_thread_counter--;
+ if (!(codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE)) {
+ entangled_thread_counter--;
- /* Release any user-supplied mutex. */
- if (lockmgr_cb) {
- (*lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
+ /* Release any user-supplied mutex. */
+ if (lockmgr_cb) {
+ (*lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
+ }
}
+
if (options) {
av_dict_free(options);
*options = tmp;