aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/utils.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-12-08 03:19:12 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-12-17 01:06:34 +0100
commitec464c96831ac81329187013c35a9b0a4df6b406 (patch)
treed5d73178cf968ca555440921ece424e5f3eaab21 /libavcodec/utils.c
parent196f7da7c81814de7883c8b33c7d3866f7cac687 (diff)
downloadffmpeg-ec464c96831ac81329187013c35a9b0a4df6b406.tar.gz
avcodec/utils: av_register_codec & hwaccel() that work in O(1) time
Its possible to implement this with a few lines less code but it then would flip the order of the list and require registration of external codecs to be done first, also it could break user applications due to this. Thus to maintain ABI this slighty more complex solution is used. Reviewed-by: Stefano Sabatini Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/utils.c')
-rw-r--r--libavcodec/utils.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 73370fec67..d361391028 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -169,6 +169,7 @@ void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size)
/* encoder management */
static AVCodec *first_avcodec = NULL;
+static AVCodec **last_avcodec = &first_avcodec;
AVCodec *av_codec_next(const AVCodec *c)
{
@@ -204,11 +205,12 @@ av_cold void avcodec_register(AVCodec *codec)
{
AVCodec **p;
avcodec_init();
- p = &first_avcodec;
+ p = last_avcodec;
codec->next = NULL;
while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, codec))
p = &(*p)->next;
+ last_avcodec = &codec->next;
if (codec->init_static_data)
codec->init_static_data(codec);
@@ -3208,13 +3210,15 @@ FF_ENABLE_DEPRECATION_WARNINGS
#endif /* FF_API_MISSING_SAMPLE */
static AVHWAccel *first_hwaccel = NULL;
+static AVHWAccel **last_hwaccel = &first_hwaccel;
void av_register_hwaccel(AVHWAccel *hwaccel)
{
- AVHWAccel **p = &first_hwaccel;
+ AVHWAccel **p = last_hwaccel;
hwaccel->next = NULL;
while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, hwaccel))
p = &(*p)->next;
+ last_hwaccel = &hwaccel->next;
}
AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel)