# Allow more config/external/ libs built against system-wide version.

diff --git build/moz.configure/old.configure build/moz.configure/old.configure
index d0fe7accffe6..c46bdd023225 100644
--- mozilla/build/moz.configure/old.configure
+++ mozilla/build/moz.configure/old.configure
@@ -288,7 +288,12 @@ def old_configure_options(*options):
     '--with-system-libvpx',
     '--with-system-nspr',
     '--with-system-nss',
+    '--with-system-ogg',
     '--with-system-png',
+    '--with-system-soundtouch',
+    '--with-system-theora',
+    '--with-system-tremor',
+    '--with-system-vorbis',
     '--with-system-zlib',
     '--with-thumb',
     '--with-thumb-interwork',
diff --git config/Makefile.in config/Makefile.in
index a6206bb0ff30..f20987c61754 100644
--- mozilla/config/Makefile.in
+++ mozilla/config/Makefile.in
@@ -51,6 +51,11 @@ export:: $(export-preqs)
 		-DMOZ_SYSTEM_LIBEVENT=$(MOZ_SYSTEM_LIBEVENT) \
 		-DMOZ_SYSTEM_LIBVPX=$(MOZ_SYSTEM_LIBVPX) \
 		-DMOZ_SYSTEM_ICU=$(MOZ_SYSTEM_ICU) \
+		-DMOZ_SYSTEM_OGG=$(MOZ_SYSTEM_OGG) \
+		-DMOZ_SYSTEM_THEORA=$(MOZ_SYSTEM_THEORA) \
+		-DMOZ_SYSTEM_VORBIS=$(MOZ_SYSTEM_VORBIS) \
+		-DMOZ_SYSTEM_TREMOR=$(MOZ_SYSTEM_TREMOR) \
+		-DMOZ_SYSTEM_SOUNDTOUCH=$(MOZ_SYSTEM_SOUNDTOUCH) \
 		$(srcdir)/system-headers $(srcdir)/stl-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers
 	$(INSTALL) system_wrappers $(DIST)
 
diff --git config/external/moz.build config/external/moz.build
index 029ff8504795..2c3a40caa1ba 100644
--- mozilla/config/external/moz.build
+++ mozilla/config/external/moz.build
@@ -21,12 +21,21 @@ if CONFIG['MOZ_UPDATER']:
 external_dirs += ['modules/brotli']
 external_dirs += ['modules/woff2']
 
-if CONFIG['MOZ_VORBIS']:
+if not CONFIG['MOZ_SYSTEM_OGG']:
+    external_dirs += ['media/libogg']
+
+if CONFIG['MOZ_VORBIS'] and not CONFIG['MOZ_SYSTEM_VORBIS']:
     external_dirs += ['media/libvorbis']
 
-if CONFIG['MOZ_TREMOR']:
+if CONFIG['MOZ_TREMOR'] and not CONFIG['MOZ_SYSTEM_TREMOR']:
     external_dirs += ['media/libtremor']
 
+if not CONFIG['MOZ_SYSTEM_THEORA']:
+    external_dirs += ['media/libtheora']
+
+if not CONFIG['MOZ_SYSTEM_SOUNDTOUCH']:
+    external_dirs += ['media/libsoundtouch']
+
 if CONFIG['MOZ_WEBM_ENCODER']:
     external_dirs += ['media/libmkv']
 
@@ -52,12 +61,9 @@ external_dirs += [
     'media/kiss_fft',
     'media/libcubeb',
     'media/libnestegg',
-    'media/libogg',
     'media/libopus',
-    'media/libtheora',
     'media/libspeex_resampler',
     'media/libstagefright',
-    'media/libsoundtouch',
     'media/psshparser'
 ]
 
diff --git config/system-headers config/system-headers
index 5ee7f71f9634..13178ac3b3ab 100644
--- mozilla/config/system-headers
+++ mozilla/config/system-headers
@@ -1348,3 +1348,17 @@ unicode/utypes.h
 libutil.h
 unwind.h
 fenv.h
+#if MOZ_SYSTEM_OGG==1
+ogg/ogg.h
+ogg/os_types.h
+#endif
+#if MOZ_SYSTEM_THEORA==1
+theora/theoradec.h
+#endif
+#if MOZ_SYSTEM_VORBIS==1
+vorbis/codec.h
+vorbis/vorbisenc.h
+#endif
+#if MOZ_SYSTEM_TREMOR==1
+tremor/ivorbiscodec.h
+#endif
diff --git dom/media/AudioStream.cpp dom/media/AudioStream.cpp
index 93ecda4319af..ff674c64ea07 100644
--- mozilla/dom/media/AudioStream.cpp
+++ mozilla/dom/media/AudioStream.cpp
@@ -115,7 +115,9 @@ AudioStream::AudioStream(DataSource& aSource)
   : mMonitor("AudioStream")
   , mChannels(0)
   , mOutChannels(0)
+#ifndef MOZ_SYSTEM_SOUNDTOUCH
   , mTimeStretcher(nullptr)
+#endif
   , mDumpFile(nullptr)
   , mState(INITIALIZED)
   , mDataSource(aSource)
@@ -130,9 +132,11 @@ AudioStream::~AudioStream()
   if (mDumpFile) {
     fclose(mDumpFile);
   }
+#ifndef MOZ_SYSTEM_SOUNDTOUCH
   if (mTimeStretcher) {
     soundtouch::destroySoundTouchObj(mTimeStretcher);
   }
+#endif
 }
 
 size_t
@@ -151,7 +155,11 @@ nsresult AudioStream::EnsureTimeStretcherInitializedUnlocked()
 {
   mMonitor.AssertCurrentThreadOwns();
   if (!mTimeStretcher) {
+#ifdef MOZ_SYSTEM_SOUNDTOUCH
+    mTimeStretcher = new soundtouch::SoundTouch();
+#else
     mTimeStretcher = soundtouch::createSoundTouchObj();
+#endif
     mTimeStretcher->setSampleRate(mAudioClock.GetInputRate());
     mTimeStretcher->setChannels(mOutChannels);
     mTimeStretcher->setPitch(1.0);
diff --git dom/media/AudioStream.h dom/media/AudioStream.h
index 7dc1f60f95cc..67d402a4117f 100644
--- mozilla/dom/media/AudioStream.h
+++ mozilla/dom/media/AudioStream.h
@@ -16,7 +16,11 @@
 #include "mozilla/TimeStamp.h"
 #include "mozilla/UniquePtr.h"
 #include "CubebUtils.h"
+#ifdef MOZ_SYSTEM_SOUNDTOUCH
+#include "soundtouch/SoundTouch.h"
+#else
 #include "soundtouch/SoundTouchFactory.h"
+#endif
 
 namespace mozilla {
 
@@ -287,7 +291,11 @@ private:
   uint32_t mChannels;
   uint32_t mOutChannels;
   AudioClock mAudioClock;
+#ifdef MOZ_SYSTEM_SOUNDTOUCH
+  nsAutoPtr<soundtouch::SoundTouch> mTimeStretcher;
+#else
   soundtouch::SoundTouch* mTimeStretcher;
+#endif
 
   // Output file for dumping audio
   FILE* mDumpFile;
diff --git dom/media/moz.build dom/media/moz.build
index 86b051c58d33..fb6186dce78b 100644
--- mozilla/dom/media/moz.build
+++ mozilla/dom/media/moz.build
@@ -308,6 +308,21 @@ if CONFIG['MOZ_WEBRTC']:
 
 DEFINES['MOZILLA_INTERNAL_API'] = True
 
+if CONFIG['MOZ_SYSTEM_OGG']:
+    CXXFLAGS += CONFIG['MOZ_OGG_CFLAGS']
+
+if CONFIG['MOZ_SYSTEM_THEORA']:
+    CXXFLAGS += CONFIG['MOZ_THEORA_CFLAGS']
+
+if CONFIG['MOZ_SYSTEM_VORBIS']:
+    CXXFLAGS += CONFIG['MOZ_VORBIS_CFLAGS']
+
+if CONFIG['MOZ_SYSTEM_TREMOR']:
+    CXXFLAGS += CONFIG['MOZ_TREMOR_CFLAGS']
+
+if CONFIG['MOZ_SYSTEM_SOUNDTOUCH']:
+    CXXFLAGS += CONFIG['MOZ_SOUNDTOUCH_CFLAGS']
+
 if CONFIG['OS_TARGET'] == 'WINNT':
     DEFINES['WEBRTC_WIN'] = True
 else:
diff --git dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp
index 078f6ea5ef60..c600db067539 100644
--- mozilla/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp
+++ mozilla/dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp
@@ -11,9 +11,13 @@
 #include "prmem.h"
 #include "prlink.h"
 
+#ifdef MOZ_SYSTEM_SOUNDTOUCH
+#include "nsXPCOMPrivate.h" // for XUL_DLL
+#else
 // We use a known symbol located in lgpllibs to determine its location.
 // soundtouch happens to be always included in lgpllibs
 #include "soundtouch/SoundTouch.h"
+#endif
 
 namespace mozilla {
 
@@ -50,6 +54,12 @@ FFVPXRuntimeLinker::Init()
 
   sLinkStatus = LinkStatus_FAILED;
 
+#ifdef MOZ_SYSTEM_SOUNDTOUCH
+  // We retrieve the path of the XUL library as this is where mozavcodec and
+  // mozavutil libs are located.
+  char* path =
+    PR_GetLibraryFilePathname(XUL_DLL, (PRFuncPtr)&FFVPXRuntimeLinker::Init);
+#else
   // We retrieve the path of the lgpllibs library as this is where mozavcodec
   // and mozavutil libs are located.
   char* lgpllibsname = PR_GetLibraryName(nullptr, "lgpllibs");
@@ -60,6 +70,7 @@ FFVPXRuntimeLinker::Init()
     PR_GetLibraryFilePathname(lgpllibsname,
                               (PRFuncPtr)&soundtouch::SoundTouch::getVersionId);
   PR_FreeLibraryName(lgpllibsname);
+#endif
   if (!path) {
     return false;
   }
diff --git media/libogg/README_MOZILLA media/libogg/README_MOZILLA
index 6213fdc7770c..ada799916a17 100644
--- mozilla/media/libogg/README_MOZILLA
+++ mozilla/media/libogg/README_MOZILLA
@@ -6,3 +6,6 @@ package downloaded from xiph.org and copied using the update.sh script.
 The int-types.patch address a bug that config_types.h generated from
 Linux platform can't be used on OpenSolaris directly see Mozilla bug
 449754
+
+The in-tree copy may be omitted during build by --with-system-ogg.
+Keep version in old-configure.in in sync on updates.
diff --git media/libsoundtouch/README_MOZILLA media/libsoundtouch/README_MOZILLA
index dc0dbe8f6886..ea73b55e3e39 100644
--- mozilla/media/libsoundtouch/README_MOZILLA
+++ mozilla/media/libsoundtouch/README_MOZILLA
@@ -6,3 +6,5 @@ The whole library is not used, only the relevant files are imported in the tree,
 using the script `update.sh`. Some changes have been made to the files, using
 the patch `moz-libsoundtouch.patch`. We also use a custom soundtouch_config.h.
 
+The in-tree copy may be omitted during build by --with-system-soundtouch.
+Keep version in old-configure.in in sync on updates.
diff --git media/libsoundtouch/src/soundtouch_perms.h media/libsoundtouch/src/soundtouch_perms.h
index 0af2fe618311..10973564e7a4 100644
--- mozilla/media/libsoundtouch/src/soundtouch_perms.h
+++ mozilla/media/libsoundtouch/src/soundtouch_perms.h
@@ -12,7 +12,9 @@
 
 #pragma GCC visibility push(default)
 #include "SoundTouch.h"
+#ifndef MOZ_SYSTEM_SOUNDTOUCH
 #include "SoundTouchFactory.h"
+#endif
 #pragma GCC visibility pop
 
 #endif // MOZILLA_SOUNDTOUCH_PERMS_H
diff --git media/libtheora/README_MOZILLA media/libtheora/README_MOZILLA
index d48dbfa6f63d..6f30f250220e 100644
--- mozilla/media/libtheora/README_MOZILLA
+++ mozilla/media/libtheora/README_MOZILLA
@@ -3,3 +3,6 @@ using the update.sh script. The changes made were those applied by update.sh,
 the addition/update of Makefile.in files for the Mozilla build system.
 
 The subversion revision used was r17578.
+
+The in-tree copy may be omitted during build by --with-system-theora.
+Keep version in old-configure.in in sync on updates.
diff --git media/libtheora/moz.build media/libtheora/moz.build
index c7f85eebff95..aae7b814adb5 100644
--- mozilla/media/libtheora/moz.build
+++ mozilla/media/libtheora/moz.build
@@ -21,6 +21,9 @@ FINAL_LIBRARY = 'gkmedias'
 # The encoder is currently not included.
 DEFINES['THEORA_DISABLE_ENCODE'] = True
 
+if CONFIG['MOZ_SYSTEM_OGG']:
+    CFLAGS += CONFIG['MOZ_OGG_CFLAGS']
+
 # Suppress warnings in third-party code.
 if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']:
     CFLAGS += ['-Wno-type-limits']
diff --git media/libtremor/README_MOZILLA media/libtremor/README_MOZILLA
index ee67b53a05c5..81c971773d55 100644
--- mozilla/media/libtremor/README_MOZILLA
+++ mozilla/media/libtremor/README_MOZILLA
@@ -5,3 +5,6 @@ Makefile.in files for the Mozilla build system.
 
 The upstream release used was http://svn.xiph.org/trunk/Tremor/
 The subversion revision used was r17547.
+
+The in-tree copy may be omitted during build by --with-system-tremor.
+Keep version in old-configure.in in sync on updates.
diff --git media/libtremor/moz.build media/libtremor/moz.build
index 83afc8e37c64..71ef159da3d7 100644
--- mozilla/media/libtremor/moz.build
+++ mozilla/media/libtremor/moz.build
@@ -9,3 +9,5 @@ with Files('*'):
 
 DIRS += ['include/tremor', 'lib']
 
+if CONFIG['MOZ_SYSTEM_OGG']:
+    CFLAGS += CONFIG['MOZ_OGG_CFLAGS']
diff --git media/libvorbis/README_MOZILLA media/libvorbis/README_MOZILLA
index 1211ac074b33..eb31084aed25 100644
--- mozilla/media/libvorbis/README_MOZILLA
+++ mozilla/media/libvorbis/README_MOZILLA
@@ -8,3 +8,6 @@ https://svn.xiph.org/tags/vorbis/libvorbis-1.3.5@19464
 
 Some files are renamed during the copy to prevent clashes with object
 file names with other Mozilla libraries.
+
+The in-tree copy may be omitted during build by --with-system-vorbis.
+Keep version in old-configure.in in sync on updates.
diff --git media/libvorbis/moz.build media/libvorbis/moz.build
index adf393782cc9..923b76231107 100644
--- mozilla/media/libvorbis/moz.build
+++ mozilla/media/libvorbis/moz.build
@@ -56,3 +56,6 @@ FINAL_LIBRARY = 'gkmedias'
 # Suppress warnings in third-party code.
 if CONFIG['GNU_CC']:
     CFLAGS += ['-Wno-uninitialized']
+
+if CONFIG['MOZ_SYSTEM_OGG']:
+    CFLAGS += CONFIG['MOZ_OGG_CFLAGS']
diff --git old-configure.in old-configure.in
index b614eef85c89..85f9099dba4d 100644
--- mozilla/old-configure.in
+++ mozilla/old-configure.in
@@ -2941,6 +2941,111 @@ if test -n "$MOZ_OMX_PLUGIN"; then
     fi
 fi
 
+dnl ========================================================
+dnl Check for libogg
+dnl ========================================================
+
+MOZ_ARG_WITH_BOOL(system-ogg,
+[  --with-system-ogg       Use system libogg (located with pkgconfig)],
+MOZ_SYSTEM_OGG=1,
+MOZ_SYSTEM_OGG=)
+
+if test -n "$MOZ_SYSTEM_OGG"; then
+    PKG_CHECK_MODULES(MOZ_OGG, ogg >= 1.3.0)
+
+    _SAVE_LIBS=$LIBS
+    LIBS="$LIBS $MOZ_OGG_LIBS"
+    AC_CHECK_FUNC(ogg_set_mem_functions, [],
+      [AC_DEFINE(MOZ_OGG_NO_MEM_REPORTING)])
+    LIBS=$_SAVE_LIBS
+fi
+
+AC_SUBST(MOZ_SYSTEM_OGG)
+
+dnl ========================================================
+dnl Check for libvorbis
+dnl ========================================================
+
+MOZ_ARG_WITH_BOOL(system-vorbis,
+[  --with-system-vorbis    Use system libvorbis (located with pkgconfig)],
+MOZ_SYSTEM_VORBIS=1,
+MOZ_SYSTEM_VORBIS=)
+
+if test -n "$MOZ_SYSTEM_VORBIS"; then
+    PKG_CHECK_MODULES(MOZ_VORBIS, vorbis vorbisenc >= 1.3.5)
+fi
+
+AC_SUBST(MOZ_SYSTEM_VORBIS)
+
+dnl ========================================================
+dnl Check for integer-only libvorbis aka tremor
+dnl ========================================================
+
+MOZ_ARG_WITH_BOOL(system-tremor,
+[  --with-system-tremor    Use system libtremor (located with pkgconfig)],
+MOZ_SYSTEM_TREMOR=1,
+MOZ_SYSTEM_TREMOR=)
+
+if test -n "$MOZ_SYSTEM_TREMOR"; then
+    PKG_CHECK_MODULES(MOZ_TREMOR, vorbisidec >= 1.2.1)
+fi
+
+AC_SUBST(MOZ_SYSTEM_TREMOR)
+
+dnl ========================================================
+dnl Check for libtheora
+dnl ========================================================
+
+MOZ_ARG_WITH_BOOL(system-theora,
+[  --with-system-theora    Use system libtheora (located with pkgconfig)],
+MOZ_SYSTEM_THEORA=1,
+MOZ_SYSTEM_THEORA=)
+
+if test -n "$MOZ_SYSTEM_THEORA"; then
+    PKG_CHECK_MODULES(MOZ_THEORA, theora >= 1.2)
+fi
+
+AC_SUBST(MOZ_SYSTEM_THEORA)
+
+dnl ========================================================
+dnl Check for libSoundTouch
+dnl ========================================================
+
+MOZ_ARG_WITH_BOOL(system-soundtouch,
+[  --with-system-soundtouch Use system libSoundTouch (located with pkgconfig)],
+MOZ_SYSTEM_SOUNDTOUCH=1,
+MOZ_SYSTEM_SOUNDTOUCH=)
+
+if test -n "$MOZ_SYSTEM_SOUNDTOUCH"; then
+    PKG_CHECK_MODULES(MOZ_SOUNDTOUCH, soundtouch >= 1.9.0)
+
+    AC_LANG_SAVE
+    AC_LANG_CPLUSPLUS
+    _SAVE_CXXFLAGS=$CXXFLAGS
+    CXXFLAGS="$CXXFLAGS $MOZ_SOUNDTOUCH_CFLAGS"
+    AC_CACHE_CHECK(for soundtouch sample type,
+                   ac_cv_soundtouch_sample_type,
+                   [AC_TRY_COMPILE([#include <SoundTouch.h>
+                                    #ifndef SOUNDTOUCH_INTEGER_SAMPLES
+                                    #error soundtouch expects float samples
+                                    #endif],
+                                   [],
+                                   [ac_cv_soundtouch_sample_type=short],
+                                   [ac_cv_soundtouch_sample_type=float])])
+    CXXFLAGS=$_SAVE_CXXFLAGS
+    AC_LANG_RESTORE
+
+    if test \( -n "$MOZ_SAMPLE_TYPE_S16" -a "$ac_cv_soundtouch_sample_type" != short \) \
+         -o \( -n "$MOZ_SAMPLE_TYPE_FLOAT32" -a "$ac_cv_soundtouch_sample_type" != float \) ; then
+        AC_MSG_ERROR([SoundTouch library is built with incompatible sample type. Either rebuild the library with/without --enable-integer-samples, chase default Mozilla sample type or remove --with-system-soundtouch.])
+    fi
+fi
+
+if test -n "$MOZ_SYSTEM_SOUNDTOUCH"; then
+    AC_DEFINE(MOZ_SYSTEM_SOUNDTOUCH)
+fi
+AC_SUBST(MOZ_SYSTEM_SOUNDTOUCH)
+
 dnl system libvpx Support
 dnl ========================================================
 MOZ_ARG_WITH_BOOL(system-libvpx,
diff --git toolkit/library/moz.build toolkit/library/moz.build
index 079a575adec3..514d901195de 100644
--- mozilla/toolkit/library/moz.build
+++ mozilla/toolkit/library/moz.build
@@ -237,6 +237,21 @@ if CONFIG['MOZ_SYSTEM_HARFBUZZ']:
 if CONFIG['MOZ_SYSTEM_HUNSPELL']:
     OS_LIBS += CONFIG['MOZ_HUNSPELL_LIBS']
 
+if CONFIG['MOZ_SYSTEM_OGG']:
+    OS_LIBS += CONFIG['MOZ_OGG_LIBS']
+
+if CONFIG['MOZ_SYSTEM_THEORA']:
+    OS_LIBS += CONFIG['MOZ_THEORA_LIBS']
+
+if CONFIG['MOZ_SYSTEM_VORBIS']:
+    OS_LIBS += CONFIG['MOZ_VORBIS_LIBS']
+
+if CONFIG['MOZ_SYSTEM_TREMOR']:
+    OS_LIBS += CONFIG['MOZ_TREMOR_LIBS']
+
+if CONFIG['MOZ_SYSTEM_SOUNDTOUCH']:
+    OS_LIBS += CONFIG['MOZ_SOUNDTOUCH_LIBS']
+
 if CONFIG['MOZ_SYSTEM_LIBEVENT']:
     OS_LIBS += CONFIG['MOZ_LIBEVENT_LIBS']
 
diff --git xpcom/build/XPCOMInit.cpp xpcom/build/XPCOMInit.cpp
index c083ab4bc4f3..62b917043a2c 100644
--- mozilla/xpcom/build/XPCOMInit.cpp
+++ mozilla/xpcom/build/XPCOMInit.cpp
@@ -154,7 +154,9 @@ extern nsresult nsStringInputStreamConstructor(nsISupports*, REFNSIID, void**);
 
 #include "mozilla/ipc/GeckoChildProcessHost.h"
 
+#ifndef MOZ_OGG_NO_MEM_REPORTING
 #include "ogg/ogg.h"
+#endif
 #if defined(MOZ_VPX) && !defined(MOZ_VPX_NO_MEM_REPORTING)
 #if defined(HAVE_STDINT_H)
 // mozilla-config.h defines HAVE_STDINT_H, and then it's defined *again* in
@@ -664,11 +666,13 @@ NS_InitXPCOM2(nsIServiceManager** aResult,
   // this oddness.
   mozilla::SetICUMemoryFunctions();
 
+#ifndef MOZ_OGG_NO_MEM_REPORTING
   // Do the same for libogg.
   ogg_set_mem_functions(OggReporter::CountingMalloc,
                         OggReporter::CountingCalloc,
                         OggReporter::CountingRealloc,
                         OggReporter::CountingFree);
+#endif
 
 #if defined(MOZ_VPX) && !defined(MOZ_VPX_NO_MEM_REPORTING)
   // And for VPX.
