[FFmpeg-cvslog] avcodec/utils: av_register_codec & hwaccel() that work in O(1) time

Michael Niedermayer git at videolan.org
Tue Dec 17 01:14:02 CET 2013


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Sun Dec  8 03:19:12 2013 +0100| [ec464c96831ac81329187013c35a9b0a4df6b406] | committer: Michael Niedermayer

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 at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ec464c96831ac81329187013c35a9b0a4df6b406
---

 libavcodec/utils.c |    8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 73370fe..d361391 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)



More information about the ffmpeg-cvslog mailing list