On Wed, 3 Jan 2018 00:43:12 +0000
Josh de Kock <j...@itanimul.li> wrote:

> ---
>  libavdevice/alldevices.c |  6 +++++-
>  libavformat/allformats.c | 44 +++++++++++++++++++++++++++++++++++++++-----
>  libavformat/avformat.h   |  4 ++++
>  3 files changed, 48 insertions(+), 6 deletions(-)
> 
> diff --git a/libavdevice/alldevices.c b/libavdevice/alldevices.c
> index 6b2a512..041eb85 100644
> --- a/libavdevice/alldevices.c
> +++ b/libavdevice/alldevices.c
> @@ -105,6 +105,8 @@ static void av_device_init_next(void)
>      }
>      if (previn)
>          previn->next = NULL;
> +
> +    avpriv_register_devices(outdev_list, indev_list);
>  }
>  
>  void avdevice_register_all(void)
> @@ -115,9 +117,11 @@ void avdevice_register_all(void)
>  static void *device_next(void *prev, int output,
>                           AVClassCategory c1, AVClassCategory c2)
>  {
> -    pthread_once(&av_device_next_init, av_device_init_next);
>      const AVClass *pc;
>      AVClassCategory category = AV_CLASS_CATEGORY_NA;
> +
> +    pthread_once(&av_device_next_init, av_device_init_next);
> +
>      if (!prev && !(prev = (output ? (void*)outdev_list[0] : 
> (void*)indev_list[0])))
>          return NULL;
>  
> diff --git a/libavformat/allformats.c b/libavformat/allformats.c
> index fa72acd..52b7088 100644
> --- a/libavformat/allformats.c
> +++ b/libavformat/allformats.c
> @@ -20,6 +20,7 @@
>   */
>  
>  #include "libavutil/thread.h"
> +#include "libavdevice/avdevice.h"
>  #include "avformat.h"
>  #include "rtp.h"
>  #include "rdt.h"
> @@ -482,6 +483,7 @@ const AVOutputFormat *av_muxer_iterate(void **opaque)
>  {
>      uintptr_t i = (uintptr_t)*opaque;
>      const AVOutputFormat *f = muxer_list[i];
> +
>      if (f)
>          *opaque = (void*)(i + 1);
>      return f;
> @@ -499,45 +501,77 @@ const AVInputFormat *av_demuxer_iterate(void **opaque){
>  #if FF_API_NEXT
>  pthread_once_t av_format_next_init = PTHREAD_ONCE_INIT;
>  
> +static AVInputFormat **indev_list = NULL;
> +static AVOutputFormat **outdev_list = NULL;
> +
>  static void av_format_init_next(void)
>  {
>      AVOutputFormat *prevout = NULL, *out;
>      AVInputFormat *previn = NULL, *in;
>      void *i = 0;
> -    while ((out = (AVOutputFormat*)av_muxer_iterate(&i))) {
> +
> +    for (i = 0; (out = (AVOutputFormat*)av_muxer_iterate(&i));) {
>          if (prevout)
>              prevout->next = out;
>          prevout = out;
>      }
> +
> +    if (outdev_list) {
> +        for (i = 0; (out = (AVOutputFormat*)outdev_list[(int)i]); i = 
> (void*)(i + 1)) {
> +            if (prevout)
> +                prevout->next = out;
> +            prevout = out;
> +        }
> +    }
> +
>      if (prevout)
>          prevout->next = NULL;
>  
> -    i = 0;
> -    while ((in = (AVInputFormat*)av_demuxer_iterate(&i))) {
> +    for (i = 0; (in = (AVInputFormat*)av_demuxer_iterate(&i));) {
>          if (previn)
>              previn->next = in;
>          previn = in;
>      }
> +
> +    if (indev_list) {
> +        for (i = 0; (in = (AVInputFormat*)indev_list[(int)i]); i = (void*)(i 
> + 1)) {
> +            if (previn)
> +                previn->next = in;
> +            previn = in;
> +        }
> +    }
> +
>      if (previn)
>          previn->next = NULL;
>  }
>  
> +void avpriv_register_devices(AVOutputFormat *o[], AVInputFormat *i[])
> +{
> +    outdev_list = o;
> +    indev_list = i;
> +    av_format_init_next();
> +}
> +
>  AVInputFormat *av_iformat_next(const AVInputFormat *f)
>  {
> +    void *i = 0;
>      pthread_once(&av_format_next_init, av_format_init_next);
>      if (f)
>          return f->next;
>      else
> -        return demuxer_list[0];
> +    /* If there are no demuxers but input devices, then return the first 
> input device.
> +     * This will still return null if both there are both no demuxers or 
> input devices. */
> +        return demuxer_list[0] ? (AVInputFormat*)demuxer_list[0] : 
> (AVInputFormat*)av_indev_iterate(&i);
>  }
>  
>  AVOutputFormat *av_oformat_next(const AVOutputFormat *f)
>  {
> +    void *i = 0;
>      pthread_once(&av_format_next_init, av_format_init_next);
>      if (f)
>          return f->next;
>      else
> -        return muxer_list[0];
> +        return muxer_list[0] ? (AVOutputFormat*)muxer_list[0] : 
> (AVOutputFormat*)av_outdev_iterate(&i);
>  }
>  
>  void av_register_all(void)
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index d38ca4e..56ec41a 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -2014,6 +2014,10 @@ int avformat_network_deinit(void);
>  
>  #if FF_API_NEXT
>  /**
> +  * Register devices in deprecated format linked list.
> +  */
> +void avpriv_register_devices(AVOutputFormat *o[], AVInputFormat *i[]);
> +/**
>   * If f is NULL, returns the first registered input format,
>   * if f is non-NULL, returns the next registered input format after f
>   * or NULL if f is the last one.


I find this strange. It looks like av_iformat_next() includes
the libavdevice list, but av_muxer_iterate() does not. Is this
intended? Does using "-f" to force a muxer/demuxer on the ffmpeg.c
command line still work?

Also avpriv_register_devices() doesn't look very thread safe. You
probably want to use the libavformat mutex to protect that.

Are patches to update ffmpeg.c still missing? I think these would
unfortunately have to be done before we apply this, just to be sure
everything works.

Haven't really looked at the configure changes in all those patches.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to