Index: head/Mk/Uses/gecko.mk =================================================================== --- head/Mk/Uses/gecko.mk (revision 438263) +++ head/Mk/Uses/gecko.mk (revision 438264) @@ -1,127 +1,127 @@ # $FreeBSD$ # # Handle dependency of different gecko based applications # # MAINTAINER: gecko@FreeBSD.org # # Feature: gecko # Usage: USES=gecko or USES=gecko:ARGS # Valid ARGS: libxul, firefox, seamonkey, thunderbird # in case the first argument is not libxul # The following arguments are available # - build: also add the dependency as a build # dependency # - [0-9][0-9][+]?: a version optionnally # followed by a + # .if !defined(_INCLUDE_USES_GECKO_MK) _INCLUDE_USES_GECKO_MK= yes .if empty(gecko_ARGS) gecko_ARGS= libxul .endif _GECKO_VERSION= ${gecko_ARGS:M[0-9][0-9]*} .if ${gecko_ARGS:Mlibxul} # Compat with older versions GECKO= libxul GECKO_CONFING?= ${LOCALBASE}/bin/${GECKO}-config XPIDL?= ${LOCALBASE}/lib/${GECKO}/xpidl XPIDL_INCL?= `${GECKO_CONFIG} --idlflags` BUILD_DEPENDS+= libxul>=45:www/libxul RUN_DEPENDS+= libxul>=45:www/libxul .elif ${gecko_ARGS:Mfirefox} _GECKO_DEFAULT_VERSION= 45 -_GECKO_VERSIONS= 45 52 +_GECKO_VERSIONS= 45 53 _GECKO_TYPE= firefox # Dependence lines for different Firefox versions 45_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox-esr -52_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox +53_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox .if exists(${LOCALBASE}/bin/firefox) _GECKO_INSTALLED_VER!= ${LOCALBASE}/bin/firefox --version 2>/dev/null _GECKO_INSTALLED_VER:= ${_GECKO_INSTALLED_VER:M[0-9][0-9]*:C/([0-9][0-9]).*/\1/g} .endif .elif ${gecko_ARGS:Mseamonkey} _GECKO_DEFAULT_VERSION= 46 _GECKO_VERSIONS= 46 _GECKO_TYPE= seamonkey .if exists(${LOCALBASE}/bin/seamonkey) _GECKO_INSTALLED_VER!= ${LOCALBASE}/bin/seamonkey --version 2>/dev/null _GECKO_INSTALLED_VER:= ${_GECKO_INSTALLED_VER:M[0-9]*:C/[0-9].([0-9][0-9]).*/\1/g} .endif # Dependence lines for different Seamonkey versions 46_DEPENDS= ${LOCALBASE}/lib/seamonkey/seamonkey:www/seamonkey .elif ${gecko_ARGS:Mthunderbird} _GECKO_DEFAULT_VERSION= 52 _GECKO_VERSIONS= 52 _GECKO_TYPE= thunderbird .if exists(${LOCALBASE}/bin/thunderbird) _GECKO_INSTALLED_VER!= ${LOCALBASE}/bin/thunderbird --version 2>/dev/null _GECKO_INSTALLED_VER:= ${_GECKO_INSTALLED_VER:M[0-9][0-9]*:C/([0-9][0-9]).*/\1/g} .endif # Dependence lines for different Thunderbird versions 52_DEPENDS= ${LOCALBASE}/lib/thunderbird/thunderbird:mail/thunderbird .else IGNORE= Unknown type of gecko dependency you may specify either libxul, firefox, seamonkey or thunderbird .endif .if defined(_GECKO_TYPE) .if ${_GECKO_VERSION:M*+} _GECKO_MIN_VERSION:= ${_GECKO_VERSION:S/+//} _GECKO_WANTED_VERSIONS:= ${_GECKO_DEFAULT_VERSION} .endif .if ${_GECKO_VERSION:M[0-9][0-9]} _GECKO_WANTED_VERSIONS:= ${_GECKO_VERSION:M[0-9][0-9]} .endif _GECKO_WANTED_VERSIONS?= ${_GECKO_DEFAULT_VERSION} .if defined(_GECKO_MIN_VERSION) . for _v in ${_GECKO_VERSIONS} . if ${_GECKO_MIN_VERSION} <= ${_v} _GECKO_WANTED_VERSIONS+= ${_v} . endif . endfor .endif .for _v in ${_GECKO_WANTED_VERSIONS:O:u} _GECKO_HIGHEST_VERSION:= ${_v} .if defined(_GECKO_INSTALLED_VER) && ${_GECKO_INSTALLED_VER} == ${_v} _GECKO_WANTED_VERSION:= ${_v} .endif .endfor .if !defined(_GECKO_WANTED_VERSION) .if defined(_GECKO_INSTALLED_VER) IGNORE= cannot install: ${_GECKO_TYPE} versions mismatch: ${_GECKO_TYPE}-${_GECKO_INSTALLED_VER} is installed and wanted version is ${_GECKO_TYPE}-${_GECKO_VERSION:M[0-9][0-9]} .else _GECKO_WANTED_VERSION:= ${_GECKO_HIGHEST_VERSION} .endif .endif .if ${gecko_ARGS:Mbuild} BUILD_DEPENDS+= ${${_GECKO_WANTED_VERSION}_DEPENDS} .endif RUN_DEPENDS+= ${${_GECKO_WANTED_VERSION}_DEPENDS} .endif .endif Index: head/www/firefox/Makefile =================================================================== --- head/www/firefox/Makefile (revision 438263) +++ head/www/firefox/Makefile (revision 438264) @@ -1,78 +1,78 @@ # Created by: Alan Eldridge # $FreeBSD$ PORTNAME= firefox -DISTVERSION= 52.0.2 +DISTVERSION= 53.0 DISTVERSIONSUFFIX=.source PORTEPOCH= 1 CATEGORIES= www ipv6 MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \ - MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build1/source + MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build3/source MAINTAINER= gecko@FreeBSD.org COMMENT= Web browser based on the browser portion of Mozilla BUILD_DEPENDS= nspr>=4.13.1:devel/nspr \ nss>=3.28.3:security/nss \ libevent>=2.0.21_2:devel/libevent \ harfbuzz>=1.4.1:print/harfbuzz \ graphite2>=1.3.8:graphics/graphite2 \ png>=1.6.25:graphics/png \ libvorbis>=1.3.5,3:audio/libvorbis \ libvpx>=1.5.0:multimedia/libvpx \ sqlite3>=3.17.0:databases/sqlite3 \ ${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3 \ v4l_compat>0:multimedia/v4l_compat \ autoconf-2.13:devel/autoconf213 \ yasm:devel/yasm \ zip:archivers/zip # soundtouch>=1.9.0:audio/soundtouch \ LIB_DEPENDS= libv4l2.so:multimedia/libv4l USE_GECKO= gecko CONFLICTS_INSTALL= firefox-esr-45.* firefox-esr-3[18].* firefox-esr-24.* MOZ_PKGCONFIG_FILES= # empty USE_MOZILLA= -soundtouch MOZILLA_NAME= Firefox USE_GL= gl USES= tar:xz FIREFOX_ICON= ${MOZILLA}.png FIREFOX_ICON_SRC= ${PREFIX}/lib/${MOZILLA}/browser/chrome/icons/default/default48.png MOZ_OPTIONS= --enable-application=browser \ --enable-official-branding OPTIONS_DEFINE= RUST OPTIONS_DEFAULT= BUNDLED_CAIRO GTK3 # XXX lang/rust and devel/cargo currently build only on these platforms OPTIONS_DEFAULT_amd64= RUST OPTIONS_DEFAULT_i386= RUST OPTIONS_SINGLE+= TOOLKIT OPTIONS_SINGLE_TOOLKIT= GTK2 GTK3 .include "${.CURDIR}/../../www/firefox/Makefile.options" WRKSRC:= ${WRKDIR}/${PORTNAME}-${DISTVERSION} post-extract: @${SED} -e 's|@FIREFOX_ICON@|${FIREFOX_ICON}|' -e 's|@MOZILLA@|${MOZILLA}|' \ -e 's|@MOZILLA_NAME@|${MOZILLA_NAME}|' \ <${FILESDIR}/firefox.desktop.in >${WRKDIR}/${MOZILLA}.desktop post-patch: @${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \ ${WRKSRC}/browser/app/nsBrowserApp.cpp pre-configure: (cd ${WRKSRC} && ${LOCALBASE}/bin/autoconf-2.13) (cd ${WRKSRC}/js/src/ && ${LOCALBASE}/bin/autoconf-2.13) post-install: ${MKDIR} ${STAGEDIR}${PREFIX}/share/pixmaps ${INSTALL_DATA} ${WRKDIR}/${MOZILLA}.desktop ${STAGEDIR}${PREFIX}/share/applications/ ${LN} -sf ${FIREFOX_ICON_SRC} ${STAGEDIR}${PREFIX}/share/pixmaps/${FIREFOX_ICON} .include Index: head/www/firefox/distinfo =================================================================== --- head/www/firefox/distinfo (revision 438263) +++ head/www/firefox/distinfo (revision 438264) @@ -1,3 +1,3 @@ -TIMESTAMP = 1490348850 -SHA256 (firefox-52.0.2.source.tar.xz) = 2927a9a097be69338ed2a4aa94f063669e447e59fbcd28da76c7bb180ed16230 -SIZE (firefox-52.0.2.source.tar.xz) = 211407880 +TIMESTAMP = 1491914864 +SHA256 (firefox-53.0.source.tar.xz) = 757a24781799c6a8d70bc9e423fb09c1e37500440f2918b08ca0a0427215315a +SIZE (firefox-53.0.source.tar.xz) = 215111080 Index: head/www/firefox/files/patch-toolkit_mozapps_installer_packager_mk =================================================================== --- head/www/firefox/files/patch-toolkit_mozapps_installer_packager_mk (revision 438263) +++ head/www/firefox/files/patch-toolkit_mozapps_installer_packager_mk (nonexistent) @@ -1,13 +0,0 @@ -$OpenBSD: patch-toolkit_mozapps_installer_packager_mk,v 1.11 2012/06/11 15:29:56 landry Exp $ -install headers/idl/sdk libs only if xulrunner ---- toolkit/mozapps/installer/packager.mk.orig Fri Jun 1 14:04:20 2012 -+++ toolkit/mozapps/installer/packager.mk Tue Jun 5 07:55:51 2012 -@@ -127,7 +127,7 @@ endif - $(NSINSTALL) -D $(DESTDIR)$(bindir) - $(RM) -f $(DESTDIR)$(bindir)/$(MOZ_APP_NAME) - ln -s $(installdir)/$(MOZ_APP_NAME) $(DESTDIR)$(bindir) --ifdef INSTALL_SDK # Here comes the hard part -+ifeq ($(MOZ_APP_NAME),xulrunner) - $(NSINSTALL) -D $(DESTDIR)$(includedir) - (cd $(DIST)/include && tar $(TAR_CREATE_FLAGS) - .) | \ - (cd $(DESTDIR)$(includedir) && tar -xf -) Property changes on: head/www/firefox/files/patch-toolkit_mozapps_installer_packager_mk ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -yes \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/www/firefox/files/patch-bug1322112 =================================================================== --- head/www/firefox/files/patch-bug1322112 (revision 438263) +++ head/www/firefox/files/patch-bug1322112 (nonexistent) @@ -1,23 +0,0 @@ ---- image/decoders/nsIconDecoder.cpp -+++ image/decoders/nsIconDecoder.cpp -@@ -89,17 +89,18 @@ nsIconDecoder::ReadRowOfPixels(const cha - { - MOZ_ASSERT(aLength % 4 == 0, "Rows should contain a multiple of four bytes"); - - auto result = mPipe.WritePixels([&]() -> NextPixel { - if (aLength == 0) { - return AsVariant(WriteState::NEED_MORE_DATA); // Done with this row. - } - -- uint32_t pixel = *reinterpret_cast(aData); -+ uint32_t pixel; -+ memcpy(&pixel, aData, 4); - aData += 4; - aLength -= 4; - - return AsVariant(pixel); - }); - - MOZ_ASSERT(result != WriteState::FAILURE); - - Property changes on: head/www/firefox/files/patch-bug1322112 ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -yes \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/www/firefox/files/patch-bug1321877 =================================================================== --- head/www/firefox/files/patch-bug1321877 (revision 438263) +++ head/www/firefox/files/patch-bug1321877 (nonexistent) @@ -1,42 +0,0 @@ -commit a13d95795217 -Author: -Date: Thu Dec 8 18:20:12 2016 -0600 - - Bug 1321877. Fix compiler warnings in Downscaler.h when skia is not enabled. r=tnikkel ---- - image/Downscaler.h | 11 +++++++---- - 1 file changed, 7 insertions(+), 4 deletions(-) - -diff --git image/Downscaler.h image/Downscaler.h -index 21179a38f200..0bdef0eaa646 100644 ---- image/Downscaler.h -+++ image/Downscaler.h -@@ -154,14 +154,14 @@ private: - class Downscaler - { - public: -- explicit Downscaler(const nsIntSize&) -+ explicit Downscaler(const nsIntSize&) : mScale(1.0, 1.0) - { - MOZ_RELEASE_ASSERT(false, "Skia is not enabled"); - } - -- const nsIntSize& OriginalSize() const { return nsIntSize(); } -- const nsIntSize& TargetSize() const { return nsIntSize(); } -- const gfxSize& Scale() const { return gfxSize(1.0, 1.0); } -+ const nsIntSize& OriginalSize() const { return mSize; } -+ const nsIntSize& TargetSize() const { return mSize; } -+ const gfxSize& Scale() const { return mScale; } - - nsresult BeginFrame(const nsIntSize&, const Maybe&, uint8_t*, bool, bool = false) - { -@@ -177,6 +177,9 @@ public: - DownscalerInvalidRect TakeInvalidRect() { return DownscalerInvalidRect(); } - void ResetForNextProgressivePass() { } - const nsIntSize FrameSize() const { return nsIntSize(0, 0); } -+private: -+ nsIntSize mSize; -+ gfxSize mScale; - }; - - #endif // MOZ_ENABLE_SKIA Property changes on: head/www/firefox/files/patch-bug1321877 ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -yes \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/www/firefox/files/patch-bug1322660 =================================================================== --- head/www/firefox/files/patch-bug1322660 (revision 438263) +++ head/www/firefox/files/patch-bug1322660 (nonexistent) @@ -1,80 +0,0 @@ ---- modules/woff2/src/store_bytes.h -+++ modules/woff2/src/store_bytes.h -@@ -29,41 +29,44 @@ inline size_t StoreU32(uint8_t* dst, size_t offset, uint32_t x) { - dst[offset + 1] = x >> 16; - dst[offset + 2] = x >> 8; - dst[offset + 3] = x; - return offset + 4; - } - - inline size_t Store16(uint8_t* dst, size_t offset, int x) { - #if (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) -- *reinterpret_cast(dst + offset) = -- ((x & 0xFF) << 8) | ((x & 0xFF00) >> 8); -+ uint16_t v = ((x & 0xFF) << 8) | ((x & 0xFF00) >> 8); -+ memcpy(dst + offset, &v, 2); - #elif (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) -- *reinterpret_cast(dst + offset) = static_cast(x); -+ uint16_t v = static_cast(x); -+ memcpy(dst + offset, &v, 2); - #else - dst[offset] = x >> 8; - dst[offset + 1] = x; - #endif - return offset + 2; - } - - inline void StoreU32(uint32_t val, size_t* offset, uint8_t* dst) { - dst[(*offset)++] = val >> 24; - dst[(*offset)++] = val >> 16; - dst[(*offset)++] = val >> 8; - dst[(*offset)++] = val; - } - - inline void Store16(int val, size_t* offset, uint8_t* dst) { - #if (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) -- *reinterpret_cast(dst + *offset) = -+ uint16_t v = ((val & 0xFF) << 8) | ((val & 0xFF00) >> 8); -+ memcpy(dst + *offset, &v, 2); - ((val & 0xFF) << 8) | ((val & 0xFF00) >> 8); - *offset += 2; - #elif (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) -- *reinterpret_cast(dst + *offset) = static_cast(val); -+ uint16_t v = static_cast(val); -+ memcpy(dst + *offset, &v, 2); - *offset += 2; - #else - dst[(*offset)++] = val >> 8; - dst[(*offset)++] = val; - #endif - } - - inline void StoreBytes(const uint8_t* data, size_t len, ---- modules/woff2/src/woff2_common.cc -+++ modules/woff2/src/woff2_common.cc -@@ -20,22 +20,23 @@ - - namespace woff2 { - - - uint32_t ComputeULongSum(const uint8_t* buf, size_t size) { - uint32_t checksum = 0; - size_t aligned_size = size & ~3; - for (size_t i = 0; i < aligned_size; i += 4) { -+ uint32_t v; -+ memcpy(&v, buf + i, 4); - #if (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) -- uint32_t v = *reinterpret_cast(buf + i); - checksum += (((v & 0xFF) << 24) | ((v & 0xFF00) << 8) | - ((v & 0xFF0000) >> 8) | ((v & 0xFF000000) >> 24)); - #elif (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) -- checksum += *reinterpret_cast(buf + i); -+ checksum += v; - #else - checksum += (buf[i] << 24) | (buf[i + 1] << 16) | - (buf[i + 2] << 8) | buf[i + 3]; - #endif - } - - // treat size not aligned on 4 as if it were padded to 4 with 0's - if (size != aligned_size) { Property changes on: head/www/firefox/files/patch-bug1322660 ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -yes \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/www/firefox/files/patch-bug1013882 =================================================================== --- head/www/firefox/files/patch-bug1013882 (revision 438263) +++ head/www/firefox/files/patch-bug1013882 (nonexistent) @@ -1,69 +0,0 @@ -diff --git b2g/installer/Makefile.in b2g/installer/Makefile.in -index 754312a..c69904c 100644 ---- b2g/installer/Makefile.in -+++ b2g/installer/Makefile.in -@@ -101,6 +101,10 @@ ifneq (,$(filter rtsp,$(NECKO_PROTOCOLS) - DEFINES += -DMOZ_RTSP - endif - -+ifdef MOZ_DEBUG -+DEFINES += -DMOZ_DEBUG=1 -+endif -+ - DEFINES += -DMOZ_ICU_VERSION=$(MOZ_ICU_VERSION) - ifdef MOZ_SYSTEM_ICU - DEFINES += -DMOZ_SYSTEM_ICU -diff --git b2g/installer/package-manifest.in b2g/installer/package-manifest.in -index 17d433c..0416187 100644 ---- b2g/installer/package-manifest.in -+++ b2g/installer/package-manifest.in -@@ -660,7 +660,7 @@ - @RESPATH@/components/EngineeringModeAPI.js - @RESPATH@/components/EngineeringModeService.js - --#ifdef MOZ_DEBUG -+#if defined(ENABLE_TESTS) && defined(MOZ_DEBUG) - @RESPATH@/components/TestInterfaceJS.js - @RESPATH@/components/TestInterfaceJS.manifest - #endif -diff --git browser/installer/package-manifest.in browser/installer/package-manifest.in -index b509fd4..195345c 100644 ---- browser/installer/package-manifest.in -+++ browser/installer/package-manifest.in -@@ -608,7 +608,7 @@ - @RESPATH@/components/MozKeyboard.js - @RESPATH@/components/InputMethod.manifest - --#ifdef MOZ_DEBUG -+#if defined(ENABLE_TESTS) && defined(MOZ_DEBUG) - @RESPATH@/components/TestInterfaceJS.js - @RESPATH@/components/TestInterfaceJS.manifest - #endif -diff --git mobile/android/installer/Makefile.in mobile/android/installer/Makefile.in -index 96dceab..3528ad6 100644 ---- mobile/android/installer/Makefile.in -+++ mobile/android/installer/Makefile.in -@@ -41,6 +41,10 @@ BINPATH = bin - endif - DEFINES += -DBINPATH=$(BINPATH) - -+ifdef MOZ_DEBUG -+DEFINES += -DMOZ_DEBUG=1 -+endif -+ - ifdef ENABLE_MARIONETTE - DEFINES += -DENABLE_MARIONETTE=1 - endif -diff --git mobile/android/installer/package-manifest.in mobile/android/installer/package-manifest.in -index 994580b..cf142df 100644 ---- mobile/android/installer/package-manifest.in -+++ mobile/android/installer/package-manifest.in -@@ -440,7 +440,7 @@ - @BINPATH@/components/dom_webspeechsynth.xpt - #endif - --#ifdef MOZ_DEBUG -+#if defined(ENABLE_TESTS) && defined(MOZ_DEBUG) - @BINPATH@/components/TestInterfaceJS.js - @BINPATH@/components/TestInterfaceJS.manifest - #endif Property changes on: head/www/firefox/files/patch-bug1013882 ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -yes \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/www/firefox/files/patch-bug1316879 =================================================================== --- head/www/firefox/files/patch-bug1316879 (revision 438263) +++ head/www/firefox/files/patch-bug1316879 (nonexistent) @@ -1,11 +0,0 @@ -diff --git build/buildconfig.py build/buildconfig.py -index bb12114b2f4a..e73903a1a981 100644 ---- build/buildconfig.py -+++ build/buildconfig.py -@@ -16,5 +16,5 @@ for var in ('topsrcdir', 'topobjdir', 'defines', 'non_global_defines', - substs = dict(substs) - - for var in os.environ: -- if var != 'SHELL' and var in substs: -+ if var not in ('CPP', 'CXXCPP', 'SHELL') and var in substs: - substs[var] = os.environ[var] Property changes on: head/www/firefox/files/patch-bug1316879 ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -yes \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/www/firefox/files/patch-bug1336791 =================================================================== --- head/www/firefox/files/patch-bug1336791 (revision 438263) +++ head/www/firefox/files/patch-bug1336791 (nonexistent) @@ -1,21 +0,0 @@ -# Allow readelf to print types without parentheses - ---- toolkit/library/dependentlibs.py -+++ toolkit/library/dependentlibs.py -@@ -57,11 +57,15 @@ def dependentlibs_readelf(lib): - for line in proc.stdout: - # Each line has the following format: - # tag (TYPE) value -+ # or with BSD readelf: -+ # tag TYPE value - # Looking for NEEDED type entries - tmp = line.split(' ', 3) -- if len(tmp) > 3 and tmp[2] == '(NEEDED)': -+ if len(tmp) > 3 and 'NEEDED' in tmp[2]: - # NEEDED lines look like: - # 0x00000001 (NEEDED) Shared library: [libname] -+ # or with BSD readelf: -+ # 0x00000001 NEEDED Shared library: [libname] - match = re.search('\[(.*)\]', tmp[3]) - if match: - deps.append(match.group(1)) Property changes on: head/www/firefox/files/patch-bug1336791 ___________________________________________________________________ Deleted: fbsd:nokeywords ## -1 +0,0 ## -yes \ No newline at end of property Deleted: svn:eol-style ## -1 +0,0 ## -native \ No newline at end of property Deleted: svn:mime-type ## -1 +0,0 ## -text/plain \ No newline at end of property Index: head/www/firefox/files/patch-bug1021761 =================================================================== --- head/www/firefox/files/patch-bug1021761 (revision 438263) +++ head/www/firefox/files/patch-bug1021761 (revision 438264) @@ -1,1157 +1,1222 @@ diff --git build/moz.configure/old.configure build/moz.configure/old.configure -index b95dd2b..4cbefd5 100644 +index cd6c37cf4c7c..e98dc7973a6a 100644 --- build/moz.configure/old.configure +++ build/moz.configure/old.configure -@@ -305,6 +305,7 @@ def old_configure_options(*options): +@@ -275,6 +275,7 @@ def old_configure_options(*options): '--with-nspr-prefix', '--with-nss-exec-prefix', '--with-nss-prefix', + '--with-oss', '--with-pthreads', '--with-qemu-exe', - '--with-servo', -diff --git old-configure.in configure.in -index 48e60c0..ec08417 100644 + '--with-sixgill', +diff --git old-configure.in old-configure.in +index dff46614635e..dbbfdb76ab78 100644 --- old-configure.in +++ old-configure.in -@@ -5591,6 +5591,67 @@ fi +@@ -3128,6 +3128,67 @@ AC_DEFINE(MOZ_WEBM_ENCODER) AC_SUBST(MOZ_WEBM_ENCODER) dnl ================================== +dnl = Check OSS availability +dnl ================================== + +dnl If using Linux, Solaris or BSDs, ensure that OSS is available +case "$OS_TARGET" in +Linux|SunOS|DragonFly|FreeBSD|NetBSD|GNU/kFreeBSD) + MOZ_OSS=1 + ;; +esac + +MOZ_ARG_WITH_STRING(oss, +[ --with-oss[=PFX] Enable OpenSoundSystem support [installed at prefix PFX]], + OSSPREFIX=$withval) + +if test -n "$OSSPREFIX"; then + if test "$OSSPREFIX" != "no"; then + MOZ_OSS=1 + else + MOZ_OSS= + fi +fi + +_SAVE_CFLAGS=$CFLAGS +_SAVE_LIBS=$LIBS +if test -n "$MOZ_OSS"; then + dnl Prefer 4Front implementation + AC_MSG_CHECKING([MOZ_OSS_CFLAGS]) + if test "$OSSPREFIX" != "yes"; then + oss_conf=${OSSPREFIX%/usr}/etc/oss.conf + if test -f "$oss_conf"; then + . "$oss_conf" + else + OSSLIBDIR=$OSSPREFIX/lib/oss + fi + if test -d "$OSSLIBDIR"; then + MOZ_OSS_CFLAGS="$MOZ_OSS_CFLAGS -I$OSSLIBDIR/include" + fi + fi + AC_MSG_RESULT([$MOZ_OSS_CFLAGS]) + + CFLAGS="$CFLAGS $MOZ_OSS_CFLAGS" + MOZ_CHECK_HEADERS(sys/soundcard.h soundcard.h) + + if test "$ac_cv_header_sys_soundcard_h" != "yes" -a \ + "$ac_cv_header_soundcard_h" != "yes"; then + AC_MSG_ERROR([Need OSS for Ogg, Wave or WebM decoding on $OS_TARGET. Disable with --without-oss.]) + fi + + dnl Assume NetBSD implementation over SunAudio + AC_CHECK_LIB(ossaudio, _oss_ioctl, + [AC_DEFINE_UNQUOTED(CUBEB_OSS_DEFAULT_OUTPUT, "/dev/sound") + MOZ_OSS_LIBS="$MOZ_OSS_LIBS -lossaudio"]) +fi +CFLAGS=$_SAVE_CFLAGS +LIBS=$_SAVE_LIBS + +AC_SUBST(MOZ_OSS) +AC_SUBST_LIST(MOZ_OSS_CFLAGS) +AC_SUBST_LIST(MOZ_OSS_LIBS) + +dnl ================================== dnl = Check alsa availability on Linux dnl ================================== +diff --git dom/media/CubebUtils.cpp dom/media/CubebUtils.cpp +index e10e07e06ade..1fd561bea113 100644 +--- dom/media/CubebUtils.cpp ++++ dom/media/CubebUtils.cpp +@@ -71,7 +71,8 @@ const char* AUDIOSTREAM_BACKEND_ID_STR[] = { + "sndio", + "opensl", + "audiotrack", +- "kai" ++ "kai", ++ "oss", + }; + /* Index for failures to create an audio stream the first time. */ + const int CUBEB_BACKEND_INIT_FAILURE_FIRST = diff --git media/libcubeb/AUTHORS media/libcubeb/AUTHORS -index b441e8a..950d9e5 100644 +index 0fde65baad34..f8663c43b475 100644 --- media/libcubeb/AUTHORS +++ media/libcubeb/AUTHORS -@@ -4,3 +4,4 @@ Michael Wu +@@ -4,6 +4,7 @@ Michael Wu Paul Adenot David Richards Sebastien Alaiwan +Evgeniy Vodolazskiy + KO Myung-Hun + Haakon Sporsheim + Alex Chronopoulos diff --git media/libcubeb/src/cubeb.c media/libcubeb/src/cubeb.c -index 9c3adcc..45d765b 100644 +index 57bcb4c13652..68be024f4a68 100644 --- media/libcubeb/src/cubeb.c +++ media/libcubeb/src/cubeb.c -@@ -54,6 +54,9 @@ int opensl_init(cubeb ** context, char const * context_name); - #if defined(USE_AUDIOTRACK) - int audiotrack_init(cubeb ** context, char const * context_name); +@@ -54,6 +54,9 @@ int audiotrack_init(cubeb ** context, char const * context_name); + #if defined(USE_KAI) + int kai_init(cubeb ** context, char const * context_name); #endif +#if defined(USE_OSS) +int oss_init(cubeb ** context, char const * context_name); +#endif - int - validate_stream_params(cubeb_stream_params stream_params) -@@ -120,6 +123,9 @@ cubeb_init(cubeb ** context, char const * context_name) - #if defined(USE_AUDIOTRACK) - audiotrack_init, + static int + validate_stream_params(cubeb_stream_params * input_stream_params, +@@ -138,6 +141,9 @@ cubeb_init(cubeb ** context, char const * context_name) + #if defined(USE_KAI) + kai_init, #endif +#if defined(USE_OSS) + oss_init, +#endif }; int i; diff --git media/libcubeb/src/cubeb_alsa.c media/libcubeb/src/cubeb_alsa.c -index a962553..1f780f4 100644 +index 05ad27fef53b..3ea78e994f59 100644 --- media/libcubeb/src/cubeb_alsa.c +++ media/libcubeb/src/cubeb_alsa.c -@@ -11,6 +11,7 @@ +@@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include -@@ -24,6 +25,50 @@ +@@ -25,6 +26,52 @@ #define ALSA_PA_PLUGIN "ALSA <-> PulseAudio PCM I/O Plugin" +#ifdef DISABLE_LIBASOUND_DLOPEN +#define WRAP(x) x +#else +#define WRAP(x) cubeb_##x +#define MAKE_TYPEDEF(x) static typeof(x) * cubeb_##x +MAKE_TYPEDEF(snd_config); +MAKE_TYPEDEF(snd_config_add); +MAKE_TYPEDEF(snd_config_copy); +MAKE_TYPEDEF(snd_config_delete); +MAKE_TYPEDEF(snd_config_get_id); +MAKE_TYPEDEF(snd_config_get_string); +MAKE_TYPEDEF(snd_config_imake_integer); +MAKE_TYPEDEF(snd_config_search); +MAKE_TYPEDEF(snd_config_search_definition); +MAKE_TYPEDEF(snd_lib_error_set_handler); +MAKE_TYPEDEF(snd_pcm_avail_update); +MAKE_TYPEDEF(snd_pcm_close); +MAKE_TYPEDEF(snd_pcm_delay); +MAKE_TYPEDEF(snd_pcm_drain); +MAKE_TYPEDEF(snd_pcm_frames_to_bytes); +MAKE_TYPEDEF(snd_pcm_get_params); +/* snd_pcm_hw_params_alloca is actually a macro */ +/* MAKE_TYPEDEF(snd_pcm_hw_params_alloca); */ +MAKE_TYPEDEF(snd_pcm_hw_params_sizeof); +#define snd_pcm_hw_params_sizeof cubeb_snd_pcm_hw_params_sizeof +MAKE_TYPEDEF(snd_pcm_hw_params_any); +MAKE_TYPEDEF(snd_pcm_hw_params_get_channels_max); +MAKE_TYPEDEF(snd_pcm_hw_params_get_rate); +MAKE_TYPEDEF(snd_pcm_hw_params_set_rate_near); +MAKE_TYPEDEF(snd_pcm_nonblock); +MAKE_TYPEDEF(snd_pcm_open); +MAKE_TYPEDEF(snd_pcm_open_lconf); +MAKE_TYPEDEF(snd_pcm_pause); +MAKE_TYPEDEF(snd_pcm_poll_descriptors); +MAKE_TYPEDEF(snd_pcm_poll_descriptors_count); +MAKE_TYPEDEF(snd_pcm_poll_descriptors_revents); ++MAKE_TYPEDEF(snd_pcm_readi); +MAKE_TYPEDEF(snd_pcm_recover); +MAKE_TYPEDEF(snd_pcm_set_params); ++MAKE_TYPEDEF(snd_pcm_start); +MAKE_TYPEDEF(snd_pcm_state); +MAKE_TYPEDEF(snd_pcm_writei); + +#undef MAKE_TYPEDEF +#endif + /* ALSA is not thread-safe. snd_pcm_t instances are individually protected by the owning cubeb_stream's mutex. snd_pcm_t creation and destruction is not thread-safe until ALSA 1.0.24 (see alsa-lib.git commit 91c9c8f1), -@@ -64,6 +109,8 @@ struct cubeb { +@@ -65,6 +112,8 @@ struct cubeb { workaround is not required. */ snd_config_t * local_config; int is_pa; + + void * libasound; }; enum stream_state { -@@ -260,10 +307,10 @@ alsa_refill_stream(cubeb_stream * stm) +@@ -243,8 +292,8 @@ set_timeout(struct timeval * timeout, unsigned int ms) + static void + stream_buffer_decrement(cubeb_stream * stm, long count) + { +- char * bufremains = stm->buffer + snd_pcm_frames_to_bytes(stm->pcm, count); +- memmove(stm->buffer, bufremains, snd_pcm_frames_to_bytes(stm->pcm, stm->bufframes - count)); ++ char * bufremains = stm->buffer + WRAP(snd_pcm_frames_to_bytes)(stm->pcm, count); ++ memmove(stm->buffer, bufremains, WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->bufframes - count)); + stm->bufframes -= count; + } - pthread_mutex_lock(&stm->mutex); +@@ -276,9 +325,9 @@ alsa_process_stream(cubeb_stream * stm) + /* Call _poll_descriptors_revents() even if we don't use it + to let underlying plugins clear null events. Otherwise poll() + may wake up again and again, producing unnecessary CPU usage. */ +- snd_pcm_poll_descriptors_revents(stm->pcm, stm->fds, stm->nfds, &revents); ++ WRAP(snd_pcm_poll_descriptors_revents)(stm->pcm, stm->fds, stm->nfds, &revents); - avail = snd_pcm_avail_update(stm->pcm); + avail = WRAP(snd_pcm_avail_update)(stm->pcm); - if (avail < 0) { -- snd_pcm_recover(stm->pcm, avail, 1); -- avail = snd_pcm_avail_update(stm->pcm); -+ WRAP(snd_pcm_recover)(stm->pcm, avail, 1); -+ avail = WRAP(snd_pcm_avail_update)(stm->pcm); - } - /* Failed to recover from an xrun, this stream must be broken. */ -@@ -286,7 +333,7 @@ alsa_refill_stream(cubeb_stream * stm) - return RUNNING; - } + /* Got null event? Bail and wait for another wakeup. */ + if (avail == 0) { +@@ -301,7 +350,7 @@ alsa_process_stream(cubeb_stream * stm) + // TODO: should it be marked as DRAINING? + } -- p = calloc(1, snd_pcm_frames_to_bytes(stm->pcm, avail)); -+ p = calloc(1, WRAP(snd_pcm_frames_to_bytes)(stm->pcm, avail)); - assert(p); +- got = snd_pcm_readi(stm->pcm, stm->buffer+stm->bufframes, avail); ++ got = WRAP(snd_pcm_readi)(stm->pcm, stm->buffer+stm->bufframes, avail); - pthread_mutex_unlock(&stm->mutex); -@@ -312,10 +359,10 @@ alsa_refill_stream(cubeb_stream * stm) - b[i] *= stm->volume; + if (got < 0) { + avail = got; // the error handler below will recover us +@@ -345,7 +394,7 @@ alsa_process_stream(cubeb_stream * stm) + (!stm->other_stream || stm->other_stream->bufframes > 0)) { + long got = avail - stm->bufframes; + void * other_buffer = stm->other_stream ? stm->other_stream->buffer : NULL; +- char * buftail = stm->buffer + snd_pcm_frames_to_bytes(stm->pcm, stm->bufframes); ++ char * buftail = stm->buffer + WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->bufframes); + + /* Correct read size to the other stream available frames */ + if (stm->other_stream && got > stm->other_stream->bufframes) { +@@ -372,8 +421,8 @@ alsa_process_stream(cubeb_stream * stm) + long drain_frames = avail - stm->bufframes; + double drain_time = (double) drain_frames / stm->params.rate; + +- char * buftail = stm->buffer + snd_pcm_frames_to_bytes(stm->pcm, stm->bufframes); +- memset(buftail, 0, snd_pcm_frames_to_bytes(stm->pcm, drain_frames)); ++ char * buftail = stm->buffer + WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->bufframes); ++ memset(buftail, 0, WRAP(snd_pcm_frames_to_bytes)(stm->pcm, drain_frames)); + stm->bufframes = avail; + + /* Mark as draining, unless we're waiting for capture */ +@@ -400,7 +449,7 @@ alsa_process_stream(cubeb_stream * stm) } } -- wrote = snd_pcm_writei(stm->pcm, p, got); -+ wrote = WRAP(snd_pcm_writei)(stm->pcm, p, got); + +- wrote = snd_pcm_writei(stm->pcm, stm->buffer, avail); ++ wrote = WRAP(snd_pcm_writei)(stm->pcm, stm->buffer, avail); if (wrote < 0) { -- snd_pcm_recover(stm->pcm, wrote, 1); -- wrote = snd_pcm_writei(stm->pcm, p, got); -+ WRAP(snd_pcm_recover)(stm->pcm, wrote, 1); -+ wrote = WRAP(snd_pcm_writei)(stm->pcm, p, got); - } - assert(wrote >= 0 && wrote == got); - stm->write_position += wrote; -@@ -342,7 +389,7 @@ alsa_refill_stream(cubeb_stream * stm) + avail = wrote; // the error handler below will recover us + } else { +@@ -413,13 +462,13 @@ alsa_process_stream(cubeb_stream * stm) - /* Fill the remaining buffer with silence to guarantee one full period - has been written. */ -- snd_pcm_writei(stm->pcm, (char *) p + got, avail - got); -+ WRAP(snd_pcm_writei)(stm->pcm, (char *) p + got, avail - got); + /* Got some error? Let's try to recover the stream. */ + if (avail < 0) { +- avail = snd_pcm_recover(stm->pcm, avail, 0); ++ avail = WRAP(snd_pcm_recover)(stm->pcm, avail, 0); - set_timeout(&stm->drain_timeout, buffer_time * 1000); + /* Capture pcm must be started after initial setup/recover */ + if (avail >= 0 && + stm->stream_type == SND_PCM_STREAM_CAPTURE && +- snd_pcm_state(stm->pcm) == SND_PCM_STATE_PREPARED) { +- avail = snd_pcm_start(stm->pcm); ++ WRAP(snd_pcm_state)(stm->pcm) == SND_PCM_STATE_PREPARED) { ++ avail = WRAP(snd_pcm_start)(stm->pcm); + } + } -@@ -453,26 +500,26 @@ get_slave_pcm_node(snd_config_t * lconf, snd_config_t * root_pcm) +@@ -535,26 +584,26 @@ get_slave_pcm_node(snd_config_t * lconf, snd_config_t * root_pcm) slave_def = NULL; - r = snd_config_search(root_pcm, "slave", &slave_pcm); + r = WRAP(snd_config_search)(root_pcm, "slave", &slave_pcm); if (r < 0) { return NULL; } - r = snd_config_get_string(slave_pcm, &string); + r = WRAP(snd_config_get_string)(slave_pcm, &string); if (r >= 0) { - r = snd_config_search_definition(lconf, "pcm_slave", string, &slave_def); + r = WRAP(snd_config_search_definition)(lconf, "pcm_slave", string, &slave_def); if (r < 0) { return NULL; } } do { - r = snd_config_search(slave_def ? slave_def : slave_pcm, "pcm", &pcm); + r = WRAP(snd_config_search)(slave_def ? slave_def : slave_pcm, "pcm", &pcm); if (r < 0) { break; } - r = snd_config_get_string(slave_def ? slave_def : slave_pcm, &string); + r = WRAP(snd_config_get_string)(slave_def ? slave_def : slave_pcm, &string); if (r < 0) { break; } -@@ -481,7 +528,7 @@ get_slave_pcm_node(snd_config_t * lconf, snd_config_t * root_pcm) +@@ -563,7 +612,7 @@ get_slave_pcm_node(snd_config_t * lconf, snd_config_t * root_pcm) if (r < 0 || r > (int) sizeof(node_name)) { break; } - r = snd_config_search(lconf, node_name, &pcm); + r = WRAP(snd_config_search)(lconf, node_name, &pcm); if (r < 0) { break; } -@@ -490,7 +537,7 @@ get_slave_pcm_node(snd_config_t * lconf, snd_config_t * root_pcm) +@@ -572,7 +621,7 @@ get_slave_pcm_node(snd_config_t * lconf, snd_config_t * root_pcm) } while (0); if (slave_def) { - snd_config_delete(slave_def); + WRAP(snd_config_delete)(slave_def); } return NULL; -@@ -513,22 +560,22 @@ init_local_config_with_workaround(char const * pcm_name) +@@ -595,22 +644,22 @@ init_local_config_with_workaround(char const * pcm_name) lconf = NULL; - if (snd_config == NULL) { + if (*WRAP(snd_config) == NULL) { return NULL; } - r = snd_config_copy(&lconf, snd_config); + r = WRAP(snd_config_copy)(&lconf, *WRAP(snd_config)); if (r < 0) { return NULL; } do { - r = snd_config_search_definition(lconf, "pcm", pcm_name, &pcm_node); + r = WRAP(snd_config_search_definition)(lconf, "pcm", pcm_name, &pcm_node); if (r < 0) { break; } - r = snd_config_get_id(pcm_node, &string); + r = WRAP(snd_config_get_id)(pcm_node, &string); if (r < 0) { break; } -@@ -537,7 +584,7 @@ init_local_config_with_workaround(char const * pcm_name) +@@ -619,7 +668,7 @@ init_local_config_with_workaround(char const * pcm_name) if (r < 0 || r > (int) sizeof(node_name)) { break; } - r = snd_config_search(lconf, node_name, &pcm_node); + r = WRAP(snd_config_search)(lconf, node_name, &pcm_node); if (r < 0) { break; } -@@ -548,12 +595,12 @@ init_local_config_with_workaround(char const * pcm_name) +@@ -630,12 +679,12 @@ init_local_config_with_workaround(char const * pcm_name) } /* Fetch the PCM node's type, and bail out if it's not the PulseAudio plugin. */ - r = snd_config_search(pcm_node, "type", &node); + r = WRAP(snd_config_search)(pcm_node, "type", &node); if (r < 0) { break; } - r = snd_config_get_string(node, &string); + r = WRAP(snd_config_get_string)(node, &string); if (r < 0) { break; } -@@ -564,18 +611,18 @@ init_local_config_with_workaround(char const * pcm_name) +@@ -646,18 +695,18 @@ init_local_config_with_workaround(char const * pcm_name) /* Don't clobber an explicit existing handle_underrun value, set it only if it doesn't already exist. */ - r = snd_config_search(pcm_node, "handle_underrun", &node); + r = WRAP(snd_config_search)(pcm_node, "handle_underrun", &node); if (r != -ENOENT) { break; } /* Disable pcm_pulse's asynchronous underrun handling. */ - r = snd_config_imake_integer(&node, "handle_underrun", 0); + r = WRAP(snd_config_imake_integer)(&node, "handle_underrun", 0); if (r < 0) { break; } - r = snd_config_add(pcm_node, node); + r = WRAP(snd_config_add)(pcm_node, node); if (r < 0) { break; } -@@ -583,7 +630,7 @@ init_local_config_with_workaround(char const * pcm_name) +@@ -665,7 +714,7 @@ init_local_config_with_workaround(char const * pcm_name) return lconf; } while (0); - snd_config_delete(lconf); + WRAP(snd_config_delete)(lconf); return NULL; } -@@ -595,9 +642,9 @@ alsa_locked_pcm_open(snd_pcm_t ** pcm, snd_pcm_stream_t stream, snd_config_t * l +@@ -677,9 +726,9 @@ alsa_locked_pcm_open(snd_pcm_t ** pcm, char const * pcm_name, snd_pcm_stream_t s pthread_mutex_lock(&cubeb_alsa_mutex); if (local_config) { -- r = snd_pcm_open_lconf(pcm, CUBEB_ALSA_PCM_NAME, stream, SND_PCM_NONBLOCK, local_config); -+ r = WRAP(snd_pcm_open_lconf)(pcm, CUBEB_ALSA_PCM_NAME, stream, SND_PCM_NONBLOCK, local_config); +- r = snd_pcm_open_lconf(pcm, pcm_name, stream, SND_PCM_NONBLOCK, local_config); ++ r = WRAP(snd_pcm_open_lconf)(pcm, pcm_name, stream, SND_PCM_NONBLOCK, local_config); } else { -- r = snd_pcm_open(pcm, CUBEB_ALSA_PCM_NAME, stream, SND_PCM_NONBLOCK); -+ r = WRAP(snd_pcm_open)(pcm, CUBEB_ALSA_PCM_NAME, stream, SND_PCM_NONBLOCK); +- r = snd_pcm_open(pcm, pcm_name, stream, SND_PCM_NONBLOCK); ++ r = WRAP(snd_pcm_open)(pcm, pcm_name, stream, SND_PCM_NONBLOCK); } pthread_mutex_unlock(&cubeb_alsa_mutex); -@@ -610,7 +657,7 @@ alsa_locked_pcm_close(snd_pcm_t * pcm) +@@ -692,7 +741,7 @@ alsa_locked_pcm_close(snd_pcm_t * pcm) int r; pthread_mutex_lock(&cubeb_alsa_mutex); - r = snd_pcm_close(pcm); + r = WRAP(snd_pcm_close)(pcm); pthread_mutex_unlock(&cubeb_alsa_mutex); return r; -@@ -667,12 +714,65 @@ alsa_init(cubeb ** context, char const * context_name) +@@ -755,12 +804,65 @@ alsa_init(cubeb ** context, char const * context_name) pthread_attr_t attr; snd_pcm_t * dummy; + void * libasound = NULL; + +#ifndef DISABLE_LIBASOUND_DLOPEN + libasound = dlopen("libasound.so", RTLD_LAZY); + if (!libasound) { + return CUBEB_ERROR; + } + +#define LOAD(x) do { \ + cubeb_##x = dlsym(libasound, #x); \ + if (!cubeb_##x) { \ + dlclose(libasound); \ + return CUBEB_ERROR; \ + } \ + } while(0) + + LOAD(snd_config); + LOAD(snd_config_add); + LOAD(snd_config_copy); + LOAD(snd_config_delete); + LOAD(snd_config_get_id); + LOAD(snd_config_get_string); + LOAD(snd_config_imake_integer); + LOAD(snd_config_search); + LOAD(snd_config_search_definition); + LOAD(snd_lib_error_set_handler); + LOAD(snd_pcm_avail_update); + LOAD(snd_pcm_close); + LOAD(snd_pcm_delay); + LOAD(snd_pcm_drain); + LOAD(snd_pcm_frames_to_bytes); + LOAD(snd_pcm_get_params); + /* snd_pcm_hw_params_alloca is actually a macro */ + /* LOAD(snd_pcm_hw_params_alloca); */ + LOAD(snd_pcm_hw_params_sizeof); + LOAD(snd_pcm_hw_params_any); + LOAD(snd_pcm_hw_params_get_channels_max); + LOAD(snd_pcm_hw_params_get_rate); + LOAD(snd_pcm_hw_params_set_rate_near); + LOAD(snd_pcm_nonblock); + LOAD(snd_pcm_open); + LOAD(snd_pcm_open_lconf); + LOAD(snd_pcm_pause); + LOAD(snd_pcm_poll_descriptors); + LOAD(snd_pcm_poll_descriptors_count); + LOAD(snd_pcm_poll_descriptors_revents); + LOAD(snd_pcm_recover); + LOAD(snd_pcm_set_params); + LOAD(snd_pcm_state); + LOAD(snd_pcm_writei); + +#undef LOAD +#endif assert(context); *context = NULL; pthread_mutex_lock(&cubeb_alsa_mutex); if (!cubeb_alsa_error_handler_set) { - snd_lib_error_set_handler(silent_error_handler); + WRAP(snd_lib_error_set_handler)(silent_error_handler); cubeb_alsa_error_handler_set = 1; } pthread_mutex_unlock(&cubeb_alsa_mutex); -@@ -680,6 +780,8 @@ alsa_init(cubeb ** context, char const * context_name) +@@ -768,6 +870,8 @@ alsa_init(cubeb ** context, char const * context_name) ctx = calloc(1, sizeof(*ctx)); assert(ctx); + ctx->libasound = libasound; + ctx->ops = &alsa_ops; r = pthread_mutex_init(&ctx->mutex, NULL); -@@ -729,7 +831,7 @@ alsa_init(cubeb ** context, char const * context_name) +@@ -817,7 +921,7 @@ alsa_init(cubeb ** context, char const * context_name) config fails with EINVAL, the PA PCM is too old for this workaround. */ if (r == -EINVAL) { pthread_mutex_lock(&cubeb_alsa_mutex); - snd_config_delete(ctx->local_config); + WRAP(snd_config_delete)(ctx->local_config); pthread_mutex_unlock(&cubeb_alsa_mutex); ctx->local_config = NULL; } else if (r >= 0) { -@@ -768,9 +870,13 @@ alsa_destroy(cubeb * ctx) +@@ -857,9 +961,13 @@ alsa_destroy(cubeb * ctx) pthread_mutex_destroy(&ctx->mutex); free(ctx->fds); + if (ctx->libasound) { + dlclose(ctx->libasound); + } + if (ctx->local_config) { pthread_mutex_lock(&cubeb_alsa_mutex); - snd_config_delete(ctx->local_config); + WRAP(snd_config_delete)(ctx->local_config); pthread_mutex_unlock(&cubeb_alsa_mutex); } -@@ -838,7 +944,7 @@ alsa_stream_init(cubeb * ctx, cubeb_stream ** stream, char const * stream_name, +@@ -939,7 +1047,7 @@ alsa_stream_init_single(cubeb * ctx, cubeb_stream ** stream, char const * stream return CUBEB_ERROR; } - r = snd_pcm_nonblock(stm->pcm, 1); + r = WRAP(snd_pcm_nonblock)(stm->pcm, 1); assert(r == 0); latency_us = latency_frames * 1e6 / stm->params.rate; -@@ -855,7 +961,7 @@ alsa_stream_init(cubeb * ctx, cubeb_stre +@@ -952,7 +1060,7 @@ alsa_stream_init_single(cubeb * ctx, cubeb_stream ** stream, char const * stream latency_us = latency_us < min_latency ? min_latency: latency_us; } - r = snd_pcm_set_params(stm->pcm, format, SND_PCM_ACCESS_RW_INTERLEAVED, + r = WRAP(snd_pcm_set_params)(stm->pcm, format, SND_PCM_ACCESS_RW_INTERLEAVED, stm->params.channels, stm->params.rate, 1, latency_us); if (r < 0) { -@@ -867,15 +973,15 @@ alsa_stream_init(cubeb * ctx, cubeb_stre +@@ -960,20 +1068,20 @@ alsa_stream_init_single(cubeb * ctx, cubeb_stream ** stream, char const * stream return CUBEB_ERROR_INVALID_FORMAT; } - r = snd_pcm_get_params(stm->pcm, &stm->buffer_size, &period_size); + r = WRAP(snd_pcm_get_params)(stm->pcm, &stm->buffer_size, &period_size); assert(r == 0); + /* Double internal buffer size to have enough space when waiting for the other side of duplex connection */ + stm->buffer_size *= 2; +- stm->buffer = calloc(1, snd_pcm_frames_to_bytes(stm->pcm, stm->buffer_size)); ++ stm->buffer = calloc(1, WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->buffer_size)); + assert(stm->buffer); + - stm->nfds = snd_pcm_poll_descriptors_count(stm->pcm); + stm->nfds = WRAP(snd_pcm_poll_descriptors_count)(stm->pcm); assert(stm->nfds > 0); stm->saved_fds = calloc(stm->nfds, sizeof(struct pollfd)); assert(stm->saved_fds); - r = snd_pcm_poll_descriptors(stm->pcm, stm->saved_fds, stm->nfds); + r = WRAP(snd_pcm_poll_descriptors)(stm->pcm, stm->saved_fds, stm->nfds); assert((nfds_t) r == stm->nfds); r = pthread_cond_init(&stm->cond, NULL); -@@ -895,7 +1001,7 @@ alsa_stream_destroy(cubeb_stream * stm) +@@ -1048,7 +1156,7 @@ alsa_stream_destroy(cubeb_stream * stm) pthread_mutex_lock(&stm->mutex); if (stm->pcm) { if (stm->state == DRAINING) { - snd_pcm_drain(stm->pcm); + WRAP(snd_pcm_drain)(stm->pcm); } alsa_locked_pcm_close(stm->pcm); stm->pcm = NULL; -@@ -938,12 +1044,12 @@ alsa_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) - return CUBEB_ERROR; - } +@@ -1094,12 +1202,12 @@ alsa_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) + assert(stm); + - r = snd_pcm_hw_params_any(stm->pcm, hw_params); + r = WRAP(snd_pcm_hw_params_any)(stm->pcm, hw_params); if (r < 0) { return CUBEB_ERROR; } - r = snd_pcm_hw_params_get_channels_max(hw_params, max_channels); + r = WRAP(snd_pcm_hw_params_get_channels_max)(hw_params, max_channels); if (r < 0) { return CUBEB_ERROR; } -@@ -969,34 +1075,34 @@ alsa_get_preferred_sample_rate(cubeb * c +@@ -1120,34 +1228,34 @@ alsa_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) { /* get a pcm, disabling resampling, so we get a rate the * hardware/dmix/pulse/etc. supports. */ - r = snd_pcm_open(&pcm, CUBEB_ALSA_PCM_NAME, SND_PCM_STREAM_PLAYBACK, SND_PCM_NO_AUTO_RESAMPLE); + r = WRAP(snd_pcm_open)(&pcm, CUBEB_ALSA_PCM_NAME, SND_PCM_STREAM_PLAYBACK, SND_PCM_NO_AUTO_RESAMPLE); if (r < 0) { return CUBEB_ERROR; } - r = snd_pcm_hw_params_any(pcm, hw_params); + r = WRAP(snd_pcm_hw_params_any)(pcm, hw_params); if (r < 0) { - snd_pcm_close(pcm); + WRAP(snd_pcm_close)(pcm); return CUBEB_ERROR; } - r = snd_pcm_hw_params_get_rate(hw_params, rate, &dir); + r = WRAP(snd_pcm_hw_params_get_rate)(hw_params, rate, &dir); if (r >= 0) { /* There is a default rate: use it. */ - snd_pcm_close(pcm); + WRAP(snd_pcm_close)(pcm); return CUBEB_OK; } /* Use a common rate, alsa may adjust it based on hw/etc. capabilities. */ *rate = 44100; - r = snd_pcm_hw_params_set_rate_near(pcm, hw_params, rate, NULL); + r = WRAP(snd_pcm_hw_params_set_rate_near)(pcm, hw_params, rate, NULL); if (r < 0) { - snd_pcm_close(pcm); + WRAP(snd_pcm_close)(pcm); return CUBEB_ERROR; } - snd_pcm_close(pcm); + WRAP(snd_pcm_close)(pcm); return CUBEB_OK; } -@@ -1013,7 +1119,7 @@ alsa_stream_start(cubeb_stream * stm) - ctx = stm->context; - +@@ -1180,10 +1288,10 @@ alsa_stream_start(cubeb_stream * stm) pthread_mutex_lock(&stm->mutex); + /* Capture pcm must be started after initial setup/recover */ + if (stm->stream_type == SND_PCM_STREAM_CAPTURE && +- snd_pcm_state(stm->pcm) == SND_PCM_STATE_PREPARED) { +- snd_pcm_start(stm->pcm); ++ WRAP(snd_pcm_state)(stm->pcm) == SND_PCM_STATE_PREPARED) { ++ WRAP(snd_pcm_start)(stm->pcm); + } - snd_pcm_pause(stm->pcm, 0); + WRAP(snd_pcm_pause)(stm->pcm, 0); gettimeofday(&stm->last_activity, NULL); pthread_mutex_unlock(&stm->mutex); -@@ -1047,7 +1153,7 @@ alsa_stream_stop(cubeb_stream * stm) +@@ -1223,7 +1331,7 @@ alsa_stream_stop(cubeb_stream * stm) pthread_mutex_unlock(&ctx->mutex); pthread_mutex_lock(&stm->mutex); - snd_pcm_pause(stm->pcm, 1); + WRAP(snd_pcm_pause)(stm->pcm, 1); pthread_mutex_unlock(&stm->mutex); return CUBEB_OK; -@@ -1063,8 +1169,8 @@ alsa_stream_get_position(cubeb_stream * stm, uint64_t * position) +@@ -1239,8 +1347,8 @@ alsa_stream_get_position(cubeb_stream * stm, uint64_t * position) pthread_mutex_lock(&stm->mutex); delay = -1; - if (snd_pcm_state(stm->pcm) != SND_PCM_STATE_RUNNING || - snd_pcm_delay(stm->pcm, &delay) != 0) { + if (WRAP(snd_pcm_state)(stm->pcm) != SND_PCM_STATE_RUNNING || + WRAP(snd_pcm_delay)(stm->pcm, &delay) != 0) { *position = stm->last_position; pthread_mutex_unlock(&stm->mutex); return CUBEB_OK; -@@ -1089,7 +1195,7 @@ alsa_stream_get_latency(cubeb_stream * stm, uint32_t * latency) +@@ -1265,7 +1373,7 @@ alsa_stream_get_latency(cubeb_stream * stm, uint32_t * latency) snd_pcm_sframes_t delay; /* This function returns the delay in frames until a frame written using snd_pcm_writei is sent to the DAC. The DAC delay should be < 1ms anyways. */ - if (snd_pcm_delay(stm->pcm, &delay)) { + if (WRAP(snd_pcm_delay)(stm->pcm, &delay)) { return CUBEB_ERROR; } diff --git media/libcubeb/src/cubeb_oss.c media/libcubeb/src/cubeb_oss.c new file mode 100644 -index 0000000..5e38e27 +index 000000000000..7b0b4f37dbe4 --- /dev/null +++ media/libcubeb/src/cubeb_oss.c -@@ -0,0 +1,442 @@ +@@ -0,0 +1,445 @@ +/* + * Copyright © 2014 Mozilla Foundation + * + * This program is made available under an ISC-style license. See the + * accompanying file LICENSE for details. + */ +#if defined(HAVE_SYS_SOUNDCARD_H) +#include +#else +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cubeb/cubeb.h" +#include "cubeb-internal.h" + +#ifndef CUBEB_OSS_DEFAULT_OUTPUT +#define CUBEB_OSS_DEFAULT_OUTPUT "/dev/dsp" +#endif + +#define OSS_BUFFER_SIZE 1024 + +struct cubeb { + struct cubeb_ops const * ops; +}; + +struct cubeb_stream { + cubeb * context; + + cubeb_data_callback data_callback; + cubeb_state_callback state_callback; + void * user_ptr; + float volume; + float panning; + + pthread_mutex_t state_mutex; + pthread_cond_t state_cond; + + int running; + int stopped; + int floating; + + /* These two vars are needed to support old versions of OSS */ + unsigned int position_bytes; + unsigned int last_position_bytes; + + uint64_t written_frags; /* The number of fragments written to /dev/dsp */ + uint64_t missed_frags; /* fragments output with stopped stream */ + + cubeb_stream_params params; + int fd; + pthread_t th; +}; + +static struct cubeb_ops const oss_ops; + +int oss_init(cubeb ** context, char const * context_name) +{ + cubeb* ctx = (cubeb*)malloc(sizeof(cubeb)); + ctx->ops = &oss_ops; + *context = ctx; + return CUBEB_OK; +} + +static void oss_destroy(cubeb *ctx) +{ + free(ctx); +} + +static char const * oss_get_backend_id(cubeb * context) +{ + static char oss_name[] = "oss"; + return oss_name; +} + +static int oss_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) +{ + *max_channels = 2; /* Let's support only stereo for now */ + return CUBEB_OK; +} + +static int oss_get_min_latency(cubeb * context, cubeb_stream_params params, -+ uint32_t * latency_ms) ++ uint32_t * latency_frames) +{ ++ (void)context; + /* 40ms is a big enough number to work ok */ -+ *latency_ms = 40; ++ *latency_frames = 40 * params.rate / 1000; + return CUBEB_OK; +} + +static int oss_get_preferred_sample_rate(cubeb *context, uint32_t * rate) +{ + /* 48000 seems a prefered choice for most audio devices + * and a good choice for OSS */ + *rate = 48000; + return CUBEB_OK; +} + +static void run_state_callback(cubeb_stream *stream, cubeb_state state) +{ + if (stream->state_callback) { + stream->state_callback(stream, stream->user_ptr, state); + } +} + +static long run_data_callback(cubeb_stream *stream, void *buffer, long nframes) +{ + long got = 0; + pthread_mutex_lock(&stream->state_mutex); + if (stream->data_callback && stream->running && !stream->stopped) { + pthread_mutex_unlock(&stream->state_mutex); + got = stream->data_callback(stream, stream->user_ptr, NULL, buffer, nframes); + } else { + pthread_mutex_unlock(&stream->state_mutex); + } + return got; +} + +static void apply_volume_int(int16_t* buffer, unsigned int n, + float volume, float panning) +{ + float left = volume; + float right = volume; + unsigned int i; + int pan[2]; + if (panning<0) { + right *= (1+panning); + } else { + left *= (1-panning); + } + pan[0] = 128.0*left; + pan[1] = 128.0*right; + for(i=0; irunning) { + pthread_mutex_lock(&stream->state_mutex); + if (stream->stopped) { + pthread_mutex_unlock(&stream->state_mutex); + run_state_callback(stream, CUBEB_STATE_STOPPED); + pthread_mutex_lock(&stream->state_mutex); + while (stream->stopped) { + pthread_cond_wait(&stream->state_cond, &stream->state_mutex); + } + pthread_mutex_unlock(&stream->state_mutex); + run_state_callback(stream, CUBEB_STATE_STARTED); + continue; + } + pthread_mutex_unlock(&stream->state_mutex); + if (stream->floating) { + got = run_data_callback(stream, f_buffer, + OSS_BUFFER_SIZE/stream->params.channels); + apply_volume_float(f_buffer, got*stream->params.channels, + stream->volume, stream->panning); + for (i=0; i<((unsigned long)got)*stream->params.channels; i++) { + /* Clipping is prefered to overflow */ + if(f_buffer[i]>=1.0){ + f_buffer[i]=1.0; + } + if(f_buffer[i]<=-1.0){ + f_buffer[i]=-1.0; + } + /* One might think that multipling by 32767.0 is logical but results in clipping */ + buffer[i] = f_buffer[i]*32767.0; + } + } else { + got = run_data_callback(stream, buffer, + OSS_BUFFER_SIZE/stream->params.channels); + apply_volume_int(buffer, got*stream->params.channels, + stream->volume, stream->panning); + } + if (got<0) { + run_state_callback(stream, CUBEB_STATE_ERROR); + break; + } + if (!got) { + run_state_callback(stream, CUBEB_STATE_DRAINED); + } + if (got) { + size_t i = 0; + size_t s = got*stream->params.channels*sizeof(int16_t); + while (i < s) { + ssize_t n = write(stream->fd, ((char*)buffer) + i, s - i); + if (n<=0) { + run_state_callback(stream, CUBEB_STATE_ERROR); + break; + } + i+=n; + } + stream->written_frags+=got; + } + } + return NULL; +} + +static void oss_try_set_latency(cubeb_stream* stream, unsigned int latency) +{ + unsigned int latency_bytes, n_frag; + int frag; + /* fragment size of 1024 is a good choice with good chances to be accepted */ -+ unsigned int frag_size=1024; -+ unsigned int frag_log=10; /* 2^frag_log = frag_size */ ++ unsigned int frag_log=10; /* 2^frag_log = fragment size */ + latency_bytes = + latency*stream->params.rate*stream->params.channels*sizeof(uint16_t)/1000; + n_frag = latency_bytes>>frag_log; + frag = (n_frag<<16) | frag_log; + /* Even if this fails we wish to continue, not checking for errors */ + ioctl(stream->fd, SNDCTL_DSP_SETFRAGMENT, &frag); +} + +static int oss_stream_init(cubeb * context, cubeb_stream ** stm, + char const * stream_name, + cubeb_devid input_device, + cubeb_stream_params * input_stream_params, + cubeb_devid output_device, + cubeb_stream_params * output_stream_params, + unsigned int latency, + cubeb_data_callback data_callback, + cubeb_state_callback state_callback, void * user_ptr) +{ + cubeb_stream* stream = (cubeb_stream*)malloc(sizeof(cubeb_stream)); + stream->context = context; + stream->data_callback = data_callback; + stream->state_callback = state_callback; + stream->user_ptr = user_ptr; + + assert(!input_stream_params && "not supported."); + if (input_device || output_device) { + /* Device selection not yet implemented. */ + return CUBEB_ERROR_DEVICE_UNAVAILABLE; + } + + if ((stream->fd = open(CUBEB_OSS_DEFAULT_OUTPUT, O_WRONLY)) == -1) { + free(stream); + return CUBEB_ERROR; + } +#define SET(what, to) do { unsigned int i = to; \ + int j = ioctl(stream->fd, what, &i); \ + if (j == -1 || i != to) { \ + close(stream->fd); \ + free(stream); \ + return CUBEB_ERROR_INVALID_FORMAT; } } while (0) + + stream->params = *output_stream_params; + stream->volume = 1.0; + stream->panning = 0.0; + + oss_try_set_latency(stream, latency); + + stream->floating = 0; + SET(SNDCTL_DSP_CHANNELS, stream->params.channels); + SET(SNDCTL_DSP_SPEED, stream->params.rate); + switch (stream->params.format) { + case CUBEB_SAMPLE_S16LE: + SET(SNDCTL_DSP_SETFMT, AFMT_S16_LE); + break; + case CUBEB_SAMPLE_S16BE: + SET(SNDCTL_DSP_SETFMT, AFMT_S16_BE); + break; + case CUBEB_SAMPLE_FLOAT32LE: + SET(SNDCTL_DSP_SETFMT, AFMT_S16_NE); + stream->floating = 1; + break; + default: + close(stream->fd); + free(stream); + return CUBEB_ERROR; + } + + + pthread_mutex_init(&stream->state_mutex, NULL); + pthread_cond_init(&stream->state_cond, NULL); + + stream->running = 1; + stream->stopped = 1; + stream->position_bytes = 0; + stream->last_position_bytes = 0; + stream->written_frags = 0; + stream->missed_frags = 0; + + pthread_create(&stream->th, NULL, writer, (void*)stream); + + *stm = stream; + + return CUBEB_OK; +} + +static void oss_stream_destroy(cubeb_stream * stream) +{ + pthread_mutex_lock(&stream->state_mutex); + + stream->running = 0; + stream->stopped = 0; + pthread_cond_signal(&stream->state_cond); + + pthread_mutex_unlock(&stream->state_mutex); + + pthread_join(stream->th, NULL); + + pthread_mutex_destroy(&stream->state_mutex); + pthread_cond_destroy(&stream->state_cond); + close(stream->fd); + free(stream); +} + +static int oss_stream_get_latency(cubeb_stream * stream, uint32_t * latency) +{ + if (ioctl(stream->fd, SNDCTL_DSP_GETODELAY, latency)==-1) { + return CUBEB_ERROR; + } + /* Convert latency from bytes to frames */ + *latency /= stream->params.channels*sizeof(int16_t); + return CUBEB_OK; +} + + +static int oss_stream_current_optr(cubeb_stream * stream, uint64_t * position) +{ + count_info ci; + /* Unfortunately, this ioctl is only available in OSS 4.x */ +#ifdef SNDCTL_DSP_CURRENT_OPTR + oss_count_t count; + if (ioctl(stream->fd, SNDCTL_DSP_CURRENT_OPTR, &count) != -1) { + *position = count.samples;// + count.fifo_samples; + return CUBEB_OK; + } +#endif + /* Fall back to this ioctl in case the previous one fails */ + if (ioctl(stream->fd, SNDCTL_DSP_GETOPTR, &ci) == -1) { + return CUBEB_ERROR; + } + /* ci.bytes is only 32 bit and will start to wrap after arithmetic overflow */ + stream->position_bytes += ci.bytes - stream->last_position_bytes; + stream->last_position_bytes = ci.bytes; + *position = stream->position_bytes/stream->params.channels/sizeof(int16_t); + return CUBEB_OK; +} + +static int oss_stream_get_position(cubeb_stream * stream, uint64_t * position) +{ + if ( oss_stream_current_optr(stream, position) == CUBEB_OK ){ + *position -= stream->missed_frags; + return CUBEB_OK; + } + /* If no correct method to get position works we resort to this */ + *position = stream->written_frags; + return CUBEB_OK; +} + + +static int oss_stream_start(cubeb_stream * stream) +{ + pthread_mutex_lock(&stream->state_mutex); + if (stream->stopped) { + uint64_t ptr; + oss_stream_current_optr(stream, &ptr); + stream->missed_frags = ptr - stream->written_frags; + stream->stopped = 0; + pthread_cond_signal(&stream->state_cond); + } + pthread_mutex_unlock(&stream->state_mutex); + return CUBEB_OK; +} + +static int oss_stream_stop(cubeb_stream * stream) +{ + pthread_mutex_lock(&stream->state_mutex); + stream->stopped = 1; + pthread_mutex_unlock(&stream->state_mutex); + return CUBEB_OK; +} + +int oss_stream_set_panning(cubeb_stream * stream, float panning) +{ + if (stream->params.channels == 2) { + stream->panning=panning; + } + return CUBEB_OK; +} + +int oss_stream_set_volume(cubeb_stream * stream, float volume) +{ + stream->volume=volume; + return CUBEB_OK; +} + +static struct cubeb_ops const oss_ops = { + .init = oss_init, + .get_backend_id = oss_get_backend_id, + .get_max_channel_count = oss_get_max_channel_count, + .get_min_latency = oss_get_min_latency, + .get_preferred_sample_rate = oss_get_preferred_sample_rate, ++ .get_preferred_channel_layout = NULL, + .destroy = oss_destroy, ++ .enumerate_devices = NULL, + .stream_init = oss_stream_init, + .stream_destroy = oss_stream_destroy, + .stream_start = oss_stream_start, + .stream_stop = oss_stream_stop, + .stream_get_position = oss_stream_get_position, + .stream_get_latency = oss_stream_get_latency, + .stream_set_volume = oss_stream_set_volume, + .stream_set_panning = oss_stream_set_panning, + .stream_get_current_device = NULL, + .stream_device_destroy = NULL, -+ .stream_register_device_changed_callback = NULL ++ .stream_register_device_changed_callback = NULL, ++ .register_device_collection_changed = NULL +}; diff --git media/libcubeb/src/moz.build media/libcubeb/src/moz.build -index 8b7a0dd..31212ce 100644 +index fc9c79198e30..57d039d5a0f2 100644 --- media/libcubeb/src/moz.build +++ media/libcubeb/src/moz.build -@@ -17,6 +17,12 @@ if CONFIG['MOZ_ALSA']: +@@ -20,6 +20,12 @@ if CONFIG['MOZ_ALSA']: ] DEFINES['USE_ALSA'] = True +if CONFIG['MOZ_OSS']: + SOURCES += [ + 'cubeb_oss.c', + ] + DEFINES['USE_OSS'] = True + - if CONFIG['MOZ_PULSEAUDIO']: + if CONFIG['MOZ_PULSEAUDIO'] or CONFIG['MOZ_JACK']: SOURCES += [ - 'cubeb_pulse.c', -@@ -75,5 +81,6 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk': + 'cubeb_resampler.cpp', +@@ -92,6 +98,7 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk': + '%' + '%s/system/media/wilhelm/include' % CONFIG['ANDROID_SOURCE'], + ] - FAIL_ON_WARNINGS = True - +CFLAGS += CONFIG['MOZ_OSS_CFLAGS'] CFLAGS += CONFIG['MOZ_ALSA_CFLAGS'] CFLAGS += CONFIG['MOZ_PULSEAUDIO_CFLAGS'] -diff --git media/libcubeb/tests/moz.build media/libcubeb/tests/moz.build -index 1b17c7b..48b56c2 100644 ---- media/libcubeb/tests/moz.build -+++ media/libcubeb/tests/moz.build -@@ -73,7 +73,6 @@ elif CONFIG['OS_TARGET'] == 'OpenBSD': +diff --git media/libcubeb/gtest/moz.build media/libcubeb/gtest/moz.build +index e99968648554..efbbbf779e11 100644 +--- media/libcubeb/gtest/moz.build ++++ media/libcubeb/gtest/moz.build +@@ -71,7 +71,6 @@ elif CONFIG['OS_TARGET'] == 'OpenBSD': 'sndio', ] else: - OS_LIBS += CONFIG['MOZ_ALSA_LIBS'] OS_LIBS += CONFIG['MOZ_PULSEAUDIO_LIBS'] if CONFIG['GNU_CXX']: diff --git media/libcubeb/update.sh media/libcubeb/update.sh -index a96badd..2f9585e 100755 +index b139b8f497fd..d1f8a223c6d8 100755 --- media/libcubeb/update.sh +++ media/libcubeb/update.sh -@@ -16,6 +16,7 @@ cp $1/src/cubeb_audiounit.cpp src +@@ -17,6 +17,7 @@ cp $1/src/cubeb_audiounit.cpp src cp $1/src/cubeb_osx_run_loop.h src cp $1/src/cubeb_jack.cpp src cp $1/src/cubeb_opensl.c src +cp $1/src/cubeb_oss.c src + cp $1/src/cubeb_array_queue.h src cp $1/src/cubeb_panner.cpp src cp $1/src/cubeb_panner.h src - cp $1/src/cubeb_pulse.c src diff --git media/webrtc/signaling/test/common.build media/webrtc/signaling/test/common.build -index 991f03f..3d99eb5 100644 +index 3e5450f5d63a..dd45427f655a 100644 --- media/webrtc/signaling/test/common.build +++ media/webrtc/signaling/test/common.build -@@ -102,8 +102,8 @@ USE_LIBS += ['mozglue'] +@@ -99,8 +99,8 @@ USE_LIBS += ['mozglue'] OS_LIBS += CONFIG['MOZ_WEBRTC_X11_LIBS'] OS_LIBS += CONFIG['REALTIME_LIBS'] -if CONFIG['MOZ_ALSA']: - OS_LIBS += CONFIG['MOZ_ALSA_LIBS'] +if CONFIG['MOZ_OSS']: + OS_LIBS += CONFIG['MOZ_OSS_LIBS'] if CONFIG['MOZ_SYSTEM_JPEG']: OS_LIBS += CONFIG['MOZ_JPEG_LIBS'] diff --git toolkit/library/moz.build toolkit/library/moz.build -index e191f13..4fb268a 100644 +index a61c689c83c3..7764df6f8a6b 100644 --- toolkit/library/moz.build +++ toolkit/library/moz.build -@@ -234,8 +234,8 @@ if CONFIG['MOZ_SYSTEM_LIBVPX']: +@@ -242,8 +242,8 @@ if CONFIG['MOZ_SYSTEM_LIBVPX']: if not CONFIG['MOZ_TREE_PIXMAN']: OS_LIBS += CONFIG['MOZ_PIXMAN_LIBS'] -if CONFIG['MOZ_ALSA']: - OS_LIBS += CONFIG['MOZ_ALSA_LIBS'] +if CONFIG['MOZ_OSS']: + OS_LIBS += CONFIG['MOZ_OSS_LIBS'] if CONFIG['HAVE_CLOCK_MONOTONIC']: OS_LIBS += CONFIG['REALTIME_LIBS'] Index: head/www/firefox/files/patch-bug826985 =================================================================== --- head/www/firefox/files/patch-bug826985 (revision 438263) +++ head/www/firefox/files/patch-bug826985 (revision 438264) @@ -1,183 +1,183 @@ commit 8024d93 Author: Henrik Gulbrandsen Date: Fri Jan 4 13:49:22 2013 +0100 Bug 826985 - Support more video formats for WebRTC via libv4l2 on Linux. --- config/system-headers | 1 + old-configure.in | 7 +++++++ media/webrtc/signaling/test/Makefile.in | 1 + .../modules/video_capture/linux/device_info_linux.cc | 17 +++++++++++++++++ .../modules/video_capture/linux/video_capture_linux.cc | 16 +++++++++++++++- .../webrtc/modules/video_capture/video_capture.gypi | 11 +++++++++++ toolkit/library/Makefile.in | 1 + 6 files changed, 52 insertions(+), 1 deletion(-) diff --git config/system-headers config/system-headers index 55e4cd1..76567b3 100644 --- config/system-headers +++ config/system-headers @@ -624,6 +624,7 @@ libgnome/libgnome.h libgnomeui/gnome-icon-lookup.h libgnomeui/gnome-icon-theme.h libgnomeui/gnome-ui-init.h +libv4l2.h limits.h link.h #ifdef ANDROID diff --git old-configure.in configure.in index 55e4cd1..76567b3 100644 --- old-configure.in +++ old-configure.in @@ -5309,6 +5309,9 @@ if test -n "$MOZ_WEBRTC"; then MOZ_VP8_ENCODER=1 MOZ_VP8_ERROR_CONCEALMENT=1 + dnl with libv4l2 we can support more cameras + PKG_CHECK_MODULES(MOZ_LIBV4L2, libv4l2) + dnl enable once Signaling lands MOZ_WEBRTC_SIGNALING=1 AC_DEFINE(MOZ_WEBRTC_SIGNALING) diff --git build/gyp.mozbuild build/gyp.mozbuild index b483cd1..f1dd1f0 100644 --- build/gyp.mozbuild +++ build/gyp.mozbuild @@ -11,6 +11,7 @@ gyp_vars = { 'have_ethtool_cmd_speed_hi': 1 if CONFIG['MOZ_WEBRTC_HAVE_ETHTOOL_SPEED_HI'] else 0, 'include_alsa_audio': 1 if CONFIG['MOZ_ALSA'] else 0, 'include_pulse_audio': 1 if CONFIG['MOZ_PULSEAUDIO'] else 0, + 'use_libv4l2': 1 if CONFIG['MOZ_LIBV4L2_LIBS'] else 0, # basic stuff for everything 'include_internal_video_render': 0, 'clang_use_chrome_plugins': 0, diff --git media/webrtc/signaling/test/common.build media/webrtc/signaling/test/common.build index b483cd1..f1dd1f0 100644 --- media/webrtc/signaling/test/common.build +++ media/webrtc/signaling/test/common.build @@ -99,6 +99,7 @@ if CONFIG['JS_SHARED_LIBRARY']: USE_LIBS += ['mozglue'] +OS_LIBS += CONFIG['MOZ_LIBV4L2_LIBS'] OS_LIBS += CONFIG['MOZ_WEBRTC_X11_LIBS'] OS_LIBS += CONFIG['REALTIME_LIBS'] diff --git media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc index 239a292..bab496c 100644 --- media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc +++ media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc @@ -25,6 +25,9 @@ #else #include #endif +#ifdef HAVE_LIBV4L2 +#include +#endif #include "webrtc/system_wrappers/interface/ref_count.h" #include "webrtc/system_wrappers/interface/trace.h" @@ -34,6 +37,15 @@ #define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) ) #endif +#ifdef HAVE_LIBV4L2 +#define open v4l2_open +#define close v4l2_close +#define dup v4l2_dup +#define ioctl v4l2_ioctl +#define mmap v4l2_mmap +#define munmap v4l2_munmap +#endif + namespace webrtc { namespace videocapturemodule @@ -274,6 +286,11 @@ int32_t DeviceInfoLinux::GetDeviceName( memset(deviceNameUTF8, 0, deviceNameLength); memcpy(cameraName, cap.card, sizeof(cap.card)); + if (cameraName[0] == '\0') + { + sprintf(cameraName, "Camera at /dev/video%d", deviceNumber); + } + if (deviceNameLength >= strlen(cameraName)) { memcpy(deviceNameUTF8, cameraName, strlen(cameraName)); diff --git media/webrtc/trunk/webrtc/modules/video_capture/linux/video_capture_linux.cc media/webrtc/trunk/webrtc/modules/video_capture/linux/video_capture_linux.cc index 12df1b3..e9863ba 100644 --- media/webrtc/trunk/webrtc/modules/video_capture/linux/video_capture_linux.cc +++ media/webrtc/trunk/webrtc/modules/video_capture/linux/video_capture_linux.cc @@ -25,6 +25,9 @@ #else #include #endif +#ifdef HAVE_LIBV4L2 +#include +#endif #include @@ -26,6 +31,15 @@ #include "critical_section_wrapper.h" #include "video_capture_linux.h" +#ifdef HAVE_LIBV4L2 +#define open v4l2_open +#define close v4l2_close +#define dup v4l2_dup +#define ioctl v4l2_ioctl +#define mmap v4l2_mmap +#define munmap v4l2_munmap +#endif + namespace webrtc { namespace videocapturemodule diff --git media/webrtc/trunk/webrtc/modules/video_capture/video_capture.gypi media/webrtc/trunk/webrtc/modules/video_capture/video_capture.gypi index d46b5aa..e452223 100644 --- media/webrtc/trunk/webrtc/modules/video_capture/video_capture.gypi +++ media/webrtc/trunk/webrtc/modules/video_capture/video_capture.gypi @@ -7,6 +7,9 @@ # be found in the AUTHORS file in the root of the source tree. { + 'variables': { + 'use_libv4l2%': 0, + }, 'targets': [ { 'target_name': 'video_capture_module', -@@ -75,6 +78,19 @@ +@@ -76,6 +76,19 @@ 'linux/video_capture_linux.cc', 'linux/video_capture_linux.h', ], + 'conditions': [ + ['use_libv4l2==1', { + 'defines': [ + 'HAVE_LIBV4L2', + ], + 'cflags_mozilla': [ + '$(MOZ_LIBV4L2_CFLAGS)', + ], + 'libraries': [ + '-lv4l2', + ], + }], + ], - }], # linux + }], ['OS=="mac"', { 'sources': [ diff --git toolkit/library/moz.build toolkit/library/moz.build index 9c16ffa..1db3794 100644 --- toolkit/library/moz.build +++ toolkit/library/moz.build @@ -163,6 +163,7 @@ if CONFIG['OS_ARCH'] == 'Linux' and CONF ] OS_LIBS += CONFIG['MOZ_CAIRO_OSLIBS'] +OS_LIBS += CONFIG['MOZ_LIBV4L2_LIBS'] OS_LIBS += CONFIG['MOZ_WEBRTC_X11_LIBS'] OS_LIBS += CONFIG['MOZ_APP_EXTRA_LIBS'] Index: head/www/firefox-i18n/Makefile =================================================================== --- head/www/firefox-i18n/Makefile (revision 438263) +++ head/www/firefox-i18n/Makefile (revision 438264) @@ -1,89 +1,89 @@ # Created by: Andrew Pantyukhin # $FreeBSD$ PORTNAME= firefox-i18n -PORTVERSION= 52.0.2 +PORTVERSION= 53.0 CATEGORIES= www MASTER_SITES= MOZILLA/${PORTNAME:S|-i18n||}/releases/${DISTVERSION}/linux-i686/xpi \ - MOZILLA/${PORTNAME:S|-i18n||}/candidates/${DISTVERSION}-candidates/build1/linux-i686/xpi + MOZILLA/${PORTNAME:S|-i18n||}/candidates/${DISTVERSION}-candidates/build3/linux-i686/xpi PKGNAMEPREFIX= DISTFILES= ${FIREFOX_I18N_:S/$/.xpi/} DIST_SUBDIR= xpi/${DISTNAME} MAINTAINER= gecko@FreeBSD.org COMMENT= Localized interface for Firefox EXTRACT_DEPENDS= zip:archivers/zip USES= zip:infozip gecko:firefox,52,build USE_XPI= firefox NO_ARCH= yes USE_SUBMAKE= yes WDIR= langpack-*@firefox.mozilla.org XPI_DISTNAMES= ${FIREFOX_I18N_} PLIST?= ${WRKDIR}/plist PLISTF?= ${WRKDIR}/plist_files .include "${.CURDIR}/Makefile.option" .include .ifndef WITHOUT_SWITCHER RUN_DEPENDS+= xpi-quick-locale-switcher>=0:www/xpi-quick-locale-switcher .endif .include "${.CURDIR}/Makefile.lang" FIREFOX_I18N_?= ${FIREFOX_I18N} .for dist in ${XPI_DISTNAMES} XPI_ID_${dist}= langpack-${dist}@firefox.mozilla.org .endfor pre-everything:: @${ECHO_CMD} @${ECHO_CMD} "Please define FIREFOX_I18N_ALL to install all languages." @${ECHO_CMD} do-extract: @${MKDIR} ${WRKSRC} @for lang in ${FIREFOX_I18N_}; do \ if ! (${UNZIP_CMD} -qo ${_DISTDIR}/$$lang.xpi -d ${WRKSRC}/langpack-$$lang@firefox.mozilla.org);\ then \ exit 1; \ fi; \ cd ${WRKSRC}/langpack-$$lang@firefox.mozilla.org/; \ ${FIND} -H -s * ! -type d | \ ${SED} -e "s|^|lib/xpi/langpack-$$lang@firefox.mozilla.org/|" >> ${PLISTF}; \ done ${CAT} ${PLISTF} | ${SORT} >> ${PLIST} do-install: @${MKDIR} ${STAGEDIR}${XPI_LIBDIR} cd ${WRKSRC}; ${PAX} -rw . ${STAGEDIR}${XPI_LIBDIR} ${CHMOD} -R a+rX,go-w ${STAGEDIR}${XPI_LIBDIR}/${WDIR}/ @for e in ${STAGEDIR}${XPI_LIBDIR}/${WDIR}; do \ for _dir in ${XPI_LINKFARMS} ; do \ ${LN} -sf $${_e##*/} ${STAGEDIR}$$_dir/ ${_Q} ; \ done \ done @${ECHO_CMD} '@exec ${INSTALL} -d ${XPI_SLDIRS_ALL:S,^${PREFIX},%D,}' ${_A} @${ECHO_CMD} '@exec for _dir in ${XPI_LINKFARMS} ; { \ ${LN} -sf ${XPI_LIBDIR}/${WDIR} $$_dir/ ${_Q}; }' ${_A} @${ECHO_CMD} '@unexec for _dir in ${XPI_LINKFARMS} ; { ${RM} $$_dir/${WDIR} ; }' ${_A} post-patch: ${FIND} ${WRKSRC} -name install.rdf -print0 | \ ${XARGS} -0L1 ${REINPLACE_CMD} -i '' -e '/ Index: head/www/firefox-i18n/distinfo =================================================================== --- head/www/firefox-i18n/distinfo (revision 438263) +++ head/www/firefox-i18n/distinfo (revision 438264) @@ -1,179 +1,179 @@ -TIMESTAMP = 1490348850 -SHA256 (xpi/firefox-i18n-52.0.2/ach.xpi) = 46a28dec74c400b26b894ff50e386bc4cd657d09450b0b2daa643fed234a49fe -SIZE (xpi/firefox-i18n-52.0.2/ach.xpi) = 427637 -SHA256 (xpi/firefox-i18n-52.0.2/af.xpi) = c63b3bc898c1d05acfbc69cd98192568e8e69e66e54590a418ba5de9b05d2fd4 -SIZE (xpi/firefox-i18n-52.0.2/af.xpi) = 436821 -SHA256 (xpi/firefox-i18n-52.0.2/an.xpi) = d341e02116d166a57451a043eb8c1a33f528050483a54129c1a42b5a3257a205 -SIZE (xpi/firefox-i18n-52.0.2/an.xpi) = 445141 -SHA256 (xpi/firefox-i18n-52.0.2/ar.xpi) = b20d225e90ae1d7641faafd80e7d0e53b811473410d45a21dd2fc2dd2b3b9a77 -SIZE (xpi/firefox-i18n-52.0.2/ar.xpi) = 473379 -SHA256 (xpi/firefox-i18n-52.0.2/as.xpi) = ad300a4a43e6961a75bb50089427b292b53e90a02d5d4420aae364192e952d02 -SIZE (xpi/firefox-i18n-52.0.2/as.xpi) = 486886 -SHA256 (xpi/firefox-i18n-52.0.2/ast.xpi) = bb39846af23b0e422be4727359233cc2df3f80751a24f0ff933b094300263a62 -SIZE (xpi/firefox-i18n-52.0.2/ast.xpi) = 440030 -SHA256 (xpi/firefox-i18n-52.0.2/az.xpi) = 238b8948b8dd429b96a25dced6968d4154749ade71ff2ccfdcda3ed15d694b69 -SIZE (xpi/firefox-i18n-52.0.2/az.xpi) = 454920 -SHA256 (xpi/firefox-i18n-52.0.2/bg.xpi) = 98adcbaf6f62e3dc8533ba9ad304f4e2183ab6cf93434522fe748b7bd28a5b50 -SIZE (xpi/firefox-i18n-52.0.2/bg.xpi) = 487890 -SHA256 (xpi/firefox-i18n-52.0.2/bn-BD.xpi) = 796e8ec22cf717829f59c697fa26d4ac22ad0f911f080a16d5fdf87774ee35cf -SIZE (xpi/firefox-i18n-52.0.2/bn-BD.xpi) = 511992 -SHA256 (xpi/firefox-i18n-52.0.2/bn-IN.xpi) = b90a849d2d23a223aa19f237861c793c50b0978a5129c89fd201270cf01fad6f -SIZE (xpi/firefox-i18n-52.0.2/bn-IN.xpi) = 509373 -SHA256 (xpi/firefox-i18n-52.0.2/br.xpi) = 57c2d2b6b7a2ee58ac7955c3e3d1085cd8cfc8b308812907c8e2507ad5065501 -SIZE (xpi/firefox-i18n-52.0.2/br.xpi) = 435481 -SHA256 (xpi/firefox-i18n-52.0.2/bs.xpi) = a41b344e55c7bff518188dace17be215cdb3ed003f7373b3ed5792ed3ad9aa93 -SIZE (xpi/firefox-i18n-52.0.2/bs.xpi) = 441781 -SHA256 (xpi/firefox-i18n-52.0.2/ca.xpi) = 07a394409d6092353e621f526843c4dcf786375c022a46a074860d9d1bfaf974 -SIZE (xpi/firefox-i18n-52.0.2/ca.xpi) = 443303 -SHA256 (xpi/firefox-i18n-52.0.2/cs.xpi) = 63765555f13a30b00076139d9ae83666075c6ab82c2c3dd9c7cb03bf4bd30b83 -SIZE (xpi/firefox-i18n-52.0.2/cs.xpi) = 444072 -SHA256 (xpi/firefox-i18n-52.0.2/cy.xpi) = 5ed4f0cd18880dad59be7bfa0231c9b6c09328de8299d955ca495558ad5d3ec3 -SIZE (xpi/firefox-i18n-52.0.2/cy.xpi) = 436582 -SHA256 (xpi/firefox-i18n-52.0.2/da.xpi) = 496b38aaffb4014fbc85052027c3c5fb91222264ec289c49f11b59b36b03097d -SIZE (xpi/firefox-i18n-52.0.2/da.xpi) = 424391 -SHA256 (xpi/firefox-i18n-52.0.2/de.xpi) = 49b7a797e31288de30ec2b659940a96735bb658a7c5aa1a81e15d2708d117388 -SIZE (xpi/firefox-i18n-52.0.2/de.xpi) = 442477 -SHA256 (xpi/firefox-i18n-52.0.2/dsb.xpi) = 84f3d361fbb320ecc6a19d2bc6b2ed0b6fafc28527a26cea8481f1e31e6f7873 -SIZE (xpi/firefox-i18n-52.0.2/dsb.xpi) = 459422 -SHA256 (xpi/firefox-i18n-52.0.2/el.xpi) = d7068492c5fe5fece28c6b02416c22ed77e33bc2bf62cf9a391fc0872b81a1ce -SIZE (xpi/firefox-i18n-52.0.2/el.xpi) = 516590 -SHA256 (xpi/firefox-i18n-52.0.2/en-GB.xpi) = 66001390175d8983abc372e5092fd03ce452b0eab00419cbcde263eccf372f1b -SIZE (xpi/firefox-i18n-52.0.2/en-GB.xpi) = 419322 -SHA256 (xpi/firefox-i18n-52.0.2/en-US.xpi) = 457b7309200df9d7850412740f9ca093eb84a1222792aaa87681ae2fab6e6d03 -SIZE (xpi/firefox-i18n-52.0.2/en-US.xpi) = 428627 -SHA256 (xpi/firefox-i18n-52.0.2/en-ZA.xpi) = 4507c1d5fc872e8f7ece588811046e4a994de4f64590771d98287c2d4eeba1af -SIZE (xpi/firefox-i18n-52.0.2/en-ZA.xpi) = 412209 -SHA256 (xpi/firefox-i18n-52.0.2/eo.xpi) = 983b6af6b5576ae92305c9f3c3e59f361256535aff167f13c494b8e9baf36bae -SIZE (xpi/firefox-i18n-52.0.2/eo.xpi) = 437471 -SHA256 (xpi/firefox-i18n-52.0.2/es-AR.xpi) = 4e001c2ca079d338fb113c8ac173094a6b94428c18f2a987cdc2b40b015bd2e1 -SIZE (xpi/firefox-i18n-52.0.2/es-AR.xpi) = 445924 -SHA256 (xpi/firefox-i18n-52.0.2/es-CL.xpi) = dc7e749e4f2ca9c6960b426b9e2f636202ac3a2cc3f1b1b06df0f03bb531e1aa -SIZE (xpi/firefox-i18n-52.0.2/es-CL.xpi) = 445675 -SHA256 (xpi/firefox-i18n-52.0.2/es-ES.xpi) = dd1d6fbea50903fd37f7f122b94b857d8d3c1ea45ad0f18735586294ef651273 -SIZE (xpi/firefox-i18n-52.0.2/es-ES.xpi) = 344875 -SHA256 (xpi/firefox-i18n-52.0.2/es-MX.xpi) = 06b6fbf5bf090ca988ac646f7b7ad173f81fee4cbc06efa8aff60efd0f028b2d -SIZE (xpi/firefox-i18n-52.0.2/es-MX.xpi) = 448383 -SHA256 (xpi/firefox-i18n-52.0.2/et.xpi) = e58153f1cd3110d1d3a165ce7301fb618782b17454e481bc222fe231bf58ed60 -SIZE (xpi/firefox-i18n-52.0.2/et.xpi) = 425112 -SHA256 (xpi/firefox-i18n-52.0.2/eu.xpi) = 19d9fbf829a8ecc937c505240be92ec8a0324f19d05bcabe5a56a3e1fefefb6a -SIZE (xpi/firefox-i18n-52.0.2/eu.xpi) = 438477 -SHA256 (xpi/firefox-i18n-52.0.2/fa.xpi) = 4fa4505571ae92264ca42ca0a55cc59d137b37e77cdbb0b24fb21c56b9cce8c0 -SIZE (xpi/firefox-i18n-52.0.2/fa.xpi) = 491342 -SHA256 (xpi/firefox-i18n-52.0.2/ff.xpi) = 698a02e232bcbc5c67a566f666f5e462bfa66c104015cbf6a6938185fdef85f0 -SIZE (xpi/firefox-i18n-52.0.2/ff.xpi) = 440926 -SHA256 (xpi/firefox-i18n-52.0.2/fi.xpi) = 79f369ed2c47676fb8d13dae59499ca22bd33eb52a51ec661522070ab33c7f6e -SIZE (xpi/firefox-i18n-52.0.2/fi.xpi) = 430058 -SHA256 (xpi/firefox-i18n-52.0.2/fr.xpi) = 0f3aa5e2f940c9d58a73e6388db14776f857cbd6fdaa84c2b6078f9fa2dba8fb -SIZE (xpi/firefox-i18n-52.0.2/fr.xpi) = 450208 -SHA256 (xpi/firefox-i18n-52.0.2/fy-NL.xpi) = 397c97d97183730701ed3295d7aebddf32b81207ade87c14018ffaeaad81337c -SIZE (xpi/firefox-i18n-52.0.2/fy-NL.xpi) = 444971 -SHA256 (xpi/firefox-i18n-52.0.2/ga-IE.xpi) = 2a4ec23a859ed66eeac2da30a33333d53b69e995d5733e7ff8d4703d73a7f12d -SIZE (xpi/firefox-i18n-52.0.2/ga-IE.xpi) = 458163 -SHA256 (xpi/firefox-i18n-52.0.2/gd.xpi) = 9471b63f068a154896946d205062688b1f79646263431bbfa79d0e44c64fbe53 -SIZE (xpi/firefox-i18n-52.0.2/gd.xpi) = 447265 -SHA256 (xpi/firefox-i18n-52.0.2/gl.xpi) = 9b92c412edcecee43756ac709c0cd382561485ba9b2fb6c2c5e84878ed274087 -SIZE (xpi/firefox-i18n-52.0.2/gl.xpi) = 447294 -SHA256 (xpi/firefox-i18n-52.0.2/gn.xpi) = cb9fe1f0eb9f08046c96a0a60781a5f87b9d3116b6b87b1a8cc131328b413ae4 -SIZE (xpi/firefox-i18n-52.0.2/gn.xpi) = 456213 -SHA256 (xpi/firefox-i18n-52.0.2/gu-IN.xpi) = b27f5139ded670a4f58c7e2f55ee413758c9f46f9190e3398bffa8137588ae53 -SIZE (xpi/firefox-i18n-52.0.2/gu-IN.xpi) = 489365 -SHA256 (xpi/firefox-i18n-52.0.2/he.xpi) = 3975a4028cf4137fbe23f8d3daab92ba0116deabccfe9feb00be9f8bb10e9cd7 -SIZE (xpi/firefox-i18n-52.0.2/he.xpi) = 455281 -SHA256 (xpi/firefox-i18n-52.0.2/hi-IN.xpi) = 8039d71d12d43f98315d734f374461d17059b5f6d84c144f42e0e39c58bec2fd -SIZE (xpi/firefox-i18n-52.0.2/hi-IN.xpi) = 506516 -SHA256 (xpi/firefox-i18n-52.0.2/hr.xpi) = e3c7e75bc1d445a110e31aa823f2d60ba8283ceb9f1a0fb381d635a8d653c479 -SIZE (xpi/firefox-i18n-52.0.2/hr.xpi) = 447501 -SHA256 (xpi/firefox-i18n-52.0.2/hsb.xpi) = df1a7df836781b9d32ae33ebb3c01fd95b58ae75acf9e87655c7eb7114e4b08c -SIZE (xpi/firefox-i18n-52.0.2/hsb.xpi) = 457258 -SHA256 (xpi/firefox-i18n-52.0.2/hu.xpi) = 4ddcef44310b790c314e069556abb34fec9cc47fe25e0f89acfbdf2ae7c62725 -SIZE (xpi/firefox-i18n-52.0.2/hu.xpi) = 451493 -SHA256 (xpi/firefox-i18n-52.0.2/hy-AM.xpi) = 9d8227c27bee38324727681f4a6a58c2d111e38998b5c2e2be645d8a81ac5acb -SIZE (xpi/firefox-i18n-52.0.2/hy-AM.xpi) = 495771 -SHA256 (xpi/firefox-i18n-52.0.2/id.xpi) = aeb3aee8ff4066b8f5b6947c90b50daf49a42722b64ff219be7f050fbac500fa -SIZE (xpi/firefox-i18n-52.0.2/id.xpi) = 426022 -SHA256 (xpi/firefox-i18n-52.0.2/is.xpi) = 392d2e44f60ed162a0c1c662549d796d907529a7f48468c064f02daef4843300 -SIZE (xpi/firefox-i18n-52.0.2/is.xpi) = 442695 -SHA256 (xpi/firefox-i18n-52.0.2/it.xpi) = 9c61bfc7b21987c497941db6d8a7a8551e1af71deacd24b63971e000ecab3661 -SIZE (xpi/firefox-i18n-52.0.2/it.xpi) = 339219 -SHA256 (xpi/firefox-i18n-52.0.2/ja.xpi) = 631f3391dc3918369a5ef73982c020ed77566f06fef22a633828ae81b0f591c7 -SIZE (xpi/firefox-i18n-52.0.2/ja.xpi) = 488342 -SHA256 (xpi/firefox-i18n-52.0.2/kk.xpi) = 34530b6a9d15c22a9edbe43ac4d4f76e8c2a352355646ecfa3acfad236f0f1af -SIZE (xpi/firefox-i18n-52.0.2/kk.xpi) = 496937 -SHA256 (xpi/firefox-i18n-52.0.2/km.xpi) = 61fc53a527bc4c5723c71dffffc2564e413f6cc8b7ad9ba1208474e7b26ded7c -SIZE (xpi/firefox-i18n-52.0.2/km.xpi) = 520342 -SHA256 (xpi/firefox-i18n-52.0.2/kn.xpi) = b8b635b6d857a145d258fc7ef67609b4842c09de3857d3acb65058b1a9331dfa -SIZE (xpi/firefox-i18n-52.0.2/kn.xpi) = 519454 -SHA256 (xpi/firefox-i18n-52.0.2/ko.xpi) = 7b951abdbff6b3f2b1b2f074e9c2ac8c23f222a3379a40f278c7a218d1b07f32 -SIZE (xpi/firefox-i18n-52.0.2/ko.xpi) = 463629 -SHA256 (xpi/firefox-i18n-52.0.2/lij.xpi) = aa25a8a6b7bbf585199c655aabbd017e4dc11c05389e180d9e7d0df6245b7384 -SIZE (xpi/firefox-i18n-52.0.2/lij.xpi) = 421071 -SHA256 (xpi/firefox-i18n-52.0.2/lt.xpi) = a255238cff530ffaef75dcfe45bf8a22b59fae6be781da5fac3302af8c509dd1 -SIZE (xpi/firefox-i18n-52.0.2/lt.xpi) = 452234 -SHA256 (xpi/firefox-i18n-52.0.2/lv.xpi) = ca6828ae04899e618e576288bd2a45582347e31d4b1d3e3e9e27ec479cf1e280 -SIZE (xpi/firefox-i18n-52.0.2/lv.xpi) = 448449 -SHA256 (xpi/firefox-i18n-52.0.2/mai.xpi) = 02338b36d11863f61b1208a476b69dc0d1b4569500692a6041bce271d73ec488 -SIZE (xpi/firefox-i18n-52.0.2/mai.xpi) = 499838 -SHA256 (xpi/firefox-i18n-52.0.2/mk.xpi) = cccd132a530a4a0bd20e573a5b9eb01e20a6b214b4dcb4b0b5172d438ad09098 -SIZE (xpi/firefox-i18n-52.0.2/mk.xpi) = 496198 -SHA256 (xpi/firefox-i18n-52.0.2/ml.xpi) = 8a06f9959060884b660b7e0c7d8ac5bca3af2cbede25fabcada56c450147cfe9 -SIZE (xpi/firefox-i18n-52.0.2/ml.xpi) = 516485 -SHA256 (xpi/firefox-i18n-52.0.2/mr.xpi) = cdd57ca6da4964c3d85db9ae5b66344ea37b462e5c6a8d67cab9c5984942b9b8 -SIZE (xpi/firefox-i18n-52.0.2/mr.xpi) = 502429 -SHA256 (xpi/firefox-i18n-52.0.2/ms.xpi) = 575abeeaa27eadb22bb7db64455d2ea3a0e1e1489e4649084b5da888dd6a3ef5 -SIZE (xpi/firefox-i18n-52.0.2/ms.xpi) = 435989 -SHA256 (xpi/firefox-i18n-52.0.2/nb-NO.xpi) = 0eb0571fe1f2ce42b531e872a75e144905feb9df3a5222539cb57625c732b1c1 -SIZE (xpi/firefox-i18n-52.0.2/nb-NO.xpi) = 434410 -SHA256 (xpi/firefox-i18n-52.0.2/nl.xpi) = f087cb5cfc1ca8a8099f1780eb4af54d45634f3b29413007cc43054c8ac0312b -SIZE (xpi/firefox-i18n-52.0.2/nl.xpi) = 432005 -SHA256 (xpi/firefox-i18n-52.0.2/nn-NO.xpi) = 36f8c050f21d068f1af7305258273257c66087849d1bb28970075057f6636434 -SIZE (xpi/firefox-i18n-52.0.2/nn-NO.xpi) = 428642 -SHA256 (xpi/firefox-i18n-52.0.2/or.xpi) = 1da04e28aa10b9af5e4f964674116a14905480d346f054f0dbf6ee69d5543a7b -SIZE (xpi/firefox-i18n-52.0.2/or.xpi) = 496914 -SHA256 (xpi/firefox-i18n-52.0.2/pa-IN.xpi) = f1ffa9dbfef26c65187a76d85c88cdea8fd4351fa0a7deda8d53c9af5aa3b78a -SIZE (xpi/firefox-i18n-52.0.2/pa-IN.xpi) = 476585 -SHA256 (xpi/firefox-i18n-52.0.2/pl.xpi) = e80cc845cd383cda82fdc2bb0e4e0ddeb4029558546d2bc03e3d8239eacb8463 -SIZE (xpi/firefox-i18n-52.0.2/pl.xpi) = 352850 -SHA256 (xpi/firefox-i18n-52.0.2/pt-BR.xpi) = 9e452c0562f4241302ffe682967d8635805c9733e2b7cbde2a57bca1df4d6e52 -SIZE (xpi/firefox-i18n-52.0.2/pt-BR.xpi) = 438168 -SHA256 (xpi/firefox-i18n-52.0.2/pt-PT.xpi) = 914ad44b853ef8eb25c8c255619b467dba4329be5e76ece189de72c43d5e39b5 -SIZE (xpi/firefox-i18n-52.0.2/pt-PT.xpi) = 436725 -SHA256 (xpi/firefox-i18n-52.0.2/rm.xpi) = 07c385a14377d8eeba68406ab1dd40b8506147c55133bb604b048e1543bf1821 -SIZE (xpi/firefox-i18n-52.0.2/rm.xpi) = 434607 -SHA256 (xpi/firefox-i18n-52.0.2/ro.xpi) = 60198c04cdab52fd275abe62f56e04289ae7a22f7d84cdf61a06589431557168 -SIZE (xpi/firefox-i18n-52.0.2/ro.xpi) = 449935 -SHA256 (xpi/firefox-i18n-52.0.2/ru.xpi) = 619efb022f7eedefb5c3e3e9038bf6dd3e95fc73f1de8049b97631110560c93f -SIZE (xpi/firefox-i18n-52.0.2/ru.xpi) = 395362 -SHA256 (xpi/firefox-i18n-52.0.2/si.xpi) = 4e90ee6fba5bebd359541af331a0728131476e41e2b02d774f9da6b7e3e808df -SIZE (xpi/firefox-i18n-52.0.2/si.xpi) = 491957 -SHA256 (xpi/firefox-i18n-52.0.2/sk.xpi) = 21e46ea68503a8058188822dc774a9463ae60a60642bfa0b750c39c7f356aa19 -SIZE (xpi/firefox-i18n-52.0.2/sk.xpi) = 455817 -SHA256 (xpi/firefox-i18n-52.0.2/sl.xpi) = d7960ff34578f09f4d9caa5630d7550b22235f36ab2b4ac876dcdd0192a444a7 -SIZE (xpi/firefox-i18n-52.0.2/sl.xpi) = 433481 -SHA256 (xpi/firefox-i18n-52.0.2/son.xpi) = bdc20ab4dacf72d375dc22677134e0b57cd79705e8a86dfcc9376e33b2fde193 -SIZE (xpi/firefox-i18n-52.0.2/son.xpi) = 435126 -SHA256 (xpi/firefox-i18n-52.0.2/sq.xpi) = 42769c0e78ae845c439a606480bfe38cf7a0f0428e692f1ccb54ae9490619a1d -SIZE (xpi/firefox-i18n-52.0.2/sq.xpi) = 448154 -SHA256 (xpi/firefox-i18n-52.0.2/sr.xpi) = 91eaa2f539233af915e816d2d0c165828e1b877b7ada63e86b43207900e30473 -SIZE (xpi/firefox-i18n-52.0.2/sr.xpi) = 463392 -SHA256 (xpi/firefox-i18n-52.0.2/sv-SE.xpi) = ebdfc72bec47311ccc4fb3c8d89de3ee82d6eba28a1e93a0864512f8a9df50fc -SIZE (xpi/firefox-i18n-52.0.2/sv-SE.xpi) = 441179 -SHA256 (xpi/firefox-i18n-52.0.2/ta.xpi) = a7c06a0a0275ea9df6a496b158ae13f58943811e29ceeec98697ba3c3a1a2f51 -SIZE (xpi/firefox-i18n-52.0.2/ta.xpi) = 494798 -SHA256 (xpi/firefox-i18n-52.0.2/te.xpi) = 8b91189605191a3704754f6421f7c2fb0dabc1237d44ec18b222b197b069be43 -SIZE (xpi/firefox-i18n-52.0.2/te.xpi) = 515239 -SHA256 (xpi/firefox-i18n-52.0.2/th.xpi) = 1309494d11a907096e04251978e090d85faa01af0672935cbef69e07ef513e83 -SIZE (xpi/firefox-i18n-52.0.2/th.xpi) = 489377 -SHA256 (xpi/firefox-i18n-52.0.2/tr.xpi) = 0e3b4defe3da096b0592fe2140bfa1a2f1d3471c6197f7c3fc3944f5a98c63ca -SIZE (xpi/firefox-i18n-52.0.2/tr.xpi) = 443670 -SHA256 (xpi/firefox-i18n-52.0.2/uk.xpi) = ce9e641feac457f804eb3654f8bbfbf57c8a5574185f09e13ed636b3b4b6cfe2 -SIZE (xpi/firefox-i18n-52.0.2/uk.xpi) = 495093 -SHA256 (xpi/firefox-i18n-52.0.2/uz.xpi) = 649a1bd017a6230868ce99eb55dab3ad6e27e443ba96f0fd6382e095006aaa4a -SIZE (xpi/firefox-i18n-52.0.2/uz.xpi) = 447914 -SHA256 (xpi/firefox-i18n-52.0.2/vi.xpi) = 7a8bc3e7c68853b2a32321a180d431522528bc2574cff6d37f565f58a32e2773 -SIZE (xpi/firefox-i18n-52.0.2/vi.xpi) = 450803 -SHA256 (xpi/firefox-i18n-52.0.2/xh.xpi) = bb5b38a0c4edf7b777efbff8c2f832ee9422247257d0cc25c5257122e76cdfb9 -SIZE (xpi/firefox-i18n-52.0.2/xh.xpi) = 441170 -SHA256 (xpi/firefox-i18n-52.0.2/zh-CN.xpi) = b09d4dc5567d0e147c4d1ed623a65f44f60ad67601b7d285f5d5658901c594db -SIZE (xpi/firefox-i18n-52.0.2/zh-CN.xpi) = 461691 -SHA256 (xpi/firefox-i18n-52.0.2/zh-TW.xpi) = 26061af5b560a3df1657f589741fd551c607142cb775981492bdfad888fc4cb8 -SIZE (xpi/firefox-i18n-52.0.2/zh-TW.xpi) = 472532 +TIMESTAMP = 1491914864 +SHA256 (xpi/firefox-i18n-53.0/ach.xpi) = 6b50af6b457608c625b5a99c0f467e9e13827e84387223682c251847ef12ec03 +SIZE (xpi/firefox-i18n-53.0/ach.xpi) = 432350 +SHA256 (xpi/firefox-i18n-53.0/af.xpi) = 2e030e8d993a72fc2b922bd71749564706d5bbc4f5edd1d5cb0a2e2d341dd397 +SIZE (xpi/firefox-i18n-53.0/af.xpi) = 441829 +SHA256 (xpi/firefox-i18n-53.0/an.xpi) = 3b049eabcf49f57742f574c792b0f15a2f0fe7af8d7700074555741eba4b40bd +SIZE (xpi/firefox-i18n-53.0/an.xpi) = 450799 +SHA256 (xpi/firefox-i18n-53.0/ar.xpi) = 0df14612d4a6fe4e6da247b8529b45ab856d3a6d6bf284dac9654af2b4c91909 +SIZE (xpi/firefox-i18n-53.0/ar.xpi) = 479118 +SHA256 (xpi/firefox-i18n-53.0/as.xpi) = 67a780398046cfb66c7b10d8aa3e42a7b8eef5d8eedb2f7d890ab1a748049708 +SIZE (xpi/firefox-i18n-53.0/as.xpi) = 491255 +SHA256 (xpi/firefox-i18n-53.0/ast.xpi) = 0b0cab248642b295d3ec4fdb5206c4b4ab3ec1d8aa9cec573f230bd6fa75a816 +SIZE (xpi/firefox-i18n-53.0/ast.xpi) = 445436 +SHA256 (xpi/firefox-i18n-53.0/az.xpi) = 59ead0e267f43af93c7caa1148947224dc4206d42a37f80156ff47adae994261 +SIZE (xpi/firefox-i18n-53.0/az.xpi) = 459503 +SHA256 (xpi/firefox-i18n-53.0/bg.xpi) = 5ca6477997bd96165af804a2a8bcd6c01c8bfb5c9f98354e1602f49a922cf65b +SIZE (xpi/firefox-i18n-53.0/bg.xpi) = 492607 +SHA256 (xpi/firefox-i18n-53.0/bn-BD.xpi) = 9f52c102c056489b2187f9d781a645f2c1d205b812a3ca6afdad56130c211c7f +SIZE (xpi/firefox-i18n-53.0/bn-BD.xpi) = 516501 +SHA256 (xpi/firefox-i18n-53.0/bn-IN.xpi) = f913e5d79388285ae6a7e7f59b81855135336c50c37e3dd90cbd101057017600 +SIZE (xpi/firefox-i18n-53.0/bn-IN.xpi) = 513552 +SHA256 (xpi/firefox-i18n-53.0/br.xpi) = 0bb79e4c792cd3bba0804064f91963389daba26a486cbf3fe84045ee6701ec07 +SIZE (xpi/firefox-i18n-53.0/br.xpi) = 440067 +SHA256 (xpi/firefox-i18n-53.0/bs.xpi) = e4c803a77b70c0077c3f0fb467a601b5ff143a37ac8303dd97005b7aa3007864 +SIZE (xpi/firefox-i18n-53.0/bs.xpi) = 446633 +SHA256 (xpi/firefox-i18n-53.0/ca.xpi) = 18483d647252cb2d6c9be0a2ec460de22cdecaa492b02d4a1ef3e5f9ded2aa59 +SIZE (xpi/firefox-i18n-53.0/ca.xpi) = 448941 +SHA256 (xpi/firefox-i18n-53.0/cs.xpi) = 5335967e578088e691d59a6f0540380075dab79e611c53fd67e2938da432f25a +SIZE (xpi/firefox-i18n-53.0/cs.xpi) = 449411 +SHA256 (xpi/firefox-i18n-53.0/cy.xpi) = 0822da739fc2ce0bf267dcafc8af2841432e62793e4c66ca79d0d937c4e5780e +SIZE (xpi/firefox-i18n-53.0/cy.xpi) = 441503 +SHA256 (xpi/firefox-i18n-53.0/da.xpi) = 823dfd42463c4b31a6a5b1cfdcb79bfda8e80ade999cd9d481d09e48b97190c6 +SIZE (xpi/firefox-i18n-53.0/da.xpi) = 428973 +SHA256 (xpi/firefox-i18n-53.0/de.xpi) = 81a6ac063827b7c3eb99a26b491e26c5e6898edf51e2d836d60e14a69a2d150d +SIZE (xpi/firefox-i18n-53.0/de.xpi) = 447784 +SHA256 (xpi/firefox-i18n-53.0/dsb.xpi) = 72e03e9bcefc173af4df02bfc99f22df99e7b3829cbc1d07de1b3d98e8092b35 +SIZE (xpi/firefox-i18n-53.0/dsb.xpi) = 464374 +SHA256 (xpi/firefox-i18n-53.0/el.xpi) = e8815fb6cae7632d70ae00cd28293a96f9d875f4f2e4e6c1491751037f293437 +SIZE (xpi/firefox-i18n-53.0/el.xpi) = 523412 +SHA256 (xpi/firefox-i18n-53.0/en-GB.xpi) = 258bec58ec28b75eb3db7c9b9cc68af21497eb49603994ace4aaa105840c84fd +SIZE (xpi/firefox-i18n-53.0/en-GB.xpi) = 424829 +SHA256 (xpi/firefox-i18n-53.0/en-US.xpi) = e8d3d164d433d755f7619c8413d1f53041f2f23d5819c8043362408b26245398 +SIZE (xpi/firefox-i18n-53.0/en-US.xpi) = 430736 +SHA256 (xpi/firefox-i18n-53.0/en-ZA.xpi) = 0fe0b4fc2bb38f15bfff36e44bbb2c62715daaa6b242f3914581512684fddeb7 +SIZE (xpi/firefox-i18n-53.0/en-ZA.xpi) = 417992 +SHA256 (xpi/firefox-i18n-53.0/eo.xpi) = 541501fc0829fcf8147ee269224928b52e6cf4e8f1b362a4177d63f906db902e +SIZE (xpi/firefox-i18n-53.0/eo.xpi) = 442322 +SHA256 (xpi/firefox-i18n-53.0/es-AR.xpi) = 61ff3ce7467b5222e110107c4119e9f752645ad0b31c6b614487bb5c533a0311 +SIZE (xpi/firefox-i18n-53.0/es-AR.xpi) = 450766 +SHA256 (xpi/firefox-i18n-53.0/es-CL.xpi) = a806fc6176247cda5a54ef853c9637775f9a1c2e29a87dd1b55742a71f852b33 +SIZE (xpi/firefox-i18n-53.0/es-CL.xpi) = 450475 +SHA256 (xpi/firefox-i18n-53.0/es-ES.xpi) = 8604ba37430f71b800a67361ce53b2325d7d71cefd0167170db35c4f2e02ce59 +SIZE (xpi/firefox-i18n-53.0/es-ES.xpi) = 347587 +SHA256 (xpi/firefox-i18n-53.0/es-MX.xpi) = 2173f50a3dea92c658a7e60ae76fbab81335e2bd843a835bd31db2e6162d75f1 +SIZE (xpi/firefox-i18n-53.0/es-MX.xpi) = 453324 +SHA256 (xpi/firefox-i18n-53.0/et.xpi) = 1ded0ac4ec18c88b8c9425a9f00f02112514c0474c442d445fd210dae019bc77 +SIZE (xpi/firefox-i18n-53.0/et.xpi) = 428863 +SHA256 (xpi/firefox-i18n-53.0/eu.xpi) = 624fc7dfe57168f616153f03f34348786f82efe5dcb0a510d4e42c93560bede7 +SIZE (xpi/firefox-i18n-53.0/eu.xpi) = 443202 +SHA256 (xpi/firefox-i18n-53.0/fa.xpi) = a745c9cdf381f18097755226fd7fff59840c6498fd8601d8850f7b22d36ddddb +SIZE (xpi/firefox-i18n-53.0/fa.xpi) = 496781 +SHA256 (xpi/firefox-i18n-53.0/ff.xpi) = f68a9e23a8e2a02ff493ebd0bd9698b17ff5a5a3850bc8f21bf6fe2d6c6f22cf +SIZE (xpi/firefox-i18n-53.0/ff.xpi) = 446668 +SHA256 (xpi/firefox-i18n-53.0/fi.xpi) = b99cc77e76dcbf9a25fa68c622648aa9e2db64b610c83012d8695f13e55d23a9 +SIZE (xpi/firefox-i18n-53.0/fi.xpi) = 434620 +SHA256 (xpi/firefox-i18n-53.0/fr.xpi) = 85436c3886b9b89e601ddf39329af76275a0010fb6acc723574a239154cd3f07 +SIZE (xpi/firefox-i18n-53.0/fr.xpi) = 457534 +SHA256 (xpi/firefox-i18n-53.0/fy-NL.xpi) = 1896b79fd6ac6bfa4beca5f56d88292375231836d1d031a4146b126f464403ea +SIZE (xpi/firefox-i18n-53.0/fy-NL.xpi) = 449819 +SHA256 (xpi/firefox-i18n-53.0/ga-IE.xpi) = c276e493fd8a6a77bb9f6a0542763ded93ceff0f74dfdc7329f2c86105d30e6c +SIZE (xpi/firefox-i18n-53.0/ga-IE.xpi) = 463129 +SHA256 (xpi/firefox-i18n-53.0/gd.xpi) = 4da4ab8fc415524ea83e99f63edc5546c0027e8b3dca1615905e69521c358a38 +SIZE (xpi/firefox-i18n-53.0/gd.xpi) = 452061 +SHA256 (xpi/firefox-i18n-53.0/gl.xpi) = 3a6bbcc4ac4e7b6a16031a64a8b8518fa18c7932d90bbbedfa79beecc32ece96 +SIZE (xpi/firefox-i18n-53.0/gl.xpi) = 449150 +SHA256 (xpi/firefox-i18n-53.0/gn.xpi) = b750ecda7bef4e14213d8e04281e080748cf48ec6e26e81457de9451aabd1454 +SIZE (xpi/firefox-i18n-53.0/gn.xpi) = 461571 +SHA256 (xpi/firefox-i18n-53.0/gu-IN.xpi) = 922ab30d6f1cb0747d1cd18ec526014e6f1761d5667f5d16eed834ac214149f4 +SIZE (xpi/firefox-i18n-53.0/gu-IN.xpi) = 493667 +SHA256 (xpi/firefox-i18n-53.0/he.xpi) = 11d021e790ab97612caa09afd29586fff8d680f8c4267920180f4a2b888e34a2 +SIZE (xpi/firefox-i18n-53.0/he.xpi) = 460047 +SHA256 (xpi/firefox-i18n-53.0/hi-IN.xpi) = af30c610f0e1300a2deeb47438e303b1714fd554f7859693d0a55109915d66d9 +SIZE (xpi/firefox-i18n-53.0/hi-IN.xpi) = 511787 +SHA256 (xpi/firefox-i18n-53.0/hr.xpi) = f4f7ffc50536c254a274e593eefb63fa5d26601968efc4f53d71179c6c95180c +SIZE (xpi/firefox-i18n-53.0/hr.xpi) = 453109 +SHA256 (xpi/firefox-i18n-53.0/hsb.xpi) = ba0e3f0d2d40c45d2b481dfd2680a2fc312e6eb981058c85e696690f90f52d4d +SIZE (xpi/firefox-i18n-53.0/hsb.xpi) = 462170 +SHA256 (xpi/firefox-i18n-53.0/hu.xpi) = 486d533bddbc6dd76a435fbe4efcb092218ec13ccc62aaaf2577b118d008bff8 +SIZE (xpi/firefox-i18n-53.0/hu.xpi) = 456925 +SHA256 (xpi/firefox-i18n-53.0/hy-AM.xpi) = d0b02e04e824c1110f3bc1c16854e0d65632fbc1683ff149def5cb3878e35dca +SIZE (xpi/firefox-i18n-53.0/hy-AM.xpi) = 500717 +SHA256 (xpi/firefox-i18n-53.0/id.xpi) = e4533c814f961d10f807c9e575989e1116bba1369731fc8f46c00fd5cc9d966a +SIZE (xpi/firefox-i18n-53.0/id.xpi) = 430280 +SHA256 (xpi/firefox-i18n-53.0/is.xpi) = da4be8811abad593f3f8bf06f922ccdc0873a59ed6f63fbfc5d541272e211b89 +SIZE (xpi/firefox-i18n-53.0/is.xpi) = 447329 +SHA256 (xpi/firefox-i18n-53.0/it.xpi) = 7dbbe76bfea715179c118ed0d3547596454d45e9ee0b001d876893db807b68b8 +SIZE (xpi/firefox-i18n-53.0/it.xpi) = 341968 +SHA256 (xpi/firefox-i18n-53.0/ja.xpi) = d0ce0ca453f180cdf7edabf18e3268f3117c70018fd2d06f870b60eee8d5c2cf +SIZE (xpi/firefox-i18n-53.0/ja.xpi) = 493027 +SHA256 (xpi/firefox-i18n-53.0/kk.xpi) = 29bbb10188bac81daf7d73c82da3d4c653fd4b8ae384527b18bbda3fed07eca3 +SIZE (xpi/firefox-i18n-53.0/kk.xpi) = 499340 +SHA256 (xpi/firefox-i18n-53.0/km.xpi) = 36101d95663960644b096602ee3db596b0f1e59ead95e9a5bf64be3accad8bdb +SIZE (xpi/firefox-i18n-53.0/km.xpi) = 524728 +SHA256 (xpi/firefox-i18n-53.0/kn.xpi) = 59c340fdedbf240a5e46e07144a11ce01cb0bd83d4cd7fa0c611e2f2bcbd465e +SIZE (xpi/firefox-i18n-53.0/kn.xpi) = 524035 +SHA256 (xpi/firefox-i18n-53.0/ko.xpi) = 9e67ce2142de5d82e959dff3e812efff88ec34f1b691d07fa0312a50173de95d +SIZE (xpi/firefox-i18n-53.0/ko.xpi) = 468651 +SHA256 (xpi/firefox-i18n-53.0/lij.xpi) = c739536b93b9f8a6b97f958531d19907752d77619d84232e03bf9b14bb543995 +SIZE (xpi/firefox-i18n-53.0/lij.xpi) = 435428 +SHA256 (xpi/firefox-i18n-53.0/lt.xpi) = 8a42c0b05b37d3554ae70478a84a16b8e78ee3aa6eb26a1b6fd4cbaba0e9c1bb +SIZE (xpi/firefox-i18n-53.0/lt.xpi) = 457033 +SHA256 (xpi/firefox-i18n-53.0/lv.xpi) = e2067c4beced017ce7559bf0bb610d5cc3e2fc0e2d654223e93224fe09f26c49 +SIZE (xpi/firefox-i18n-53.0/lv.xpi) = 453376 +SHA256 (xpi/firefox-i18n-53.0/mai.xpi) = de5a34ad598a77c50be8f51529ec384f163ab388d6c14919a1928bf00dc4a8ea +SIZE (xpi/firefox-i18n-53.0/mai.xpi) = 504301 +SHA256 (xpi/firefox-i18n-53.0/mk.xpi) = bd05f2c417b776651c5aa58f610d532a7b1402c9ab30fdde3126e3bd7b38ccc9 +SIZE (xpi/firefox-i18n-53.0/mk.xpi) = 499954 +SHA256 (xpi/firefox-i18n-53.0/ml.xpi) = 89e1127cfd43e994b39505b901e5dc696acbe744cd55f30ebfbd832530ae4d59 +SIZE (xpi/firefox-i18n-53.0/ml.xpi) = 520665 +SHA256 (xpi/firefox-i18n-53.0/mr.xpi) = 94d69be50f1c958102715dcc93ed12f2e9e8b8dd9431c9f675949b9208a0ae45 +SIZE (xpi/firefox-i18n-53.0/mr.xpi) = 507881 +SHA256 (xpi/firefox-i18n-53.0/ms.xpi) = d0a9ebeb04a68cbf250cfc02aca420e1398d09709dcc2ec2030b90ccaaeee314 +SIZE (xpi/firefox-i18n-53.0/ms.xpi) = 440726 +SHA256 (xpi/firefox-i18n-53.0/nb-NO.xpi) = d87de6098aa2e6a6589a4892009e321702cdf3ab78f1d098b8c8cc4002b8b250 +SIZE (xpi/firefox-i18n-53.0/nb-NO.xpi) = 439031 +SHA256 (xpi/firefox-i18n-53.0/nl.xpi) = d81a6ffa69b3735e9d2d7009a5272917566960842ef6bfd3d1ddfa79ef486954 +SIZE (xpi/firefox-i18n-53.0/nl.xpi) = 436859 +SHA256 (xpi/firefox-i18n-53.0/nn-NO.xpi) = 4e514e8d606b0af61e383830fb4cd01026c54670886c4292222280be15628afe +SIZE (xpi/firefox-i18n-53.0/nn-NO.xpi) = 433328 +SHA256 (xpi/firefox-i18n-53.0/or.xpi) = 1dd68ac544f06277082413f6673ec34e4e2472991b6ee3c0ee2e6eb2136da45f +SIZE (xpi/firefox-i18n-53.0/or.xpi) = 501207 +SHA256 (xpi/firefox-i18n-53.0/pa-IN.xpi) = 02fd50b2c13337bbda22d54d9284418ddbb015107194a0ceef1983686de8f76c +SIZE (xpi/firefox-i18n-53.0/pa-IN.xpi) = 480863 +SHA256 (xpi/firefox-i18n-53.0/pl.xpi) = a883b9cee7408f109fc1c4f7067081b83d483c341c972d1ba458635e64e68402 +SIZE (xpi/firefox-i18n-53.0/pl.xpi) = 354948 +SHA256 (xpi/firefox-i18n-53.0/pt-BR.xpi) = 0fa8dc3ed0ebd891e877782b04b9b256b9074612095feed6002b21d6beb27f21 +SIZE (xpi/firefox-i18n-53.0/pt-BR.xpi) = 442706 +SHA256 (xpi/firefox-i18n-53.0/pt-PT.xpi) = e330926df408aa8641f75736a9badef3e7e4e6e2aba7b2ea94b614aafdb563ae +SIZE (xpi/firefox-i18n-53.0/pt-PT.xpi) = 441597 +SHA256 (xpi/firefox-i18n-53.0/rm.xpi) = 02b3d8b7c7a955ebc031515048fa973901551e503b469404c9424188f7d7ffb1 +SIZE (xpi/firefox-i18n-53.0/rm.xpi) = 439746 +SHA256 (xpi/firefox-i18n-53.0/ro.xpi) = e4369e1952a7960a95b2c081c8103006b1d0cf6bf03caa42a457b5ef3300ab50 +SIZE (xpi/firefox-i18n-53.0/ro.xpi) = 454821 +SHA256 (xpi/firefox-i18n-53.0/ru.xpi) = a2d465ba99ba544cefd517c3c2725453501e04d993fe0c6554c04d5e1a2e52c6 +SIZE (xpi/firefox-i18n-53.0/ru.xpi) = 506893 +SHA256 (xpi/firefox-i18n-53.0/si.xpi) = 3f59729bae26437926a1db83d3cb711f5e5a7dc0b77bcb8ded6741cbaa400e35 +SIZE (xpi/firefox-i18n-53.0/si.xpi) = 496182 +SHA256 (xpi/firefox-i18n-53.0/sk.xpi) = 9b59cc6c64d376c99f599ba39094ac2c9d0cbd7460e8a22b27d6a0840337e3a4 +SIZE (xpi/firefox-i18n-53.0/sk.xpi) = 460857 +SHA256 (xpi/firefox-i18n-53.0/sl.xpi) = 04454bfb17d444bb5bee5075e67c63bbaa021293bfdb73ef6c34b41ddd16ddc6 +SIZE (xpi/firefox-i18n-53.0/sl.xpi) = 438368 +SHA256 (xpi/firefox-i18n-53.0/son.xpi) = e3eb6d18f50936eb502aa115f93b23769e7490b34fea9d7a95263a2700a52d99 +SIZE (xpi/firefox-i18n-53.0/son.xpi) = 439833 +SHA256 (xpi/firefox-i18n-53.0/sq.xpi) = 8e2472bdb82639b71fd57fa8f9beec91fb5d3542b086f24ff53155d12c66abe7 +SIZE (xpi/firefox-i18n-53.0/sq.xpi) = 453422 +SHA256 (xpi/firefox-i18n-53.0/sr.xpi) = c89f53af42e87fdb87cc5f3651fe4bd33c98ed2306102ed91961e2901793771e +SIZE (xpi/firefox-i18n-53.0/sr.xpi) = 467995 +SHA256 (xpi/firefox-i18n-53.0/sv-SE.xpi) = 8ea1cbf75b2a2dd31fbaabda7af29a911a70d0565c82058f38d677e43bf07e73 +SIZE (xpi/firefox-i18n-53.0/sv-SE.xpi) = 445794 +SHA256 (xpi/firefox-i18n-53.0/ta.xpi) = 6f9c38e64e388bc9d20e29ca63d3ff9b67b3d6a896bc0d647a50ec90295f3413 +SIZE (xpi/firefox-i18n-53.0/ta.xpi) = 500477 +SHA256 (xpi/firefox-i18n-53.0/te.xpi) = b7b8b3b74d150c3d676a2f527f77c3c80c2f4ecdf255e280ed2db3a748e6abe3 +SIZE (xpi/firefox-i18n-53.0/te.xpi) = 520473 +SHA256 (xpi/firefox-i18n-53.0/th.xpi) = baf97ade535c20e08c5a804a2a08441b07e6237b35970e9471490a8c74fb32d0 +SIZE (xpi/firefox-i18n-53.0/th.xpi) = 494085 +SHA256 (xpi/firefox-i18n-53.0/tr.xpi) = e25bdd9f0e2fccffd28cfeb4df596a41f762c20933593dfe3ff5b044af703e81 +SIZE (xpi/firefox-i18n-53.0/tr.xpi) = 445852 +SHA256 (xpi/firefox-i18n-53.0/uk.xpi) = b0259c08112f7a846d9fef89f1fc44130e7ce1760efaf4a0ec6e657c08351fac +SIZE (xpi/firefox-i18n-53.0/uk.xpi) = 497430 +SHA256 (xpi/firefox-i18n-53.0/uz.xpi) = 4b99ed2093fa73aa086bae96f4b04b34a8ea5f73aeb25ec21a1c316d97085224 +SIZE (xpi/firefox-i18n-53.0/uz.xpi) = 453390 +SHA256 (xpi/firefox-i18n-53.0/vi.xpi) = 0cdb6fd7573de2f4315d6c1d6011b6d74abb33f1e562a42b5807f4be3218a71e +SIZE (xpi/firefox-i18n-53.0/vi.xpi) = 455840 +SHA256 (xpi/firefox-i18n-53.0/xh.xpi) = 8999ad2228f4a96829e65a0c17f77bd2f9c21cba50f40238c381054dc358660d +SIZE (xpi/firefox-i18n-53.0/xh.xpi) = 446170 +SHA256 (xpi/firefox-i18n-53.0/zh-CN.xpi) = 3a0efa39397231033295ba594f4fff36ec3e829727a3c4e1fd7cafa6cf6a67da +SIZE (xpi/firefox-i18n-53.0/zh-CN.xpi) = 463955 +SHA256 (xpi/firefox-i18n-53.0/zh-TW.xpi) = 9e1f57da99b79fbce6d70f6d04e7295663c5e84fa151e9026c3519ab8d3bbd61 +SIZE (xpi/firefox-i18n-53.0/zh-TW.xpi) = 474980