From a65b5ab001721f6d4a77a3368f11fd7528476f96 Mon Sep 17 00:00:00 2001
From: Julian Rother <julianr@fsmpi.rwth-aachen.de>
Date: Sun, 4 Aug 2019 23:27:57 +0200
Subject: [PATCH] Added variable expansion for strings and enabled it for
 filter graphs in "transcode"

---
 transcode.c      | 14 ++++++++------
 util.h           |  1 +
 util/eval_vars.c | 39 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 48 insertions(+), 6 deletions(-)
 create mode 100644 util/eval_vars.c

diff --git a/transcode.c b/transcode.c
index 2f0c028..a493f71 100644
--- a/transcode.c
+++ b/transcode.c
@@ -23,7 +23,7 @@ static void setup_input_stream(char *stream, AVFormatContext *demux,
 		AVCodecContext **decs, AVFilterGraph *fg, AVFilterContext **srcs,
 		AVFilterInOut **pads)
 {
-	char *p;
+	char *p, *tmp;
 	int idx, err;
 	enum AVMediaType type;
 	AVDictionary *opts;
@@ -83,8 +83,9 @@ static void setup_input_stream(char *stream, AVFormatContext *demux,
 	for (p = jenter(jlookup(stream, "filters")); p; p = jnext(p))
 	{
 		(*pads)->name = av_strdup("in");
-		if ((err = avfilter_graph_parse_ptr(fg, jstr(p, "ERROR"), 0, pads, 0)) < 0)
-			job_failed("Parsing filter string \"%s\" failed: %s", jstr(p, 0), av_err2str(err));
+		tmp = eval_vars(jstr(p, "ERROR"));
+		if ((err = avfilter_graph_parse_ptr(fg, tmp, 0, pads, 0)) < 0)
+			job_failed("Parsing filter string \"%s\" failed: %s", tmp, av_err2str(err));
 		if ((*pads)->next)
 			job_failed("Unconnected filter pad\n");
 	}
@@ -96,7 +97,7 @@ static void prepare_output_stream(char *stream, AVStream *st,
 		AVFilterInOut **pads)
 {
 	int idx, err;
-	char *p;
+	char *p, *tmp;
 	AVFilterInOut *_inpads;
 	AVFilterInOut *_outpads;
 	idx = st->index;
@@ -138,8 +139,9 @@ static void prepare_output_stream(char *stream, AVStream *st,
 	for (p = jenter(jlookup(stream, "filters")); p; p = jnext(p))
 	{
 		(*pads)->name = av_strdup("out");
-		if ((err = avfilter_graph_parse_ptr(fg, jstr(p, "ERROR"), pads, 0, 0)) < 0)
-			job_failed("Parsing filter string \"%s\" failed: %s", jstr(p, 0), av_err2str(err));
+		tmp = eval_vars(jstr(p, "ERROR"));
+		if ((err = avfilter_graph_parse_ptr(fg, tmp, pads, 0, 0)) < 0)
+			job_failed("Parsing filter string \"%s\" failed: %s", tmp, av_err2str(err));
 		if ((*pads)->next)
 			job_failed("Unconnected filter pad\n");
 	}
diff --git a/util.h b/util.h
index 9531313..cf92f2d 100644
--- a/util.h
+++ b/util.h
@@ -19,6 +19,7 @@ char *json_fileinfo(char *path);
 void overwrite_check(char *path, char *srcpath, char *srchash);
 int checktime(time_t min);
 char *buildpath(char *root, char *path);
+char *eval_vars(char *p);
 
 #define WORKER_APIKEY "WORKER_APIKEY"
 #define WORKER_APIBASE "WORKER_APIBASE"
diff --git a/util/eval_vars.c b/util/eval_vars.c
new file mode 100644
index 0000000..04acf47
--- /dev/null
+++ b/util/eval_vars.c
@@ -0,0 +1,39 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../util.h"
+
+char *eval_vars(char *p)
+{
+	char *ptr;
+	size_t size;
+	FILE *stream;
+	if (!(stream = open_memstream(&ptr, &size)))
+		exit(99);
+	for (; *p; p ++)
+	{
+		if (!strncmp(p, SL("$" WORKER_RAW)))
+		{
+			p += sizeof(WORKER_RAW)-1;
+			if (getenv(WORKER_RAW))
+				fputs(getenv(WORKER_RAW), stream);
+		}
+		else if (!strncmp(p, SL("$" WORKER_RELEASED)))
+		{
+			p += sizeof(WORKER_RELEASED)-1;
+			if (getenv(WORKER_RELEASED))
+				fputs(getenv(WORKER_RELEASED), stream);
+		}
+		else if (!strncmp(p, SL("$" WORKER_TMP)))
+		{
+			p += sizeof(WORKER_TMP)-1;
+			if (getenv(WORKER_TMP))
+				fputs(getenv(WORKER_TMP), stream);
+		}
+		else
+			fputc(*p, stream);
+	}
+	fclose(stream);
+	return ptr;
+}
-- 
GitLab