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

Stefano Sabatini stefasab at gmail.com
Mon Dec 16 17:01:47 CET 2013


On date Sunday 2013-12-08 03:55:21 +0100, Michael Niedermayer encoded:
> 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.
> 
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
>  libavcodec/utils.c |    8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index 102a049..8d96bd0 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);
> @@ -3187,13 +3189,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;
>  }

LGTM.
-- 
FFmpeg = Fiendish and Funny Magical Political Epic Game


More information about the ffmpeg-devel mailing list