Commit 2470851f authored by Ash Hughes's avatar Ash Hughes Committed by Michael Niedermayer

lavc: enable recursively using avcodec_open2/close.

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 7abf3948
...@@ -178,4 +178,16 @@ int ff_get_logical_cpus(AVCodecContext *avctx); ...@@ -178,4 +178,16 @@ int ff_get_logical_cpus(AVCodecContext *avctx);
int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx); int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx);
/**
* Call avcodec_open2 recursively by decrementing counter, unlocking mutex,
* calling the function and then restoring again. Assumes the mutex is
* already locked
*/
int ff_codec_open2_recursive(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
/**
* Call avcodec_close recursively, counterpart to avcodec_open2_recursive.
*/
int ff_codec_close_recursive(AVCodecContext *avctx);
#endif /* AVCODEC_INTERNAL_H */ #endif /* AVCODEC_INTERNAL_H */
...@@ -798,6 +798,27 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) ...@@ -798,6 +798,27 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
} }
#endif #endif
int attribute_align_arg ff_codec_open2_recursive(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
{
int ret = 0;
entangled_thread_counter--;
/* Release any user-supplied mutex. */
if (ff_lockmgr_cb) {
(*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
}
ret = avcodec_open2(avctx, codec, options);
/* If there is a user-supplied mutex locking routine, call it. */
if (ff_lockmgr_cb) {
if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
return -1;
}
entangled_thread_counter++;
return ret;
}
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options) int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
{ {
int ret = 0; int ret = 0;
...@@ -1809,6 +1830,27 @@ void avsubtitle_free(AVSubtitle *sub) ...@@ -1809,6 +1830,27 @@ void avsubtitle_free(AVSubtitle *sub)
memset(sub, 0, sizeof(AVSubtitle)); memset(sub, 0, sizeof(AVSubtitle));
} }
av_cold int ff_codec_close_recursive(AVCodecContext *avctx)
{
int ret = 0;
entangled_thread_counter--;
/* Release any user-supplied mutex. */
if (ff_lockmgr_cb) {
(*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
}
ret = avcodec_close(avctx);
/* If there is a user-supplied mutex locking routine, call it. */
if (ff_lockmgr_cb) {
if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
return -1;
}
entangled_thread_counter++;
return ret;
}
av_cold int avcodec_close(AVCodecContext *avctx) av_cold int avcodec_close(AVCodecContext *avctx)
{ {
/* If there is a user-supplied mutex locking routine, call it. */ /* If there is a user-supplied mutex locking routine, call it. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment