diff --git a/transcode.c b/transcode.c
index fd8da347ab2702a733a8d705dc7052760d32b347..8a03022a19680b867a0cf9b0add128768ccf4499 100644
--- a/transcode.c
+++ b/transcode.c
@@ -250,7 +250,7 @@ void connect_pads(AVFilterInOut **ins, AVFilterInOut **outs)
 int main(int argc, char *argv[])
 {
 	int err, i, progress, _progress, canceled;
-	char *p, *input, *output, *inpath, *outpath, *tmppath, *oldsrcpath;
+	char *p, *input, *output, *inpath, *outdir, *outpath, *tmppath, *oldsrcpath;
 	AVFormatContext *demux, *mux;
 	AVCodecContext **decs, **encs;
 	AVFilterContext **srcs, **sinks;
@@ -276,6 +276,9 @@ int main(int argc, char *argv[])
 	input = jlookup(argv[4], "input");
 	inpath = buildpath(getenv(WORKER_RAW), jstr(jlookup(input, "path"), 0));
 	output = jlookup(argv[4], "output");
+	outdir = buildpath(getenv(WORKER_RELEASED), dirname(jstr(jlookup(output, "path"), 0)));
+	if (access(outdir, F_OK) && mkdir(outdir, 02775))
+		job_failed("Could not create target directory \"%s\": %s", outdir, strerror(errno));
 	outpath = buildpath(getenv(WORKER_RELEASED), jstr(jlookup(output, "path"), 0));
 	tmppath = mprintf("%s/.tmp-%i", getenv(WORKER_TMP), jobid);
 	if (oldsrcpath = jstr(jlookup(argv[4], "srcpath"), 0))
@@ -283,8 +286,6 @@ int main(int argc, char *argv[])
 	else
 		oldsrcpath = "/var/empty/nosource";
 	overwrite_check(outpath, oldsrcpath, jstr(jlookup(argv[4], "srchash"), ""));
-	if (access(dirname(outpath), F_OK) && mkdir(dirname(outpath), 02775))
-		job_failed("Could not create target directory \"%s\": %s", dirname(outpath), strerror(errno));
 	demux = 0;
 	opts = 0;
 	parse_dict(&opts, jlookup(input, "options"));