[FFmpeg-devel] [PATCH v2] avformat/tee: Support arbitrary number of slaves

Jan Sebechlebsky sebechlebskyjan at gmail.com
Thu Jun 16 18:37:09 CEST 2016


Ping :)

On 06/12/2016 08:17 PM, sebechlebskyjan at gmail.com wrote:
> From: Jan Sebechlebsky <sebechlebskyjan at gmail.com>
>
> Signed-off-by: Jan Sebechlebsky <sebechlebskyjan at gmail.com>
> ---
>   libavformat/tee.c | 24 +++++++++++++++---------
>   1 file changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/libavformat/tee.c b/libavformat/tee.c
> index 806beaa..bf7438c 100644
> --- a/libavformat/tee.c
> +++ b/libavformat/tee.c
> @@ -27,8 +27,6 @@
>   #include "avformat.h"
>   #include "avio_internal.h"
>   
> -#define MAX_SLAVES 16
> -
>   typedef enum {
>       ON_SLAVE_FAILURE_ABORT  = 1,
>       ON_SLAVE_FAILURE_IGNORE = 2
> @@ -52,7 +50,7 @@ typedef struct TeeContext {
>       const AVClass *class;
>       unsigned nb_slaves;
>       unsigned nb_alive;
> -    TeeSlave slaves[MAX_SLAVES];
> +    TeeSlave *slaves;
>   } TeeContext;
>   
>   static const char *const slave_delim     = "|";
> @@ -203,6 +201,7 @@ static void close_slaves(AVFormatContext *avf)
>       for (i = 0; i < tee->nb_slaves; i++) {
>           close_slave(&tee->slaves[i]);
>       }
> +    av_freep(&tee->slaves);
>   }
>   
>   static int open_slave(AVFormatContext *avf, char *slave, TeeSlave *tee_slave)
> @@ -443,17 +442,17 @@ static int tee_write_header(AVFormatContext *avf)
>       TeeContext *tee = avf->priv_data;
>       unsigned nb_slaves = 0, i;
>       const char *filename = avf->filename;
> -    char *slaves[MAX_SLAVES];
> +    char **slaves = NULL;
>       int ret;
>   
>       while (*filename) {
> -        if (nb_slaves == MAX_SLAVES) {
> -            av_log(avf, AV_LOG_ERROR, "Maximum %d slave muxers reached.\n",
> -                   MAX_SLAVES);
> -            ret = AVERROR_PATCHWELCOME;
> +        char *slave = av_get_token(&filename, slave_delim);
> +        if (!slave) {
> +            ret = AVERROR(ENOMEM);
>               goto fail;
>           }
> -        if (!(slaves[nb_slaves++] = av_get_token(&filename, slave_delim))) {
> +        dynarray_add(&slaves, &nb_slaves, slave);
> +        if (!slaves) {
>               ret = AVERROR(ENOMEM);
>               goto fail;
>           }
> @@ -461,6 +460,10 @@ static int tee_write_header(AVFormatContext *avf)
>               filename++;
>       }
>   
> +    if (!(tee->slaves = av_mallocz_array(nb_slaves, sizeof(*tee->slaves)))) {
> +        ret = AVERROR(ENOMEM);
> +        goto fail;
> +    }
>       tee->nb_slaves = tee->nb_alive = nb_slaves;
>   
>       for (i = 0; i < nb_slaves; i++) {
> @@ -483,12 +486,14 @@ static int tee_write_header(AVFormatContext *avf)
>               av_log(avf, AV_LOG_WARNING, "Input stream #%d is not mapped "
>                      "to any slave.\n", i);
>       }
> +    av_free(slaves);
>       return 0;
>   
>   fail:
>       for (i = 0; i < nb_slaves; i++)
>           av_freep(&slaves[i]);
>       close_slaves(avf);
> +    av_free(slaves);
>       return ret;
>   }
>   
> @@ -505,6 +510,7 @@ static int tee_write_trailer(AVFormatContext *avf)
>                   ret_all = ret;
>           }
>       }
> +    av_freep(&tee->slaves);
>       return ret_all;
>   }
>   



More information about the ffmpeg-devel mailing list