[FFmpeg-devel] [PATCH] Changed metadata print option to accept general urls

Paul B Mahol onemda at gmail.com
Fri Jul 8 13:02:26 EEST 2016


On 7/8/16, sami.hult at gmail.com <sami.hult at gmail.com> wrote:
> From: Sami Hult <sami.hult at gmail.com>
>
> This is an updated patch, that removes a debug-purposed printf that I
> accidentally left.
>
> Changes metadata filter to accept general urls as file argument without
> breaking former behaviour. As a byproduct, it also allows for writing to
> file "-" if specified as "file:-".
>
> Example:
>
> ffmpeg -i test.wav -filter_complex
> "silencedetect=n=-40dB:d=0.1,ametadata=mode=print:file='pipe\:4'" -f null
>
>
> Signed-off-by: Sami Hult <sami.hult at gmail.com>
> ---
>  Changelog                |  1 +
>  doc/filters.texi         | 23 +++++++++++++++++------
>  libavfilter/f_metadata.c | 48
> ++++++++++++++++++++++++++++--------------------
>  3 files changed, 46 insertions(+), 26 deletions(-)
>
> diff --git a/Changelog b/Changelog
> index 99cdb80..5b34d34 100644
> --- a/Changelog
> +++ b/Changelog
> @@ -49,6 +49,7 @@ version 3.1:
>  - libutvideo wrapper removed
>  - YUY2 Lossless Codec decoder
>  - VideoToolbox H.264 encoder
> +- Changed metadata print option to accept general urls
>
>
>  version 3.0:
> diff --git a/doc/filters.texi b/doc/filters.texi
> index a8c2c87..42341ea 100644
> --- a/doc/filters.texi
> +++ b/doc/filters.texi
> @@ -9390,13 +9390,14 @@ Float representation of @code{value} from metadata
> key.
>
>  @item VALUE2
>  Float representation of @code{value} as supplied by user in @code{value}
> option.
> - at end table
>
>  @item file
> -If specified in @code{print} mode, output is written to the named file.
> When
> -filename equals "-" data is written to standard output.
> -If @code{file} option is not set, output is written to the log with
> AV_LOG_INFO
> -loglevel.
> +If specified in @code{print} mode, output is written to the named file.
> Instead of
> +plain filename any writable url can be specified. Filename ``-'' is a
> shorthand
> +for standard output. If @code{file} option is not set, output is written to
> the log
> +with AV_LOG_INFO loglevel.
> + at end table
> +
>  @end table
>
>  @subsection Examples
> @@ -9406,8 +9407,18 @@ loglevel.
>  Print all metadata values for frames with key
> @code{lavfi.singnalstats.YDIF} with values
>  between 0 and 1.
>  @example
> - at end example
> signalstats,metadata=print:key=lavfi.signalstats.YDIF:value=0:function=expr:expr='between(VALUE1,0,1)'
> + at end example
> + at item
> +Print silencedetect output to file @file{metadata.txt}.
> + at example
> +silencedetect,ametadata=mode=print:file=metadata.txt
> + at end example
> + at item
> +Direct all metadata to a pipe with file descriptor 4.
> + at example
> +metadata=mode=print:file='pipe\:4'
> + at end example
>  @end itemize
>
>  @section mpdecimate
> diff --git a/libavfilter/f_metadata.c b/libavfilter/f_metadata.c
> index ab07ccf..68cc16c 100644
> --- a/libavfilter/f_metadata.c
> +++ b/libavfilter/f_metadata.c
> @@ -31,6 +31,7 @@
>  #include "libavutil/internal.h"
>  #include "libavutil/opt.h"
>  #include "libavutil/timestamp.h"
> +#include "libavformat/avio.h"
>  #include "avfilter.h"
>  #include "audio.h"
>  #include "formats.h"
> @@ -80,7 +81,7 @@ typedef struct MetadataContext {
>      AVExpr *expr;
>      double var_values[VAR_VARS_NB];
>
> -    FILE *file;
> +    AVIOContext* avio_context;
>      char *file_str;
>
>      int (*compare)(struct MetadataContext *s,
> @@ -180,8 +181,11 @@ static void print_file(AVFilterContext *ctx, const char
> *msg, ...)
>      va_list argument_list;
>
>      va_start(argument_list, msg);
> -    if (msg)
> -        vfprintf(s->file, msg, argument_list);
> +    if (msg) {
> +        char buf[128];
> +        vsnprintf(buf, sizeof(buf), msg, argument_list);
> +        avio_put_str(s->avio_context, buf);
> +    }
>      va_end(argument_list);
>  }
>
> @@ -236,25 +240,29 @@ static av_cold int init(AVFilterContext *ctx)
>          }
>      }
>
> -    if (s->file_str) {
> -        if (!strcmp(s->file_str, "-")) {
> -            s->file = stdout;
> -        } else {
> -            s->file = fopen(s->file_str, "w");
> -            if (!s->file) {
> -                int err = AVERROR(errno);
> -                char buf[128];
> -                av_strerror(err, buf, sizeof(buf));
> -                av_log(ctx, AV_LOG_ERROR, "Could not open file %s: %s\n",
> -                       s->file_str, buf);
> -                return err;
> -            }
> -        }
> +    if (s->mode == METADATA_PRINT && s->file_str) {
>          s->print = print_file;
>      } else {
>          s->print = print_log;
>      }
>
> +    s->avio_context = NULL;
> +    if (s->file_str) {
> +        if (!strcmp("-", s->file_str)) {
> +            ret = avio_open(&s->avio_context, "pipe:1", AVIO_FLAG_WRITE);
> +        } else {
> +            ret = avio_open(&s->avio_context, s->file_str,
> AVIO_FLAG_WRITE);
> +        }
> +
> +        if (ret < 0) {
> +            char buf[128];
> +            av_strerror(ret, buf, sizeof(buf));
> +            av_log(ctx, AV_LOG_ERROR, "Could not open %s: %s\n",
> +                   s->file_str, buf);
> +            return ret;
> +        }
> +    }
> +
>      return 0;
>  }
>
> @@ -262,9 +270,9 @@ static av_cold void uninit(AVFilterContext *ctx)
>  {
>      MetadataContext *s = ctx->priv;
>
> -    if (s->file && s->file != stdout)
> -        fclose(s->file);
> -    s->file = NULL;
> +    if (s->avio_context) {
> +        avio_closep(&s->avio_context);
> +    }
>  }
>
>  static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
> --
> 2.1.4
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

probably ok


More information about the ffmpeg-devel mailing list