summaryrefslogtreecommitdiff
path: root/libavdevice
diff options
context:
space:
mode:
authorStefano Sabatini <stefasab@gmail.com>2012-10-23 01:13:23 +0200
committerStefano Sabatini <stefasab@gmail.com>2012-10-23 22:08:55 +0200
commit8b03cd3cd7a3141b87419ebce02b9fed7e0030da (patch)
treeaeedf357352b667519c7744cdbfeaea58017d272 /libavdevice
parentbd6240e7e9f3d60b542fd517742fd546318f5917 (diff)
lavd/lavfi: add graph_file option
Allow to specify a filename where to put the filtergraph description. This is useful to override limitations or glitches of particular shell environments, and allows a level of indirection for specifying filtergraphs.
Diffstat (limited to 'libavdevice')
-rw-r--r--libavdevice/lavfi.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c
index 82c5844fab..070aff565c 100644
--- a/libavdevice/lavfi.c
+++ b/libavdevice/lavfi.c
@@ -28,6 +28,7 @@
#include "float.h" /* DBL_MIN, DBL_MAX */
#include "libavutil/bprint.h"
+#include "libavutil/file.h"
#include "libavutil/log.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h"
@@ -43,6 +44,7 @@
typedef struct {
AVClass *class; ///< class for private options
char *graph_str;
+ char *graph_filename;
char *dump_graph;
AVFilterGraph *graph;
AVFilterContext **sinks;
@@ -104,6 +106,32 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx)
buffersink = avfilter_get_by_name("ffbuffersink");
abuffersink = avfilter_get_by_name("ffabuffersink");
+ if (lavfi->graph_filename && lavfi->graph_str) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Only one of the graph or graph_file options must be specified\n");
+ return AVERROR(EINVAL);
+ }
+
+ if (lavfi->graph_filename) {
+ uint8_t *file_buf, *graph_buf;
+ size_t file_bufsize;
+ ret = av_file_map(lavfi->graph_filename,
+ &file_buf, &file_bufsize, 0, avctx);
+ if (ret < 0)
+ return ret;
+
+ /* create a 0-terminated string based on the read file */
+ graph_buf = av_malloc(file_bufsize + 1);
+ if (!graph_buf) {
+ av_file_unmap(file_buf, file_bufsize);
+ return AVERROR(ENOMEM);
+ }
+ memcpy(graph_buf, file_buf, file_bufsize);
+ graph_buf[file_bufsize] = 0;
+ av_file_unmap(file_buf, file_bufsize);
+ lavfi->graph_str = graph_buf;
+ }
+
if (!lavfi->graph_str)
lavfi->graph_str = av_strdup(avctx->filename);
@@ -376,6 +404,7 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
static const AVOption options[] = {
{ "graph", "set libavfilter graph", OFFSET(graph_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
+ { "graph_file","set libavfilter graph filename", OFFSET(graph_filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC},
{ "dumpgraph", "dump graph to stderr", OFFSET(dump_graph), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
{ NULL },
};