diff --git a/contrib/bootstrap b/contrib/bootstrap
index fb81a9fe08a82e574b3de3120d49bdf5ea7e3961..4a5e4b9cc9f1dd69ff131e124ca9ffb4eb4ffa7e 100755
--- a/contrib/bootstrap
+++ b/contrib/bootstrap
@@ -26,6 +26,7 @@ usage()
 	echo "  --prefix=PREFIX     install files in PREFIX"
 	echo "  --no-checksums      don't verify checksums (allows to replace tarballs)"
 	echo "  --disable-downloads don't download packages from the internet"
+        echo '  --cache-dir=DIR     the directory where contrib tarballs are cached'
 	echo "  --enable-debug      build with debug symbol and extra checks (disabled by default)"
 	echo "  --disable-FOO       configure to not build package FOO"
 	echo "  --enable-FOO        configure to build package FOO"
@@ -36,6 +37,7 @@ HOST=
 PREFIX=
 PKGS_ENABLE=
 PKGS_DISABLE=
+CONF_TARBALLS=
 
 if test ! -f "../../contrib/src/main.mak"
 then
@@ -59,6 +61,9 @@ do
 		--disable-downloads)
 			DISABLE_CONTRIB_DOWNLOADS="TRUE"
 			;;
+                --cache-dir=*)
+			CONF_TARBALLS="${1#--cache-dir=}"
+			;;
 		--enable-debug)
 			ENABLE_DEBUG=1
 			;;
@@ -122,6 +127,7 @@ PKGS_DISABLE := $PKGS_DISABLE
 PKGS_ENABLE := $PKGS_ENABLE
 DISABLE_CONTRIB_DOWNLOADS := $DISABLE_CONTRIB_DOWNLOADS
 DISABLE_CONTRIB_CHECKSUMS := $DISABLE_CONTRIB_CHECKSUMS
+CONF_TARBALLS := $CONF_TARBALLS
 ENABLE_DEBUG := $ENABLE_DEBUG
 EOF
 
diff --git a/contrib/src/ffmpeg/rules.mak b/contrib/src/ffmpeg/rules.mak
index d82e60242f726f9443908fa7537202abd5bacfea..ca450becf14d36c3e5f07c1ea7b86c712c6168d9 100644
--- a/contrib/src/ffmpeg/rules.mak
+++ b/contrib/src/ffmpeg/rules.mak
@@ -342,7 +342,7 @@ $(TARBALLS)/ffmpeg-$(FFMPEG_HASH).tar.gz:
 ffmpeg: ffmpeg-$(FFMPEG_HASH).tar.gz
 	rm -Rf $@ $@-$(FFMPEG_HASH)
 	mkdir -p $@-$(FFMPEG_HASH)
-	(cd $@-$(FFMPEG_HASH) && tar x $(if ${BATCH_MODE},,-v) --strip-components=1 -f ../$<)
+	(cd $@-$(FFMPEG_HASH) && tar x $(if ${BATCH_MODE},,-v) --strip-components=1 -f $<)
 	$(APPLY) $(SRC)/ffmpeg/remove-mjpeg-log.patch
 	$(APPLY) $(SRC)/ffmpeg/change-RTCP-ratio.patch
 	$(APPLY) $(SRC)/ffmpeg/rtp_ext_abs_send_time.patch
diff --git a/contrib/src/main.mak b/contrib/src/main.mak
index e77981f054c0f93baf233793601ff183fd91b18e..752dfc045552e755a8f2f56fbb6250ccdd0ce0a8 100644
--- a/contrib/src/main.mak
+++ b/contrib/src/main.mak
@@ -23,10 +23,15 @@ all: install
 # bootstrap configuration
 include config.mak
 
-TOPSRC ?= ../../contrib
-TOPDST ?= ..
+TOPSRC ?= $(abspath ../../contrib)
+TOPDST ?= $(abspath ..)
 SRC := $(TOPSRC)/src
-TARBALLS := $(TOPSRC)/tarballs
+
+# Resolves TARBALLS using the following precedence rules:
+# 1. Environment variable
+# 2. Configured value at bootstrap time
+# 3. Default value
+TARBALLS := $(or $(TARBALLS),$(CONF_TARBALLS),$(TOPSRC)/tarballs)
 
 PATH :=$(abspath ../../extras/tools/build/bin):$(PATH)
 export PATH
diff --git a/contrib/src/onnx/rules.mak b/contrib/src/onnx/rules.mak
index c631564f4c23d6d6ac2eb131229903eae0890357..5c06e4e86609154d68edb3630c04cdaa18a9ad8d 100644
--- a/contrib/src/onnx/rules.mak
+++ b/contrib/src/onnx/rules.mak
@@ -12,7 +12,7 @@ $(TARBALLS)/onnxruntime-$(ONNX_VERSION).tar.xz:
 onnx: onnxruntime-$(ONNX_VERSION).tar.xz .sum-onnx
 	rm -Rf $@
 	mkdir -p $@
-	(cd $@ && tar x --strip-components=1 -f ../$<)
+	(cd $@ && tar x --strip-components=1 -f $<)
 
 .onnx:  onnx
 ifdef HAVE_ANDROID
diff --git a/contrib/src/vpx/rules.mak b/contrib/src/vpx/rules.mak
index 75bbdb5ceab6eb5991f322ba91d2aaa86b2b0e8c..e663f1f879f02fc49fe8cebd190fd7ccd4482682 100644
--- a/contrib/src/vpx/rules.mak
+++ b/contrib/src/vpx/rules.mak
@@ -11,7 +11,7 @@ $(TARBALLS)/libvpx-$(VPX_HASH).tar.gz:
 libvpx: libvpx-$(VPX_HASH).tar.gz .sum-vpx
 	rm -Rf $@-$(VPX_HASH)
 	mkdir -p $@-$(VPX_HASH)
-	(cd $@-$(VPX_HASH) && tar x $(if ${BATCH_MODE},,-v) --strip-components=1 -f ../$<)
+	(cd $@-$(VPX_HASH) && tar x $(if ${BATCH_MODE},,-v) --strip-components=1 -f $<)
 	$(MOVE)
 
 DEPS_vpx =
diff --git a/contrib/src/x264/rules.mak b/contrib/src/x264/rules.mak
index a83e8e8c137a3b1058e057920b1b8b81ccd6f93c..fae3f4292d6001663c9f6c56e24caad5cc447c7d 100644
--- a/contrib/src/x264/rules.mak
+++ b/contrib/src/x264/rules.mak
@@ -50,7 +50,7 @@ $(TARBALLS)/x264-$(X264_HASH).tar.xz:
 x264: x264-$(X264_HASH).tar.xz .sum-x264
 	rm -Rf $@-$(X264_HASH)
 	mkdir -p $@-$(X264_HASH)
-	(cd $@-$(X264_HASH) && tar x $(if ${BATCH_MODE},,-v) --strip-components=1 -f ../$<)
+	(cd $@-$(X264_HASH) && tar x $(if ${BATCH_MODE},,-v) --strip-components=1 -f $<)
 ifdef HAVE_IOS
 	$(APPLY) $(SRC)/x264/remove-align.patch
 endif