summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefano Sabatini <stefasab@gmail.com>2011-10-02 11:26:07 +0200
committerStefano Sabatini <stefasab@gmail.com>2011-10-09 16:03:13 +0200
commitcb50ada4f87bc6f735b76f798fddc8d3e6045497 (patch)
tree6450f295279e62091d0b33269cfa55acca08738e
parent9806dda8a8b707b90c10074f0b5bfd54b7c6a97e (diff)
ffprobe: parse arguments for -print_format writer
This allows -print_format to accept string of the form WRITER=OPTIONS, as required by the pending compact writer patch.
-rw-r--r--doc/ffprobe.texi5
-rw-r--r--ffprobe.c36
2 files changed, 30 insertions, 11 deletions
diff --git a/doc/ffprobe.texi b/doc/ffprobe.texi
index 597b6b5342..9496fc95be 100644
--- a/doc/ffprobe.texi
+++ b/doc/ffprobe.texi
@@ -80,9 +80,12 @@ Use sexagesimal format HH:MM:SS.MICROSECONDS for time values.
Prettify the format of the displayed values, it corresponds to the
options "-unit -prefix -byte_binary_prefix -sexagesimal".
-@item -print_format @var{format}
+@item -print_format @var{writer_name}[=@var{writer_options}]
Set the output printing format.
+@var{writer_name} specifies the name of the writer, and
+@var{writer_options} specifies the options to be passed to the writer.
+
For example for printing the output in JSON format, specify:
@example
-print_format json
diff --git a/ffprobe.c b/ffprobe.c
index d2ef86fe62..82a8f5425e 100644
--- a/ffprobe.c
+++ b/ffprobe.c
@@ -23,6 +23,7 @@
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
+#include "libavutil/avstring.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/dict.h"
@@ -737,23 +738,34 @@ static int probe_file(const char *filename)
AVFormatContext *fmt_ctx;
int ret;
Writer *w;
+ const char *buf = print_format;
+ char *w_str = NULL, *w_args = NULL;
WriterContext *wctx;
writer_register_all();
- if (!print_format)
- print_format = av_strdup("default");
- w = writer_get_by_name(print_format);
- if (!w) {
- fprintf(stderr, "Invalid output format '%s'\n", print_format);
- return AVERROR(EINVAL);
+ if (buf) {
+ w_str = av_get_token(&buf, "=");
+ if (*buf == '=') {
+ buf++;
+ w_args = av_get_token(&buf, "");
+ }
}
- if ((ret = writer_open(&wctx, w, NULL, NULL)) < 0)
- return ret;
+ if (!w_str)
+ w_str = av_strdup("default");
+ w = writer_get_by_name(w_str);
+ if (!w) {
+ av_log(NULL, AV_LOG_ERROR, "Invalid output format '%s'\n", w_str);
+ ret = AVERROR(EINVAL);
+ goto end;
+ }
+
+ if ((ret = writer_open(&wctx, w, w_args, NULL)) < 0)
+ goto end;
if ((ret = open_input_file(&fmt_ctx, filename)))
- return ret;
+ goto end;
writer_print_header(wctx);
PRINT_CHAPTER(packets);
@@ -764,7 +776,11 @@ static int probe_file(const char *filename)
av_close_input_file(fmt_ctx);
writer_close(&wctx);
- return 0;
+end:
+ av_free(w_str);
+ av_free(w_args);
+
+ return ret;
}
static void show_usage(void)