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