[FFmpeg-devel] [PATCH] avformat/tee: Support arbitrary number of slaves
Nicolas George
george at nsup.org
Sun Jun 12 16:26:30 CEST 2016
Le tridi 23 prairial, an CCXXIV, sebechlebskyjan at gmail.com a écrit :
> From: Jan Sebechlebsky <sebechlebskyjan at gmail.com>
>
> Signed-off-by: Jan Sebechlebsky <sebechlebskyjan at gmail.com>
> ---
> libavformat/tee.c | 27 +++++++++++++++++----------
> 1 file changed, 17 insertions(+), 10 deletions(-)
Out of curiosity, in what situation is this a problem?
> diff --git a/libavformat/tee.c b/libavformat/tee.c
> index 806beaa..427e999 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,8 @@ static void close_slaves(AVFormatContext *avf)
> for (i = 0; i < tee->nb_slaves; i++) {
> close_slave(&tee->slaves[i]);
> }
> +
Minor nit: I do not think we need an extra line here.
> + av_freep(&tee->slaves);
> }
>
> static int open_slave(AVFormatContext *avf, char *slave, TeeSlave *tee_slave)
> @@ -443,17 +443,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 +461,10 @@ static int tee_write_header(AVFormatContext *avf)
> filename++;
> }
>
> + if (!(tee->slaves = calloc(nb_slaves, sizeof(*tee->slaves)))) {
Calling calloc() directly is not allowed, use av_mallocz_array() instead.
> + ret = AVERROR(ENOMEM);
> + goto fail;
> + }
> tee->nb_slaves = tee->nb_alive = nb_slaves;
>
> for (i = 0; i < nb_slaves; i++) {
> @@ -483,12 +487,13 @@ 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;
> -
Stray.
> fail:
> for (i = 0; i < nb_slaves; i++)
> av_freep(&slaves[i]);
> close_slaves(avf);
> + av_free(slaves);
> return ret;
> }
>
> @@ -505,6 +510,8 @@ static int tee_write_trailer(AVFormatContext *avf)
> ret_all = ret;
> }
> }
> +
Ditto about the empty line.
> + av_freep(&tee->slaves);
> return ret_all;
> }
Apart from the calloc() point, LGTM.
Regards,
--
Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160612/45ce000c/attachment.sig>
More information about the ffmpeg-devel
mailing list