On 7/8/16, sami.h...@gmail.com <sami.h...@gmail.com> wrote: > From: Sami Hult <sami.h...@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.h...@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. > -@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. > +@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 > -@end example > signalstats,metadata=print:key=lavfi.signalstats.YDIF:value=0:function=expr:expr='between(VALUE1,0,1)' > +@end example > +@item > +Print silencedetect output to file @file{metadata.txt}. > +@example > +silencedetect,ametadata=mode=print:file=metadata.txt > +@end example > +@item > +Direct all metadata to a pipe with file descriptor 4. > +@example > +metadata=mode=print:file='pipe\:4' > +@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@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >
probably ok _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel