Index: head/Mk/Uses/gecko.mk =================================================================== --- head/Mk/Uses/gecko.mk (revision 425098) +++ head/Mk/Uses/gecko.mk (revision 425099) @@ -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 49 +_GECKO_VERSIONS= 45 50 _GECKO_TYPE= firefox # Dependence lines for different Firefox versions 45_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox-esr -49_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:www/firefox +50_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= 40 _GECKO_VERSIONS= 40 _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 40_DEPENDS= ${LOCALBASE}/lib/seamonkey/seamonkey:www/seamonkey .elif ${gecko_ARGS:Mthunderbird} _GECKO_DEFAULT_VERSION= 45 _GECKO_VERSIONS= 45 _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 45_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/Mk/bsd.gecko.mk =================================================================== --- head/Mk/bsd.gecko.mk (revision 425098) +++ head/Mk/bsd.gecko.mk (revision 425099) @@ -1,599 +1,602 @@ #-*- tab-width: 4; -*- # ex:ts=4 # # Date created: 12 Nov 2005 # Whom: Michael Johnson # # $FreeBSD$ # # 4 column tabs prevent hair loss and tooth decay! # bsd.gecko.mk abstracts the selection of gecko-based backends. It allows users # and porters to support any available gecko backend without needing to build # many conditional tests. ${USE_GECKO} is the list of backends that your port # can handle, and ${GECKO} is set by bsd.gecko.mk to be the chosen backend. # Users set ${WITH_GECKO} to the list of gecko backends they want on their # system. .if defined(USE_GECKO) .if !defined(_POSTMKINCLUDED) && !defined(Gecko_Pre_Include) Gecko_Pre_Include= bsd.gecko.mk # This file contains some reusable components for mozilla ports. It's of # use primarily to apps from the mozilla project itself (such as Firefox, # Thunderbird, etc.), and probably won't be of use for gecko-based ports # like epiphany, galeon, etc. # # You need to make sure to add USE_GECKO=gecko to for your port can uses # one of these options below. # # Ports can use the following: # # USE_MOZILLA By default, it enables every system dependency # listed in '_ALL_DEPENDS'. If your port doesn't # need one of those then you can use '-' like # 'USE_MOZILLA= -png -vpx' to subtract the # dependencies. Experimental deps use '+' like # 'USE_MOZILLA= +speex +theora'. # # MOZILLA_PLIST_DIRS List of directories to descend into when installing # and creating the plist # # MOZ_PIS_SCRIPTS List of scripts residing in ${FILESDIR} to be # filtered through MOZCONFIG_SED and installed along # with our Pluggable Init Scripts (PIS) # # MOZ_SED_ARGS sed(1) commands through which MOZ_PIS_SCRIPTS are # filtered. There is a default set defined here, so # you probably want to add to MOZ_SED_ARGS rather # than clobber it # # MOZ_OPTIONS configure arguments (added to .mozconfig). If # NOMOZCONFIG is defined, you probably want to set # CONFIGURE_ARGS+=${MOZ_OPTIONS} # # MOZ_MK_OPTIONS The make(1) arguments (added to .mozconfig). If # NOMOZCONFIG is defined, you probably want to set # MAKE_ARGS+=${MOZ_MK_OPTIONS} # # MOZ_EXPORT Environment variables for the build process (added # to .mozconfig). If NOMOZCONFIG is defined, you # probably want to set MAKE_ENV+=${MOZ_EXPORT} # # MOZ_CHROME A variable for the --enable-chrome-format= in # CONFIGURE_ARGS. The default is omni. # # MOZ_TOOLKIT A variable for the --enable-default-toolkit= in # CONFIGURE_ARGS. The default is cairo-gtk2. # # MOZ_EXTENSIONS A list of extensions to build # # MOZ_PROTOCOLS A list of protocols to build (http, ftp, etc.) # # PORT_MOZCONFIG Defaults to ${FILESDIR}/mozconfig.in, but can be # set to a generic mozconfig included with the port # # NOMOZCONFIG Don't drop a customized .mozconfig into the build # directory. Options will have to be specified in # CONFIGURE_ARGS instead # MAINTAINER?= gecko@FreeBSD.org MOZILLA?= ${PORTNAME} MOZILLA_VER?= ${PORTVERSION} MOZILLA_BIN?= ${PORTNAME}-bin MOZILLA_EXEC_NAME?=${MOZILLA} MOZ_RPATH?= ${MOZILLA} -USES+= cpe compiler:c++11-lang gmake iconv perl5 pkgconfig \ +USES+= cpe gmake iconv perl5 pkgconfig \ python:2.7,build desktop-file-utils CPE_VENDOR?=mozilla USE_PERL5= build USE_XORG= x11 xcomposite xdamage xext xfixes xrender xt .if ${MOZILLA} != "libxul" BUNDLE_LIBS= yes .endif -# call to implicitly-deleted copy constructor of 'mozilla::WidevineVideoFrame' -.if ${OPSYS} == FreeBSD && ${OSVERSION} < 1000019 && ${MOZILLA_VER:R:R} >= 49 -# XXX USES=compiler:c++11-lib cannot be used due to ports/208538 -USE_GCC= 5+ +.if ${MOZILLA_VER:R:R} >= 49 +USES+= compiler:c++14-lang +FAVORITE_COMPILER= ${COMPILER_TYPE} # c++14-lib +CPPFLAGS+= -D_GLIBCXX_USE_C99 -D_GLIBCXX_USE_C99_MATH_TR1 \ + -D_DECLARE_C99_LDBL_MATH # XXX ports/193528 +.else +USES+= compiler:c++11-lang .endif MOZILLA_SUFX?= none MOZSRC?= ${WRKSRC} WRKSRC?= ${WRKDIR}/mozilla PLISTF?= ${WRKDIR}/plist_files MOZ_OBJDIR?= ${WRKSRC}/obj-${ARCH:C/amd64/x86_64/}-unknown-${OPSYS:tl}${OSREL} MOZ_PIS_DIR?= lib/${MOZILLA}/init.d PORT_MOZCONFIG?= ${FILESDIR}/mozconfig.in MOZCONFIG?= ${WRKSRC}/.mozconfig # XXX Not ?= because fmake uses MAKEFILE internally MAKEFILE= ${WRKSRC}/client.mk MOZILLA_PLIST_DIRS?= bin lib share/pixmaps share/applications PKGINSTALL?= ${WRKDIR}/pkg-install PKGDEINSTALL?= ${WRKDIR}/pkg-deinstall PKGINSTALL_INC?= ${.CURDIR}/../../www/firefox/files/pkg-install.in PKGDEINSTALL_INC?= ${.CURDIR}/../../www/firefox/files/pkg-deinstall.in MOZ_PKGCONFIG_FILES?= ${MOZILLA}-gtkmozembed ${MOZILLA}-js \ ${MOZILLA}-xpcom ${MOZILLA}-plugin ALL_TARGET?= build MOZ_EXPORT+= ${CONFIGURE_ENV} \ PERL="${PERL}" MOZ_OPTIONS+= --prefix="${PREFIX}" MOZ_MK_OPTIONS+=MOZ_OBJDIR="${MOZ_OBJDIR}" CPPFLAGS+= -isystem${LOCALBASE}/include LDFLAGS+= -L${LOCALBASE}/lib \ -Wl,-rpath,${PREFIX}/lib/${MOZILLA} -Wl,--as-needed .if ${OPSYS} != DragonFly # XXX xpcshell crash during install # use jemalloc 3.0.0 (4.0 for firefox 43+) API for stats/tuning MOZ_EXPORT+= MOZ_JEMALLOC3=1 MOZ_JEMALLOC4=1 .if ${OPSYS} != FreeBSD || ${OSVERSION} < 1000012 || ${MOZILLA_VER:R:R} >= 37 . if ${MOZILLA_VER:R:R} >= 48 MOZ_OPTIONS+= --enable-jemalloc=4 .else MOZ_OPTIONS+= --enable-jemalloc . endif .endif .endif # !DragonFly # Standard depends _ALL_DEPENDS= cairo event ffi graphite harfbuzz hunspell icu jpeg nspr nss png pixman soundtouch sqlite vpx .if ${PORT_OPTIONS:MINTEGER_SAMPLES} MOZ_EXPORT+= MOZ_INTEGER_SAMPLES=1 _ALL_DEPENDS+= tremor .else _ALL_DEPENDS+= vorbis .endif .if ! ${PORT_OPTIONS:MBUNDLED_CAIRO} cairo_BUILD_DEPENDS=cairo>=1.12.16_1,2:graphics/cairo cairo_LIB_DEPENDS= libcairo.so:graphics/cairo cairo_MOZ_OPTIONS= --enable-system-cairo .endif event_LIB_DEPENDS= libevent.so:devel/libevent2 event_MOZ_OPTIONS= --with-system-libevent ffi_LIB_DEPENDS= libffi.so:devel/libffi ffi_MOZ_OPTIONS= --enable-system-ffi .if exists(${FILESDIR}/patch-bug847568) graphite_LIB_DEPENDS= libgraphite2.so:graphics/graphite2 graphite_MOZ_OPTIONS= --with-system-graphite2 harfbuzz_LIB_DEPENDS= libharfbuzz.so:print/harfbuzz harfbuzz_MOZ_OPTIONS= --with-system-harfbuzz .endif hunspell_LIB_DEPENDS= libhunspell-1.3.so:textproc/hunspell hunspell_MOZ_OPTIONS= --enable-system-hunspell icu_LIB_DEPENDS= libicui18n.so:devel/icu icu_MOZ_OPTIONS= --with-system-icu --with-intl-api -jpeg_BUILD_DEPENDS=yasm:devel/yasm # XXX Remove files/patch-ijg-libjpeg once -turbo is default jpeg_USES= jpeg jpeg_MOZ_OPTIONS= --with-system-jpeg=${LOCALBASE} nspr_LIB_DEPENDS= libnspr4.so:devel/nspr nspr_MOZ_OPTIONS= --with-system-nspr nss_LIB_DEPENDS= libnss3.so:security/nss nss_MOZ_OPTIONS= --with-system-nss pixman_LIB_DEPENDS= libpixman-1.so:x11/pixman pixman_MOZ_OPTIONS= --enable-system-pixman png_LIB_DEPENDS= libpng.so:graphics/png png_MOZ_OPTIONS= --with-system-png=${LOCALBASE} .if exists(${FILESDIR}/patch-z-bug517422) soundtouch_LIB_DEPENDS= libSoundTouch.so:audio/soundtouch soundtouch_MOZ_OPTIONS= --with-system-soundtouch .endif sqlite_LIB_DEPENDS= libsqlite3.so:databases/sqlite3 sqlite_MOZ_OPTIONS= --enable-system-sqlite .if exists(${FILESDIR}/patch-z-bug517422) # XXX disabled: update to 1.2.x or review backported fixes theora_LIB_DEPENDS= libtheora.so:multimedia/libtheora theora_MOZ_OPTIONS= --with-system-theora tremor_LIB_DEPENDS= libogg.so:audio/libogg libvorbisidec.so:audio/libtremor tremor_MOZ_OPTIONS= --with-system-tremor --with-system-ogg vorbis_LIB_DEPENDS= libogg.so:audio/libogg libvorbis.so:audio/libvorbis vorbis_MOZ_OPTIONS= --with-system-vorbis --with-system-ogg .endif -vpx_BUILD_DEPENDS= yasm:devel/yasm vpx_LIB_DEPENDS= libvpx.so:multimedia/libvpx vpx_MOZ_OPTIONS= --with-system-libvpx .for use in ${USE_MOZILLA} ${use:S/-/_WITHOUT_/}= ${TRUE} .endfor LIB_DEPENDS+= libfontconfig.so:x11-fonts/fontconfig \ libfreetype.so:print/freetype2 .for dep in ${_ALL_DEPENDS} ${USE_MOZILLA:M+*:S/+//} .if !defined(_WITHOUT_${dep}) BUILD_DEPENDS+= ${${dep}_BUILD_DEPENDS} LIB_DEPENDS+= ${${dep}_LIB_DEPENDS} RUN_DEPENDS+= ${${dep}_RUN_DEPENDS} USES+= ${${dep}_USES} MOZ_OPTIONS+= ${${dep}_MOZ_OPTIONS} .else BUILD_DEPENDS+= ${-${dep}_BUILD_DEPENDS} .endif .endfor # Standard options MOZ_CHROME?= omni MOZ_TOOLKIT?= cairo-gtk2 MOZ_OPTIONS+= \ --enable-chrome-format=${MOZ_CHROME} \ --enable-default-toolkit=${MOZ_TOOLKIT} \ --enable-pie \ --with-pthreads # Configure options for install .if !defined(MOZ_EXTENSIONS) MOZ_OPTIONS+= --enable-extensions=default .else MOZ_OPTIONS+= --enable-extensions=${MOZ_EXTENSIONS} .endif .if !defined(MOZ_PROTOCOLS) MOZ_OPTIONS+= --enable-necko-protocols=default .else MOZ_OPTIONS+= --enable-necko-protocols=${MOZ_PROTOCOLS} .endif # others MOZ_OPTIONS+= --with-system-zlib \ --with-system-bz2 \ --disable-debug-symbols # API keys from www/chromium # http://www.chromium.org/developers/how-tos/api-keys # Note: these are for FreeBSD use ONLY. For your own distribution, # please get your own set of keys. MOZ_EXPORT+= MOZ_GOOGLE_API_KEY=AIzaSyBsp9n41JLW8jCokwn7vhoaMejDFRd1mp8 \ MOZ_GOOGLE_OAUTH_API_CLIENTID=996322985003.apps.googleusercontent.com \ MOZ_GOOGLE_OAUTH_API_KEY=IR1za9-1VK0zZ0f_O8MVFicn .if ${PORT_OPTIONS:MGTK3} MOZ_TOOLKIT= cairo-gtk3 .endif .if ${MOZ_TOOLKIT:Mcairo-gtk3} BUILD_DEPENDS+= gtk3>=3.14.6:x11-toolkits/gtk30 USE_GNOME+= gdkpixbuf2 gtk20 gtk30 .else # gtk2, cairo-gtk2 USE_GNOME+= gdkpixbuf2 gtk20 .endif .if ${PORT_OPTIONS:MOPTIMIZED_CFLAGS} CFLAGS+= -O3 MOZ_EXPORT+= MOZ_OPTIMIZE_FLAGS="${CFLAGS:M-O*}" MOZ_OPTIONS+= --enable-optimize .else MOZ_OPTIONS+= --disable-optimize .endif .if ${PORT_OPTIONS:MCANBERRA} RUN_DEPENDS+= libcanberra>0:audio/libcanberra .endif .if ${PORT_OPTIONS:MDBUS} BUILD_DEPENDS+= libnotify>0:devel/libnotify LIB_DEPENDS+= libdbus-1.so:devel/dbus \ libdbus-glib-1.so:devel/dbus-glib \ libstartup-notification-1.so:x11/startup-notification MOZ_OPTIONS+= --enable-startup-notification .else MOZ_OPTIONS+= --disable-dbus .endif .if ${PORT_OPTIONS:MFFMPEG} # dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp RUN_DEPENDS+= ffmpeg>=0.8,1:multimedia/ffmpeg .endif .if ${MOZILLA_VER:R:R} < 46 MOZ_OPTIONS+= --disable-gstreamer .endif .if ${PORT_OPTIONS:MGCONF} BUILD_DEPENDS+= ${gconf2_DETECT}:${gconf2_LIB_DEPENDS:C/.*://} USE_GNOME+= gconf2:build MOZ_OPTIONS+= --enable-gconf .else MOZ_OPTIONS+= --disable-gconf .endif .if ${PORT_OPTIONS:MGNOMEUI} BUILD_DEPENDS+= ${libgnomeui_DETECT}:${libgnomeui_LIB_DEPENDS:C/.*://} USE_GNOME+= libgnomeui:build MOZ_OPTIONS+= --enable-gnomeui .else MOZ_OPTIONS+= --disable-gnomeui .endif .if ${PORT_OPTIONS:MLIBPROXY} LIB_DEPENDS+= libproxy.so:net/libproxy MOZ_OPTIONS+= --enable-libproxy .else MOZ_OPTIONS+= --disable-libproxy .endif .if ${PORT_OPTIONS:MPGO} USES:= compiler:gcc-c++11-lib ${USES:Ncompiler*c++11*} USE_DISPLAY=yes ALL_TARGET= profiledbuild MOZ_EXPORT+=MOZ_OPTIMIZE_FLAGS="-Os" MOZ_PGO_OPTIMIZE_FLAGS="${CFLAGS:M-O*}" .endif .if ${PORT_OPTIONS:MALSA} LIB_DEPENDS+= libasound.so:audio/alsa-lib RUN_DEPENDS+= ${LOCALBASE}/lib/alsa-lib/libasound_module_pcm_oss.so:audio/alsa-plugins RUN_DEPENDS+= alsa-lib>=1.1.1_1:audio/alsa-lib MOZ_OPTIONS+= --enable-alsa .endif .if ${PORT_OPTIONS:MPULSEAUDIO} . if ${PORT_OPTIONS:MALSA} BUILD_DEPENDS+= pulseaudio>0:audio/pulseaudio . else # pull pulse package if we cannot fallback to another backend LIB_DEPENDS+= libpulse.so:audio/pulseaudio . endif MOZ_OPTIONS+= --enable-pulseaudio .else MOZ_OPTIONS+= --disable-pulseaudio .endif .if ${PORT_OPTIONS:MRUST} BUILD_DEPENDS+= rustc:${RUST_PORT} RUST_PORT?= lang/rust MOZ_OPTIONS+= --enable-rust .else MOZ_OPTIONS+= --disable-rust .endif .if ${PORT_OPTIONS:MDEBUG} MOZ_OPTIONS+= --enable-debug --disable-release STRIP= # ports/184285 .else MOZ_OPTIONS+= --disable-debug --enable-release .endif .if ${PORT_OPTIONS:MDTRACE} MOZ_OPTIONS+= --enable-dtrace \ --disable-gold . if ${OPSYS} == FreeBSD && ${OSVERSION} < 1100061 LIBS+= -lelf . endif STRIP= .else MOZ_OPTIONS+= --disable-dtrace .endif .if ${PORT_OPTIONS:MPROFILE} MOZ_OPTIONS+= --enable-profiling STRIP= .else MOZ_OPTIONS+= --disable-profiling .endif .if ${PORT_OPTIONS:MTEST} USE_XORG+= xscrnsaver MOZ_OPTIONS+= --enable-tests .else MOZ_OPTIONS+= --disable-tests .endif .if !defined(STRIP) || ${STRIP} == "" MOZ_OPTIONS+= --disable-strip --disable-install-strip .else MOZ_OPTIONS+= --enable-strip --enable-install-strip .endif # _MAKE_JOBS is only available after bsd.port.post.mk, thus cannot be # used in .mozconfig. And client.mk automatically uses -jN where N # is what multiprocessing.cpu_count() returns. .if defined(DISABLE_MAKE_JOBS) || defined(MAKE_JOBS_UNSAFE) MAKE_JOBS_NUMBER= 1 .endif .if defined(MAKE_JOBS_NUMBER) MOZ_MAKE_FLAGS+=-j${MAKE_JOBS_NUMBER} .endif .if defined(MOZ_MAKE_FLAGS) MOZ_MK_OPTIONS+=MOZ_MAKE_FLAGS="${MOZ_MAKE_FLAGS}" .endif MOZ_SED_ARGS+= -e's|@CPPFLAGS@|${CPPFLAGS}|g' \ -e 's|@CFLAGS@|${CFLAGS}|g' \ -e 's|@LDFLAGS@|${LDFLAGS}|g' \ -e 's|@LIBS@|${LIBS}|g' \ -e 's|@LOCALBASE@|${LOCALBASE}|g' \ -e 's|@PERL@|${PERL}|g' \ -e 's|@MOZDIR@|${PREFIX}/lib/${MOZILLA}|g' \ -e 's|%%PREFIX%%|${PREFIX}|g' \ -e 's|%%CFLAGS%%|${CFLAGS}|g' \ -e 's|%%LDFLAGS%%|${LDFLAGS}|g' \ -e 's|%%LIBS%%|${LIBS}|g' \ -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \ -e 's|%%PERL%%|${PERL}|g' \ -e 's|%%MOZILLA%%|${MOZILLA}|g' \ -e 's|%%MOZILLA_BIN%%|${MOZILLA_BIN}|g' \ -e 's|%%MOZDIR%%|${PREFIX}/lib/${MOZILLA}|g' MOZCONFIG_SED?= ${SED} ${MOZ_SED_ARGS} .if ${ARCH} == amd64 . if ${USE_MOZILLA:M-nss} USE_BINUTILS= # intel-gcm.s CFLAGS+= -B${LOCALBASE}/bin LDFLAGS+= -B${LOCALBASE}/bin . endif .elif ${ARCH:Mpowerpc*} USES:= compiler:gcc-c++11-lib ${USES:Ncompiler*c++11*} . if ${ARCH} == "powerpc64" MOZ_EXPORT+= UNAME_m="${ARCH}" CFLAGS+= -mminimal-toc . endif .elif ${ARCH} == "sparc64" # Work around miscompilation/mislinkage of the sCanonicalVTable hacks. MOZ_OPTIONS+= --disable-v1-string-abi .endif .else # bsd.port.post.mk pre-extract: gecko-pre-extract gecko-pre-extract: .if ${PORT_OPTIONS:MPGO} @${ECHO} "*****************************************************************" @${ECHO} "**************************** attention **************************" @${ECHO} "*****************************************************************" @${ECHO} "To build ${MOZILLA} with PGO support you need a running X server and" @${ECHO} " build this port with an user who could access the X server! " @${ECHO} "" @${ECHO} "During the build a ${MOZILLA} instance will start and run some test." @${ECHO} " Do not interrupt or close ${MOZILLA} during this tests! " @${ECHO} "*****************************************************************" @sleep 10 .endif post-patch: gecko-post-patch gecko-moz-pis-patch gecko-post-patch: .if exists(${PKGINSTALL_INC}) @${MOZCONFIG_SED} < ${PKGINSTALL_INC} > ${PKGINSTALL} .endif .if exists(${PKGDEINSTALL_INC}) @${MOZCONFIG_SED} < ${PKGDEINSTALL_INC} > ${PKGDEINSTALL} .endif @${RM} ${MOZCONFIG} .if !defined(NOMOZCONFIG) @if [ -e ${PORT_MOZCONFIG} ] ; then \ ${MOZCONFIG_SED} < ${PORT_MOZCONFIG} >> ${MOZCONFIG} ; \ fi .for arg in ${MOZ_OPTIONS} @${ECHO_CMD} ac_add_options ${arg:Q} >> ${MOZCONFIG} .endfor .for arg in ${MOZ_MK_OPTIONS} @${ECHO_CMD} mk_add_options ${arg:Q} >> ${MOZCONFIG} .endfor .for var in ${MOZ_EXPORT} @${ECHO_CMD} export ${var:Q} >> ${MOZCONFIG} .endfor .endif # .if !defined(NOMOZCONFIG) .if exists(${MOZSRC}/build/unix/mozilla-config.in) @${REINPLACE_CMD} -e 's/%{idldir}/%idldir%/g ; \ s|"%FULL_NSPR_CFLAGS%"|`nspr-config --cflags`|g ; \ s|"%FULL_NSPR_LIBS%"|`nspr-config --libs`|g' \ ${MOZSRC}/build/unix/mozilla-config.in .endif .if ${USE_MOZILLA:M-nspr} @${ECHO_MSG} "===> Applying NSPR patches" @for i in ${.CURDIR}/../../devel/nspr/files/patch-*; do \ ${PATCH} ${PATCH_ARGS} -d ${MOZSRC}/nsprpub < $$i; \ done .endif .if ${USE_MOZILLA:M-nss} @${ECHO_MSG} "===> Applying NSS patches" @for i in ${.CURDIR}/../../security/nss/files/patch-*; do \ ${PATCH} ${PATCH_ARGS} -d ${MOZSRC}/security/nss < $$i; \ done .endif @for f in \ ${WRKSRC}/directory/c-sdk/config/FreeBSD.mk \ ${WRKSRC}/directory/c-sdk/configure \ ${MOZSRC}/security/coreconf/FreeBSD.mk \ ${MOZSRC}/js/src/Makefile.in \ ${MOZSRC}/js/src/configure \ ${MOZSRC}/configure \ ${WRKSRC}/configure; do \ if [ -f $$f ] ; then \ ${REINPLACE_CMD} -Ee 's|-lc_r|-pthread|g ; \ s|-l?pthread|-pthread|g ; \ s|echo aout|echo elf|g ; \ s|/usr/X11R6|${LOCALBASE}|g' \ $$f; \ fi; \ done @if [ -f ${WRKSRC}/config/baseconfig.mk ] ; then \ ${REINPLACE_CMD} -e 's|%%MOZILLA%%|${MOZILLA}|g' \ ${WRKSRC}/config/baseconfig.mk; \ fi @${REINPLACE_CMD} -e 's|%%MOZILLA%%|${MOZILLA}|g' \ ${MOZSRC}/config/baseconfig.mk @${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|g ; \ s|%%LOCALBASE%%|${LOCALBASE}|g' \ ${MOZSRC}/build/unix/run-mozilla.sh @${REINPLACE_CMD} -e 's|/usr/local/netscape|${LOCALBASE}|g ; \ s|/usr/local/lib/netscape|${LOCALBASE}/lib|g' \ ${MOZSRC}/xpcom/io/SpecialSystemDirectory.cpp @${REINPLACE_CMD} -e 's|/etc|${PREFIX}&|g' \ ${MOZSRC}/xpcom/build/nsXPCOMPrivate.h @${REINPLACE_CMD} -e 's|/usr/local|${LOCALBASE}|g' \ -e 's|mozilla/plugins|browser_plugins|g' \ -e 's|share/mozilla/extensions|lib/xpi|g' \ ${MOZSRC}/xpcom/io/nsAppFileLocationProvider.cpp \ ${MOZSRC}/toolkit/xre/nsXREDirProvider.cpp @${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \ ${MOZSRC}/extensions/spellcheck/hunspell/*/mozHunspell.cpp # handles mozilla pis scripts. gecko-moz-pis-patch: .for moz in ${MOZ_PIS_SCRIPTS} @${MOZCONFIG_SED} < ${FILESDIR}/${moz} > ${WRKDIR}/${moz} .endfor do-configure: gecko-do-configure gecko-do-configure: @(if ! ${CONFIGURE_ENV} ${DO_MAKE_BUILD} configure; then \ ${ECHO_MSG} "===> Script \"${CONFIGURE_SCRIPT}\" failed unexpectedly."; \ (${ECHO_CMD} ${CONFIGURE_FAIL_MESSAGE}) | ${FMT} 75 79 ; \ ${FALSE}; \ fi) pre-install: gecko-moz-pis-pre-install post-install-script: gecko-create-plist gecko-create-plist: # Create the plist ${RM} ${PLISTF} .for dir in ${MOZILLA_PLIST_DIRS} @cd ${STAGEDIR}${PREFIX}/${dir} && ${FIND} -H -s * ! -type d | \ ${SED} -e 's|^|${dir}/|' >> ${PLISTF} .endfor ${CAT} ${PLISTF} | ${SORT} >> ${TMPPLIST} gecko-moz-pis-pre-install: .if defined(MOZ_PIS_SCRIPTS) ${MKDIR} ${STAGEDIR}${PREFIX}/${MOZ_PIS_DIR} .for moz in ${MOZ_PIS_SCRIPTS} ${INSTALL_SCRIPT} ${WRKDIR}/${moz} ${STAGEDIR}${PREFIX}/${MOZ_PIS_DIR} .endfor .endif .endif .endif # HERE THERE BE TACOS -- adamw Index: head/www/firefox/Makefile =================================================================== --- head/www/firefox/Makefile (revision 425098) +++ head/www/firefox/Makefile (revision 425099) @@ -1,87 +1,87 @@ # Created by: Alan Eldridge # $FreeBSD$ PORTNAME= firefox -DISTVERSION= 49.0.2 +DISTVERSION= 50.0 DISTVERSIONSUFFIX=.source PORTEPOCH= 1 CATEGORIES= www ipv6 MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \ - MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build2/source + MOZILLA/${PORTNAME}/candidates/${DISTVERSION}-candidates/build1/source MAINTAINER= gecko@FreeBSD.org COMMENT= Web browser based on the browser portion of Mozilla BUILD_DEPENDS= nspr>=4.12:devel/nspr \ - nss>=3.25:security/nss \ + nss>=3.26.2:security/nss \ libevent2>=2.0.21_2:devel/libevent2 \ soundtouch>=1.9.0:audio/soundtouch \ harfbuzz>=1.2.6:print/harfbuzz \ graphite2>=1.3.8:graphics/graphite2 \ - png>=1.6.21:graphics/png \ + png>=1.6.23:graphics/png \ libvorbis>=1.3.5,3:audio/libvorbis \ libvpx>=1.5.0:multimedia/libvpx \ sqlite3>=3.13: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 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= # empty 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 ${OPTIONS_DEFAULT_${OPSYS}_${OSREL:R}_${ARCH}} # XXX lang/rust currently builds only on these platforms OPTIONS_DEFAULT_DragonFly_4_x86_64= RUST OPTIONS_DEFAULT_FreeBSD_10_amd64= RUST OPTIONS_DEFAULT_FreeBSD_10_i386= RUST OPTIONS_DEFAULT_FreeBSD_11_amd64= RUST OPTIONS_DEFAULT_FreeBSD_11_i386= RUST OPTIONS_DEFAULT_FreeBSD_12_amd64= RUST OPTIONS_DEFAULT_FreeBSD_12_i386= RUST OPTIONS_SINGLE+= TOOLKIT OPTIONS_SINGLE_TOOLKIT= GTK2 GTK3 TEST_BROKEN= No rule to make target '../../../dist/bin/libnspr4.so', needed by \ '../../../_tests/xpcshell/modules/libmar/tests/unit/libnspr4.so' .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 425098) +++ head/www/firefox/distinfo (revision 425099) @@ -1,3 +1,3 @@ -TIMESTAMP = 1477039138 -SHA256 (firefox-49.0.2.source.tar.xz) = 67abe9202958c36bf60454c91065953aa8f6ede83ea1c0e9cdb870c3fc3d56d0 -SIZE (firefox-49.0.2.source.tar.xz) = 188669928 +TIMESTAMP = 1477916479 +SHA256 (firefox-50.0.source.tar.xz) = b322309e1021254eb1bb69ed5938d0cebc5e8201d155afe595f3db41e03b6357 +SIZE (firefox-50.0.source.tar.xz) = 196035352 Index: head/www/firefox/files/patch-bug1130155 =================================================================== --- head/www/firefox/files/patch-bug1130155 (revision 425098) +++ head/www/firefox/files/patch-bug1130155 (nonexistent) @@ -1,179 +0,0 @@ -commit eab3e3a -Author: Mikhail Teterin -Date: Tue Dec 16 19:34:02 2014 -0800 - - Bug 1130155 - Avoid assert failures when consuming only part of buffer. ---- - media/libcubeb/src/cubeb_alsa.c | 112 ++++++++++++++++++++++++++++++---------- - 1 file changed, 85 insertions(+), 27 deletions(-) - -diff --git media/libcubeb/src/cubeb_alsa.c media/libcubeb/src/cubeb_alsa.c -index 9bbc129..e72944a 100644 ---- media/libcubeb/src/cubeb_alsa.c -+++ media/libcubeb/src/cubeb_alsa.c -@@ -14,6 +14,8 @@ - #include - #include - #include -+#include -+#include - #include - #include - #include "cubeb/cubeb.h" -@@ -45,6 +47,7 @@ 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_forward); - MAKE_TYPEDEF(snd_pcm_frames_to_bytes); - MAKE_TYPEDEF(snd_pcm_get_params); - /* snd_pcm_hw_params_alloca is actually a macro */ -@@ -305,32 +308,35 @@ alsa_refill_stream(cubeb_stream * stm) - long got; - void * p; - int draining; -+ unsigned pipefailures, againfailures; - - draining = 0; - - pthread_mutex_lock(&stm->mutex); - -- r = WRAP(snd_pcm_poll_descriptors_revents)(stm->pcm, stm->fds, stm->nfds, &revents); -- if (r < 0 || revents != POLLOUT) { -- /* This should be a stream error; it makes no sense for poll(2) to wake -- for this stream and then have the stream report that it's not ready. -- Unfortunately, this does happen, so just bail out and try again. */ -- pthread_mutex_unlock(&stm->mutex); -- return RUNNING; -- } -+ for (pipefailures = 0;;) { -+ r = WRAP(snd_pcm_poll_descriptors_revents)(stm->pcm, stm->fds, stm->nfds, &revents); -+ if (r < 0 || revents != POLLOUT || -+ (avail = WRAP(snd_pcm_avail_update)(stm->pcm)) == 0) { -+ /* This should be a stream error; it makes no sense for poll(2) to wake -+ for this stream and then have the stream report that it's not ready. -+ Unfortunately, this does happen, so just bail out and try again. */ -+ pthread_mutex_unlock(&stm->mutex); -+ return RUNNING; -+ } - -- avail = WRAP(snd_pcm_avail_update)(stm->pcm); -- if (avail == -EPIPE) { -+ if (avail > 0) -+ break; -+ if (pipefailures++ > 11) { -+ fprintf(stderr, "%s: repeated failures from snd_pcm_avail_update, " -+ "giving up\n", __func__); -+ pthread_mutex_unlock(&stm->mutex); -+ stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); -+ return ERROR; -+ } - 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. */ -- if (avail < 0) { -- pthread_mutex_unlock(&stm->mutex); -- stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); -- return ERROR; - } -+ pipefailures = againfailures = 0; - - /* This should never happen. */ - if ((unsigned int) avail > stm->buffer_size) { -@@ -359,10 +365,11 @@ alsa_refill_stream(cubeb_stream * stm) - if (got < 0) { - pthread_mutex_unlock(&stm->mutex); - stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); -+ free(p); - return ERROR; - } - if (got > 0) { -- snd_pcm_sframes_t wrote; -+ snd_pcm_sframes_t wrote, towrite = got; - - if (stm->params.format == CUBEB_SAMPLE_FLOAT32NE) { - float * b = (float *) p; -@@ -375,14 +382,62 @@ alsa_refill_stream(cubeb_stream * stm) - b[i] *= stm->volume; - } - } -- wrote = WRAP(snd_pcm_writei)(stm->pcm, p, got); -- if (wrote == -EPIPE) { -- WRAP(snd_pcm_recover)(stm->pcm, wrote, 1); -- wrote = WRAP(snd_pcm_writei)(stm->pcm, p, got); -+ for (;;) { -+ wrote = WRAP(snd_pcm_writei)(stm->pcm, p, -+ towrite > avail ? avail : towrite); -+ switch(wrote) { -+ case -EPIPE: -+ if (pipefailures++ > 3) { -+ fprintf(stderr, "%s: Too many underflows, giving up\n", __func__); -+ stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); -+ pthread_mutex_unlock(&stm->mutex); -+ free(p); -+ return ERROR; -+ } -+ WRAP(snd_pcm_recover)(stm->pcm, wrote, 1); -+ continue; -+ case -EAGAIN: -+ if (againfailures++ > 3) { -+ fprintf(stderr, "%s: Too many -EAGAIN errors from snd_pcm_writei, " -+ "giving up\n", __func__); -+ stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); -+ pthread_mutex_unlock(&stm->mutex); -+ free(p); -+ return ERROR; -+ } -+ continue; -+ case -EBADFD: -+ fprintf(stderr, "%s: snc_pcm_writei returned -%s, giving up\n", -+ __func__, "EBADFD"); -+ free(p); -+ stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); -+ pthread_mutex_unlock(&stm->mutex); -+ return ERROR; -+ } -+ if (wrote < 0) { -+ fprintf(stderr, "%s: snc_pcm_writei returned unexpected error %lld, " -+ "giving up\n", __func__, (long long)wrote); -+ free(p); -+ stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); -+ pthread_mutex_unlock(&stm->mutex); -+ return ERROR; -+ } -+ pipefailures = againfailures = 0; -+ stm->write_position += wrote; -+ gettimeofday(&stm->last_activity, NULL); -+ if (wrote > towrite) { -+ fprintf(stderr, "%s: snc_pcm_writei wrote %lld frames, which was more " -+ "than we requested (%lld). This should not happen, giving up\n", -+ __func__, (long long)wrote, (long long)towrite); -+ free(p); -+ stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); -+ pthread_mutex_unlock(&stm->mutex); -+ return ERROR; -+ } -+ if (towrite == wrote) -+ break; -+ towrite -= wrote; - } -- assert(wrote >= 0 && wrote == got); -- stm->write_position += wrote; -- gettimeofday(&stm->last_activity, NULL); - } - if (got != avail) { - long buffer_fill = stm->buffer_size - (avail - got); -@@ -1177,7 +1232,10 @@ alsa_stream_get_position(cubeb_stream * stm, uint64_t * position) - return CUBEB_OK; - } - -- assert(delay >= 0); -+ if (delay < 0) { -+ WRAP(snd_pcm_forward)(stm->pcm, -delay); -+ delay = 0; -+ } - - *position = 0; - if (stm->write_position >= (snd_pcm_uframes_t) delay) { Property changes on: head/www/firefox/files/patch-bug1130155 ___________________________________________________________________ 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-bug1278861 =================================================================== --- head/www/firefox/files/patch-bug1278861 (revision 425098) +++ head/www/firefox/files/patch-bug1278861 (nonexistent) @@ -1,38 +0,0 @@ - -# HG changeset patch -# User Nathan Froyd -# Date 1466820205 14400 -# Node ID bd25b06261c840a62d035192cf4b1dbc18f54e3f -# Parent fbe25a30fcbbe172bdd37c70c5b06cdbb07886af -Bug 1278861 - adjust ifdefs in Conversions.h:ToInt32 to catch clang-on-arm-generally; r=luke - -The bug noted in ToInt32 doesn't just exist when compiling for -arm-darwin; it exists for ARM targets generally. The ifdef should -reflect that. - -diff --git js/public/Conversions.h js/public/Conversions.h ---- js/public/Conversions.h -+++ js/public/Conversions.h -@@ -395,19 +395,19 @@ ToIntWidth(double d) - } - - } // namespace detail - - /* ES5 9.5 ToInt32 (specialized for doubles). */ - inline int32_t - ToInt32(double d) - { -- // clang crashes compiling this when targeting arm-darwin: -+ // clang crashes compiling this when targeting arm: - // https://llvm.org/bugs/show_bug.cgi?id=22974 --#if defined (__arm__) && defined (__GNUC__) && !defined(__APPLE__) -+#if defined (__arm__) && defined (__GNUC__) && !defined(__clang__) - int32_t i; - uint32_t tmp0; - uint32_t tmp1; - uint32_t tmp2; - asm ( - // We use a pure integer solution here. In the 'softfp' ABI, the argument - // will start in r0 and r1, and VFP can't do all of the necessary ECMA - // conversions by itself so some integer code will be required anyway. A - Property changes on: head/www/firefox/files/patch-bug1278861 ___________________________________________________________________ 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-bug1299694 =================================================================== --- head/www/firefox/files/patch-bug1299694 (revision 425098) +++ head/www/firefox/files/patch-bug1299694 (nonexistent) @@ -1,31 +0,0 @@ -commit 6ab2496 -Author: Chris Pearce -Date: Mon Sep 5 13:54:37 2016 +1200 - - Bug 1299694 - Ensure we don't enable Widevine unintentionally. r=glandium - - On FreeBSD the target.kernel etc checks in enable_eme are failing, - but we're still falling through to |return value|, and so Widevine - is being enabled. If we remove the |return value| from enable_eme - we at least make Widevine disabled where it's not supposed to be - enabled. - - MozReview-Commit-ID: D1h0IUidxhv ---- - toolkit/moz.configure | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git toolkit/moz.configure toolkit/moz.configure -index 0c98c7a..a00b6eb 100644 ---- toolkit/moz.configure -+++ toolkit/moz.configure -@@ -366,7 +366,8 @@ def enable_eme(value, target): - return value - elif value and value.origin != 'default': - die('%s is not supported on %s' % (value.format('--enable-eme'), target.alias)) -- return value -+ # Return the same type of OptionValue (Positive or Negative), with an empty tuple. -+ return value.__class__(()) - - @depends(enable_eme, fmp4) - def eme(value, fmp4): Property changes on: head/www/firefox/files/patch-bug1299694 ___________________________________________________________________ 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-browser-app-nsBrowserApp.cpp =================================================================== --- head/www/firefox/files/patch-browser-app-nsBrowserApp.cpp (revision 425098) +++ head/www/firefox/files/patch-browser-app-nsBrowserApp.cpp (revision 425099) @@ -1,11 +1,12 @@ ---- browser/app/nsBrowserApp.cpp~ +--- browser/app/nsBrowserApp.cpp.orig 2016-09-19 16:19:28 UTC +++ browser/app/nsBrowserApp.cpp -@@ -417,6 +417,8 @@ int main(int argc, char* argv[]) - TriggerQuirks(); - #endif +@@ -324,6 +324,9 @@ int main(int argc, char* argv[], char* e + { + mozilla::TimeStamp start = mozilla::TimeStamp::Now(); + setenv("MOZ_GMP_PATH", "%%LOCALBASE%%/lib/browser_plugins/symlinks/gecko", 0); + setenv("MOZ_PLUGIN_PATH", "%%LOCALBASE%%/lib/browser_plugins/symlinks/gecko", 0); - int gotCounters; - #if defined(XP_UNIX) - struct rusage initialRUsage; ++ + #ifdef HAS_DLL_BLOCKLIST + DllBlocklist_Initialize(); + Index: head/www/firefox/files/patch-bug1021761 =================================================================== --- head/www/firefox/files/patch-bug1021761 (revision 425098) +++ head/www/firefox/files/patch-bug1021761 (revision 425099) @@ -1,1177 +1,1157 @@ diff --git build/moz.configure/old.configure build/moz.configure/old.configure index b95dd2b..4cbefd5 100644 --- build/moz.configure/old.configure +++ build/moz.configure/old.configure @@ -305,6 +305,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 --- old-configure.in +++ old-configure.in @@ -5591,6 +5591,67 @@ fi 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 media/libcubeb/AUTHORS media/libcubeb/AUTHORS index b441e8a..950d9e5 100644 --- media/libcubeb/AUTHORS +++ media/libcubeb/AUTHORS @@ -4,3 +4,4 @@ Michael Wu Paul Adenot David Richards Sebastien Alaiwan +Evgeniy Vodolazskiy diff --git media/libcubeb/src/cubeb.c media/libcubeb/src/cubeb.c index 9c3adcc..45d765b 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); #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, #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 --- media/libcubeb/src/cubeb_alsa.c +++ media/libcubeb/src/cubeb_alsa.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -24,6 +25,50 @@ #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_recover); +MAKE_TYPEDEF(snd_pcm_set_params); +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 { workaround is not required. */ snd_config_t * local_config; int is_pa; + + void * libasound; }; enum stream_state { -@@ -262,7 +309,7 @@ alsa_refill_stream(cubeb_stream * stm) +@@ -260,10 +307,10 @@ alsa_refill_stream(cubeb_stream * stm) pthread_mutex_lock(&stm->mutex); -- r = snd_pcm_poll_descriptors_revents(stm->pcm, stm->fds, stm->nfds, &revents); -+ r = WRAP(snd_pcm_poll_descriptors_revents)(stm->pcm, stm->fds, stm->nfds, &revents); - if (r < 0 || revents != POLLOUT) { - /* This should be a stream error; it makes no sense for poll(2) to wake - for this stream and then have the stream report that it's not ready. -@@ -271,10 +318,10 @@ alsa_refill_stream(cubeb_stream * stm) - return RUNNING; - } - - avail = snd_pcm_avail_update(stm->pcm); + avail = WRAP(snd_pcm_avail_update)(stm->pcm); - if (avail == -EPIPE) { + 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. */ -@@ -293,8 +340,8 @@ alsa_refill_stream(cubeb_stream * stm) - available to write. If avail is still zero here, the stream must be in - a funky state, so recover and try again. */ - if (avail == 0) { -- snd_pcm_recover(stm->pcm, -EPIPE, 1); -- avail = snd_pcm_avail_update(stm->pcm); -+ WRAP(snd_pcm_recover)(stm->pcm, -EPIPE, 1); -+ avail = WRAP(snd_pcm_avail_update)(stm->pcm); - if (avail <= 0) { - pthread_mutex_unlock(&stm->mutex); - stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_ERROR); -@@ -302,7 +349,7 @@ alsa_refill_stream(cubeb_stream * stm) - } +@@ -286,7 +333,7 @@ alsa_refill_stream(cubeb_stream * stm) + return RUNNING; } - 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); pthread_mutex_unlock(&stm->mutex); -@@ -327,10 +374,10 @@ alsa_refill_stream(cubeb_stream * stm) +@@ -312,10 +359,10 @@ alsa_refill_stream(cubeb_stream * stm) b[i] *= stm->volume; } } - wrote = snd_pcm_writei(stm->pcm, p, got); + wrote = WRAP(snd_pcm_writei)(stm->pcm, p, got); - if (wrote == -EPIPE) { + 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) /* 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); set_timeout(&stm->drain_timeout, buffer_time * 1000); @@ -453,26 +500,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) 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) } 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) 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) 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) } /* 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) /* 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) 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 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); } 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); } pthread_mutex_unlock(&cubeb_alsa_mutex); @@ -610,7 +657,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) 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) 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) 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) 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, return CUBEB_ERROR; } - r = snd_pcm_nonblock(stm->pcm, 1); + r = WRAP(snd_pcm_nonblock)(stm->pcm, 1); assert(r == 0); - /* Ugly hack: the PA ALSA plugin allows buffer configurations that can't -@@ -859,7 +965,7 @@ alsa_stream_init(cubeb * ctx, cubeb_stre - latency = latency < 500 ? 500 : latency; + latency_us = latency_frames * 1e6 / stm->params.rate; +@@ -855,7 +961,7 @@ alsa_stream_init(cubeb * ctx, cubeb_stre + 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 * 1000); + latency_us); if (r < 0) { @@ -867,15 +973,15 @@ alsa_stream_init(cubeb * ctx, cubeb_stre 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); - 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) 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; } - 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; } -@@ -963,34 +1069,34 @@ alsa_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) { +@@ -969,34 +1075,34 @@ alsa_get_preferred_sample_rate(cubeb * c /* 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, 0); -+ r = WRAP(snd_pcm_open)(&pcm, CUBEB_ALSA_PCM_NAME, SND_PCM_STREAM_PLAYBACK | SND_PCM_NO_AUTO_RESAMPLE, 0); +- 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; pthread_mutex_lock(&stm->mutex); - 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) 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) 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) 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 --- /dev/null +++ media/libcubeb/src/cubeb_oss.c @@ -0,0 +1,442 @@ +/* + * 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) +{ + /* 40ms is a big enough number to work ok */ + *latency_ms = 40; + 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 */ + 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, + .destroy = oss_destroy, + .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 +}; diff --git media/libcubeb/src/moz.build media/libcubeb/src/moz.build index 8b7a0dd..31212ce 100644 --- media/libcubeb/src/moz.build +++ media/libcubeb/src/moz.build @@ -17,6 +17,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']: SOURCES += [ 'cubeb_pulse.c', @@ -75,5 +81,6 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk': 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': '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 --- media/libcubeb/update.sh +++ media/libcubeb/update.sh -@@ -10,6 +10,7 @@ cp $1/src/cubeb_audiounit.c src - cp $1/src/cubeb_pulse.c src - cp $1/src/cubeb_sndio.c src +@@ -16,6 +16,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_audiotrack.c src - cp $1/src/cubeb_wasapi.cpp src - cp $1/src/cubeb_resampler.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 --- media/webrtc/signaling/test/common.build +++ media/webrtc/signaling/test/common.build @@ -102,8 +102,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 --- toolkit/library/moz.build +++ toolkit/library/moz.build @@ -234,8 +234,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 425098) +++ head/www/firefox/files/patch-bug826985 (revision 425099) @@ -1,179 +1,179 @@ 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 -@@ -629,6 +629,7 @@ libgnome/libgnome.h +@@ -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 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,10 +25,21 @@ #else #include #endif +#ifdef HAVE_LIBV4L2 +#include +#endif #include "webrtc/system_wrappers/interface/ref_count.h" #include "webrtc/system_wrappers/interface/trace.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 { @@ -130,6 +142,11 @@ WebRtc_Word32 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 @@ '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/files/patch-bug847568 =================================================================== --- head/www/firefox/files/patch-bug847568 (revision 425098) +++ head/www/firefox/files/patch-bug847568 (revision 425099) @@ -1,270 +1,272 @@ # Allow building against system-wide graphite2/harfbuzz. -diff --git build/moz.configure/old.configure build/moz.configure/old.configure -index 4cbefd5..42ab554 100644 ---- build/moz.configure/old.configure -+++ build/moz.configure/old.configure -@@ -312,6 +312,8 @@ def old_configure_options(*options): - '--with-sixgill', - '--with-soft-float', - '--with-system-bz2', -+ '--with-system-graphite2', -+ '--with-system-harfbuzz', - '--with-system-icu', - '--with-system-jpeg', - '--with-system-libevent', diff --git config/Makefile.in config/Makefile.in -index 14bfc0d..5383399 100644 +index 10807cf..f4b8587 100644 --- config/Makefile.in +++ config/Makefile.in @@ -49,6 +49,8 @@ export:: $(export-preqs) -DMOZ_SYSTEM_LIBEVENT=$(MOZ_SYSTEM_LIBEVENT) \ -DMOZ_SYSTEM_LIBVPX=$(MOZ_SYSTEM_LIBVPX) \ -DMOZ_SYSTEM_ICU=$(MOZ_SYSTEM_ICU) \ + -DMOZ_SYSTEM_GRAPHITE2=$(MOZ_SYSTEM_GRAPHITE2) \ + -DMOZ_SYSTEM_HARFBUZZ=$(MOZ_SYSTEM_HARFBUZZ) \ - $(srcdir)/system-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers + $(srcdir)/system-headers $(srcdir)/stl-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers $(INSTALL) system_wrappers $(DIST) diff --git config/system-headers config/system-headers -index 18e8703..bdc5f82 100644 +index 48afa0f..61612f6 100644 --- config/system-headers +++ config/system-headers -@@ -1344,3 +1344,11 @@ unicode/utypes.h +@@ -1331,3 +1331,12 @@ unicode/utypes.h #endif libutil.h unwind.h +#if MOZ_SYSTEM_GRAPHITE2==1 +graphite2/Font.h +graphite2/Segment.h +#endif +#if MOZ_SYSTEM_HARFBUZZ==1 ++harfbuzz/hb-glib.h +harfbuzz/hb-ot.h +harfbuzz/hb.h +#endif -diff --git old-configure.in configure.in -index ac38f40..87536b7 100644 ---- old-configure.in -+++ old-configure.in -@@ -7989,6 +7989,49 @@ if test "$USE_FC_FREETYPE"; then - fi - - dnl ======================================================== -+dnl Check for harfbuzz -+dnl ======================================================== -+ -+MOZ_ARG_WITH_BOOL(system-harfbuzz, -+[ --with-system-harfbuzz Use system harfbuzz (located with pkgconfig)], -+MOZ_SYSTEM_HARFBUZZ=1, -+MOZ_SYSTEM_HARFBUZZ=) -+ -+if test -n "$MOZ_SYSTEM_HARFBUZZ"; then -+ PKG_CHECK_MODULES(MOZ_HARFBUZZ, harfbuzz >= 1.2.6) -+fi -+ -+AC_SUBST(MOZ_SYSTEM_HARFBUZZ) -+ -+dnl ======================================================== -+dnl Check for graphite2 -+dnl ======================================================== -+ -+MOZ_ARG_WITH_BOOL(system-graphite2, -+[ --with-system-graphite2 Use system graphite2 (located with pkgconfig)], -+MOZ_SYSTEM_GRAPHITE2=1, -+MOZ_SYSTEM_GRAPHITE2=) -+ -+if test -n "$MOZ_SYSTEM_GRAPHITE2"; then -+ PKG_CHECK_MODULES(MOZ_GRAPHITE2, graphite2) -+ -+ dnl graphite2.pc has bogus version, check manually -+ AC_TRY_COMPILE([ #include -+ #define GR2_VERSION_REQUIRE(major,minor,bugfix) \ -+ ( GR2_VERSION_MAJOR * 10000 + GR2_VERSION_MINOR \ -+ * 100 + GR2_VERSION_BUGFIX >= \ -+ (major) * 10000 + (minor) * 100 + (bugfix) ) -+ ], [ -+ #if !GR2_VERSION_REQUIRE(1,3,8) -+ #error "Insufficient graphite2 version." -+ #endif -+ ], [], -+ [AC_MSG_ERROR([--with-system-graphite2 requested but no working libgraphite2 found])]) -+fi -+ -+AC_SUBST(MOZ_SYSTEM_GRAPHITE2) -+ -+dnl ======================================================== - dnl Check for pixman and cairo - dnl ======================================================== - diff --git dom/base/moz.build dom/base/moz.build -index a660ba4..6b2f602 100644 +index 6e0d4f5..0770717 100644 --- dom/base/moz.build +++ dom/base/moz.build -@@ -397,6 +397,9 @@ if CONFIG['INTEL_ARCHITECTURE']: - SOURCES += ['nsTextFragmentSSE2.cpp'] - SOURCES['nsTextFragmentSSE2.cpp'].flags += CONFIG['SSE2_FLAGS'] +@@ -457,6 +457,9 @@ if CONFIG['MOZ_BUILD_APP'] in ['browser', 'mobile/android', 'xulrunner']: + if CONFIG['MOZ_X11']: + CXXFLAGS += CONFIG['TK_CFLAGS'] +if CONFIG['MOZ_SYSTEM_HARFBUZZ']: -+ SOURCES['nsContentUtils.cpp'].flags += CONFIG['MOZ_HARFBUZZ_CFLAGS'] ++ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] + - EXTRA_COMPONENTS += [ - 'ConsoleAPI.manifest', - 'ConsoleAPIStorage.js', + GENERATED_FILES += [ + 'PropertyUseCounterMap.inc', + 'UseCounterList.h', diff --git gfx/graphite2/moz-gr-update.sh gfx/graphite2/moz-gr-update.sh -index f3d76ea..a9e7fb6 100644 +index faaab1b..04eff5f 100644 --- gfx/graphite2/moz-gr-update.sh +++ gfx/graphite2/moz-gr-update.sh @@ -1,6 +1,7 @@ #!/bin/bash # Script used to update the Graphite2 library in the mozilla source tree +# and bump version for --with-system-graphite2 # This script lives in gfx/graphite2, along with the library source, # but must be run from the top level of the mozilla-central tree. -@@ -37,12 +38,16 @@ echo "See" $0 "for update procedure." >> +@@ -37,12 +38,16 @@ echo "See" $0 "for update procedure." >> gfx/graphite2/README.mozilla #find gfx/graphite2/ -name "*.cpp" -exec perl -p -i -e "s///;s/Windows.h/windows.h/;" {} \; #find gfx/graphite2/ -name "*.h" -exec perl -p -i -e "s///;s/Windows.h/windows.h/;" {} \; +# chase version for --with-system-graphite2 +perl -p -i -e "s/[0-9]+\,[0-9]+\,[0-9]+/$RELEASE/ and tr/./,/ \ + if /GR2_VERSION_REQUIRE/" old-configure.in + # summarize what's been touched echo Updated to $RELEASE. echo Here is what changed in the gfx/graphite2 directory: echo -hg stat gfx/graphite2 +hg stat old-configure.in gfx/graphite2 echo echo If gfx/graphite2/src/files.mk has changed, please make corresponding diff --git gfx/harfbuzz/README-mozilla gfx/harfbuzz/README-mozilla -index ca57d16..1ce21fe 100644 +index 24e6cbb..0b7a5df 100644 --- gfx/harfbuzz/README-mozilla +++ gfx/harfbuzz/README-mozilla -@@ -18,3 +18,8 @@ the mozilla tree. - In addition, the src/Makefile.in file here is NOT from upstream, nor is it - generated from src/Makefile.am (the original harfbuzz version); it is a mozilla- - specific makefile that is maintained by hand. +@@ -20,3 +20,8 @@ the mozilla tree. + + If the collection of source files changes, manual updates to moz.build may be + needed, as we don't use the upstream makefiles. + +The in-tree copy may be omitted during build by --with-system-harfbuzz. +Make sure to keep pkg-config version check within old-configure.in in sync +with checkout version or increment latest tag by one if it's not based +on upstream release. diff --git gfx/moz.build gfx/moz.build -index 519aa46..6929751 100644 +index 2509198..5cc4663 100644 --- gfx/moz.build +++ gfx/moz.build @@ -7,6 +7,12 @@ if CONFIG['MOZ_TREE_CAIRO']: DIRS += ['cairo'] +if not CONFIG['MOZ_SYSTEM_GRAPHITE2']: + DIRS += ['graphite2/src' ] + +if not CONFIG['MOZ_SYSTEM_HARFBUZZ']: + DIRS += ['harfbuzz/src'] + DIRS += [ '2d', 'ycbcr', @@ -15,8 +21,6 @@ DIRS += [ 'qcms', 'gl', 'layers', - 'graphite2/src', - 'harfbuzz/src', 'ots/src', 'thebes', 'ipc', diff --git gfx/skia/generate_mozbuild.py gfx/skia/generate_mozbuild.py -index 28fa6b5..240dced 100755 +index ab1365f..8897c27 100755 --- gfx/skia/generate_mozbuild.py +++ gfx/skia/generate_mozbuild.py -@@ -134,6 +134,9 @@ if CONFIG['CLANG_CXX'] or CONFIG['CLANG_ +@@ -140,6 +140,9 @@ if CONFIG['CLANG_CXX'] or CONFIG['CLANG_CL']: '-Wno-unused-private-field', ] +if CONFIG['MOZ_SYSTEM_HARFBUZZ']: + CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] + - if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3', 'android', 'gonk', 'qt'): + if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3', 'android', 'gonk'): CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS'] CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS'] diff --git gfx/skia/moz.build gfx/skia/moz.build -index 1d0c2f9..adb8941 100644 +index a2f914b..d3759b0 100644 --- gfx/skia/moz.build +++ gfx/skia/moz.build -@@ -752,6 +752,9 @@ if CONFIG['CLANG_CXX'] or CONFIG['CLANG_ +@@ -664,6 +664,9 @@ if CONFIG['CLANG_CXX'] or CONFIG['CLANG_CL']: '-Wno-unused-private-field', ] +if CONFIG['MOZ_SYSTEM_HARFBUZZ']: + CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] + - if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3', 'android', 'gonk', 'qt'): + if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3', 'android', 'gonk'): CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS'] CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS'] diff --git gfx/thebes/moz.build gfx/thebes/moz.build -index d5852fa..aeeab25 100644 +index bbbce6fd..db0ceb1 100644 --- gfx/thebes/moz.build +++ gfx/thebes/moz.build -@@ -306,7 +306,13 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk +@@ -289,7 +289,13 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3'): LOCAL_INCLUDES += CONFIG['SKIA_INCLUDES'] -DEFINES['GRAPHITE2_STATIC'] = True +if CONFIG['MOZ_SYSTEM_HARFBUZZ']: + CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] + +if CONFIG['MOZ_SYSTEM_GRAPHITE2']: + CXXFLAGS += CONFIG['MOZ_GRAPHITE2_CFLAGS'] +else: + DEFINES['GRAPHITE2_STATIC'] = True if CONFIG['CLANG_CXX']: # Suppress warnings from Skia header files. -index d736943..41a931f 100644 +diff --git intl/unicharutil/util/moz.build intl/unicharutil/util/moz.build +index 9754753..768cc7d 100644 --- intl/unicharutil/util/moz.build +++ intl/unicharutil/util/moz.build -@@ -44,4 +44,7 @@ if CONFIG['ENABLE_INTL_API']: - LOCAL_INCLUDES += CONFIG['MOZ_ICU_INCLUDES'] +@@ -42,4 +42,7 @@ if CONFIG['_MSC_VER']: + if CONFIG['ENABLE_INTL_API']: USE_LIBS += ['icu'] +if CONFIG['MOZ_SYSTEM_HARFBUZZ']: + CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] + DIST_INSTALL = True +diff --git moz.configure moz.configure +index e762576..196dafd 100644 +--- moz.configure ++++ moz.configure +@@ -216,6 +216,30 @@ check_prog('GENISOIMAGE', delayed_getattr(extra_programs, 'GENISOIMAGE'), + check_prog('RPMBUILD', delayed_getattr(extra_programs, 'RPMBUILD'), + allow_missing=True) + ++option('--with-system-graphite2', ++ help="Use system graphite2 (located with pkgconfig)") ++ ++@depends('--with-system-graphite2', compile_environment) ++def check_for_graphite2(value, compile_env): ++ return value and compile_env ++ ++system_graphite2 = pkg_check_modules('MOZ_GRAPHITE2', 'graphite2', ++ check_for_graphite2) ++ ++set_config('MOZ_SYSTEM_GRAPHITE2', system_graphite2) ++ ++option('--with-system-harfbuzz', ++ help="Use system harfbuzz (located with pkgconfig)") ++ ++@depends('--with-system-harfbuzz', compile_environment) ++def check_for_harfbuzz(value, compile_env): ++ return value and compile_env ++ ++system_harfbuzz = pkg_check_modules('MOZ_HARFBUZZ', 'harfbuzz >= 1.2.6', ++ check_for_harfbuzz) ++ ++set_config('MOZ_SYSTEM_HARFBUZZ', system_harfbuzz) ++ + option('--enable-system-hunspell', + help="Use system hunspell (located with pkgconfig)") + diff --git netwerk/dns/moz.build netwerk/dns/moz.build -index 0b0717a..2e665c9 100644 +index f788d9a..5662301 100644 --- netwerk/dns/moz.build +++ netwerk/dns/moz.build @@ -66,6 +66,9 @@ LOCAL_INCLUDES += [ '/netwerk/base', ] +if CONFIG['MOZ_SYSTEM_HARFBUZZ']: + CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] + - if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk' and CONFIG['ANDROID_VERSION'] > '19': - LOCAL_INCLUDES += ['%' + '%s/bionic/libc/dns/include' % CONFIG['ANDROID_SOURCE']] + if CONFIG['ENABLE_INTL_API']: + DEFINES['IDNA2008'] = True + USE_LIBS += ['icu'] +diff --git old-configure.in old-configure.in +index 0070d48..9d1129f 100644 +--- old-configure.in ++++ old-configure.in +@@ -5764,6 +5764,27 @@ if test "$USE_FC_FREETYPE"; then + fi + dnl ======================================================== ++dnl Check for graphite2 ++dnl ======================================================== ++if test -n "$MOZ_SYSTEM_GRAPHITE2"; then ++ dnl graphite2.pc has bogus version, check manually ++ _SAVE_CFLAGS=$CFLAGS ++ CFLAGS="$CFLAGS $MOZ_GRAPHITE2_CFLAGS" ++ AC_TRY_COMPILE([ #include ++ #define GR2_VERSION_REQUIRE(major,minor,bugfix) \ ++ ( GR2_VERSION_MAJOR * 10000 + GR2_VERSION_MINOR \ ++ * 100 + GR2_VERSION_BUGFIX >= \ ++ (major) * 10000 + (minor) * 100 + (bugfix) ) ++ ], [ ++ #if !GR2_VERSION_REQUIRE(1,3,8) ++ #error "Insufficient graphite2 version." ++ #endif ++ ], [], ++ [AC_MSG_ERROR([--with-system-graphite2 requested but no working libgraphite2 found])]) ++ CFLAGS=$_SAVE_CFLAGS ++fi ++ ++dnl ======================================================== + dnl Check for pixman and cairo + dnl ======================================================== + diff --git toolkit/library/moz.build toolkit/library/moz.build -index 67f0db9..d42137a 100644 +index a3d5450..2c684a7e 100644 --- toolkit/library/moz.build +++ toolkit/library/moz.build -@@ -231,6 +231,12 @@ if CONFIG['MOZ_SYSTEM_LIBVPX']: - if not CONFIG['MOZ_TREE_PIXMAN']: - OS_LIBS += CONFIG['MOZ_PIXMAN_LIBS'] +@@ -217,6 +217,12 @@ if CONFIG['MOZ_SYSTEM_JPEG']: + if CONFIG['MOZ_SYSTEM_PNG']: + OS_LIBS += CONFIG['MOZ_PNG_LIBS'] +if CONFIG['MOZ_SYSTEM_GRAPHITE2']: + OS_LIBS += CONFIG['MOZ_GRAPHITE2_LIBS'] + +if CONFIG['MOZ_SYSTEM_HARFBUZZ']: + OS_LIBS += CONFIG['MOZ_HARFBUZZ_LIBS'] + - if CONFIG['MOZ_OSS']: - OS_LIBS += CONFIG['MOZ_OSS_LIBS'] + if CONFIG['MOZ_SYSTEM_HUNSPELL']: + OS_LIBS += CONFIG['MOZ_HUNSPELL_LIBS'] Index: head/www/firefox/files/patch-z-bug517422 =================================================================== --- head/www/firefox/files/patch-z-bug517422 (revision 425098) +++ head/www/firefox/files/patch-z-bug517422 (revision 425099) @@ -1,463 +1,463 @@ # Allow more config/external/ libs built against system-wide version. diff --git build/moz.configure/old.configure build/moz.configure/old.configure index 42ab554..c91df3d 100644 --- build/moz.configure/old.configure +++ build/moz.configure/old.configure @@ -320,7 +320,12 @@ def old_configure_options(*options): '--with-system-libvpx', '--with-system-nspr', '--with-system-nss', + '--with-system-ogg', '--with-system-png', + '--with-system-soundtouch', + '--with-system-theora', + '--with-system-tremor', + '--with-system-vorbis', '--with-system-zlib', '--with-thumb', '--with-thumb-interwork', diff --git config/Makefile.in config/Makefile.in index 5383399..0410004 100644 --- config/Makefile.in +++ config/Makefile.in -@@ -77,6 +77,11 @@ export:: $(export-preqs) +@@ -51,6 +51,11 @@ export:: $(export-preqs) -DMOZ_SYSTEM_ICU=$(MOZ_SYSTEM_ICU) \ -DMOZ_SYSTEM_GRAPHITE2=$(MOZ_SYSTEM_GRAPHITE2) \ -DMOZ_SYSTEM_HARFBUZZ=$(MOZ_SYSTEM_HARFBUZZ) \ + -DMOZ_SYSTEM_OGG=$(MOZ_SYSTEM_OGG) \ + -DMOZ_SYSTEM_THEORA=$(MOZ_SYSTEM_THEORA) \ + -DMOZ_SYSTEM_VORBIS=$(MOZ_SYSTEM_VORBIS) \ + -DMOZ_SYSTEM_TREMOR=$(MOZ_SYSTEM_TREMOR) \ + -DMOZ_SYSTEM_SOUNDTOUCH=$(MOZ_SYSTEM_SOUNDTOUCH) \ - $(srcdir)/system-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers + $(srcdir)/system-headers $(srcdir)/stl-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers $(INSTALL) system_wrappers $(DIST) diff --git config/external/moz.build config/external/moz.build index f67c5c7..eb909ce 100644 --- config/external/moz.build +++ config/external/moz.build @@ -20,12 +20,21 @@ if CONFIG['MOZ_UPDATER']: # There's no "native brotli" yet, but probably in the future... external_dirs += ['modules/brotli'] -if CONFIG['MOZ_VORBIS']: +if not CONFIG['MOZ_SYSTEM_OGG']: + external_dirs += ['media/libogg'] + +if CONFIG['MOZ_VORBIS'] and not CONFIG['MOZ_SYSTEM_VORBIS']: external_dirs += ['media/libvorbis'] -if CONFIG['MOZ_TREMOR']: +if CONFIG['MOZ_TREMOR'] and not CONFIG['MOZ_SYSTEM_TREMOR']: external_dirs += ['media/libtremor'] +if not CONFIG['MOZ_SYSTEM_THEORA']: + external_dirs += ['media/libtheora'] + +if not CONFIG['MOZ_SYSTEM_SOUNDTOUCH']: + external_dirs += ['media/libsoundtouch'] + if CONFIG['MOZ_WEBM_ENCODER']: external_dirs += ['media/libmkv'] @@ -51,12 +60,9 @@ external_dirs += [ 'media/kiss_fft', 'media/libcubeb', 'media/libnestegg', - 'media/libogg', 'media/libopus', - 'media/libtheora', 'media/libspeex_resampler', 'media/libstagefright', - 'media/libsoundtouch', ] DIRS += ['../../' + i for i in external_dirs] diff --git config/system-headers config/system-headers index bef567c..9807c29 100644 --- config/system-headers +++ config/system-headers @@ -1364,3 +1363,17 @@ graphite2/Segment.h harfbuzz/hb-ot.h harfbuzz/hb.h #endif +#if MOZ_SYSTEM_OGG==1 +ogg/ogg.h +ogg/os_types.h +#endif +#if MOZ_SYSTEM_THEORA==1 +theora/theoradec.h +#endif +#if MOZ_SYSTEM_VORBIS==1 +vorbis/codec.h +vorbis/vorbisenc.h +#endif +#if MOZ_SYSTEM_TREMOR==1 +tremor/ivorbiscodec.h +#endif diff --git old-configure.in configure.in index 87db361..7947626 100644 --- old-configure.in +++ old-configure.in @@ -5401,6 +5401,111 @@ if test -n "$MOZ_OMX_PLUGIN"; then fi fi +dnl ======================================================== +dnl Check for libogg +dnl ======================================================== + +MOZ_ARG_WITH_BOOL(system-ogg, +[ --with-system-ogg Use system libogg (located with pkgconfig)], +MOZ_SYSTEM_OGG=1, +MOZ_SYSTEM_OGG=) + +if test -n "$MOZ_SYSTEM_OGG"; then + PKG_CHECK_MODULES(MOZ_OGG, ogg >= 1.2.1) + + _SAVE_LIBS=$LIBS + LIBS="$LIBS $MOZ_OGG_LIBS" + AC_CHECK_FUNC(ogg_set_mem_functions, [], + [AC_DEFINE(MOZ_OGG_NO_MEM_REPORTING)]) + LIBS=$_SAVE_LIBS +fi + +AC_SUBST(MOZ_SYSTEM_OGG) + +dnl ======================================================== +dnl Check for libvorbis +dnl ======================================================== + +MOZ_ARG_WITH_BOOL(system-vorbis, +[ --with-system-vorbis Use system libvorbis (located with pkgconfig)], +MOZ_SYSTEM_VORBIS=1, +MOZ_SYSTEM_VORBIS=) + +if test -n "$MOZ_SYSTEM_VORBIS"; then + PKG_CHECK_MODULES(MOZ_VORBIS, vorbis vorbisenc >= 1.3.5) +fi + +AC_SUBST(MOZ_SYSTEM_VORBIS) + +dnl ======================================================== +dnl Check for integer-only libvorbis aka tremor +dnl ======================================================== + +MOZ_ARG_WITH_BOOL(system-tremor, +[ --with-system-tremor Use system libtremor (located with pkgconfig)], +MOZ_SYSTEM_TREMOR=1, +MOZ_SYSTEM_TREMOR=) + +if test -n "$MOZ_SYSTEM_TREMOR"; then + PKG_CHECK_MODULES(MOZ_TREMOR, vorbisidec >= 1.2.1) +fi + +AC_SUBST(MOZ_SYSTEM_TREMOR) + +dnl ======================================================== +dnl Check for libtheora +dnl ======================================================== + +MOZ_ARG_WITH_BOOL(system-theora, +[ --with-system-theora Use system libtheora (located with pkgconfig)], +MOZ_SYSTEM_THEORA=1, +MOZ_SYSTEM_THEORA=) + +if test -n "$MOZ_SYSTEM_THEORA"; then + PKG_CHECK_MODULES(MOZ_THEORA, theora >= 1.2) +fi + +AC_SUBST(MOZ_SYSTEM_THEORA) + +dnl ======================================================== +dnl Check for libSoundTouch +dnl ======================================================== + +MOZ_ARG_WITH_BOOL(system-soundtouch, +[ --with-system-soundtouch Use system libSoundTouch (located with pkgconfig)], +MOZ_SYSTEM_SOUNDTOUCH=1, +MOZ_SYSTEM_SOUNDTOUCH=) + +if test -n "$MOZ_SYSTEM_SOUNDTOUCH"; then + PKG_CHECK_MODULES(MOZ_SOUNDTOUCH, soundtouch >= 1.9.0) + + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + _SAVE_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS $MOZ_SOUNDTOUCH_CFLAGS" + AC_CACHE_CHECK(for soundtouch sample type, + ac_cv_soundtouch_sample_type, + [AC_TRY_COMPILE([#include + #ifndef SOUNDTOUCH_INTEGER_SAMPLES + #error soundtouch expects float samples + #endif], + [], + [ac_cv_soundtouch_sample_type=short], + [ac_cv_soundtouch_sample_type=float])]) + CXXFLAGS=$_SAVE_CXXFLAGS + AC_LANG_RESTORE + + if test \( -n "$MOZ_SAMPLE_TYPE_S16" -a "$ac_cv_soundtouch_sample_type" != short \) \ + -o \( -n "$MOZ_SAMPLE_TYPE_FLOAT32" -a "$ac_cv_soundtouch_sample_type" != float \) ; then + AC_MSG_ERROR([SoundTouch library is built with incompatible sample type. Either rebuild the library with/without --enable-integer-samples, chase default Mozilla sample type or remove --with-system-soundtouch.]) + fi +fi + +if test -n "$MOZ_SYSTEM_SOUNDTOUCH"; then + AC_DEFINE(MOZ_SYSTEM_SOUNDTOUCH) +fi +AC_SUBST(MOZ_SYSTEM_SOUNDTOUCH) + dnl system libvpx Support dnl ======================================================== MOZ_ARG_WITH_BOOL(system-libvpx, diff --git dom/media/AudioStream.cpp dom/media/AudioStream.cpp index 2127256..1ec09fe 100644 --- dom/media/AudioStream.cpp +++ dom/media/AudioStream.cpp @@ -125,7 +125,9 @@ AudioStream::AudioStream(DataSource& aSo , mOutRate(0) , mChannels(0) , mOutChannels(0) +#ifndef MOZ_SYSTEM_SOUNDTOUCH , mTimeStretcher(nullptr) +#endif , mDumpFile(nullptr) , mState(INITIALIZED) , mDataSource(aSource) @@ -152,9 +154,11 @@ AudioStream::~AudioStream() if (mDumpFile) { fclose(mDumpFile); } +#ifndef MOZ_SYSTEM_SOUNDTOUCH if (mTimeStretcher) { soundtouch::destroySoundTouchObj(mTimeStretcher); } +#endif } size_t -@@ -177,7 +181,11 @@ nsresult AudioStream::EnsureTimeStretcherInitializedUnlocked() +@@ -151,7 +155,11 @@ nsresult AudioStream::EnsureTimeStretche { mMonitor.AssertCurrentThreadOwns(); if (!mTimeStretcher) { +#ifdef MOZ_SYSTEM_SOUNDTOUCH + mTimeStretcher = new soundtouch::SoundTouch(); +#else mTimeStretcher = soundtouch::createSoundTouchObj(); +#endif - mTimeStretcher->setSampleRate(mInRate); + mTimeStretcher->setSampleRate(mAudioClock.GetInputRate()); mTimeStretcher->setChannels(mOutChannels); mTimeStretcher->setPitch(1.0); diff --git dom/media/AudioStream.h dom/media/AudioStream.h index a552e3e..02b80b1 100644 --- dom/media/AudioStream.h +++ dom/media/AudioStream.h @@ -15,7 +15,11 @@ #include "mozilla/RefPtr.h" #include "mozilla/UniquePtr.h" #include "CubebUtils.h" +#ifdef MOZ_SYSTEM_SOUNDTOUCH +#include "soundtouch/SoundTouch.h" +#else #include "soundtouch/SoundTouchFactory.h" +#endif namespace mozilla { @@ -277,7 +277,11 @@ private: // Number of frames written to the buffers. int64_t mWritten; AudioClock mAudioClock; +#ifdef MOZ_SYSTEM_SOUNDTOUCH + nsAutoPtr mTimeStretcher; +#else soundtouch::SoundTouch* mTimeStretcher; +#endif // Stream start time for stream open delay telemetry. TimeStamp mStartTime; diff --git dom/media/moz.build dom/media/moz.build index 7526cff..e0a0ca0 100644 --- dom/media/moz.build +++ dom/media/moz.build @@ -300,6 +300,21 @@ if CONFIG['MOZ_WEBRTC']: DEFINES['MOZILLA_INTERNAL_API'] = True +if CONFIG['MOZ_SYSTEM_OGG']: + CXXFLAGS += CONFIG['MOZ_OGG_CFLAGS'] + +if CONFIG['MOZ_SYSTEM_THEORA']: + CXXFLAGS += CONFIG['MOZ_THEORA_CFLAGS'] + +if CONFIG['MOZ_SYSTEM_VORBIS']: + CXXFLAGS += CONFIG['MOZ_VORBIS_CFLAGS'] + +if CONFIG['MOZ_SYSTEM_TREMOR']: + CXXFLAGS += CONFIG['MOZ_TREMOR_CFLAGS'] + +if CONFIG['MOZ_SYSTEM_SOUNDTOUCH']: + CXXFLAGS += CONFIG['MOZ_SOUNDTOUCH_CFLAGS'] + if CONFIG['OS_TARGET'] == 'WINNT': DEFINES['WEBRTC_WIN'] = True else: diff --git media/libogg/README_MOZILLA media/libogg/README_MOZILLA index 0833e4d..7ece97b 100644 --- media/libogg/README_MOZILLA +++ media/libogg/README_MOZILLA @@ -6,3 +6,6 @@ The svn revision number used was r17287. The int-types.patch address a bug that config_types.h generated from Linux platform can't be used on OpenSolaris directly see Mozilla bug 449754 + +The in-tree copy may be omitted during build by --with-system-ogg. +Keep version in old-configure.in in sync on updates. diff --git media/libsoundtouch/README_MOZILLA media/libsoundtouch/README_MOZILLA index bfd4b1a..15b158d 100644 --- media/libsoundtouch/README_MOZILLA +++ media/libsoundtouch/README_MOZILLA @@ -6,3 +6,5 @@ The whole library is not used, only the relevant files are imported in the tree, using the script `update.sh`. Some changes have been made to the files, using the patch `moz-libsoundtouch.patch`. We also use a custom soundtouch_config.h. +The in-tree copy may be omitted during build by --with-system-soundtouch. +Keep version in old-configure.in in sync on updates. diff --git media/libsoundtouch/src/soundtouch_perms.h media/libsoundtouch/src/soundtouch_perms.h index 0af2fe6..d80c145 100644 --- media/libsoundtouch/src/soundtouch_perms.h +++ media/libsoundtouch/src/soundtouch_perms.h @@ -12,7 +12,9 @@ #pragma GCC visibility push(default) #include "SoundTouch.h" +#ifndef MOZ_SYSTEM_SOUNDTOUCH #include "SoundTouchFactory.h" +#endif #pragma GCC visibility pop #endif // MOZILLA_SOUNDTOUCH_PERMS_H diff --git media/libtheora/README_MOZILLA media/libtheora/README_MOZILLA index d48dbfa..f08a2ed 100644 --- media/libtheora/README_MOZILLA +++ media/libtheora/README_MOZILLA @@ -3,3 +3,6 @@ using the update.sh script. The changes made were those applied by update.sh, the addition/update of Makefile.in files for the Mozilla build system. The subversion revision used was r17578. + +The in-tree copy may be omitted during build by --with-system-theora. +Keep version in old-configure.in in sync on updates. diff --git media/libtheora/moz.build media/libtheora/moz.build index 14265b1..3069e99 100644 --- media/libtheora/moz.build +++ media/libtheora/moz.build @@ -21,6 +21,9 @@ if CONFIG['GKMEDIAS_SHARED_LIBRARY']: # The encoder is currently not included. DEFINES['THEORA_DISABLE_ENCODE'] = True +if CONFIG['MOZ_SYSTEM_OGG']: + CFLAGS += CONFIG['MOZ_OGG_CFLAGS'] + # Suppress warnings in third-party code. if CONFIG['GNU_CC']: CFLAGS += ['-Wno-type-limits'] diff --git media/libtremor/README_MOZILLA media/libtremor/README_MOZILLA index ee67b53..3f34a09 100644 --- media/libtremor/README_MOZILLA +++ media/libtremor/README_MOZILLA @@ -5,3 +5,6 @@ Makefile.in files for the Mozilla build system. The upstream release used was http://svn.xiph.org/trunk/Tremor/ The subversion revision used was r17547. + +The in-tree copy may be omitted during build by --with-system-tremor. +Keep version in old-configure.in in sync on updates. diff --git media/libtremor/moz.build media/libtremor/moz.build index 31831ba..a03d576 100644 --- media/libtremor/moz.build +++ media/libtremor/moz.build @@ -6,3 +6,5 @@ DIRS += ['include/tremor', 'lib'] +if CONFIG['MOZ_SYSTEM_OGG']: + CFLAGS += CONFIG['MOZ_OGG_CFLAGS'] diff --git media/libvorbis/README_MOZILLA media/libvorbis/README_MOZILLA index 7c7454c..55baedd 100644 --- media/libvorbis/README_MOZILLA +++ media/libvorbis/README_MOZILLA @@ -8,3 +8,6 @@ https://svn.xiph.org/tags/vorbis/libvorbis-1.3.4@19059 Some files are renamed during the copy to prevent clashes with object file names with other Mozilla libraries. + +The in-tree copy may be omitted during build by --with-system-vorbis. +Keep version in old-configure.in in sync on updates. diff --git media/libvorbis/moz.build media/libvorbis/moz.build index 919b99e..cc776f7 100644 --- media/libvorbis/moz.build +++ media/libvorbis/moz.build @@ -55,3 +55,6 @@ FINAL_LIBRARY = 'gkmedias' # Suppress warnings in third-party code. if CONFIG['GNU_CC']: CFLAGS += ['-Wno-uninitialized'] + +if CONFIG['MOZ_SYSTEM_OGG']: + CFLAGS += CONFIG['MOZ_OGG_CFLAGS'] diff --git toolkit/library/moz.build toolkit/library/moz.build index d42137a..695e75a8 100644 --- toolkit/library/moz.build +++ toolkit/library/moz.build @@ -178,6 +178,21 @@ if CONFIG['MOZ_SYSTEM_PNG']: if CONFIG['MOZ_SYSTEM_HUNSPELL']: OS_LIBS += CONFIG['MOZ_HUNSPELL_LIBS'] +if CONFIG['MOZ_SYSTEM_OGG']: + OS_LIBS += CONFIG['MOZ_OGG_LIBS'] + +if CONFIG['MOZ_SYSTEM_THEORA']: + OS_LIBS += CONFIG['MOZ_THEORA_LIBS'] + +if CONFIG['MOZ_SYSTEM_VORBIS']: + OS_LIBS += CONFIG['MOZ_VORBIS_LIBS'] + +if CONFIG['MOZ_SYSTEM_TREMOR']: + OS_LIBS += CONFIG['MOZ_TREMOR_LIBS'] + +if CONFIG['MOZ_SYSTEM_SOUNDTOUCH']: + OS_LIBS += CONFIG['MOZ_SOUNDTOUCH_LIBS'] + if CONFIG['MOZ_SYSTEM_LIBEVENT']: OS_LIBS += CONFIG['MOZ_LIBEVENT_LIBS'] diff --git xpcom/build/XPCOMInit.cpp xpcom/build/XPCOMInit.cpp index 2cf281e..6d7af0e 100644 --- xpcom/build/XPCOMInit.cpp +++ xpcom/build/XPCOMInit.cpp @@ -138,7 +138,9 @@ extern nsresult nsStringInputStreamConstructor(nsISupports*, REFNSIID, void**); #include "mozilla/VisualEventTracer.h" #endif +#ifndef MOZ_OGG_NO_MEM_REPORTING #include "ogg/ogg.h" +#endif #if defined(MOZ_VPX) && !defined(MOZ_VPX_NO_MEM_REPORTING) #include "vpx_mem/vpx_mem.h" #endif @@ -651,11 +653,13 @@ NS_InitXPCOM2(nsIServiceManager** aResult, // this oddness. mozilla::SetICUMemoryFunctions(); +#ifndef MOZ_OGG_NO_MEM_REPORTING // Do the same for libogg. ogg_set_mem_functions(OggReporter::CountingMalloc, OggReporter::CountingCalloc, OggReporter::CountingRealloc, OggReporter::CountingFree); +#endif #if defined(MOZ_VPX) && !defined(MOZ_VPX_NO_MEM_REPORTING) // And for VPX. Index: head/www/firefox-i18n/Makefile =================================================================== --- head/www/firefox-i18n/Makefile (revision 425098) +++ head/www/firefox-i18n/Makefile (revision 425099) @@ -1,89 +1,89 @@ # Created by: Andrew Pantyukhin # $FreeBSD$ PORTNAME= firefox-i18n -PORTVERSION= 49.0.2 +PORTVERSION= 50.0 CATEGORIES= www MASTER_SITES= MOZILLA/${PORTNAME:S|-i18n||}/releases/${DISTVERSION}/linux-i686/xpi \ - MOZILLA/${PORTNAME:S|-i18n||}/candidates/${DISTVERSION}-candidates/build2/linux-i686/xpi + MOZILLA/${PORTNAME:S|-i18n||}/candidates/${DISTVERSION}-candidates/build1/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,49,build +USES= zip:infozip gecko:firefox,50,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 425098) +++ head/www/firefox-i18n/distinfo (revision 425099) @@ -1,181 +1,181 @@ -TIMESTAMP = 1477039138 -SHA256 (xpi/firefox-i18n-49.0.2/ach.xpi) = 45805cd9d522cc30afbb855e7f6e8016c9b49d7ad1cb3920461641d0049c305c -SIZE (xpi/firefox-i18n-49.0.2/ach.xpi) = 427260 -SHA256 (xpi/firefox-i18n-49.0.2/af.xpi) = dc6184e706f96884bbad38a0f3a7ec727a3da287551473b0c85dbd9acac6781a -SIZE (xpi/firefox-i18n-49.0.2/af.xpi) = 436101 -SHA256 (xpi/firefox-i18n-49.0.2/an.xpi) = 7de53205c8e81e6b0bfc04a400f303a369caba6597857df5e7b646bfae24cd15 -SIZE (xpi/firefox-i18n-49.0.2/an.xpi) = 446087 -SHA256 (xpi/firefox-i18n-49.0.2/ar.xpi) = 123f5a08a2356b2cda3ba73ab39ada518d5eb16de537163f7ea9a0cc180087d2 -SIZE (xpi/firefox-i18n-49.0.2/ar.xpi) = 471935 -SHA256 (xpi/firefox-i18n-49.0.2/as.xpi) = 29f4aa1e938bfa5c7d305b6a932c6cf15a55fafa244e71785566099e2adf8da2 -SIZE (xpi/firefox-i18n-49.0.2/as.xpi) = 487354 -SHA256 (xpi/firefox-i18n-49.0.2/ast.xpi) = 9ea65f49a68555babbe94b1c3739da0df8cfb1233ea2a78a560fdbe7d4379937 -SIZE (xpi/firefox-i18n-49.0.2/ast.xpi) = 461423 -SHA256 (xpi/firefox-i18n-49.0.2/az.xpi) = 80b1aaa2cc659f2e3592674a1ec5aff1925ee9db35cb665b2dcaa626419b7bcf -SIZE (xpi/firefox-i18n-49.0.2/az.xpi) = 453808 -SHA256 (xpi/firefox-i18n-49.0.2/be.xpi) = e59042399f248ccaf614884f73e25bb65e56f24cb1f5190b09f7e839ef71d20d -SIZE (xpi/firefox-i18n-49.0.2/be.xpi) = 457912 -SHA256 (xpi/firefox-i18n-49.0.2/bg.xpi) = 09778b20ea1a1723c3f7a5d27d1fd1501caa0dc9d8595f74003bb715ae9566ff -SIZE (xpi/firefox-i18n-49.0.2/bg.xpi) = 485363 -SHA256 (xpi/firefox-i18n-49.0.2/bn-BD.xpi) = 208d72e86bb12b5694d1583630553c0add9a498bb649b0141d1ae0d09fad77aa -SIZE (xpi/firefox-i18n-49.0.2/bn-BD.xpi) = 511112 -SHA256 (xpi/firefox-i18n-49.0.2/bn-IN.xpi) = a4dbc815a318aa9706030f40fa609489848ca9db73807aff80c4f86a2971cfe1 -SIZE (xpi/firefox-i18n-49.0.2/bn-IN.xpi) = 508051 -SHA256 (xpi/firefox-i18n-49.0.2/br.xpi) = 664d3747c7d89ebb2241c29cec921ef59a023a67535946cd4935da98d4ad3a57 -SIZE (xpi/firefox-i18n-49.0.2/br.xpi) = 432778 -SHA256 (xpi/firefox-i18n-49.0.2/bs.xpi) = be93f20885a42fb6c07bfe7edffae7042265165399ddf606b11dd9fb550fcd39 -SIZE (xpi/firefox-i18n-49.0.2/bs.xpi) = 440115 -SHA256 (xpi/firefox-i18n-49.0.2/ca.xpi) = 914332e5083ec325a4284c45634241e26b0c4d5c293b5f66be02fa6fa82b465f -SIZE (xpi/firefox-i18n-49.0.2/ca.xpi) = 442608 -SHA256 (xpi/firefox-i18n-49.0.2/cs.xpi) = a9159ec86021a004907e45da1d34db73e9f14f8f9cb279589307b113bb6726b2 -SIZE (xpi/firefox-i18n-49.0.2/cs.xpi) = 439660 -SHA256 (xpi/firefox-i18n-49.0.2/cy.xpi) = 5d6ad2b71992192e525e4d5905222b0eb0bda33c59a60ed185d31b0058b37f9e -SIZE (xpi/firefox-i18n-49.0.2/cy.xpi) = 435868 -SHA256 (xpi/firefox-i18n-49.0.2/da.xpi) = e8ef0cd5d5011d063de3f5c4d4c53030afe0592dc3a6bca44329e52efbccde84 -SIZE (xpi/firefox-i18n-49.0.2/da.xpi) = 423925 -SHA256 (xpi/firefox-i18n-49.0.2/de.xpi) = 32f00eedf0f68f318be129546a8c507263ff9959058e06d84f5a30e023e6121b -SIZE (xpi/firefox-i18n-49.0.2/de.xpi) = 441918 -SHA256 (xpi/firefox-i18n-49.0.2/dsb.xpi) = 7734762f8bf2dd627fe9cafb5f6f37d88ac6bdc99abd1981a551d7ef47135423 -SIZE (xpi/firefox-i18n-49.0.2/dsb.xpi) = 459994 -SHA256 (xpi/firefox-i18n-49.0.2/el.xpi) = b90324a5eddb90965df0bec902216420376b3007102ed48c1242a87ca804272c -SIZE (xpi/firefox-i18n-49.0.2/el.xpi) = 506680 -SHA256 (xpi/firefox-i18n-49.0.2/en-GB.xpi) = 1a781abc61a09bdcde024437e7712329c8234e84324d60a688431fa8aca26462 -SIZE (xpi/firefox-i18n-49.0.2/en-GB.xpi) = 421950 -SHA256 (xpi/firefox-i18n-49.0.2/en-US.xpi) = cb03f43aa7bcd804f603faebb1dc86412f11e3cbbaa351ca28ed5997cfe2b4bd -SIZE (xpi/firefox-i18n-49.0.2/en-US.xpi) = 427548 -SHA256 (xpi/firefox-i18n-49.0.2/en-ZA.xpi) = 2485bee59b9f819ac6b07925982a827244a8cf80034f38b93df7cc70654f081f -SIZE (xpi/firefox-i18n-49.0.2/en-ZA.xpi) = 410564 -SHA256 (xpi/firefox-i18n-49.0.2/eo.xpi) = 9c870ec15bcd70683b5067a3e47c6bfc24f638d3f4dd335bb4ec4c33cffb3ff1 -SIZE (xpi/firefox-i18n-49.0.2/eo.xpi) = 436592 -SHA256 (xpi/firefox-i18n-49.0.2/es-AR.xpi) = 32babf458bd93c44957554923e7a57621f01b990f24d8a4a6e03ac1b07b177df -SIZE (xpi/firefox-i18n-49.0.2/es-AR.xpi) = 440337 -SHA256 (xpi/firefox-i18n-49.0.2/es-CL.xpi) = cf40babd40ac3e293ee27fbf86cfb780444d53c28c72aade5693b1735cacca07 -SIZE (xpi/firefox-i18n-49.0.2/es-CL.xpi) = 441654 -SHA256 (xpi/firefox-i18n-49.0.2/es-ES.xpi) = 9bd54c78ad7f6f330d5853c7c5e061dff3b30911fbf9ba437eaf52e6e9e884eb -SIZE (xpi/firefox-i18n-49.0.2/es-ES.xpi) = 347226 -SHA256 (xpi/firefox-i18n-49.0.2/es-MX.xpi) = d113acdd0cb4992ec785a8eb86482d9d5dd891b7caa0ff8e822c16db534fa91c -SIZE (xpi/firefox-i18n-49.0.2/es-MX.xpi) = 447125 -SHA256 (xpi/firefox-i18n-49.0.2/et.xpi) = 5126aa00346bf17a264f5f18aefbda89ba8b55406293cc92b498f5dadcff2787 -SIZE (xpi/firefox-i18n-49.0.2/et.xpi) = 424386 -SHA256 (xpi/firefox-i18n-49.0.2/eu.xpi) = f002959b617696c727cf8ca0e57468812a84a396441223a4214065e51ec7a1ff -SIZE (xpi/firefox-i18n-49.0.2/eu.xpi) = 439742 -SHA256 (xpi/firefox-i18n-49.0.2/fa.xpi) = 2ab17fc600fdcad46f1291d91550a31d6f33fb66a296708103bc7640496c9972 -SIZE (xpi/firefox-i18n-49.0.2/fa.xpi) = 489885 -SHA256 (xpi/firefox-i18n-49.0.2/ff.xpi) = d6609c3dd5fabe30b1312047aa8ef75e9c840787a6a7cd0a9f8ca9bca25bc225 -SIZE (xpi/firefox-i18n-49.0.2/ff.xpi) = 451263 -SHA256 (xpi/firefox-i18n-49.0.2/fi.xpi) = 72ae0298c37a4d56dbe22b0915e274cb71fc13ddf96727c4c17dc84f71c7b353 -SIZE (xpi/firefox-i18n-49.0.2/fi.xpi) = 430569 -SHA256 (xpi/firefox-i18n-49.0.2/fr.xpi) = be900080ef7752e63290f48b03e452ff8fd3fe0f30a22887f3c2e5004ac3ac57 -SIZE (xpi/firefox-i18n-49.0.2/fr.xpi) = 451720 -SHA256 (xpi/firefox-i18n-49.0.2/fy-NL.xpi) = 2e80a6a47a7ad5c033b2ce2651099a6397e8bf2603b9ef93f3a1d8c6ee1b8b96 -SIZE (xpi/firefox-i18n-49.0.2/fy-NL.xpi) = 443879 -SHA256 (xpi/firefox-i18n-49.0.2/ga-IE.xpi) = f3820e512fa79bd0dc5cc71c63eb828bb14daa5631d38dd21e6b6c66d042ef90 -SIZE (xpi/firefox-i18n-49.0.2/ga-IE.xpi) = 457587 -SHA256 (xpi/firefox-i18n-49.0.2/gd.xpi) = 786778230b5c0794bf1a6a8720bf6266ad3a026dc00af004843c8cc696f77c37 -SIZE (xpi/firefox-i18n-49.0.2/gd.xpi) = 444958 -SHA256 (xpi/firefox-i18n-49.0.2/gl.xpi) = 0bb23f8d81a7f0dc5eaac8e4d8c418a08f12a54383b13158a4825afaa449fa39 -SIZE (xpi/firefox-i18n-49.0.2/gl.xpi) = 448067 -SHA256 (xpi/firefox-i18n-49.0.2/gn.xpi) = 24ed0a1f40a9b1b687412065a093397448c0229521d21729301df086d8b9a340 -SIZE (xpi/firefox-i18n-49.0.2/gn.xpi) = 455553 -SHA256 (xpi/firefox-i18n-49.0.2/gu-IN.xpi) = b44f58a445eb8669bbe480d947e626b6f00b090e7ab78eb3b0d341e039e83f9b -SIZE (xpi/firefox-i18n-49.0.2/gu-IN.xpi) = 491793 -SHA256 (xpi/firefox-i18n-49.0.2/he.xpi) = b81c9d8411f09d1f3e552fb3071e41ddbe780bc2b0df34771394976fb924c89c -SIZE (xpi/firefox-i18n-49.0.2/he.xpi) = 460378 -SHA256 (xpi/firefox-i18n-49.0.2/hi-IN.xpi) = e7eca1d545be818c4832ed1d92ecd25ce8ad4c59e619d02d71db15f94631cf1b -SIZE (xpi/firefox-i18n-49.0.2/hi-IN.xpi) = 504515 -SHA256 (xpi/firefox-i18n-49.0.2/hr.xpi) = 9f6208e22a94a5b3a3d0f1b53729829dabd522fec169a2a794a1ce3d8061c6f9 -SIZE (xpi/firefox-i18n-49.0.2/hr.xpi) = 447985 -SHA256 (xpi/firefox-i18n-49.0.2/hsb.xpi) = a59cbb5ddff83ff9c7a9305328d5bc927eb04527270c72d6a4599e083e383fee -SIZE (xpi/firefox-i18n-49.0.2/hsb.xpi) = 457763 -SHA256 (xpi/firefox-i18n-49.0.2/hu.xpi) = 96d8be62b70d73c3ace875c4aa79fb32d0c6a261f27c39ca0d90063a39ac77d8 -SIZE (xpi/firefox-i18n-49.0.2/hu.xpi) = 450546 -SHA256 (xpi/firefox-i18n-49.0.2/hy-AM.xpi) = 971fde32067742370ac876ffd28ad1f87000a766dad4577c2d9f1a4c51714e94 -SIZE (xpi/firefox-i18n-49.0.2/hy-AM.xpi) = 493808 -SHA256 (xpi/firefox-i18n-49.0.2/id.xpi) = 7ccfb2abf77a029852f7da8e7dd77419af5ad746ac03a8f36e53b3d24a3f4429 -SIZE (xpi/firefox-i18n-49.0.2/id.xpi) = 423402 -SHA256 (xpi/firefox-i18n-49.0.2/is.xpi) = ef83b6ac44a09cd6b59e01bc55db5f2e5cf55f4040ec874bb819089ff7697c17 -SIZE (xpi/firefox-i18n-49.0.2/is.xpi) = 437737 -SHA256 (xpi/firefox-i18n-49.0.2/it.xpi) = 178eb7516a3f1f90906bc980e6585000b9806f430978fd1e0527306d0eb9a16d -SIZE (xpi/firefox-i18n-49.0.2/it.xpi) = 339264 -SHA256 (xpi/firefox-i18n-49.0.2/ja.xpi) = c784401f4396f20597b7c835dfe291ed34ac8ff39f94d575683e50aad640a234 -SIZE (xpi/firefox-i18n-49.0.2/ja.xpi) = 486517 -SHA256 (xpi/firefox-i18n-49.0.2/kk.xpi) = 91bb0807f1215e8cfaa6e85062d864994c9bf7dc7a3c988a0311f8fdebf4e9ad -SIZE (xpi/firefox-i18n-49.0.2/kk.xpi) = 494256 -SHA256 (xpi/firefox-i18n-49.0.2/km.xpi) = 30cfa3ceb49c847de219d88c6cf2b02e3a4190e8806a5e56dd09e8d1b80eecbd -SIZE (xpi/firefox-i18n-49.0.2/km.xpi) = 520083 -SHA256 (xpi/firefox-i18n-49.0.2/kn.xpi) = 16d132bafae24a9c0d23e3686427c2366208dd1e8b859dc2253d1cb36685c22c -SIZE (xpi/firefox-i18n-49.0.2/kn.xpi) = 518782 -SHA256 (xpi/firefox-i18n-49.0.2/ko.xpi) = 41cec32f26ad1037ff1271bb8dd933bca2fb7e49d3329880d158e7b33fff1449 -SIZE (xpi/firefox-i18n-49.0.2/ko.xpi) = 460895 -SHA256 (xpi/firefox-i18n-49.0.2/lij.xpi) = 028ebcf1a36c123ee186f0514953a46696def3aefa5162921d08cc99e2ebc151 -SIZE (xpi/firefox-i18n-49.0.2/lij.xpi) = 396173 -SHA256 (xpi/firefox-i18n-49.0.2/lt.xpi) = bff60b6b3528f6414c50f5274dda4333c4cabb6c79c273f61ecadf27dd59f505 -SIZE (xpi/firefox-i18n-49.0.2/lt.xpi) = 451345 -SHA256 (xpi/firefox-i18n-49.0.2/lv.xpi) = 9d1835f26a2b4ba29802206e536d8c1abb273b114742db4d6f4003c7a7cb031e -SIZE (xpi/firefox-i18n-49.0.2/lv.xpi) = 445323 -SHA256 (xpi/firefox-i18n-49.0.2/mai.xpi) = 4d28adf1f9d6bf4501b0f4f6d66ef9a9b3b9c6817efff7b1c255627c36a4f142 -SIZE (xpi/firefox-i18n-49.0.2/mai.xpi) = 502478 -SHA256 (xpi/firefox-i18n-49.0.2/mk.xpi) = 1235d350e956ba5d9c88672897705286c88a732c532a56e8c29b2e0dc607e5a0 -SIZE (xpi/firefox-i18n-49.0.2/mk.xpi) = 498491 -SHA256 (xpi/firefox-i18n-49.0.2/ml.xpi) = 05259bcbd39c508a57dce9ab88ccfd48b4ca004d746176b2b6738703ff146d28 -SIZE (xpi/firefox-i18n-49.0.2/ml.xpi) = 519595 -SHA256 (xpi/firefox-i18n-49.0.2/mr.xpi) = 5f45fb7014d4e57d2b7dc039c31cdb49294316e0d59bab33e071fdb11ef7d246 -SIZE (xpi/firefox-i18n-49.0.2/mr.xpi) = 501073 -SHA256 (xpi/firefox-i18n-49.0.2/ms.xpi) = 77e8a2c49e0d1d70a3ac15681a7bfed475ee662988ad4c1354a1efb8fbdc7325 -SIZE (xpi/firefox-i18n-49.0.2/ms.xpi) = 439421 -SHA256 (xpi/firefox-i18n-49.0.2/nb-NO.xpi) = d45fbbdeaace63622b405440ec5485db21211522932babd3d504e0e0c87fb61d -SIZE (xpi/firefox-i18n-49.0.2/nb-NO.xpi) = 433585 -SHA256 (xpi/firefox-i18n-49.0.2/nl.xpi) = ef09df1807739d68667ba35210de4a1fd7621051af5782ebcda8f390e85ff045 -SIZE (xpi/firefox-i18n-49.0.2/nl.xpi) = 431242 -SHA256 (xpi/firefox-i18n-49.0.2/nn-NO.xpi) = 08f7bb102406e0b5bd68cbb6e1147a5bea4d042ea1df6be279745f1941a458e5 -SIZE (xpi/firefox-i18n-49.0.2/nn-NO.xpi) = 427585 -SHA256 (xpi/firefox-i18n-49.0.2/or.xpi) = be1789bfee2772ea1359e23a0be95713aa4b6b07ce05e36ff55e84c9d3170845 -SIZE (xpi/firefox-i18n-49.0.2/or.xpi) = 499456 -SHA256 (xpi/firefox-i18n-49.0.2/pa-IN.xpi) = 57fbb04f424f680f670c8f13e3212a06b0396465d9ebd908c8e10cf5c5606e1a -SIZE (xpi/firefox-i18n-49.0.2/pa-IN.xpi) = 479086 -SHA256 (xpi/firefox-i18n-49.0.2/pl.xpi) = 820514a8f70cac72cb20a758a77c5de038e15aadc93f883c89ed82e8bc34c49f -SIZE (xpi/firefox-i18n-49.0.2/pl.xpi) = 362534 -SHA256 (xpi/firefox-i18n-49.0.2/pt-BR.xpi) = d0fd13da04c26106684e1a5de78edfb3e99e1297e8042b043d3e73fbcfa06e3d -SIZE (xpi/firefox-i18n-49.0.2/pt-BR.xpi) = 446485 -SHA256 (xpi/firefox-i18n-49.0.2/pt-PT.xpi) = a80756bc31efa043ac1733abd7ab5ac17f92f69467baf0eae18a7343fd9d0724 -SIZE (xpi/firefox-i18n-49.0.2/pt-PT.xpi) = 433687 -SHA256 (xpi/firefox-i18n-49.0.2/rm.xpi) = 030f6065523859366e7665eb3ac35547ab3a526815c3944f3c193909638ad51c -SIZE (xpi/firefox-i18n-49.0.2/rm.xpi) = 439646 -SHA256 (xpi/firefox-i18n-49.0.2/ro.xpi) = 94aefc700df14e0b43b7c7e95212b7b71bec092439b9a28713223dd29b080e6d -SIZE (xpi/firefox-i18n-49.0.2/ro.xpi) = 447538 -SHA256 (xpi/firefox-i18n-49.0.2/ru.xpi) = 40e688a440692cfbf7c115aa8a90451c53e8df1e137dd8a6342dc38977bbcbb0 -SIZE (xpi/firefox-i18n-49.0.2/ru.xpi) = 391743 -SHA256 (xpi/firefox-i18n-49.0.2/si.xpi) = 56b986317168d2e67332e8a3d79004707b4820e5ac8d6cc2aaf4a87283a07ace -SIZE (xpi/firefox-i18n-49.0.2/si.xpi) = 492130 -SHA256 (xpi/firefox-i18n-49.0.2/sk.xpi) = 009a808a6c76779b0bc4392f5b30620d8ac0acbd20c4c5adc71bb78698af8c4d -SIZE (xpi/firefox-i18n-49.0.2/sk.xpi) = 452529 -SHA256 (xpi/firefox-i18n-49.0.2/sl.xpi) = 1ef09212f6cfa8f9fda22fa98f7d9e1164c0279c8945b7089a1c981ddf6e5db5 -SIZE (xpi/firefox-i18n-49.0.2/sl.xpi) = 430480 -SHA256 (xpi/firefox-i18n-49.0.2/son.xpi) = 4a3421f5107d845973b1e27a8834fa99b9325afaee9ddc629299572509bb32bb -SIZE (xpi/firefox-i18n-49.0.2/son.xpi) = 437034 -SHA256 (xpi/firefox-i18n-49.0.2/sq.xpi) = bd6b5c55eb8ddccc8c8af5e4fe49799ba34801b8f22e34fe6bd728059c3d0c00 -SIZE (xpi/firefox-i18n-49.0.2/sq.xpi) = 453368 -SHA256 (xpi/firefox-i18n-49.0.2/sr.xpi) = 9f2801eb0f7e8b3bc454a3171d437f6be0800cf6d7046a6110cb28452bc55f78 -SIZE (xpi/firefox-i18n-49.0.2/sr.xpi) = 463884 -SHA256 (xpi/firefox-i18n-49.0.2/sv-SE.xpi) = 29dd70d9bb2cdaa2d81b8cdec1f3a3b839071c60fe1eae02901ed838030b820d -SIZE (xpi/firefox-i18n-49.0.2/sv-SE.xpi) = 440493 -SHA256 (xpi/firefox-i18n-49.0.2/ta.xpi) = f36d8065c7901e8a3204d85551354803b00ed66c644a1a2431469ba44e1e3d41 -SIZE (xpi/firefox-i18n-49.0.2/ta.xpi) = 492435 -SHA256 (xpi/firefox-i18n-49.0.2/te.xpi) = 480625b27a71ecf1b778ca3cc56115c39f7e2557665edd85ae36d53d07485909 -SIZE (xpi/firefox-i18n-49.0.2/te.xpi) = 518143 -SHA256 (xpi/firefox-i18n-49.0.2/th.xpi) = 10bbbf467c2948f0f60250eb43604886fed2ff5f607a9963ad33e92a0ca83a33 -SIZE (xpi/firefox-i18n-49.0.2/th.xpi) = 486986 -SHA256 (xpi/firefox-i18n-49.0.2/tr.xpi) = bd29d4d94cb73a41605b36abd73defac30deb172a33b59e2bbe4804f0888173c -SIZE (xpi/firefox-i18n-49.0.2/tr.xpi) = 440856 -SHA256 (xpi/firefox-i18n-49.0.2/uk.xpi) = b5f65ba75b00df3254797bdb4ab21db56c4fed82ce6c2b3c03e78473e7151352 -SIZE (xpi/firefox-i18n-49.0.2/uk.xpi) = 491358 -SHA256 (xpi/firefox-i18n-49.0.2/uz.xpi) = 3ba8eea6634bf38e3708ea65db05c9d1a2b922a440bd8ad3f276b17c3233a35d -SIZE (xpi/firefox-i18n-49.0.2/uz.xpi) = 446443 -SHA256 (xpi/firefox-i18n-49.0.2/vi.xpi) = 782805a50b95f6791fafebfc56510a1aa1e0fcce2c19e3c640b85d79c36d970e -SIZE (xpi/firefox-i18n-49.0.2/vi.xpi) = 448048 -SHA256 (xpi/firefox-i18n-49.0.2/xh.xpi) = a6b18b3e1faf7aee6f9d5e9c07162c2b37175000bfcac676cad42e30d1829b48 -SIZE (xpi/firefox-i18n-49.0.2/xh.xpi) = 439947 -SHA256 (xpi/firefox-i18n-49.0.2/zh-CN.xpi) = b395ff821b85e54311237d5fb244fcca0eca66abf55dfbe8b7ef7bf0edd14a19 -SIZE (xpi/firefox-i18n-49.0.2/zh-CN.xpi) = 466753 -SHA256 (xpi/firefox-i18n-49.0.2/zh-TW.xpi) = 46ed7614c3f1d351b196944a55b8cdc13a10d2dad22805684eff3d30669e7b3c -SIZE (xpi/firefox-i18n-49.0.2/zh-TW.xpi) = 469470 +TIMESTAMP = 1477916479 +SHA256 (xpi/firefox-i18n-50.0/ach.xpi) = 7c03c683d7e321e82cd3843b353b2ff399583169accb43a3baa461e978a29b58 +SIZE (xpi/firefox-i18n-50.0/ach.xpi) = 425409 +SHA256 (xpi/firefox-i18n-50.0/af.xpi) = dfb4bee506ba72dd0b41e9636f9de1650035d767fd9d55584bc136e0e5ebf59c +SIZE (xpi/firefox-i18n-50.0/af.xpi) = 433949 +SHA256 (xpi/firefox-i18n-50.0/an.xpi) = 31ac468f34312777ad79f1bc38b0d80510c5ecb88fac106d0ba633266a4d136c +SIZE (xpi/firefox-i18n-50.0/an.xpi) = 442205 +SHA256 (xpi/firefox-i18n-50.0/ar.xpi) = 4e8ff2c0ab11e73c4f81e6b208b8e911e7775a3b23a6540284ea17510ab67db9 +SIZE (xpi/firefox-i18n-50.0/ar.xpi) = 470435 +SHA256 (xpi/firefox-i18n-50.0/as.xpi) = 661c6a59f70a492b134aa85cf45005b22b5330a8aa5f4c4139a508eaf4212527 +SIZE (xpi/firefox-i18n-50.0/as.xpi) = 484770 +SHA256 (xpi/firefox-i18n-50.0/ast.xpi) = d660f5a4582cba124b33b97741c922959a17bf7cd73f6677a730e787c4ebd437 +SIZE (xpi/firefox-i18n-50.0/ast.xpi) = 433849 +SHA256 (xpi/firefox-i18n-50.0/az.xpi) = a62bab5a596af29c947c4581e22a3f059960c85b6948320131c5f7d88b81036a +SIZE (xpi/firefox-i18n-50.0/az.xpi) = 451403 +SHA256 (xpi/firefox-i18n-50.0/be.xpi) = 70476d3481183b7d6d81de03a100ceade99114f28963c0605c393047073b8ee7 +SIZE (xpi/firefox-i18n-50.0/be.xpi) = 458491 +SHA256 (xpi/firefox-i18n-50.0/bg.xpi) = 6cd90b51ffbb72f54995ec64792a93742f5ae3689ce61f2dc3864c84cdd12367 +SIZE (xpi/firefox-i18n-50.0/bg.xpi) = 484621 +SHA256 (xpi/firefox-i18n-50.0/bn-BD.xpi) = ab023e69ce7f39387b018816776ad25eb31bacd24a7b16be94b9fe0f2cc0489b +SIZE (xpi/firefox-i18n-50.0/bn-BD.xpi) = 509167 +SHA256 (xpi/firefox-i18n-50.0/bn-IN.xpi) = 426569269b219983858bcc70d828714e3e65cdcec59ce6ffee5d784924469fa5 +SIZE (xpi/firefox-i18n-50.0/bn-IN.xpi) = 503130 +SHA256 (xpi/firefox-i18n-50.0/br.xpi) = 845a120cfba5b141bc35ed916fa32553e04db702871784e310073ea6f62e48fe +SIZE (xpi/firefox-i18n-50.0/br.xpi) = 432448 +SHA256 (xpi/firefox-i18n-50.0/bs.xpi) = 9f3894c4472f2ce32c0b6405b3f0e91d4f8061d7d76e761e6a9e0e807894315a +SIZE (xpi/firefox-i18n-50.0/bs.xpi) = 439555 +SHA256 (xpi/firefox-i18n-50.0/ca.xpi) = e6712e0b933cb6f5ae7abb36e7ccbe922cd748e68a7f8bc9fc39cd342f35f66a +SIZE (xpi/firefox-i18n-50.0/ca.xpi) = 440359 +SHA256 (xpi/firefox-i18n-50.0/cs.xpi) = 711a8d5284d918bdcb00b20eb331244eaeda2e5ba31cba612db4b803737a6989 +SIZE (xpi/firefox-i18n-50.0/cs.xpi) = 439541 +SHA256 (xpi/firefox-i18n-50.0/cy.xpi) = 82b2542533442cfeab7001531b707922ab89cac12fdce580ad9e7a894eeda148 +SIZE (xpi/firefox-i18n-50.0/cy.xpi) = 433664 +SHA256 (xpi/firefox-i18n-50.0/da.xpi) = f0ad84bb1e381a0880135abb0bc2e0f53e3c7e8609e25aaf87c64e27b0985baa +SIZE (xpi/firefox-i18n-50.0/da.xpi) = 421324 +SHA256 (xpi/firefox-i18n-50.0/de.xpi) = 7fd48dd147693828289ba82d5439487e858258116845892e01527b6ab21e1b69 +SIZE (xpi/firefox-i18n-50.0/de.xpi) = 438194 +SHA256 (xpi/firefox-i18n-50.0/dsb.xpi) = 49b717304bdefd42276b05e09492a0ccf13c20086422b25204c8d0ec71bf3fbe +SIZE (xpi/firefox-i18n-50.0/dsb.xpi) = 456084 +SHA256 (xpi/firefox-i18n-50.0/el.xpi) = 70c440ce51f7a4b6aa496570ea1977b9a34f34e9f41af63483f86a75a8618b55 +SIZE (xpi/firefox-i18n-50.0/el.xpi) = 502225 +SHA256 (xpi/firefox-i18n-50.0/en-GB.xpi) = 11849f6610e3d7fee2106b5ffcb98b6d55ee09b9ec9dd99a7fc35193436ceb53 +SIZE (xpi/firefox-i18n-50.0/en-GB.xpi) = 415254 +SHA256 (xpi/firefox-i18n-50.0/en-US.xpi) = a9bce3ccb7f7b04b0b5b889db6480d98ae06bfd7dc58ae6b66b77259d577bdbf +SIZE (xpi/firefox-i18n-50.0/en-US.xpi) = 425320 +SHA256 (xpi/firefox-i18n-50.0/en-ZA.xpi) = 70516e1c04e00d19266dc7deea64a3a680a98e82c4b286526be07e7138ef48b4 +SIZE (xpi/firefox-i18n-50.0/en-ZA.xpi) = 408747 +SHA256 (xpi/firefox-i18n-50.0/eo.xpi) = a3fa888a6b2353eecdd6006b3115a91b027bf036879d772b0c5a687da52b9a6b +SIZE (xpi/firefox-i18n-50.0/eo.xpi) = 434337 +SHA256 (xpi/firefox-i18n-50.0/es-AR.xpi) = e0e0a3d696931e4272165d1f3a3c0cd6b9bf171dab7a78ca4b18e547fa06c86f +SIZE (xpi/firefox-i18n-50.0/es-AR.xpi) = 439531 +SHA256 (xpi/firefox-i18n-50.0/es-CL.xpi) = 0474301257f4f6004924acf01968aacf1b7ce2d4e82c8ca78d492fc3ded0b455 +SIZE (xpi/firefox-i18n-50.0/es-CL.xpi) = 440864 +SHA256 (xpi/firefox-i18n-50.0/es-ES.xpi) = 08c2981e0af285f4f1095cd18be7a2520b6b41b1742424dec41b2642e5a8daf2 +SIZE (xpi/firefox-i18n-50.0/es-ES.xpi) = 342207 +SHA256 (xpi/firefox-i18n-50.0/es-MX.xpi) = c01ad432d1cd8214f7bb491dbc686585359724bf88fe44ccd54e3c86c37ed65d +SIZE (xpi/firefox-i18n-50.0/es-MX.xpi) = 445099 +SHA256 (xpi/firefox-i18n-50.0/et.xpi) = 7387f6e7a5bbb39dad730778e921238491bc64b317109074c2d797a24bd700c5 +SIZE (xpi/firefox-i18n-50.0/et.xpi) = 422047 +SHA256 (xpi/firefox-i18n-50.0/eu.xpi) = 8a7f98a8c76dd480c905ec556afa2d8ff8b6322ece9af0d0185aee386e0625c0 +SIZE (xpi/firefox-i18n-50.0/eu.xpi) = 435621 +SHA256 (xpi/firefox-i18n-50.0/fa.xpi) = e32c0bc851b19edb89a60f9bb9fd4bb6fe97bd77f2715eb033e819d031a02d7f +SIZE (xpi/firefox-i18n-50.0/fa.xpi) = 487591 +SHA256 (xpi/firefox-i18n-50.0/ff.xpi) = b35c99cedf54f2928cf2b80ff0a64fff9ab13942ecd10eea063a7acfca3e7a77 +SIZE (xpi/firefox-i18n-50.0/ff.xpi) = 438308 +SHA256 (xpi/firefox-i18n-50.0/fi.xpi) = 41746c1574eab648bca65c1c8e944213364242d24889339cac00adf7e5a5ebce +SIZE (xpi/firefox-i18n-50.0/fi.xpi) = 426489 +SHA256 (xpi/firefox-i18n-50.0/fr.xpi) = b7c6b28ba42bc1d09393e63d0cd48967576d7ad7760ee3a3de1408bd4ec26262 +SIZE (xpi/firefox-i18n-50.0/fr.xpi) = 447064 +SHA256 (xpi/firefox-i18n-50.0/fy-NL.xpi) = 58aff6537143cae502b51cb227b5988bed61ec71f6f3916d88add9122a0ae8e0 +SIZE (xpi/firefox-i18n-50.0/fy-NL.xpi) = 441787 +SHA256 (xpi/firefox-i18n-50.0/ga-IE.xpi) = b2e689a3801204c855f5afb14c1ec1091829a144aff543e94e753cfd2ecbe46c +SIZE (xpi/firefox-i18n-50.0/ga-IE.xpi) = 455096 +SHA256 (xpi/firefox-i18n-50.0/gd.xpi) = bb5c28d471f1198a48081a2dc2f6cbb8ccf3966abcc40b6ea32541681c6046bd +SIZE (xpi/firefox-i18n-50.0/gd.xpi) = 444264 +SHA256 (xpi/firefox-i18n-50.0/gl.xpi) = 30364b107deb8b11ff41f2fd936b77181e09ccf0a33dae4afaca6c0639ace8b7 +SIZE (xpi/firefox-i18n-50.0/gl.xpi) = 451914 +SHA256 (xpi/firefox-i18n-50.0/gn.xpi) = afe41882cb837ed56438e3746e54f7e4d9940c247ea6081aa5bf7051685ec27a +SIZE (xpi/firefox-i18n-50.0/gn.xpi) = 453224 +SHA256 (xpi/firefox-i18n-50.0/gu-IN.xpi) = c0d6765b3139d1fedb29c766515d577de4d52f27a0d7228d53663e482f660175 +SIZE (xpi/firefox-i18n-50.0/gu-IN.xpi) = 487094 +SHA256 (xpi/firefox-i18n-50.0/he.xpi) = ccccd56e971959a7296ab1d7f0250b6b3fe6d4d6d33e7c0a7195a3622199955b +SIZE (xpi/firefox-i18n-50.0/he.xpi) = 455646 +SHA256 (xpi/firefox-i18n-50.0/hi-IN.xpi) = 7e01271418343643cd67e0a224d39f79e36baa93b83e8a9055edbedc4511651b +SIZE (xpi/firefox-i18n-50.0/hi-IN.xpi) = 499703 +SHA256 (xpi/firefox-i18n-50.0/hr.xpi) = d4b051d53250a5e927c6067916e529c86d4a287960687fb8251d038abfd6f450 +SIZE (xpi/firefox-i18n-50.0/hr.xpi) = 444276 +SHA256 (xpi/firefox-i18n-50.0/hsb.xpi) = 37f3c6af3d8a599f96e04b9ba86d6fa1e1c34903cbb4e416d1df2d4ea4367388 +SIZE (xpi/firefox-i18n-50.0/hsb.xpi) = 453901 +SHA256 (xpi/firefox-i18n-50.0/hu.xpi) = 1dd8bc270702245830b36ea3cc4719322e88fac21c588bc9698a6d92cbba2c08 +SIZE (xpi/firefox-i18n-50.0/hu.xpi) = 448347 +SHA256 (xpi/firefox-i18n-50.0/hy-AM.xpi) = 9931dfbbc58edfd5645909113c16bb496a60dc8382309c4bf817fab4e3d826d5 +SIZE (xpi/firefox-i18n-50.0/hy-AM.xpi) = 492714 +SHA256 (xpi/firefox-i18n-50.0/id.xpi) = f3eb7a4e0fe2136030527833336bcabfc24587d096edec2801f6062a84190160 +SIZE (xpi/firefox-i18n-50.0/id.xpi) = 422999 +SHA256 (xpi/firefox-i18n-50.0/is.xpi) = 1c3631f497075f4fa7fbc70883ae1653cdbcbc0b586236b3432331193a155ca8 +SIZE (xpi/firefox-i18n-50.0/is.xpi) = 435391 +SHA256 (xpi/firefox-i18n-50.0/it.xpi) = 2f11a5a9425900532445dbb4dab1981295a9ebb48d175e5ae52015cb01aa4d31 +SIZE (xpi/firefox-i18n-50.0/it.xpi) = 336079 +SHA256 (xpi/firefox-i18n-50.0/ja.xpi) = aa14e3dfa86899b2d85681806c79bcfbf6b1eeb28024ccdb05838567748aba3a +SIZE (xpi/firefox-i18n-50.0/ja.xpi) = 484309 +SHA256 (xpi/firefox-i18n-50.0/kk.xpi) = 06daec43d9f01c748de4e5da345a162320ef423e4af33bd86d2d3a6911c2a47a +SIZE (xpi/firefox-i18n-50.0/kk.xpi) = 493717 +SHA256 (xpi/firefox-i18n-50.0/km.xpi) = d2326fbecd9b676ff761d41588d5698740ce09bc8b5156c2f28626255c020f06 +SIZE (xpi/firefox-i18n-50.0/km.xpi) = 518204 +SHA256 (xpi/firefox-i18n-50.0/kn.xpi) = e2e030f4222d8a1ea7863de8fc4b71f6447b3ab2ca636130f753f4a401ed27b4 +SIZE (xpi/firefox-i18n-50.0/kn.xpi) = 517624 +SHA256 (xpi/firefox-i18n-50.0/ko.xpi) = 55dedfb933f295aeee1fddfbd0b663b17df3f01c1d957aa8a61cd109b8a48ff5 +SIZE (xpi/firefox-i18n-50.0/ko.xpi) = 460198 +SHA256 (xpi/firefox-i18n-50.0/lij.xpi) = 5d5c36c4818fda2690025e440edc9e7d2965ca8b484e419b9ec699ba2e47f6fe +SIZE (xpi/firefox-i18n-50.0/lij.xpi) = 394008 +SHA256 (xpi/firefox-i18n-50.0/lt.xpi) = b3c79f0222d795041dac4cf7eb6a7f31c41466651786f10b5ea33f5d8e5d879e +SIZE (xpi/firefox-i18n-50.0/lt.xpi) = 449249 +SHA256 (xpi/firefox-i18n-50.0/lv.xpi) = 72c14c870d78c47a37b7f1e75526ef7619cded65a2efb083bc0b5af28b9ec460 +SIZE (xpi/firefox-i18n-50.0/lv.xpi) = 444934 +SHA256 (xpi/firefox-i18n-50.0/mai.xpi) = 103162894a6e19af20c0f88190cb8ab6038a5800377e584d96b63792a258a327 +SIZE (xpi/firefox-i18n-50.0/mai.xpi) = 497919 +SHA256 (xpi/firefox-i18n-50.0/mk.xpi) = a2e3586219bbeb85cc35e31a91699ba835beb47edce38fae2a0d43834a31107c +SIZE (xpi/firefox-i18n-50.0/mk.xpi) = 494589 +SHA256 (xpi/firefox-i18n-50.0/ml.xpi) = 8f858e478a5d1afd4ca0e2312f7378d6d2103a69c18f488ae48b756175597293 +SIZE (xpi/firefox-i18n-50.0/ml.xpi) = 514613 +SHA256 (xpi/firefox-i18n-50.0/mr.xpi) = d53cc9566fb184ba7ffa31d16acbabdae397df217c39f384ecf5944529905223 +SIZE (xpi/firefox-i18n-50.0/mr.xpi) = 498729 +SHA256 (xpi/firefox-i18n-50.0/ms.xpi) = af8537e31d32c58d9328ff0b33219ca63fe96e891ff963d230533112610828e8 +SIZE (xpi/firefox-i18n-50.0/ms.xpi) = 433889 +SHA256 (xpi/firefox-i18n-50.0/nb-NO.xpi) = c005c34e584a758d6a820625e99c758f8459a70054f2575a7cb2a8eb40f8bd16 +SIZE (xpi/firefox-i18n-50.0/nb-NO.xpi) = 431340 +SHA256 (xpi/firefox-i18n-50.0/nl.xpi) = 510908c5502f975b84e38013131725e920292964c059b6a4f427e2d75dfd796c +SIZE (xpi/firefox-i18n-50.0/nl.xpi) = 429141 +SHA256 (xpi/firefox-i18n-50.0/nn-NO.xpi) = 65654319d58ee4b5f5b3665965d8c4cb8becabc8a38ce8c98fb096d6deb172f5 +SIZE (xpi/firefox-i18n-50.0/nn-NO.xpi) = 425412 +SHA256 (xpi/firefox-i18n-50.0/or.xpi) = 1e511e21de7692b9b6ae7edb05119bd15ea11e9d4bfcb1572c4034915415a531 +SIZE (xpi/firefox-i18n-50.0/or.xpi) = 495201 +SHA256 (xpi/firefox-i18n-50.0/pa-IN.xpi) = 52a00734a7d97a54ec9ccecc88ef102fe9959c6f24715f660f1a994391694ad6 +SIZE (xpi/firefox-i18n-50.0/pa-IN.xpi) = 474240 +SHA256 (xpi/firefox-i18n-50.0/pl.xpi) = 9f749dccacda71070dfc0e830dcc651eb4b04623a482355d0af86335c5b091b3 +SIZE (xpi/firefox-i18n-50.0/pl.xpi) = 353776 +SHA256 (xpi/firefox-i18n-50.0/pt-BR.xpi) = 6912b5acdb62e0ed28c29d407121998abb6cc31d069283a3f9c50816730c8803 +SIZE (xpi/firefox-i18n-50.0/pt-BR.xpi) = 438614 +SHA256 (xpi/firefox-i18n-50.0/pt-PT.xpi) = 9f3891a4c0abb0bb54aeb02895f25ba165534faefa6cc01716d8bcba97d5af8c +SIZE (xpi/firefox-i18n-50.0/pt-PT.xpi) = 433531 +SHA256 (xpi/firefox-i18n-50.0/rm.xpi) = e2b916e3a7584729dbc11dc910fe28f1dda820d491e81af3aab429ba5c0a4fc9 +SIZE (xpi/firefox-i18n-50.0/rm.xpi) = 431602 +SHA256 (xpi/firefox-i18n-50.0/ro.xpi) = 77177f1c04c4c677e8a538b0de9d540551917cc93d008bea890cf505baa7f228 +SIZE (xpi/firefox-i18n-50.0/ro.xpi) = 445555 +SHA256 (xpi/firefox-i18n-50.0/ru.xpi) = ad41048f8cfbb8d6f169b3756028f6b018a42ecf3ac4f5225fd441145e4ffbae +SIZE (xpi/firefox-i18n-50.0/ru.xpi) = 390432 +SHA256 (xpi/firefox-i18n-50.0/si.xpi) = 5df2b701c6e69413793eb17b71462963f670ccfdeafcaaa7737e1fd4e5c9d215 +SIZE (xpi/firefox-i18n-50.0/si.xpi) = 486231 +SHA256 (xpi/firefox-i18n-50.0/sk.xpi) = a2f7726d7cc896657e786af0359186bc1c9e1b72c577df352a3d11d39cd33a9d +SIZE (xpi/firefox-i18n-50.0/sk.xpi) = 452173 +SHA256 (xpi/firefox-i18n-50.0/sl.xpi) = 93c6d02bd51a59e93e9e7bfd3c26aa19b3a6d21649c442643a0377cb19f81cc4 +SIZE (xpi/firefox-i18n-50.0/sl.xpi) = 430206 +SHA256 (xpi/firefox-i18n-50.0/son.xpi) = 4540c45fcf09a7e4f53d13432ea2669771a6781764f6d5b642abd310106bf330 +SIZE (xpi/firefox-i18n-50.0/son.xpi) = 433272 +SHA256 (xpi/firefox-i18n-50.0/sq.xpi) = e9682adc355a9e6c9495299ff10b6b3cf2cd8967ae6f913242d7fb059d47b0db +SIZE (xpi/firefox-i18n-50.0/sq.xpi) = 449092 +SHA256 (xpi/firefox-i18n-50.0/sr.xpi) = 2c7510ae8f9780cd5a1e2a12d32c72055c8b20f1d0889edf6aba7a8c12b9469f +SIZE (xpi/firefox-i18n-50.0/sr.xpi) = 459592 +SHA256 (xpi/firefox-i18n-50.0/sv-SE.xpi) = e4fa0d036b511cafcc9fef2f6e59744d50a4321b44252eb7869a3db0ca9e4066 +SIZE (xpi/firefox-i18n-50.0/sv-SE.xpi) = 438326 +SHA256 (xpi/firefox-i18n-50.0/ta.xpi) = c4867a36014698a1003e933f551974848adc4d36e6edcd763410372b53dbfb59 +SIZE (xpi/firefox-i18n-50.0/ta.xpi) = 489663 +SHA256 (xpi/firefox-i18n-50.0/te.xpi) = 8ce8953b18f94abd0ea141d8bcdbc0d514a17d82b0b3297d74ca07ee291ca3d2 +SIZE (xpi/firefox-i18n-50.0/te.xpi) = 515621 +SHA256 (xpi/firefox-i18n-50.0/th.xpi) = 4cb149c686bdbaed6382b77d302a2c24e93090df8704fbeddffbabab0d345ea3 +SIZE (xpi/firefox-i18n-50.0/th.xpi) = 484867 +SHA256 (xpi/firefox-i18n-50.0/tr.xpi) = 23856730275883ab98dfe7876d46f9420ac528a434a3591b1c5ec260348c316f +SIZE (xpi/firefox-i18n-50.0/tr.xpi) = 440602 +SHA256 (xpi/firefox-i18n-50.0/uk.xpi) = 81b48ea865436db42013ab2eae3c98ea114431329d49db1f5d0ae0b5855eff9e +SIZE (xpi/firefox-i18n-50.0/uk.xpi) = 490967 +SHA256 (xpi/firefox-i18n-50.0/uz.xpi) = aa96f95ef1b99723a5adaba5c32085f433b278426a809f1691a7001e152db54c +SIZE (xpi/firefox-i18n-50.0/uz.xpi) = 444774 +SHA256 (xpi/firefox-i18n-50.0/vi.xpi) = 5fbb9668d203a73bc9b7e19b15855857b749d07a0e1ef0ea3734ac24fbce539c +SIZE (xpi/firefox-i18n-50.0/vi.xpi) = 447652 +SHA256 (xpi/firefox-i18n-50.0/xh.xpi) = 722a2d305f4a0d45600f084e0af144bf0e85b73cc3f23c440fc455188c470462 +SIZE (xpi/firefox-i18n-50.0/xh.xpi) = 437878 +SHA256 (xpi/firefox-i18n-50.0/zh-CN.xpi) = 783b4c5bef4cbf7bb33de582d874ef609c7200f1e47f8f63fb674fb23cbd27f3 +SIZE (xpi/firefox-i18n-50.0/zh-CN.xpi) = 457903 +SHA256 (xpi/firefox-i18n-50.0/zh-TW.xpi) = 6204083636a8679fc712a0711b13be9f06251436acf9450cc5882fd1cea4a368 +SIZE (xpi/firefox-i18n-50.0/zh-TW.xpi) = 469090