From owner-freebsd-gecko@FreeBSD.ORG Wed Feb 5 09:55:39 2014 Return-Path: Delivered-To: freebsd-gecko@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id C6A94558 for ; Wed, 5 Feb 2014 09:55:39 +0000 (UTC) Received: from trillian.chruetertee.ch (trillian.chruetertee.ch [217.150.244.247]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id D058B15C7 for ; Wed, 5 Feb 2014 09:55:38 +0000 (UTC) Received: from trillian.chruetertee.ch (trillian [217.150.244.247]) by trillian.chruetertee.ch (8.14.4/8.14.3) with ESMTP id s159tZgh060077 for ; Wed, 5 Feb 2014 09:55:35 GMT (envelope-from svn-freebsd-gecko@chruetertee.ch) Received: (from www@localhost) by trillian.chruetertee.ch (8.14.4/8.14.3/Submit) id s159tUUl056668 for freebsd-gecko@freebsd.org; Wed, 5 Feb 2014 09:55:30 GMT (envelope-from svn-freebsd-gecko@chruetertee.ch) Date: Wed, 5 Feb 2014 09:55:30 GMT Message-Id: <201402050955.s159tUUl056668@trillian.chruetertee.ch> X-Authentication-Warning: trillian.chruetertee.ch: www set sender to svn-freebsd-gecko@chruetertee.ch using -f From: svn-freebsd-gecko@chruetertee.ch To: freebsd-gecko@freebsd.org Subject: [SVN-Commit] r1478 - in trunk: Mk www/firefox www/firefox-i18n www/firefox-nightly www/firefox/files www/seamonkey www/seamonkey-i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list Reply-To: freebsd-gecko@freebsd.org List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 05 Feb 2014 09:55:39 -0000 Author: jbeich Date: Wed Feb 5 09:55:30 2014 New Revision: 1478 Log: update Added: trunk/www/firefox/files/patch-bug806917 trunk/www/firefox/files/patch-js-src-Makefile.in Deleted: trunk/www/firefox/files/patch-bug810716 trunk/www/firefox/files/patch-bug945046 trunk/www/firefox/files/patch-bug946560 trunk/www/firefox/files/patch-toolkit_xre_Makefile.in Modified: trunk/Mk/bsd.gecko.mk trunk/www/firefox-i18n/Makefile trunk/www/firefox-i18n/distinfo trunk/www/firefox-nightly/Makefile trunk/www/firefox-nightly/Makefile.hgrev trunk/www/firefox-nightly/distinfo trunk/www/firefox/Makefile trunk/www/firefox/distinfo trunk/www/firefox/files/patch-bug826985 trunk/www/seamonkey-i18n/Makefile trunk/www/seamonkey-i18n/distinfo trunk/www/seamonkey/Makefile trunk/www/seamonkey/distinfo Modified: trunk/Mk/bsd.gecko.mk ============================================================================== --- trunk/Mk/bsd.gecko.mk Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/Mk/bsd.gecko.mk Wed Feb 5 09:55:30 2014 (r1478) @@ -176,7 +176,7 @@ # is given by the maintainer via the port or by the # user via defined variable try to find the highest # stable installed version. -# Available values: yes 24+ 27+ 24 27 +# Available values: yes 24+ 28+ 24 28 # NOTE: # default value 24 is used in case of USE_FIREFOX=yes # @@ -218,11 +218,11 @@ .endif _FIREFOX_DEFAULT_VERSION= 24 -_FIREFOX_VERSIONS= 24 27 -_FIREFOX_RANGE_VERSIONS= 24+ 27+ +_FIREFOX_VERSIONS= 24 28 +_FIREFOX_RANGE_VERSIONS= 24+ 28+ # For specifying [24, ..]+ -_FIREFOX_27P= 27 ${_FIREFOX_24P} +_FIREFOX_28P= 28 ${_FIREFOX_24P} _FIREFOX_24P= 24 # Set the default Firefox version and check if USE_FIREFOX=yes was given @@ -269,7 +269,7 @@ # Dependence lines for different Firefox versions 24_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:${PORTSDIR}/www/firefox-esr -27_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:${PORTSDIR}/www/firefox +28_DEPENDS= ${LOCALBASE}/lib/firefox/firefox:${PORTSDIR}/www/firefox # Add dependencies .if defined(USE_FIREFOX) Modified: trunk/www/firefox-i18n/Makefile ============================================================================== --- trunk/www/firefox-i18n/Makefile Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/firefox-i18n/Makefile Wed Feb 5 09:55:30 2014 (r1478) @@ -2,7 +2,7 @@ # $FreeBSD: head/www/firefox-i18n/Makefile 336446 2013-12-14 13:42:06Z flo $ PORTNAME= firefox-i18n -PORTVERSION= 27.0 +PORTVERSION= 28.0b1 CATEGORIES= www MASTER_SITES= MOZILLA/${PORTNAME:S|-i18n||}/releases/${PORTVERSION}/linux-i686/xpi PKGNAMEPREFIX= @@ -14,7 +14,7 @@ EXTRACT_DEPENDS= zip:${PORTSDIR}/archivers/zip -USE_FIREFOX= 27 +USE_FIREFOX= 28 USE_XPI= firefox linux-firefox NO_ARCH= yes Modified: trunk/www/firefox-i18n/distinfo ============================================================================== --- trunk/www/firefox-i18n/distinfo Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/firefox-i18n/distinfo Wed Feb 5 09:55:30 2014 (r1478) @@ -1,170 +1,170 @@ -SHA256 (xpi/firefox-i18n-27.0/ach.xpi) = 65cdfbcbd6014dc59399322da4ea93189b8f330a16d18c0ea83df80ab35fd69f -SIZE (xpi/firefox-i18n-27.0/ach.xpi) = 355298 -SHA256 (xpi/firefox-i18n-27.0/af.xpi) = ca5bec9e99d5761c5b6d6e1b3433eaf48b70c6bd12abc6bd4e49b876fd41ce2c -SIZE (xpi/firefox-i18n-27.0/af.xpi) = 348846 -SHA256 (xpi/firefox-i18n-27.0/ar.xpi) = df215466a8a7138b3ca107c9682508700d5784cb343cdb8f66f0342853b7b508 -SIZE (xpi/firefox-i18n-27.0/ar.xpi) = 378144 -SHA256 (xpi/firefox-i18n-27.0/as.xpi) = 5f5083c2dfe2fd92f35960212766353dec3f683f35447d77565fc6fde83e75fd -SIZE (xpi/firefox-i18n-27.0/as.xpi) = 400776 -SHA256 (xpi/firefox-i18n-27.0/ast.xpi) = b851aeb2a180068acc2077bc050e1e808a37ea425ab7bff2d461a7c1c268d27c -SIZE (xpi/firefox-i18n-27.0/ast.xpi) = 309187 -SHA256 (xpi/firefox-i18n-27.0/be.xpi) = 0e562077db87bf6749f9df4b11d37e82e59cac2c9c7709111048590d2f0b85c0 -SIZE (xpi/firefox-i18n-27.0/be.xpi) = 332358 -SHA256 (xpi/firefox-i18n-27.0/bg.xpi) = 704628352752c46ec905145b7dcf4b711a31735206a630690dfc7e56d430e7f9 -SIZE (xpi/firefox-i18n-27.0/bg.xpi) = 389841 -SHA256 (xpi/firefox-i18n-27.0/bn-BD.xpi) = bb7d395513d170562deeda0e541c26eda43eb492506c1457e97648ec92d7602f -SIZE (xpi/firefox-i18n-27.0/bn-BD.xpi) = 410846 -SHA256 (xpi/firefox-i18n-27.0/bn-IN.xpi) = 2835ccc522361166aa52d69940c099663f1daf522b2bd8dde85d74043fbdf06a -SIZE (xpi/firefox-i18n-27.0/bn-IN.xpi) = 407699 -SHA256 (xpi/firefox-i18n-27.0/br.xpi) = de107ce823b623b78313f92010aae875d6ddf538aad2ec23a87da54eb9e662f1 -SIZE (xpi/firefox-i18n-27.0/br.xpi) = 351227 -SHA256 (xpi/firefox-i18n-27.0/bs.xpi) = abaa6db8e80fb3caaa3656812014eab91b4b0094b078fafd9284a389bc48b726 -SIZE (xpi/firefox-i18n-27.0/bs.xpi) = 354539 -SHA256 (xpi/firefox-i18n-27.0/ca.xpi) = 8b79d45cef709758bc7099afabef768b799fbf83f517f44a95e32e19db7d57d7 -SIZE (xpi/firefox-i18n-27.0/ca.xpi) = 357568 -SHA256 (xpi/firefox-i18n-27.0/cs.xpi) = a06ec864c6a9c8bdafec657d18e87afb3f678c2f97a8fc166a3700a219a028c3 -SIZE (xpi/firefox-i18n-27.0/cs.xpi) = 353324 -SHA256 (xpi/firefox-i18n-27.0/csb.xpi) = a85ba066994a82c532dd9b7b1895ff269fa3a6d4266e663f426d2bc30b0a1543 -SIZE (xpi/firefox-i18n-27.0/csb.xpi) = 343114 -SHA256 (xpi/firefox-i18n-27.0/cy.xpi) = 1fb750ce593eb58bee7f7f4124744806ddad7b73c6eeb5e0e38859b048b9d267 -SIZE (xpi/firefox-i18n-27.0/cy.xpi) = 351733 -SHA256 (xpi/firefox-i18n-27.0/da.xpi) = e12a78feef00f81837ebfc623c1fa16f475145d1947e16c679923fdd663d4b2e -SIZE (xpi/firefox-i18n-27.0/da.xpi) = 343538 -SHA256 (xpi/firefox-i18n-27.0/de.xpi) = a82ce6181e633a599c3cc5b9c6a39163f011c4e9e9069c4e34299d562e7bd0da -SIZE (xpi/firefox-i18n-27.0/de.xpi) = 345770 -SHA256 (xpi/firefox-i18n-27.0/el.xpi) = 3e7e398e00dfb0027d9ea030a242d68e247f38eac52a36d00e6ecce1cae70220 -SIZE (xpi/firefox-i18n-27.0/el.xpi) = 378045 -SHA256 (xpi/firefox-i18n-27.0/en-GB.xpi) = f93788d8eb0ee356c0c45a682628666655b0ff5d991bd3c161b0cab117a23f17 -SIZE (xpi/firefox-i18n-27.0/en-GB.xpi) = 337399 -SHA256 (xpi/firefox-i18n-27.0/en-US.xpi) = f04981553bb513ccde3d4752a2e61188d6cc065fb9be7c6831a9b33d595b50c4 -SIZE (xpi/firefox-i18n-27.0/en-US.xpi) = 335284 -SHA256 (xpi/firefox-i18n-27.0/en-ZA.xpi) = 447bb54a7481d8dc3f3f557561a4c19a317646c0506a424de48968e0e699518f -SIZE (xpi/firefox-i18n-27.0/en-ZA.xpi) = 332018 -SHA256 (xpi/firefox-i18n-27.0/eo.xpi) = 139a645f78069a6a2c75763e2c52e5c4df1a836ca7b08530e14e005a98c9114e -SIZE (xpi/firefox-i18n-27.0/eo.xpi) = 351109 -SHA256 (xpi/firefox-i18n-27.0/es-AR.xpi) = c23cfa308a5cb65d001bb1756c95ca075b2e97d459e05171f65e39ace7acaa82 -SIZE (xpi/firefox-i18n-27.0/es-AR.xpi) = 354328 -SHA256 (xpi/firefox-i18n-27.0/es-CL.xpi) = 7730db5896bf181f4507c71a582eb983e756e04d72779059880fbef8b65aa515 -SIZE (xpi/firefox-i18n-27.0/es-CL.xpi) = 301974 -SHA256 (xpi/firefox-i18n-27.0/es-ES.xpi) = 2ee0cd90f30009f6a345632a2eccd134a2f5208cbc39b6e4377ca6e848b78631 -SIZE (xpi/firefox-i18n-27.0/es-ES.xpi) = 293441 -SHA256 (xpi/firefox-i18n-27.0/es-MX.xpi) = 1e324ee15726f899906a4dad28a58146e6da2343a3cd183e846a509f728befe2 -SIZE (xpi/firefox-i18n-27.0/es-MX.xpi) = 356360 -SHA256 (xpi/firefox-i18n-27.0/et.xpi) = 9bbf739a69e9f2dea2f83638dd699c817b8315751b1b272b9cc1dfc0a9ebf67c -SIZE (xpi/firefox-i18n-27.0/et.xpi) = 343296 -SHA256 (xpi/firefox-i18n-27.0/eu.xpi) = b2ceb52d5d815b2e458131bdecdbdb9da2552763c7d60a18e17e13570d084b2f -SIZE (xpi/firefox-i18n-27.0/eu.xpi) = 350045 -SHA256 (xpi/firefox-i18n-27.0/fa.xpi) = 4709bcaaae8a6465e43d074ee9dbe025272b92fdb6b76da1afa1bad667c313ea -SIZE (xpi/firefox-i18n-27.0/fa.xpi) = 391167 -SHA256 (xpi/firefox-i18n-27.0/ff.xpi) = 2d1f36ba8accdfcd27e2f092f0d867b411ca87a022c6d808f913cc9da241e654 -SIZE (xpi/firefox-i18n-27.0/ff.xpi) = 348062 -SHA256 (xpi/firefox-i18n-27.0/fi.xpi) = f77abbff461ea2016438490d0984ad61a40a4899b686402b2564d2163761f0be -SIZE (xpi/firefox-i18n-27.0/fi.xpi) = 347379 -SHA256 (xpi/firefox-i18n-27.0/fr.xpi) = 5d828ce14698eb0c93361b8eec4c35586e8bef0a4391288672fed4946a98a987 -SIZE (xpi/firefox-i18n-27.0/fr.xpi) = 360467 -SHA256 (xpi/firefox-i18n-27.0/fy-NL.xpi) = 23eb65bac2f48ee2e52299114aa67ccbecba630ac33c8e3fcbf302aa149a38de -SIZE (xpi/firefox-i18n-27.0/fy-NL.xpi) = 356625 -SHA256 (xpi/firefox-i18n-27.0/ga-IE.xpi) = b681177cc971738006428b84485d7af6aefc4d30251b4c01f32d045372273afc -SIZE (xpi/firefox-i18n-27.0/ga-IE.xpi) = 361190 -SHA256 (xpi/firefox-i18n-27.0/gd.xpi) = 758759e74da70ca817827133819b914151505c42486b05297b3c304e4aa5ff80 -SIZE (xpi/firefox-i18n-27.0/gd.xpi) = 357708 -SHA256 (xpi/firefox-i18n-27.0/gl.xpi) = 6dbab688d071055c90079586ed6cdc8b562c24353de201651904074fd689b69b -SIZE (xpi/firefox-i18n-27.0/gl.xpi) = 353148 -SHA256 (xpi/firefox-i18n-27.0/gu-IN.xpi) = 2710574a1127266c189c8de357a340ae4c5ac24b76120c21af7f9369d0cb1cd0 -SIZE (xpi/firefox-i18n-27.0/gu-IN.xpi) = 377587 -SHA256 (xpi/firefox-i18n-27.0/he.xpi) = cccf082dc057db11a75c94d39de6a37573d251713c3bde8184846b1f80d4abab -SIZE (xpi/firefox-i18n-27.0/he.xpi) = 370010 -SHA256 (xpi/firefox-i18n-27.0/hi-IN.xpi) = 43c47e272d9e8ce1323c370b5164bb6c12b59e14dcb21bd5f76b2f4809c5d492 -SIZE (xpi/firefox-i18n-27.0/hi-IN.xpi) = 396450 -SHA256 (xpi/firefox-i18n-27.0/hr.xpi) = cd289f87392ac3832fd37ebe7834e82677cb9ca87880d26132fc6c138bc5654d -SIZE (xpi/firefox-i18n-27.0/hr.xpi) = 357707 -SHA256 (xpi/firefox-i18n-27.0/hu.xpi) = fbf5ac3f5f520e906023a0010fbac4edbb4aeb59c7a057e9b94d1fe539c44408 -SIZE (xpi/firefox-i18n-27.0/hu.xpi) = 361929 -SHA256 (xpi/firefox-i18n-27.0/hy-AM.xpi) = f5091d2ba8e3ebc5e4da3d36cb405a4eedeb819c414007cba578abfa9d288ef5 -SIZE (xpi/firefox-i18n-27.0/hy-AM.xpi) = 402981 -SHA256 (xpi/firefox-i18n-27.0/id.xpi) = 5f41c04044a5d114b7ace1c371387cc3a4e953447e50444489ef183ffa3634c3 -SIZE (xpi/firefox-i18n-27.0/id.xpi) = 339611 -SHA256 (xpi/firefox-i18n-27.0/is.xpi) = ea9b27c089a974b9e53e0f3bfd293fa82d1b1ac7cf7a85b6cb45b0a62879bf66 -SIZE (xpi/firefox-i18n-27.0/is.xpi) = 346530 -SHA256 (xpi/firefox-i18n-27.0/it.xpi) = 0b6f6969a28baea46a2a487b4b9e49c2b37d6c7369fd3212a7a13f75bc9de983 -SIZE (xpi/firefox-i18n-27.0/it.xpi) = 291091 -SHA256 (xpi/firefox-i18n-27.0/ja.xpi) = 2115c6be8ce609b0f7ceba049e71be3a159b2a59403c845e9902eb21e715680f -SIZE (xpi/firefox-i18n-27.0/ja.xpi) = 393700 -SHA256 (xpi/firefox-i18n-27.0/kk.xpi) = f5a5a755b583902a1ce4bcdfb1a7cc400fba29792de960de2276daa0b3f5daad -SIZE (xpi/firefox-i18n-27.0/kk.xpi) = 396373 -SHA256 (xpi/firefox-i18n-27.0/km.xpi) = 34d590c896aa241c290b3526beddbd0d0b12821b9268ab3cdc9ec62f0e0283cd -SIZE (xpi/firefox-i18n-27.0/km.xpi) = 418733 -SHA256 (xpi/firefox-i18n-27.0/kn.xpi) = 588b191197603a968805774bddef4616400323483ddcecd2311771c868748262 -SIZE (xpi/firefox-i18n-27.0/kn.xpi) = 408351 -SHA256 (xpi/firefox-i18n-27.0/ko.xpi) = 12d592bc4feb2c746c88802467091a42bfbfc42f4bf31c2799931755256da944 -SIZE (xpi/firefox-i18n-27.0/ko.xpi) = 363839 -SHA256 (xpi/firefox-i18n-27.0/ku.xpi) = 4196f8deb8dc1f59a643d6fc805be53ad332dd92019f57b889f64fc817e506a0 -SIZE (xpi/firefox-i18n-27.0/ku.xpi) = 370259 -SHA256 (xpi/firefox-i18n-27.0/lij.xpi) = 6782c0f7dbf78b70423cbe02a879678b76449905fe3d5827a1e3ccf8de365d25 -SIZE (xpi/firefox-i18n-27.0/lij.xpi) = 339916 -SHA256 (xpi/firefox-i18n-27.0/lt.xpi) = 1a8bd95e7c070fae8cdc9a551947b8488116062d1abdaf4d5eea7514fefb64c3 -SIZE (xpi/firefox-i18n-27.0/lt.xpi) = 369739 -SHA256 (xpi/firefox-i18n-27.0/lv.xpi) = 863368f5fbdd47684aef60259a0fecc8d7365bff04d19af0ad0006c91dd910e4 -SIZE (xpi/firefox-i18n-27.0/lv.xpi) = 343465 -SHA256 (xpi/firefox-i18n-27.0/mai.xpi) = 7a0dc5e4f6624f66aad5f24d564dc6feb62c98c0692dd00320b6653a23d393d2 -SIZE (xpi/firefox-i18n-27.0/mai.xpi) = 396632 -SHA256 (xpi/firefox-i18n-27.0/mk.xpi) = 17586344aee0891622fbe311cd318b2601f8a2c716232b15cec558081d736f65 -SIZE (xpi/firefox-i18n-27.0/mk.xpi) = 392645 -SHA256 (xpi/firefox-i18n-27.0/ml.xpi) = 03267ecbbe5d4d2937f611273b290fbd5befc0f1951576c0583dfe80a27d938e -SIZE (xpi/firefox-i18n-27.0/ml.xpi) = 417094 -SHA256 (xpi/firefox-i18n-27.0/mr.xpi) = 269d397462db41cea9f2146f3f5bc369ca5859a86d2a2700057b6a35b3d7b07b -SIZE (xpi/firefox-i18n-27.0/mr.xpi) = 397289 -SHA256 (xpi/firefox-i18n-27.0/nb-NO.xpi) = 4a5a5f25b84dd831759998420f4ff87da4e8a9665d071334ccc999bd146e6956 -SIZE (xpi/firefox-i18n-27.0/nb-NO.xpi) = 346640 -SHA256 (xpi/firefox-i18n-27.0/nl.xpi) = b9348795890072a29592cd1223c9e11433b897b8d9cc8d8222b14bda1216603a -SIZE (xpi/firefox-i18n-27.0/nl.xpi) = 348111 -SHA256 (xpi/firefox-i18n-27.0/nn-NO.xpi) = 3c96cb3a39ea645651e7b87ea029b55c6806507a0c4a590c29871e520c469947 -SIZE (xpi/firefox-i18n-27.0/nn-NO.xpi) = 344618 -SHA256 (xpi/firefox-i18n-27.0/or.xpi) = 03a87cc368a3da045c7b8192cf2c9820d98585066751ba67ea46719573e75b1d -SIZE (xpi/firefox-i18n-27.0/or.xpi) = 410073 -SHA256 (xpi/firefox-i18n-27.0/pa-IN.xpi) = 7f41cd12fb36fe94670c3a2825cfc9eb2af8205f773dcff6799498c330740fd5 -SIZE (xpi/firefox-i18n-27.0/pa-IN.xpi) = 385301 -SHA256 (xpi/firefox-i18n-27.0/pl.xpi) = 6b25815c860f0c29ca8c3b6e555d0f9c32544962b99e91c044c37cd125c120d2 -SIZE (xpi/firefox-i18n-27.0/pl.xpi) = 348871 -SHA256 (xpi/firefox-i18n-27.0/pt-BR.xpi) = a6ce16cc4b14d7d9b2795cee2e435812d77d1e47c797fe2410b523e9c8d9eae5 -SIZE (xpi/firefox-i18n-27.0/pt-BR.xpi) = 354076 -SHA256 (xpi/firefox-i18n-27.0/pt-PT.xpi) = f95755a7eb0b5d3ce6925ba1fe9e532d570b6a2d94ee56e9fe8eea4561027bd5 -SIZE (xpi/firefox-i18n-27.0/pt-PT.xpi) = 347957 -SHA256 (xpi/firefox-i18n-27.0/rm.xpi) = f3d2f7b0c69dff2f6a1e3dfef2bbc39340e1e48726637693a3c8ff0f988d1d97 -SIZE (xpi/firefox-i18n-27.0/rm.xpi) = 349335 -SHA256 (xpi/firefox-i18n-27.0/ro.xpi) = 95232d726600879b77f84f3752bf7797bd236db5d3e170a537bafc3fd7ee5e10 -SIZE (xpi/firefox-i18n-27.0/ro.xpi) = 378831 -SHA256 (xpi/firefox-i18n-27.0/ru.xpi) = 0159a06d3d61d977993111d021c49f5434cd0e202aa369724d20bcdebc4e5071 -SIZE (xpi/firefox-i18n-27.0/ru.xpi) = 336572 -SHA256 (xpi/firefox-i18n-27.0/si.xpi) = 9ab44209603a6b26f9e8b5be4d1457fed5a8a8745f9d8c48633e4bb9db82cd70 -SIZE (xpi/firefox-i18n-27.0/si.xpi) = 387683 -SHA256 (xpi/firefox-i18n-27.0/sk.xpi) = 8e10d88de5975f945032efd914d2c171b68e6ab682c6928cf649510062c35d15 -SIZE (xpi/firefox-i18n-27.0/sk.xpi) = 364725 -SHA256 (xpi/firefox-i18n-27.0/sl.xpi) = 169751b4b335372633d927051b012934316627e05c96340320a9bf3669cfae42 -SIZE (xpi/firefox-i18n-27.0/sl.xpi) = 347788 -SHA256 (xpi/firefox-i18n-27.0/son.xpi) = a3aff6dee8f69441a56744b2796276e9db5d439cdeda9b7dbfa3f58c021a55e4 -SIZE (xpi/firefox-i18n-27.0/son.xpi) = 344431 -SHA256 (xpi/firefox-i18n-27.0/sq.xpi) = 6e6b77e9c387ff8cb4dffeb1b5fa3bbd27b98f2533034421f8213b37976bbefb -SIZE (xpi/firefox-i18n-27.0/sq.xpi) = 357148 -SHA256 (xpi/firefox-i18n-27.0/sr.xpi) = f42f271f999673487ae27a35706a8b1e71acb116eaacbd974e4f3e6642ee9618 -SIZE (xpi/firefox-i18n-27.0/sr.xpi) = 399940 -SHA256 (xpi/firefox-i18n-27.0/sv-SE.xpi) = c55e673ad0db2bdcfbef5d9538a6e90e372f9770eca78a315efc016552c8a981 -SIZE (xpi/firefox-i18n-27.0/sv-SE.xpi) = 352870 -SHA256 (xpi/firefox-i18n-27.0/ta.xpi) = e2169f2aba94e69571cff72d7dbaeb56054786e3fe7eca6872121df58174970d -SIZE (xpi/firefox-i18n-27.0/ta.xpi) = 400412 -SHA256 (xpi/firefox-i18n-27.0/te.xpi) = ac1093be104ed057b8a8632fb7c89e0b4505ca1956e157de8d1cd949e0f24b4f -SIZE (xpi/firefox-i18n-27.0/te.xpi) = 417871 -SHA256 (xpi/firefox-i18n-27.0/th.xpi) = e6667e3a1f4b5768b016fdcb113249ee0507f2fdb12bd5d428bdfbd673456adc -SIZE (xpi/firefox-i18n-27.0/th.xpi) = 394991 -SHA256 (xpi/firefox-i18n-27.0/tr.xpi) = 6550afc209d1e369c345865dfd3e975026963895db64378bfbe7f50729e24a50 -SIZE (xpi/firefox-i18n-27.0/tr.xpi) = 356668 -SHA256 (xpi/firefox-i18n-27.0/uk.xpi) = ed15cfae9f5e1846b02cf64eed460c13c8c75c198f5281e406a803b8e5d20d01 -SIZE (xpi/firefox-i18n-27.0/uk.xpi) = 381434 -SHA256 (xpi/firefox-i18n-27.0/vi.xpi) = 7e86801cfab6807c6be256540845c222d312fd523b6c67cb038da177619547ff -SIZE (xpi/firefox-i18n-27.0/vi.xpi) = 375485 -SHA256 (xpi/firefox-i18n-27.0/zh-CN.xpi) = 33cbe52cb0a22218442db9ed78b2c8c00c0765ad54994725c4ffefb8ae9ccae1 -SIZE (xpi/firefox-i18n-27.0/zh-CN.xpi) = 374670 -SHA256 (xpi/firefox-i18n-27.0/zh-TW.xpi) = c96fc4f2b44477f6d1bd8fe3f1b391cca1e4e47ce59de3e4f07668b63428e4bc -SIZE (xpi/firefox-i18n-27.0/zh-TW.xpi) = 372318 -SHA256 (xpi/firefox-i18n-27.0/zu.xpi) = eca1b78b6749c850a7b28b9330a917b6e2562da607dfadcee1d7763becfc66a3 -SIZE (xpi/firefox-i18n-27.0/zu.xpi) = 357236 +SHA256 (xpi/firefox-i18n-28.0b1/ach.xpi) = 93c80f3798b36e8d8f517999dc343ba3b0d300a163563321c7c6ff6f71c23918 +SIZE (xpi/firefox-i18n-28.0b1/ach.xpi) = 363208 +SHA256 (xpi/firefox-i18n-28.0b1/af.xpi) = 4af17ac072bb2d5528155b6720d43933dcfa36c07ad84f5c4ea7db81ab81c270 +SIZE (xpi/firefox-i18n-28.0b1/af.xpi) = 357552 +SHA256 (xpi/firefox-i18n-28.0b1/ar.xpi) = 855cfd2260465c43fa0933927a4fa4b6771ee2c91811419c100622cfb7aa5591 +SIZE (xpi/firefox-i18n-28.0b1/ar.xpi) = 386806 +SHA256 (xpi/firefox-i18n-28.0b1/as.xpi) = 04314b20278b3d22c17e9d23c4e3405ae96223670fb4d2a6bec9b3b663981ae2 +SIZE (xpi/firefox-i18n-28.0b1/as.xpi) = 404377 +SHA256 (xpi/firefox-i18n-28.0b1/ast.xpi) = ac588bd08d8202482755614ee0f519930fb509e498a49d8a0d059c860d4f0abd +SIZE (xpi/firefox-i18n-28.0b1/ast.xpi) = 313719 +SHA256 (xpi/firefox-i18n-28.0b1/be.xpi) = 424c8a562b26f42316c2f5200b55b75fda3225cde86af7f2c8ec8c581fdb14d6 +SIZE (xpi/firefox-i18n-28.0b1/be.xpi) = 342306 +SHA256 (xpi/firefox-i18n-28.0b1/bg.xpi) = 53f1a555dc8ad69f26e96a8062703b0deca8adf49ce2efb61b8e4f9028901ccc +SIZE (xpi/firefox-i18n-28.0b1/bg.xpi) = 393205 +SHA256 (xpi/firefox-i18n-28.0b1/bn-BD.xpi) = 7fe24ec5aa82a0666e5bcf3afed90a6fb1352168299460cd03e5dae96d88225e +SIZE (xpi/firefox-i18n-28.0b1/bn-BD.xpi) = 418596 +SHA256 (xpi/firefox-i18n-28.0b1/bn-IN.xpi) = 2976e57eb72f88819ccac1a8c625fb544965562ae7d9ef9f31ba568029e09c95 +SIZE (xpi/firefox-i18n-28.0b1/bn-IN.xpi) = 411403 +SHA256 (xpi/firefox-i18n-28.0b1/br.xpi) = 98797921c1abc794293e46b4fa56ad6af96a3086af1478d8479f4fc8a7eb9ac9 +SIZE (xpi/firefox-i18n-28.0b1/br.xpi) = 354960 +SHA256 (xpi/firefox-i18n-28.0b1/bs.xpi) = 72905e5d14df775f5f5d4305181640e73cc64020709823db42d0abf0bc50d429 +SIZE (xpi/firefox-i18n-28.0b1/bs.xpi) = 363405 +SHA256 (xpi/firefox-i18n-28.0b1/ca.xpi) = fcb9547d51836f8533889fb53641bd12e658d4c7c253a0fc93d8e87ac0daf8f6 +SIZE (xpi/firefox-i18n-28.0b1/ca.xpi) = 361290 +SHA256 (xpi/firefox-i18n-28.0b1/cs.xpi) = faca51196dc11c6b8dcb62e8564391748258fc3b92236d249a8c9d06ddf12777 +SIZE (xpi/firefox-i18n-28.0b1/cs.xpi) = 357030 +SHA256 (xpi/firefox-i18n-28.0b1/csb.xpi) = 230350653d61c65b809c432aeceb0025707472c019dd8cd697d49f1b3fb6b708 +SIZE (xpi/firefox-i18n-28.0b1/csb.xpi) = 347623 +SHA256 (xpi/firefox-i18n-28.0b1/cy.xpi) = 3ef579c3863611b6d35411cc6cad8c03b0d6b8e4cba312068e0dc927d9b200e6 +SIZE (xpi/firefox-i18n-28.0b1/cy.xpi) = 355459 +SHA256 (xpi/firefox-i18n-28.0b1/da.xpi) = a177abf2e59a575c7f97978e8a65e288d81fb0d90b1bd14c567ca26cb8ce9b06 +SIZE (xpi/firefox-i18n-28.0b1/da.xpi) = 347233 +SHA256 (xpi/firefox-i18n-28.0b1/de.xpi) = 4a6b5e3b821fe9b93bea22a16157659a8b53a6490ffb2d5e217506a98ee0b20a +SIZE (xpi/firefox-i18n-28.0b1/de.xpi) = 349485 +SHA256 (xpi/firefox-i18n-28.0b1/el.xpi) = ad52fc0a33824838ddf99a63c8eed1fe5c2ad67ade75b6427401a10b1189916f +SIZE (xpi/firefox-i18n-28.0b1/el.xpi) = 386921 +SHA256 (xpi/firefox-i18n-28.0b1/en-GB.xpi) = 50326bd644ce1aab09add80e0f5591028d9aa68502c5fb57fb35e0b30bf4ca61 +SIZE (xpi/firefox-i18n-28.0b1/en-GB.xpi) = 341049 +SHA256 (xpi/firefox-i18n-28.0b1/en-US.xpi) = 2a6f5446e4fa0704284a08560547d26a4488942d940950c705046cf7d4116dd8 +SIZE (xpi/firefox-i18n-28.0b1/en-US.xpi) = 343398 +SHA256 (xpi/firefox-i18n-28.0b1/en-ZA.xpi) = 20603bd64338a0438c747020835c657a8eab3fcc2b3e030dd01184313505c75e +SIZE (xpi/firefox-i18n-28.0b1/en-ZA.xpi) = 335613 +SHA256 (xpi/firefox-i18n-28.0b1/eo.xpi) = a8bae12e18d0a3a37efd099e361fd041613f52998d1f4bb0ab3956429a392cd4 +SIZE (xpi/firefox-i18n-28.0b1/eo.xpi) = 359938 +SHA256 (xpi/firefox-i18n-28.0b1/es-AR.xpi) = 6ec80397ad737641600550ea99ef67bb6c7abe56c072384a254d1965bdb29004 +SIZE (xpi/firefox-i18n-28.0b1/es-AR.xpi) = 358076 +SHA256 (xpi/firefox-i18n-28.0b1/es-CL.xpi) = 1a539bc2dc908c2099974e14dce292ae107056dffb3641c9f852372e223e09ed +SIZE (xpi/firefox-i18n-28.0b1/es-CL.xpi) = 307249 +SHA256 (xpi/firefox-i18n-28.0b1/es-ES.xpi) = 21dc0e2b5d5403b1e7a053ff74336a24b686d7ac165d9f401e51e9c51a3d63ca +SIZE (xpi/firefox-i18n-28.0b1/es-ES.xpi) = 298795 +SHA256 (xpi/firefox-i18n-28.0b1/es-MX.xpi) = 211490635471a57cb7c92132ac8fa9edb1630f75367ea03387af2da02b4a36c3 +SIZE (xpi/firefox-i18n-28.0b1/es-MX.xpi) = 360106 +SHA256 (xpi/firefox-i18n-28.0b1/et.xpi) = 40cee6992628b168398969db3f3c1df92dec58436d83955b4b49f3beb5d45792 +SIZE (xpi/firefox-i18n-28.0b1/et.xpi) = 346988 +SHA256 (xpi/firefox-i18n-28.0b1/eu.xpi) = 4345c3c0986823594802e0f32ddd77c37ea2043cecefb0a573b6445192937cc9 +SIZE (xpi/firefox-i18n-28.0b1/eu.xpi) = 358942 +SHA256 (xpi/firefox-i18n-28.0b1/fa.xpi) = eccd8e408976a303782fcc66b7d07e653a2565f21bd51eea08d6cd0061adbbbe +SIZE (xpi/firefox-i18n-28.0b1/fa.xpi) = 399201 +SHA256 (xpi/firefox-i18n-28.0b1/ff.xpi) = 2bc07e559cc4f633da43a63f956d071155bef24729da9303d523be33e5aaabfc +SIZE (xpi/firefox-i18n-28.0b1/ff.xpi) = 351536 +SHA256 (xpi/firefox-i18n-28.0b1/fi.xpi) = 867c8c09377e2ef3892677199882502b5fb6557e16a3c65c5490610601733fa0 +SIZE (xpi/firefox-i18n-28.0b1/fi.xpi) = 351057 +SHA256 (xpi/firefox-i18n-28.0b1/fr.xpi) = 81ad0a5fd446a426271f77d90d3f451b973c36f56a4af69224782be2da4b88cb +SIZE (xpi/firefox-i18n-28.0b1/fr.xpi) = 364194 +SHA256 (xpi/firefox-i18n-28.0b1/fy-NL.xpi) = 51d2b4cecd98c95ddd5662ede808f4792befb083c5f269f6c088cef7d82ce85c +SIZE (xpi/firefox-i18n-28.0b1/fy-NL.xpi) = 360369 +SHA256 (xpi/firefox-i18n-28.0b1/ga-IE.xpi) = 89bdb15b87bec17388d8f0d49cf16057bcd8ced6dd23ce6c7fab310d6608e788 +SIZE (xpi/firefox-i18n-28.0b1/ga-IE.xpi) = 364856 +SHA256 (xpi/firefox-i18n-28.0b1/gd.xpi) = 4f97f6ed63ae7c6dfb2ea874126c7e3d8ab7cb033da7db5f0005c1ddd873b1f0 +SIZE (xpi/firefox-i18n-28.0b1/gd.xpi) = 361326 +SHA256 (xpi/firefox-i18n-28.0b1/gl.xpi) = ab0deb7ac338cf2bfafa8bf0dc30c6b3f5fa2226f9d1755d6ddee0faceb3442d +SIZE (xpi/firefox-i18n-28.0b1/gl.xpi) = 356139 +SHA256 (xpi/firefox-i18n-28.0b1/gu-IN.xpi) = a6eb80ae19aadbf1874f0c8b6a513de889d15951a8f4f7d43b28dcb5e5ddb4b2 +SIZE (xpi/firefox-i18n-28.0b1/gu-IN.xpi) = 381328 +SHA256 (xpi/firefox-i18n-28.0b1/he.xpi) = 7284013fab9738e0b12de09c4fa70c56802f1056996bce35ffa033362fa8fbfb +SIZE (xpi/firefox-i18n-28.0b1/he.xpi) = 377881 +SHA256 (xpi/firefox-i18n-28.0b1/hi-IN.xpi) = 150dc70e57cbaf65b5c441ecebdc1c181fee5bb446a0899d519103e8fe78e2c0 +SIZE (xpi/firefox-i18n-28.0b1/hi-IN.xpi) = 399892 +SHA256 (xpi/firefox-i18n-28.0b1/hr.xpi) = 928ee812ae16b5836fe28bffbd6d7c1f228b6c10b8ee1af2e3866956e324de33 +SIZE (xpi/firefox-i18n-28.0b1/hr.xpi) = 366577 +SHA256 (xpi/firefox-i18n-28.0b1/hu.xpi) = 6f596d86f0730326f3cca34bdd6b0b2aaed16c85d392a214a766ad2ec822a1d7 +SIZE (xpi/firefox-i18n-28.0b1/hu.xpi) = 365626 +SHA256 (xpi/firefox-i18n-28.0b1/hy-AM.xpi) = 066ca6879ae5b5a26b01abf713c693d223b4e056fce747a7d376dfa1e517db8f +SIZE (xpi/firefox-i18n-28.0b1/hy-AM.xpi) = 411721 +SHA256 (xpi/firefox-i18n-28.0b1/id.xpi) = 0e8128e00cff6bd086bc639c0605fd21522ee2bf24933daaf0ee6d8c6b8b842c +SIZE (xpi/firefox-i18n-28.0b1/id.xpi) = 343341 +SHA256 (xpi/firefox-i18n-28.0b1/is.xpi) = 3255f6114f62849852bfd9750a86dd22dfec2f02472367e25166807e60222afc +SIZE (xpi/firefox-i18n-28.0b1/is.xpi) = 355470 +SHA256 (xpi/firefox-i18n-28.0b1/it.xpi) = 09da83593e345eabe17f46b6b38a451a31d389f5471897322111339d1ba6c094 +SIZE (xpi/firefox-i18n-28.0b1/it.xpi) = 296427 +SHA256 (xpi/firefox-i18n-28.0b1/ja.xpi) = d866815a9f881bf27179cf8602b43aa4c314e0840e6f884ddd943da7922fec8d +SIZE (xpi/firefox-i18n-28.0b1/ja.xpi) = 397376 +SHA256 (xpi/firefox-i18n-28.0b1/kk.xpi) = bda4a4f1806965db0fb3dd61f93dc8678c439eb0626488e294de9511071fe86a +SIZE (xpi/firefox-i18n-28.0b1/kk.xpi) = 399986 +SHA256 (xpi/firefox-i18n-28.0b1/km.xpi) = 2653cb94209d02f885017f6a09e3d64efe857e650efe7d1519516743b3a3717c +SIZE (xpi/firefox-i18n-28.0b1/km.xpi) = 427478 +SHA256 (xpi/firefox-i18n-28.0b1/kn.xpi) = 61542ae1a6ff39c70287cd01b094a216bdfac292d2f9a8ddae5b14c72d4a080a +SIZE (xpi/firefox-i18n-28.0b1/kn.xpi) = 411751 +SHA256 (xpi/firefox-i18n-28.0b1/ko.xpi) = 99cb5dc9220489ced0ce4dd0bbbcf929bcfa6fad999756928d4bd1fd47255122 +SIZE (xpi/firefox-i18n-28.0b1/ko.xpi) = 367541 +SHA256 (xpi/firefox-i18n-28.0b1/ku.xpi) = 7cc04daa5621c26bd15e382bea4f401c1dcdef153bd1a29ceddb1b931581b8d3 +SIZE (xpi/firefox-i18n-28.0b1/ku.xpi) = 378841 +SHA256 (xpi/firefox-i18n-28.0b1/lij.xpi) = 9cba557c7b3cc79ecefc565e618ed12b39b0dc6b031a9a94f45e656d3952a3ae +SIZE (xpi/firefox-i18n-28.0b1/lij.xpi) = 344099 +SHA256 (xpi/firefox-i18n-28.0b1/lt.xpi) = 6234c69a97fa7885bc178be6e33bc055f5f5390b67a4a1ac03b8c22132f94833 +SIZE (xpi/firefox-i18n-28.0b1/lt.xpi) = 373444 +SHA256 (xpi/firefox-i18n-28.0b1/lv.xpi) = dfc1f7e0d95581330a035069e8eb553c7eef7a2d1c44284987efef3c1f7a5a8c +SIZE (xpi/firefox-i18n-28.0b1/lv.xpi) = 352617 +SHA256 (xpi/firefox-i18n-28.0b1/mai.xpi) = 4cbd8f2ea0f16b0fcb2f3b736794546fe4dfec270c9f828ca6d5b7bb754475ff +SIZE (xpi/firefox-i18n-28.0b1/mai.xpi) = 399987 +SHA256 (xpi/firefox-i18n-28.0b1/mk.xpi) = d68c8113829a21e6fd10dc4c5ae3589d6b95b65232d3ef6704184161a2937214 +SIZE (xpi/firefox-i18n-28.0b1/mk.xpi) = 400747 +SHA256 (xpi/firefox-i18n-28.0b1/ml.xpi) = 74241f0be4ddd1487b61bba855aaf483a6ca0d4958dd4cd6cf2db998006743b5 +SIZE (xpi/firefox-i18n-28.0b1/ml.xpi) = 420453 +SHA256 (xpi/firefox-i18n-28.0b1/mr.xpi) = 77f59d1fc1b2bcb5ef280907ded6ce7475c60666a90ebcd9073934c0dc951203 +SIZE (xpi/firefox-i18n-28.0b1/mr.xpi) = 400782 +SHA256 (xpi/firefox-i18n-28.0b1/nb-NO.xpi) = dcd85fd108985763a978387fa4a71dd2458ab61f25e989d58920384a9733fc14 +SIZE (xpi/firefox-i18n-28.0b1/nb-NO.xpi) = 350402 +SHA256 (xpi/firefox-i18n-28.0b1/nl.xpi) = fa634a33dcb29c74db5f41f4fbae466f1ce966fe6ccf1d8f20be9edaca0b2bdc +SIZE (xpi/firefox-i18n-28.0b1/nl.xpi) = 351822 +SHA256 (xpi/firefox-i18n-28.0b1/nn-NO.xpi) = b98415fa1f1257e8bd22a3f9dea50b71ea19e1ba06cffd5cfefb553eafaf7455 +SIZE (xpi/firefox-i18n-28.0b1/nn-NO.xpi) = 348405 +SHA256 (xpi/firefox-i18n-28.0b1/or.xpi) = 31e3ecb7cf09177ce23411a01e45f7b3001b388de984c7fed323b9ee5be4e1dd +SIZE (xpi/firefox-i18n-28.0b1/or.xpi) = 413667 +SHA256 (xpi/firefox-i18n-28.0b1/pa-IN.xpi) = b35b71c5dc395ed588bc293febf5af574c25a899d944f4476117119ab9d569ce +SIZE (xpi/firefox-i18n-28.0b1/pa-IN.xpi) = 389012 +SHA256 (xpi/firefox-i18n-28.0b1/pl.xpi) = d814d9976bb8cf7238b1b082e80f5968cbbefcb293fbd2abb62e7fa34a88f7d3 +SIZE (xpi/firefox-i18n-28.0b1/pl.xpi) = 352835 +SHA256 (xpi/firefox-i18n-28.0b1/pt-BR.xpi) = f6f6ee858e480e33b1a09451a0ee3032d4fe6fbaf49f1079010db587351c54f8 +SIZE (xpi/firefox-i18n-28.0b1/pt-BR.xpi) = 357836 +SHA256 (xpi/firefox-i18n-28.0b1/pt-PT.xpi) = 1e56d8d2d312a0ad7b04d06a6dad410827e91dcd2f704d69a34361034ed18d8b +SIZE (xpi/firefox-i18n-28.0b1/pt-PT.xpi) = 351716 +SHA256 (xpi/firefox-i18n-28.0b1/rm.xpi) = f9d2bfe44193d6fa3eba54f60a194d8c9198f8d8e1e3794a68e1bcbfb15179f5 +SIZE (xpi/firefox-i18n-28.0b1/rm.xpi) = 352772 +SHA256 (xpi/firefox-i18n-28.0b1/ro.xpi) = cf02883f97a79ddbbaf4ab404bc60a7be6932cf06073399ea95d89f086818214 +SIZE (xpi/firefox-i18n-28.0b1/ro.xpi) = 387416 +SHA256 (xpi/firefox-i18n-28.0b1/ru.xpi) = 6a42b2c7a84566b3dd0aaa6d00257097b4cef88ff33790792379dc1e56e14b1d +SIZE (xpi/firefox-i18n-28.0b1/ru.xpi) = 341890 +SHA256 (xpi/firefox-i18n-28.0b1/si.xpi) = daaec69d5d2abf99ba0803019f21a10491fbbc3e09d68c5b8c53c605e7633f2e +SIZE (xpi/firefox-i18n-28.0b1/si.xpi) = 395719 +SHA256 (xpi/firefox-i18n-28.0b1/sk.xpi) = a670edd0aed66ebdc3e246d9a16e442667c8bc324ff4e80e8e6f4c6c7c2e870f +SIZE (xpi/firefox-i18n-28.0b1/sk.xpi) = 368400 +SHA256 (xpi/firefox-i18n-28.0b1/sl.xpi) = beecdba75d1121c149711b8c092493e49c2d48022284fa8c1da1af5befb8e530 +SIZE (xpi/firefox-i18n-28.0b1/sl.xpi) = 351537 +SHA256 (xpi/firefox-i18n-28.0b1/son.xpi) = 6d16c5707c0733afe34d55d466e765e1510cd4d0b65a02c4690c06e7abd7647d +SIZE (xpi/firefox-i18n-28.0b1/son.xpi) = 348056 +SHA256 (xpi/firefox-i18n-28.0b1/sq.xpi) = 72417dc591358dd8b68ed3bb22ba021a5872c0dc44418ee3a07b5d1e6bfadcb3 +SIZE (xpi/firefox-i18n-28.0b1/sq.xpi) = 365886 +SHA256 (xpi/firefox-i18n-28.0b1/sr.xpi) = 6ea789ad58ab5d8d74634ed131bc457fe47afbb78e8cb55a73f06aa246c83e57 +SIZE (xpi/firefox-i18n-28.0b1/sr.xpi) = 402632 +SHA256 (xpi/firefox-i18n-28.0b1/sv-SE.xpi) = 36d4cdbf968ac6970dbbc69611b09ab518c352756af454810d550cd95aec1c89 +SIZE (xpi/firefox-i18n-28.0b1/sv-SE.xpi) = 356614 +SHA256 (xpi/firefox-i18n-28.0b1/ta.xpi) = e87da7370125407ad8b4136a64a2bfb0fb5772e658947947e5994825d439e7ce +SIZE (xpi/firefox-i18n-28.0b1/ta.xpi) = 403991 +SHA256 (xpi/firefox-i18n-28.0b1/te.xpi) = d729f4355ed5a012c42e6674e185757c38273337472ef627a80cbd6e4511896a +SIZE (xpi/firefox-i18n-28.0b1/te.xpi) = 421516 +SHA256 (xpi/firefox-i18n-28.0b1/th.xpi) = 20e296ec1cda71e9e7e2c58ad589b51364cb389bcb5d4d0b2f6767522a4a6d49 +SIZE (xpi/firefox-i18n-28.0b1/th.xpi) = 403633 +SHA256 (xpi/firefox-i18n-28.0b1/tr.xpi) = e02a1c28e3c0b76e5b4e86b20d32c229541d4db84ddfa9071ffb3ae6689f9f4b +SIZE (xpi/firefox-i18n-28.0b1/tr.xpi) = 360319 +SHA256 (xpi/firefox-i18n-28.0b1/uk.xpi) = 0628f5b26c43124815b8e800c115d6e381f3c2602c651a4244f981f4ddcd29ae +SIZE (xpi/firefox-i18n-28.0b1/uk.xpi) = 385138 +SHA256 (xpi/firefox-i18n-28.0b1/vi.xpi) = 82ed6baa71355ff4757f9626bcb02574c68a0dc99647cc969ec823d85bbc6597 +SIZE (xpi/firefox-i18n-28.0b1/vi.xpi) = 378860 +SHA256 (xpi/firefox-i18n-28.0b1/zh-CN.xpi) = 16ce6449da9c580365fe50b59bd8568ce535ceac510bcd0cf7d597e6deb1b5f0 +SIZE (xpi/firefox-i18n-28.0b1/zh-CN.xpi) = 378432 +SHA256 (xpi/firefox-i18n-28.0b1/zh-TW.xpi) = 2bcf0feb2ed7a0c04919ecbd40d900f4a7bb3026c7dac7a7e70a314fd4df7051 +SIZE (xpi/firefox-i18n-28.0b1/zh-TW.xpi) = 376074 +SHA256 (xpi/firefox-i18n-28.0b1/zu.xpi) = 3c213ca47a2d2ae62106f6bdb1e88c2b2ba713d10be11c490cd568d4cd24f58b +SIZE (xpi/firefox-i18n-28.0b1/zu.xpi) = 365911 Modified: trunk/www/firefox-nightly/Makefile ============================================================================== --- trunk/www/firefox-nightly/Makefile Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/firefox-nightly/Makefile Wed Feb 5 09:55:30 2014 (r1478) @@ -2,7 +2,7 @@ # $FreeBSD$ PORTNAME= firefox -PORTVERSION= 29.0.${HGREV:C/:.*//} +PORTVERSION= 30.0.${HGREV:C/:.*//} PORTEPOCH= 1 CATEGORIES= www ipv6 MASTER_SITES= https://hg.mozilla.org/integration/mozilla-inbound/archive/ Modified: trunk/www/firefox-nightly/Makefile.hgrev ============================================================================== --- trunk/www/firefox-nightly/Makefile.hgrev Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/firefox-nightly/Makefile.hgrev Wed Feb 5 09:55:30 2014 (r1478) @@ -1 +1 @@ -HGREV= 166152:2a7a697f2d88 +HGREV= 166874:a497dfd65f25 Modified: trunk/www/firefox-nightly/distinfo ============================================================================== --- trunk/www/firefox-nightly/distinfo Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/firefox-nightly/distinfo Wed Feb 5 09:55:30 2014 (r1478) @@ -1,2 +1,2 @@ -SHA256 (firefox-nightly/2a7a697f2d88.tar.bz2) = 989d23356a16983564b20daf8f063e7d626fc75e7db3d6be9509e9190fb2f7fc -SIZE (firefox-nightly/2a7a697f2d88.tar.bz2) = 139589506 +SHA256 (firefox-nightly/a497dfd65f25.tar.bz2) = 02aa9fdccee57e647045d6aac07fadbb3ef1cd8330458094b3056b89cec0ccae +SIZE (firefox-nightly/a497dfd65f25.tar.bz2) = 140146557 Modified: trunk/www/firefox/Makefile ============================================================================== --- trunk/www/firefox/Makefile Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/firefox/Makefile Wed Feb 5 09:55:30 2014 (r1478) @@ -2,7 +2,7 @@ # $FreeBSD: head/www/firefox/Makefile 339634 2014-01-13 21:00:02Z rene $ PORTNAME= firefox -DISTVERSION= 27.0 +DISTVERSION= 28.0b1 PORTEPOCH= 1 CATEGORIES= www ipv6 MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \ @@ -12,9 +12,10 @@ MAINTAINER= gecko@FreeBSD.org COMMENT= Web browser based on the browser portion of Mozilla -BUILD_DEPENDS= nspr>=4.10.2:${PORTSDIR}/devel/nspr \ +BUILD_DEPENDS= nspr>=4.10.3:${PORTSDIR}/devel/nspr \ nss>=3.15.4:${PORTSDIR}/security/nss \ - sqlite3>=3.8.0.2:${PORTSDIR}/databases/sqlite3 \ + libvpx>=1.3.0:${PORTSDIR}/multimedia/libvpx \ + sqlite3>=3.8.1:${PORTSDIR}/databases/sqlite3 \ ${PYTHON_PKGNAMEPREFIX}sqlite3>0:${PORTSDIR}/databases/py-sqlite3 \ v4l_compat>0:${PORTSDIR}/multimedia/v4l_compat \ unzip:${PORTSDIR}/archivers/unzip @@ -51,7 +52,7 @@ .include "${.CURDIR}/../../www/firefox/Makefile.options" .include -WRKSRC:= ${WRKDIR}/mozilla-release +WRKSRC:= ${WRKDIR}/mozilla-beta .if ${ARCH} == i386 && ${OSVERSION} < 1000000 USE_GCC?= yes Modified: trunk/www/firefox/distinfo ============================================================================== --- trunk/www/firefox/distinfo Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/firefox/distinfo Wed Feb 5 09:55:30 2014 (r1478) @@ -1,2 +1,2 @@ -SHA256 (firefox-27.0.source.tar.bz2) = 703be57d85a90fe28636ed7f3d3ae907cec1dd33e847c1d0faf1d6312d66f1a4 -SIZE (firefox-27.0.source.tar.bz2) = 129222806 +SHA256 (firefox-28.0b1.source.tar.bz2) = e791f62fe99375a0a6087c2390979d85ca9f7b0ab11d83ce31525f522c1ee9d3 +SIZE (firefox-28.0b1.source.tar.bz2) = 134830833 Added: trunk/www/firefox/files/patch-bug806917 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/www/firefox/files/patch-bug806917 Wed Feb 5 09:55:30 2014 (r1478) @@ -0,0 +1,1972 @@ +commit cb40a26 +Author: Alessandro Decina +Date: Fri Jan 03 08:16:54 2014 -0800 + + Bug 806917 - support GStreamer 1.0 +--- + configure.in | 64 ++- + content/media/gstreamer/GStreamerAllocator.cpp | 194 +++++++ + content/media/gstreamer/GStreamerAllocator.h | 25 + + content/media/gstreamer/GStreamerFormatHelper.cpp | 13 +- + content/media/gstreamer/GStreamerFunctionList.h | 93 +++- + content/media/gstreamer/GStreamerLoader.cpp | 48 +- + content/media/gstreamer/GStreamerLoader.h | 8 + + content/media/gstreamer/GStreamerReader-0.10.cpp | 198 +++++++ + content/media/gstreamer/GStreamerReader.cpp | 618 ++++++++++++++-------- + content/media/gstreamer/GStreamerReader.h | 42 +- + content/media/gstreamer/moz.build | 11 +- + content/media/test/manifest.js | 6 +- + 12 files changed, 1046 insertions(+), 274 deletions(-) + +diff --git configure.in configure.in +index 9776b8d..0b1698d 100644 +--- configure.in ++++ configure.in +@@ -3982,6 +3982,7 @@ MOZ_SAMPLE_TYPE_FLOAT32= + MOZ_SAMPLE_TYPE_S16= + MOZ_OPUS=1 + MOZ_WEBM=1 ++MOZ_GSTREAMER= + MOZ_DIRECTSHOW= + MOZ_WMF= + MOZ_FMP4= +@@ -5606,43 +5607,58 @@ dnl = Enable GStreamer + dnl ======================================================== + if test "$OS_TARGET" = "Linux"; then + MOZ_GSTREAMER=1 ++ GST_API_VERSION=0.10 + fi + +-MOZ_ARG_ENABLE_BOOL(gstreamer, +-[ --enable-gstreamer Enable GStreamer support], +-MOZ_GSTREAMER=1, +-MOZ_GSTREAMER=) +- +-if test "$MOZ_GSTREAMER"; then +- # API version, eg 0.10, 1.0 etc ++MOZ_ARG_ENABLE_STRING(gstreamer, ++[ --enable-gstreamer[=0.10] Enable GStreamer support], ++[ MOZ_GSTREAMER=1 ++ # API version, eg 0.10, 1.0 etc ++ if test -z "$enableval" -o "$enableval" = "yes"; then + GST_API_VERSION=0.10 ++ else ++ GST_API_VERSION=$enableval ++ fi], ++) ++ ++if test -n "$MOZ_GSTREAMER"; then + # core/base release number +- GST_VERSION=0.10.25 ++ if test "$GST_API_VERSION" = "1.0"; then ++ GST_VERSION=1.0 ++ else ++ GST_VERSION=0.10.25 ++ fi ++ + PKG_CHECK_MODULES(GSTREAMER, + gstreamer-$GST_API_VERSION >= $GST_VERSION + gstreamer-app-$GST_API_VERSION +- gstreamer-plugins-base-$GST_API_VERSION, , +- AC_MSG_ERROR([gstreamer and gstreamer-plugins-base development packages are needed to build gstreamer backend. Install them or disable gstreamer support with --disable-gstreamer])) +- if test -n "$GSTREAMER_LIBS"; then +- _SAVE_LDFLAGS=$LDFLAGS +- LDFLAGS="$LDFLAGS $GSTREAMER_LIBS -lgstvideo-$GST_API_VERSION" +- AC_TRY_LINK(,[return 0;],_HAVE_LIBGSTVIDEO=1,_HAVE_LIBGSTVIDEO=) +- if test -n "$_HAVE_LIBGSTVIDEO" ; then +- GSTREAMER_LIBS="$GSTREAMER_LIBS -lgstvideo-$GST_API_VERSION" +- else +- AC_MSG_ERROR([gstreamer-plugins-base found, but no libgstvideo. Something has gone terribly wrong. Try reinstalling gstreamer-plugins-base; failing that, disable the gstreamer backend with --disable-gstreamer.]) +- fi +- LDFLAGS=$_SAVE_LDFLAGS ++ gstreamer-plugins-base-$GST_API_VERSION, ++ [_HAVE_GSTREAMER=1], ++ [_HAVE_GSTREAMER=]) ++ if test -z "$_HAVE_GSTREAMER"; then ++ AC_MSG_ERROR([gstreamer and gstreamer-plugins-base development packages are needed to build gstreamer backend. Install them or disable gstreamer support with --disable-gstreamer]) ++ fi ++ ++ _SAVE_LDFLAGS=$LDFLAGS ++ LDFLAGS="$LDFLAGS $GSTREAMER_LIBS -lgstvideo-$GST_API_VERSION" ++ AC_TRY_LINK(,[return 0;],_HAVE_LIBGSTVIDEO=1,_HAVE_LIBGSTVIDEO=) ++ if test -n "$_HAVE_LIBGSTVIDEO" ; then ++ GSTREAMER_LIBS="$GSTREAMER_LIBS -lgstvideo-$GST_API_VERSION" + else +- AC_MSG_ERROR([gstreamer and gstreamer-plugins-base development packages are needed to build gstreamer backend. Install them or disable gstreamer support with --disable-gstreamer]) ++ AC_MSG_ERROR([gstreamer-plugins-base found, but no libgstvideo. Something has gone terribly wrong. Try reinstalling gstreamer-plugins-base; failing that, disable the gstreamer backend with --disable-gstreamer.]) + fi ++ LDFLAGS=$_SAVE_LDFLAGS ++ ++ AC_SUBST(GSTREAMER_CFLAGS) ++ AC_SUBST(GSTREAMER_LIBS) + fi +-AC_SUBST(GSTREAMER_CFLAGS) +-AC_SUBST(GSTREAMER_LIBS) ++ + AC_SUBST(MOZ_GSTREAMER) ++AC_SUBST(GST_API_VERSION) + + if test -n "$MOZ_GSTREAMER"; then +- AC_DEFINE(MOZ_GSTREAMER) ++ AC_DEFINE(MOZ_GSTREAMER) ++ AC_DEFINE_UNQUOTED(GST_API_VERSION, "$GST_API_VERSION") + fi + + +diff --git content/media/gstreamer/GStreamerAllocator.cpp content/media/gstreamer/GStreamerAllocator.cpp +new file mode 100644 +index 0000000..69d0385 +--- /dev/null ++++ content/media/gstreamer/GStreamerAllocator.cpp +@@ -0,0 +1,194 @@ ++#ifdef HAVE_CONFIG_H ++#include "config.h" ++#endif ++ ++#include "GStreamerAllocator.h" ++ ++#include ++#include ++ ++#include "GStreamerLoader.h" ++ ++using namespace mozilla::layers; ++ ++namespace mozilla { ++ ++typedef struct ++{ ++ GstAllocator parent; ++ GStreamerReader *reader; ++} MozGfxMemoryAllocator; ++ ++typedef struct ++{ ++ GstAllocatorClass parent; ++} MozGfxMemoryAllocatorClass; ++ ++typedef struct ++{ ++ GstMemory memory; ++ PlanarYCbCrImage* image; ++ guint8* data; ++} MozGfxMemory; ++ ++typedef struct ++{ ++ GstMeta meta; ++} MozGfxMeta; ++ ++typedef struct ++{ ++ GstVideoBufferPoolClass parent_class; ++} MozGfxBufferPoolClass; ++ ++typedef struct ++{ ++ GstVideoBufferPool pool; ++} MozGfxBufferPool; ++ ++G_DEFINE_TYPE(MozGfxMemoryAllocator, moz_gfx_memory_allocator, GST_TYPE_ALLOCATOR); ++G_DEFINE_TYPE(MozGfxBufferPool, moz_gfx_buffer_pool, GST_TYPE_VIDEO_BUFFER_POOL); ++ ++void ++moz_gfx_memory_reset(MozGfxMemory *mem) ++{ ++ if (mem->image) ++ mem->image->Release(); ++ ++ ImageContainer* container = ((MozGfxMemoryAllocator*) mem->memory.allocator)->reader->GetImageContainer(); ++ ImageFormat format = PLANAR_YCBCR; ++ mem->image = reinterpret_cast(container->CreateImage(&format, 1).get()); ++ mem->data = mem->image->AllocateAndGetNewBuffer(mem->memory.size); ++} ++ ++static GstMemory* ++moz_gfx_memory_allocator_alloc(GstAllocator* aAllocator, gsize aSize, ++ GstAllocationParams* aParams) ++{ ++ MozGfxMemory* mem = g_slice_new (MozGfxMemory); ++ gsize maxsize = aSize + aParams->prefix + aParams->padding; ++ gst_memory_init (GST_MEMORY_CAST (mem), ++ (GstMemoryFlags)aParams->flags, ++ aAllocator, NULL, maxsize, aParams->align, ++ aParams->prefix, aSize); ++ mem->image = NULL; ++ moz_gfx_memory_reset(mem); ++ ++ return (GstMemory *) mem; ++} ++ ++static void ++moz_gfx_memory_allocator_free (GstAllocator * allocator, GstMemory * gmem) ++{ ++ MozGfxMemory *mem = (MozGfxMemory *) gmem; ++ ++ if (mem->memory.parent) ++ goto sub_mem; ++ ++ if (mem->image) ++ mem->image->Release(); ++ ++sub_mem: ++ g_slice_free (MozGfxMemory, mem); ++} ++ ++static gpointer ++moz_gfx_memory_map (MozGfxMemory * mem, gsize maxsize, GstMapFlags flags) ++{ ++ return mem->data + mem->memory.offset; ++} ++ ++static gboolean ++moz_gfx_memory_unmap (MozGfxMemory * mem) ++{ ++ return TRUE; ++} ++ ++static MozGfxMemory * ++moz_gfx_memory_share (MozGfxMemory * mem, gssize offset, gsize size) ++{ ++ MozGfxMemory *sub; ++ GstMemory *parent; ++ ++ /* find the real parent */ ++ if ((parent = mem->memory.parent) == NULL) ++ parent = (GstMemory *) mem; ++ ++ if (size == (gsize) -1) ++ size = mem->memory.size - offset; ++ ++ /* the shared memory is always readonly */ ++ sub = g_slice_new (MozGfxMemory); ++ ++ gst_memory_init (GST_MEMORY_CAST (sub), ++ (GstMemoryFlags) (GST_MINI_OBJECT_FLAGS (parent) | GST_MINI_OBJECT_FLAG_LOCK_READONLY), ++ mem->memory.allocator, &mem->memory, mem->memory.maxsize, mem->memory.align, ++ mem->memory.offset + offset, size); ++ ++ sub->image = mem->image; ++ sub->data = mem->data; ++ ++ return sub; ++} ++ ++static void ++moz_gfx_memory_allocator_class_init (MozGfxMemoryAllocatorClass * klass) ++{ ++ GstAllocatorClass *allocator_class; ++ ++ allocator_class = (GstAllocatorClass *) klass; ++ ++ allocator_class->alloc = moz_gfx_memory_allocator_alloc; ++ allocator_class->free = moz_gfx_memory_allocator_free; ++} ++ ++static void ++moz_gfx_memory_allocator_init (MozGfxMemoryAllocator * allocator) ++{ ++ GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator); ++ ++ alloc->mem_type = "moz-gfx-image"; ++ alloc->mem_map = (GstMemoryMapFunction) moz_gfx_memory_map; ++ alloc->mem_unmap = (GstMemoryUnmapFunction) moz_gfx_memory_unmap; ++ alloc->mem_share = (GstMemoryShareFunction) moz_gfx_memory_share; ++ /* fallback copy and is_span */ ++} ++ ++void ++moz_gfx_memory_allocator_set_reader(GstAllocator *aAllocator, GStreamerReader* aReader) ++{ ++ MozGfxMemoryAllocator *allocator = (MozGfxMemoryAllocator *) aAllocator; ++ allocator->reader = aReader; ++} ++ ++nsRefPtr ++moz_gfx_memory_get_image(GstMemory *aMemory) ++{ ++ NS_ASSERTION(GST_IS_MOZ_GFX_MEMORY_ALLOCATOR(aMemory->allocator), "Should be a gfx image"); ++ ++ return ((MozGfxMemory *) aMemory)->image; ++} ++ ++void ++moz_gfx_buffer_pool_reset_buffer (GstBufferPool* aPool, GstBuffer* aBuffer) ++{ ++ GstMemory* mem = gst_buffer_peek_memory(aBuffer, 0); ++ ++ NS_ASSERTION(GST_IS_MOZ_GFX_MEMORY_ALLOCATOR(mem->allocator), "Should be a gfx image"); ++ moz_gfx_memory_reset((MozGfxMemory *) mem); ++ GST_BUFFER_POOL_CLASS(moz_gfx_buffer_pool_parent_class)->reset_buffer(aPool, aBuffer); ++} ++ ++static void ++moz_gfx_buffer_pool_class_init (MozGfxBufferPoolClass * klass) ++{ ++ GstBufferPoolClass *pool_class = (GstBufferPoolClass *) klass; ++ pool_class->reset_buffer = moz_gfx_buffer_pool_reset_buffer; ++} ++ ++static void ++moz_gfx_buffer_pool_init (MozGfxBufferPool * pool) ++{ ++} ++ ++} // namespace mozilla +diff --git content/media/gstreamer/GStreamerAllocator.h content/media/gstreamer/GStreamerAllocator.h +new file mode 100644 +index 0000000..05a4412 +--- /dev/null ++++ content/media/gstreamer/GStreamerAllocator.h +@@ -0,0 +1,25 @@ ++/* This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this file, ++ * You can obtain one at http://mozilla.org/MPL/2.0/. */ ++ ++#if !defined(GStreamerAllocator_h_) ++#define GStreamerAllocator_h_ ++ ++#include "GStreamerReader.h" ++ ++#define GST_TYPE_MOZ_GFX_MEMORY_ALLOCATOR (moz_gfx_memory_allocator_get_type()) ++#define GST_IS_MOZ_GFX_MEMORY_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MOZ_GFX_MEMORY_ALLOCATOR)) ++#define GST_TYPE_MOZ_GFX_BUFFER_POOL (moz_gfx_buffer_pool_get_type()) ++#define GST_IS_MOZ_GFX_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MOZ_GFX_BUFFER_POOL)) ++ ++namespace mozilla { ++ ++GType moz_gfx_memory_allocator_get_type(); ++void moz_gfx_memory_allocator_set_reader(GstAllocator *aAllocator, GStreamerReader* aReader); ++nsRefPtr moz_gfx_memory_get_image(GstMemory *aMemory); ++ ++GType moz_gfx_buffer_pool_get_type(); ++ ++} // namespace mozilla ++ ++#endif +diff --git content/media/gstreamer/GStreamerFormatHelper.cpp content/media/gstreamer/GStreamerFormatHelper.cpp +index be71331..a5e5db8 100644 +--- content/media/gstreamer/GStreamerFormatHelper.cpp ++++ content/media/gstreamer/GStreamerFormatHelper.cpp +@@ -294,12 +294,23 @@ bool GStreamerFormatHelper::CanHandleCodecCaps(GstCaps* aCaps) + GList* GStreamerFormatHelper::GetFactories() { + NS_ASSERTION(sLoadOK, "GStreamer library not linked"); + +- uint32_t cookie = gst_default_registry_get_feature_list_cookie (); ++#if GST_VERSION_MAJOR >= 1 ++ uint32_t cookie = gst_registry_get_feature_list_cookie(gst_registry_get()); ++#else ++ uint32_t cookie = gst_default_registry_get_feature_list_cookie(); ++#endif + if (cookie != mCookie) { + g_list_free(mFactories); ++#if GST_VERSION_MAJOR >= 1 ++ mFactories = ++ gst_registry_feature_filter(gst_registry_get(), ++ (GstPluginFeatureFilter)FactoryFilter, ++ false, nullptr); ++#else + mFactories = + gst_default_registry_feature_filter((GstPluginFeatureFilter)FactoryFilter, + false, nullptr); ++#endif + mCookie = cookie; + } + +diff --git content/media/gstreamer/GStreamerFunctionList.h content/media/gstreamer/GStreamerFunctionList.h +index 56877c0..e169449 100644 +--- content/media/gstreamer/GStreamerFunctionList.h ++++ content/media/gstreamer/GStreamerFunctionList.h +@@ -9,7 +9,6 @@ + * List of symbol names we need to dlsym from the gstreamer library. + */ + GST_FUNC(LIBGSTAPP, gst_app_sink_get_type) +-GST_FUNC(LIBGSTAPP, gst_app_sink_pull_buffer) + GST_FUNC(LIBGSTAPP, gst_app_sink_set_callbacks) + GST_FUNC(LIBGSTAPP, gst_app_src_end_of_stream) + GST_FUNC(LIBGSTAPP, gst_app_src_get_size) +@@ -22,10 +21,8 @@ GST_FUNC(LIBGSTAPP, gst_app_src_set_stream_type) + GST_FUNC(LIBGSTREAMER, gst_bin_get_by_name) + GST_FUNC(LIBGSTREAMER, gst_bin_get_type) + GST_FUNC(LIBGSTREAMER, gst_bin_iterate_recurse) +-GST_FUNC(LIBGSTREAMER, gst_buffer_copy_metadata) + GST_FUNC(LIBGSTREAMER, gst_buffer_get_type) + GST_FUNC(LIBGSTREAMER, gst_buffer_new) +-GST_FUNC(LIBGSTREAMER, gst_buffer_new_and_alloc) + GST_FUNC(LIBGSTREAMER, gst_bus_set_sync_handler) + GST_FUNC(LIBGSTREAMER, gst_bus_timed_pop_filtered) + GST_FUNC(LIBGSTREAMER, gst_caps_append) +@@ -37,46 +34,36 @@ GST_FUNC(LIBGSTREAMER, gst_caps_new_any) + GST_FUNC(LIBGSTREAMER, gst_caps_new_empty) + GST_FUNC(LIBGSTREAMER, gst_caps_new_full) + GST_FUNC(LIBGSTREAMER, gst_caps_new_simple) +-GST_FUNC(LIBGSTREAMER, gst_caps_unref) +-GST_FUNC(LIBGSTREAMER, gst_element_factory_get_klass) ++GST_FUNC(LIBGSTREAMER, gst_caps_set_simple) + GST_FUNC(LIBGSTREAMER, gst_element_factory_get_static_pad_templates) + GST_FUNC(LIBGSTREAMER, gst_element_factory_get_type) + GST_FUNC(LIBGSTREAMER, gst_element_factory_make) + GST_FUNC(LIBGSTREAMER, gst_element_get_factory) +-GST_FUNC(LIBGSTREAMER, gst_element_get_pad) ++GST_FUNC(LIBGSTREAMER, gst_element_get_static_pad) + GST_FUNC(LIBGSTREAMER, gst_element_get_type) + GST_FUNC(LIBGSTREAMER, gst_element_query_convert) + GST_FUNC(LIBGSTREAMER, gst_element_query_duration) + GST_FUNC(LIBGSTREAMER, gst_element_seek_simple) + GST_FUNC(LIBGSTREAMER, gst_element_set_state) +-GST_FUNC(LIBGSTREAMER, gst_event_parse_new_segment) + GST_FUNC(LIBGSTREAMER, gst_flow_get_name) + GST_FUNC(LIBGSTREAMER, gst_init) + GST_FUNC(LIBGSTREAMER, gst_init_check) + GST_FUNC(LIBGSTREAMER, gst_iterator_next) + GST_FUNC(LIBGSTREAMER, gst_message_parse_error) + GST_FUNC(LIBGSTREAMER, gst_message_type_get_name) +-GST_FUNC(LIBGSTREAMER, gst_mini_object_get_type) +-GST_FUNC(LIBGSTREAMER, gst_mini_object_new) + GST_FUNC(LIBGSTREAMER, gst_mini_object_ref) + GST_FUNC(LIBGSTREAMER, gst_mini_object_unref) + GST_FUNC(LIBGSTREAMER, gst_object_get_parent) + GST_FUNC(LIBGSTREAMER, gst_object_unref) +-GST_FUNC(LIBGSTREAMER, gst_pad_add_event_probe) +-GST_FUNC(LIBGSTREAMER, gst_pad_alloc_buffer) + GST_FUNC(LIBGSTREAMER, gst_pad_get_element_private) +-GST_FUNC(LIBGSTREAMER, gst_pad_get_negotiated_caps) +-GST_FUNC(LIBGSTREAMER, gst_pad_set_bufferalloc_function) + GST_FUNC(LIBGSTREAMER, gst_pad_set_element_private) + GST_FUNC(LIBGSTREAMER, gst_parse_bin_from_description) + GST_FUNC(LIBGSTREAMER, gst_pipeline_get_bus) + GST_FUNC(LIBGSTREAMER, gst_pipeline_get_type) + GST_FUNC(LIBGSTREAMER, gst_plugin_feature_get_rank) + GST_FUNC(LIBGSTREAMER, gst_registry_feature_filter) +-GST_FUNC(LIBGSTREAMER, gst_registry_get_default) + GST_FUNC(LIBGSTREAMER, gst_registry_get_feature_list_cookie) + GST_FUNC(LIBGSTREAMER, gst_segment_init) +-GST_FUNC(LIBGSTREAMER, gst_segment_set_newsegment) + GST_FUNC(LIBGSTREAMER, gst_segment_to_stream_time) + GST_FUNC(LIBGSTREAMER, gst_static_caps_get) + GST_FUNC(LIBGSTREAMER, gst_structure_copy) +@@ -85,11 +72,82 @@ GST_FUNC(LIBGSTREAMER, gst_structure_get_int) + GST_FUNC(LIBGSTREAMER, gst_structure_get_value) + GST_FUNC(LIBGSTREAMER, gst_structure_new) + GST_FUNC(LIBGSTREAMER, gst_util_uint64_scale) ++ ++#if GST_VERSION_MAJOR == 0 ++GST_FUNC(LIBGSTAPP, gst_app_sink_pull_buffer) ++GST_FUNC(LIBGSTREAMER, gst_buffer_copy_metadata) ++GST_FUNC(LIBGSTREAMER, gst_buffer_new_and_alloc) ++GST_FUNC(LIBGSTREAMER, gst_caps_unref) ++GST_FUNC(LIBGSTREAMER, gst_element_factory_get_klass) ++GST_FUNC(LIBGSTREAMER, gst_element_get_pad) ++GST_FUNC(LIBGSTREAMER, gst_event_parse_new_segment) ++GST_FUNC(LIBGSTREAMER, gst_mini_object_get_type) ++GST_FUNC(LIBGSTREAMER, gst_mini_object_new) ++GST_FUNC(LIBGSTREAMER, gst_pad_add_event_probe) ++GST_FUNC(LIBGSTREAMER, gst_pad_alloc_buffer) ++GST_FUNC(LIBGSTREAMER, gst_pad_get_negotiated_caps) ++GST_FUNC(LIBGSTREAMER, gst_pad_set_bufferalloc_function) ++GST_FUNC(LIBGSTREAMER, gst_registry_get_default) ++GST_FUNC(LIBGSTREAMER, gst_segment_set_newsegment) + GST_FUNC(LIBGSTVIDEO, gst_video_format_get_component_height) + GST_FUNC(LIBGSTVIDEO, gst_video_format_get_component_offset) + GST_FUNC(LIBGSTVIDEO, gst_video_format_get_component_width) ++GST_FUNC(LIBGSTVIDEO, gst_video_format_get_pixel_stride) + GST_FUNC(LIBGSTVIDEO, gst_video_format_get_row_stride) + GST_FUNC(LIBGSTVIDEO, gst_video_format_parse_caps) ++#else ++ ++GST_FUNC(LIBGSTAPP, gst_app_sink_pull_sample) ++GST_FUNC(LIBGSTREAMER, _gst_caps_any) ++GST_FUNC(LIBGSTREAMER, gst_allocator_get_type) ++GST_FUNC(LIBGSTREAMER, gst_buffer_copy_into) ++GST_FUNC(LIBGSTREAMER, gst_buffer_extract) ++GST_FUNC(LIBGSTREAMER, gst_buffer_get_meta) ++GST_FUNC(LIBGSTREAMER, gst_buffer_get_size) ++GST_FUNC(LIBGSTREAMER, gst_buffer_map) ++GST_FUNC(LIBGSTREAMER, gst_buffer_new_allocate) ++GST_FUNC(LIBGSTREAMER, gst_buffer_n_memory) ++GST_FUNC(LIBGSTREAMER, gst_buffer_peek_memory) ++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_acquire_buffer) ++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_config_set_allocator) ++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_config_set_params) ++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_get_config) ++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_get_type) ++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_is_active) ++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_set_active) ++GST_FUNC(LIBGSTREAMER, gst_buffer_pool_set_config) ++GST_FUNC(LIBGSTREAMER, gst_buffer_set_size) ++GST_FUNC(LIBGSTREAMER, gst_buffer_unmap) ++GST_FUNC(LIBGSTREAMER, gst_element_factory_get_metadata) ++GST_FUNC(LIBGSTREAMER, gst_event_parse_segment) ++GST_FUNC(LIBGSTREAMER, gst_memory_init) ++GST_FUNC(LIBGSTREAMER, gst_memory_map) ++GST_FUNC(LIBGSTREAMER, gst_memory_unmap) ++GST_FUNC(LIBGSTREAMER, gst_object_get_type) ++GST_FUNC(LIBGSTREAMER, gst_pad_add_probe) ++GST_FUNC(LIBGSTREAMER, gst_pad_get_current_caps) ++GST_FUNC(LIBGSTREAMER, gst_pad_probe_info_get_query) ++GST_FUNC(LIBGSTREAMER, gst_query_add_allocation_meta) ++GST_FUNC(LIBGSTREAMER, gst_query_add_allocation_param) ++GST_FUNC(LIBGSTREAMER, gst_query_add_allocation_pool) ++GST_FUNC(LIBGSTREAMER, gst_query_parse_allocation) ++GST_FUNC(LIBGSTREAMER, gst_registry_get) ++GST_FUNC(LIBGSTREAMER, gst_sample_get_buffer) ++GST_FUNC(LIBGSTREAMER, gst_segment_copy_into) ++GST_FUNC(LIBGSTREAMER, gst_structure_free) ++GST_FUNC(LIBGSTVIDEO, gst_buffer_pool_config_get_video_alignment) ++GST_FUNC(LIBGSTVIDEO, gst_buffer_pool_has_option) ++GST_FUNC(LIBGSTVIDEO, gst_video_buffer_pool_get_type) ++GST_FUNC(LIBGSTVIDEO, gst_video_frame_map) ++GST_FUNC(LIBGSTVIDEO, gst_video_frame_unmap) ++GST_FUNC(LIBGSTVIDEO, gst_video_info_align) ++GST_FUNC(LIBGSTVIDEO, gst_video_info_from_caps) ++GST_FUNC(LIBGSTVIDEO, gst_video_info_init) ++GST_FUNC(LIBGSTVIDEO, gst_video_meta_api_get_type) ++GST_FUNC(LIBGSTVIDEO, gst_video_meta_map) ++GST_FUNC(LIBGSTVIDEO, gst_video_meta_unmap) ++ ++#endif + + /* + * Functions that have been defined in the header file. We replace them so that +@@ -99,6 +157,11 @@ GST_FUNC(LIBGSTVIDEO, gst_video_format_parse_caps) + REPLACE_FUNC(gst_buffer_ref); + REPLACE_FUNC(gst_buffer_unref); + REPLACE_FUNC(gst_message_unref); ++ ++#if GST_VERSION_MAJOR == 1 ++REPLACE_FUNC(gst_caps_unref); ++REPLACE_FUNC(gst_sample_unref); ++#endif + #endif + + #endif // !defined(__APPLE__) +diff --git content/media/gstreamer/GStreamerLoader.cpp content/media/gstreamer/GStreamerLoader.cpp +index 5961b23..e6457e0 100644 +--- content/media/gstreamer/GStreamerLoader.cpp ++++ content/media/gstreamer/GStreamerLoader.cpp +@@ -6,13 +6,21 @@ + #include + #include + +-#include "GStreamerLoader.h" ++#include "nsDebug.h" + #include "mozilla/NullPtr.h" + ++#include "GStreamerLoader.h" ++ + #define LIBGSTREAMER 0 + #define LIBGSTAPP 1 + #define LIBGSTVIDEO 2 + ++#ifdef __OpenBSD__ ++#define LIB_GST_SUFFIX ".so" ++#else ++#define LIB_GST_SUFFIX ".so.0" ++#endif ++ + namespace mozilla { + + /* +@@ -32,6 +40,11 @@ namespace mozilla { + GstBuffer * gst_buffer_ref_impl(GstBuffer *buf); + void gst_buffer_unref_impl(GstBuffer *buf); + void gst_message_unref_impl(GstMessage *msg); ++void gst_caps_unref_impl(GstCaps *caps); ++ ++#if GST_VERSION_MAJOR == 1 ++void gst_sample_unref_impl(GstSample *sample); ++#endif + + bool + load_gstreamer() +@@ -58,32 +71,25 @@ load_gstreamer() + if (major == GST_VERSION_MAJOR && minor == GST_VERSION_MINOR) { + gstreamerLib = RTLD_DEFAULT; + } else { +-#ifdef __OpenBSD__ +- gstreamerLib = dlopen("libgstreamer-0.10.so", RTLD_NOW | RTLD_LOCAL); +-#else +- gstreamerLib = dlopen("libgstreamer-0.10.so.0", RTLD_NOW | RTLD_LOCAL); +-#endif ++ gstreamerLib = dlopen("libgstreamer-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL); + } + +- void *handles[] = { ++ void *handles[3] = { + gstreamerLib, +-#ifdef __OpenBSD__ +- dlopen("libgstapp-0.10.so", RTLD_NOW | RTLD_LOCAL), +- dlopen("libgstvideo-0.10.so", RTLD_NOW | RTLD_LOCAL) +-#else +- dlopen("libgstapp-0.10.so.0", RTLD_NOW | RTLD_LOCAL), +- dlopen("libgstvideo-0.10.so.0", RTLD_NOW | RTLD_LOCAL) +-#endif ++ dlopen("libgstapp-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL), ++ dlopen("libgstvideo-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL) + }; + + for (size_t i = 0; i < sizeof(handles) / sizeof(handles[0]); i++) { + if (!handles[i]) { ++ NS_WARNING("Couldn't link gstreamer libraries"); + goto fail; + } + } + + #define GST_FUNC(lib, symbol) \ + if (!(symbol = (typeof(symbol))dlsym(handles[lib], #symbol))) { \ ++ NS_WARNING("Couldn't link symbol " #symbol); \ + goto fail; \ + } + #define REPLACE_FUNC(symbol) symbol = symbol##_impl; +@@ -123,4 +129,18 @@ gst_message_unref_impl(GstMessage *msg) + gst_mini_object_unref(GST_MINI_OBJECT_CAST(msg)); + } + ++#if GST_VERSION_MAJOR == 1 ++void ++gst_sample_unref_impl(GstSample *sample) ++{ ++ gst_mini_object_unref(GST_MINI_OBJECT_CAST(sample)); ++} ++#endif ++ ++void ++gst_caps_unref_impl(GstCaps *caps) ++{ ++ gst_mini_object_unref(GST_MINI_OBJECT_CAST(caps)); ++} ++ + } +diff --git content/media/gstreamer/GStreamerLoader.h content/media/gstreamer/GStreamerLoader.h +index 2d801722..cd7fe6d 100644 +--- content/media/gstreamer/GStreamerLoader.h ++++ content/media/gstreamer/GStreamerLoader.h +@@ -22,6 +22,11 @@ + #include + #pragma GCC diagnostic pop + ++#if GST_VERSION_MAJOR == 1 ++#include ++#include ++#endif ++ + namespace mozilla { + + /* +@@ -42,4 +47,7 @@ bool load_gstreamer(); + + } + ++#undef GST_CAPS_ANY ++#define GST_CAPS_ANY (*_gst_caps_any) ++ + #endif // GStreamerLoader_h_ +diff --git content/media/gstreamer/GStreamerReader-0.10.cpp content/media/gstreamer/GStreamerReader-0.10.cpp +new file mode 100644 +index 0000000..fb98bde +--- /dev/null ++++ content/media/gstreamer/GStreamerReader-0.10.cpp +@@ -0,0 +1,198 @@ ++#include "nsError.h" ++#include "MediaDecoderStateMachine.h" ++#include "AbstractMediaDecoder.h" ++#include "MediaResource.h" ++#include "GStreamerReader.h" ++#include "GStreamerMozVideoBuffer.h" ++#include "GStreamerFormatHelper.h" ++#include "VideoUtils.h" ++#include "mozilla/dom/TimeRanges.h" ++#include "mozilla/Preferences.h" ++ ++using namespace mozilla; ++using mozilla::layers::PlanarYCbCrImage; ++using mozilla::layers::ImageContainer; ++ ++GstFlowReturn GStreamerReader::AllocateVideoBufferCb(GstPad* aPad, ++ guint64 aOffset, ++ guint aSize, ++ GstCaps* aCaps, ++ GstBuffer** aBuf) ++{ ++ GStreamerReader* reader = reinterpret_cast(gst_pad_get_element_private(aPad)); ++ return reader->AllocateVideoBuffer(aPad, aOffset, aSize, aCaps, aBuf); ++} ++ ++GstFlowReturn GStreamerReader::AllocateVideoBuffer(GstPad* aPad, ++ guint64 aOffset, ++ guint aSize, ++ GstCaps* aCaps, ++ GstBuffer** aBuf) ++{ ++ nsRefPtr image; ++ return AllocateVideoBufferFull(aPad, aOffset, aSize, aCaps, aBuf, image); ++} ++ ++GstFlowReturn GStreamerReader::AllocateVideoBufferFull(GstPad* aPad, ++ guint64 aOffset, ++ guint aSize, ++ GstCaps* aCaps, ++ GstBuffer** aBuf, ++ nsRefPtr& aImage) ++{ ++ /* allocate an image using the container */ ++ ImageContainer* container = mDecoder->GetImageContainer(); ++ ImageFormat format = PLANAR_YCBCR; ++ PlanarYCbCrImage* img = reinterpret_cast(container->CreateImage(&format, 1).get()); ++ nsRefPtr image = dont_AddRef(img); ++ ++ /* prepare a GstBuffer pointing to the underlying PlanarYCbCrImage buffer */ ++ GstBuffer* buf = GST_BUFFER(gst_moz_video_buffer_new()); ++ GST_BUFFER_SIZE(buf) = aSize; ++ /* allocate the actual YUV buffer */ ++ GST_BUFFER_DATA(buf) = image->AllocateAndGetNewBuffer(aSize); ++ ++ aImage = image; ++ ++ /* create a GstMozVideoBufferData to hold the image */ ++ GstMozVideoBufferData* bufferdata = new GstMozVideoBufferData(image); ++ ++ /* Attach bufferdata to our GstMozVideoBuffer, it will take care to free it */ ++ gst_moz_video_buffer_set_data(GST_MOZ_VIDEO_BUFFER(buf), bufferdata); ++ ++ *aBuf = buf; ++ return GST_FLOW_OK; ++} ++ ++gboolean GStreamerReader::EventProbe(GstPad* aPad, GstEvent* aEvent) ++{ ++ GstElement* parent = GST_ELEMENT(gst_pad_get_parent(aPad)); ++ switch(GST_EVENT_TYPE(aEvent)) { ++ case GST_EVENT_NEWSEGMENT: ++ { ++ gboolean update; ++ gdouble rate; ++ GstFormat format; ++ gint64 start, stop, position; ++ GstSegment* segment; ++ ++ /* Store the segments so we can convert timestamps to stream time, which ++ * is what the upper layers sync on. ++ */ ++ ReentrantMonitorAutoEnter mon(mGstThreadsMonitor); ++ gst_event_parse_new_segment(aEvent, &update, &rate, &format, ++ &start, &stop, &position); ++ if (parent == GST_ELEMENT(mVideoAppSink)) ++ segment = &mVideoSegment; ++ else ++ segment = &mAudioSegment; ++ gst_segment_set_newsegment(segment, update, rate, format, ++ start, stop, position); ++ break; ++ } ++ case GST_EVENT_FLUSH_STOP: ++ /* Reset on seeks */ ++ ResetDecode(); ++ break; ++ default: ++ break; ++ } ++ gst_object_unref(parent); ++ ++ return TRUE; ++} ++ ++gboolean GStreamerReader::EventProbeCb(GstPad* aPad, ++ GstEvent* aEvent, ++ gpointer aUserData) ++{ ++ GStreamerReader* reader = reinterpret_cast(aUserData); ++ return reader->EventProbe(aPad, aEvent); ++} ++ ++nsRefPtr GStreamerReader::GetImageFromBuffer(GstBuffer* aBuffer) ++{ ++ if (!GST_IS_MOZ_VIDEO_BUFFER (aBuffer)) ++ return nullptr; ++ ++ nsRefPtr image; ++ GstMozVideoBufferData* bufferdata = reinterpret_cast(gst_moz_video_buffer_get_data(GST_MOZ_VIDEO_BUFFER(aBuffer))); ++ image = bufferdata->mImage; ++ ++ PlanarYCbCrImage::Data data; ++ data.mPicX = data.mPicY = 0; ++ data.mPicSize = nsIntSize(mPicture.width, mPicture.height); ++ data.mStereoMode = STEREO_MODE_MONO; ++ ++ data.mYChannel = GST_BUFFER_DATA(aBuffer); ++ data.mYStride = gst_video_format_get_row_stride(mFormat, 0, mPicture.width); ++ data.mYSize = nsIntSize(data.mYStride, ++ gst_video_format_get_component_height(mFormat, 0, mPicture.height)); ++ data.mYSkip = 0; ++ data.mCbCrStride = gst_video_format_get_row_stride(mFormat, 1, mPicture.width); ++ data.mCbCrSize = nsIntSize(data.mCbCrStride, ++ gst_video_format_get_component_height(mFormat, 1, mPicture.height)); ++ data.mCbChannel = data.mYChannel + gst_video_format_get_component_offset(mFormat, 1, ++ mPicture.width, mPicture.height); ++ data.mCrChannel = data.mYChannel + gst_video_format_get_component_offset(mFormat, 2, ++ mPicture.width, mPicture.height); ++ data.mCbSkip = 0; ++ data.mCrSkip = 0; ++ ++ image->SetDataNoCopy(data); ++ ++ return image; ++} ++ ++void GStreamerReader::CopyIntoImageBuffer(GstBuffer* aBuffer, ++ GstBuffer** aOutBuffer, ++ nsRefPtr &aImage) ++{ ++ AllocateVideoBufferFull(nullptr, GST_BUFFER_OFFSET(aBuffer), ++ GST_BUFFER_SIZE(aBuffer), nullptr, aOutBuffer, aImage); ++ ++ gst_buffer_copy_metadata(*aOutBuffer, aBuffer, (GstBufferCopyFlags)GST_BUFFER_COPY_ALL); ++ memcpy(GST_BUFFER_DATA(*aOutBuffer), GST_BUFFER_DATA(aBuffer), GST_BUFFER_SIZE(*aOutBuffer)); ++ ++ aImage = GetImageFromBuffer(*aOutBuffer); ++} ++ ++GstCaps* GStreamerReader::BuildAudioSinkCaps() ++{ ++ GstCaps* caps; ++#ifdef IS_LITTLE_ENDIAN ++ int endianness = 1234; ++#else ++ int endianness = 4321; ++#endif ++ gint width; ++#ifdef MOZ_SAMPLE_TYPE_FLOAT32 ++ caps = gst_caps_from_string("audio/x-raw-float, channels={1,2}"); ++ width = 32; ++#else /* !MOZ_SAMPLE_TYPE_FLOAT32 */ ++ caps = gst_caps_from_string("audio/x-raw-int, channels={1,2}"); ++ width = 16; ++#endif ++ gst_caps_set_simple(caps, ++ "width", G_TYPE_INT, width, ++ "endianness", G_TYPE_INT, endianness, ++ NULL); ++ ++ return caps; ++} ++ ++void GStreamerReader::InstallPadCallbacks() ++{ ++ GstPad* sinkpad = gst_element_get_static_pad(GST_ELEMENT(mVideoAppSink), "sink"); ++ gst_pad_add_event_probe(sinkpad, ++ G_CALLBACK(&GStreamerReader::EventProbeCb), this); ++ ++ gst_pad_set_bufferalloc_function(sinkpad, GStreamerReader::AllocateVideoBufferCb); ++ gst_pad_set_element_private(sinkpad, this); ++ gst_object_unref(sinkpad); ++ ++ sinkpad = gst_element_get_static_pad(GST_ELEMENT(mAudioAppSink), "sink"); ++ gst_pad_add_event_probe(sinkpad, ++ G_CALLBACK(&GStreamerReader::EventProbeCb), this); ++ gst_object_unref(sinkpad); ++} +diff --git content/media/gstreamer/GStreamerReader.cpp content/media/gstreamer/GStreamerReader.cpp +index 2be45dc..54509e3 100644 +--- content/media/gstreamer/GStreamerReader.cpp ++++ content/media/gstreamer/GStreamerReader.cpp +@@ -10,8 +10,10 @@ + #include "AbstractMediaDecoder.h" + #include "MediaResource.h" + #include "GStreamerReader.h" ++#if GST_VERSION_MAJOR >= 1 ++#include "GStreamerAllocator.h" ++#endif + #include "GStreamerFormatHelper.h" +-#include "GStreamerMozVideoBuffer.h" + #include "VideoUtils.h" + #include "mozilla/dom/TimeRanges.h" + #include "mozilla/Preferences.h" +@@ -31,14 +33,9 @@ extern PRLogModuleInfo* gMediaDecoderLog; + #define LOG(type, msg) + #endif + +-extern bool +-IsYV12Format(const VideoData::YCbCrBuffer::Plane& aYPlane, +- const VideoData::YCbCrBuffer::Plane& aCbPlane, +- const VideoData::YCbCrBuffer::Plane& aCrPlane); +- + static const unsigned int MAX_CHANNELS = 4; + // Let the demuxer work in pull mode for short files +-static const int SHORT_FILE_SIZE = 1024 * 1024; ++static const int SHORT_FILE_SIZE = 0; + // The default resource->Read() size when working in push mode + static const int DEFAULT_SOURCE_READ_SIZE = 50 * 1024; + +@@ -60,6 +57,10 @@ GStreamerReader::GStreamerReader(AbstractMediaDecoder* aDecoder) + : MediaDecoderReader(aDecoder), + mMP3FrameParser(aDecoder->GetResource()->GetLength()), + mUseParserDuration(false), ++#if GST_VERSION_MAJOR >= 1 ++ mAllocator(nullptr), ++ mBufferPool(nullptr), ++#endif + mPlayBin(nullptr), + mBus(nullptr), + mSource(nullptr), +@@ -72,6 +73,9 @@ GStreamerReader::GStreamerReader(AbstractMediaDecoder* aDecoder) + mAudioSinkBufferCount(0), + mGstThreadsMonitor("media.gst.threads"), + mReachedEos(false), ++#if GST_VERSION_MAJOR >= 1 ++ mConfigureAlignment(true), ++#endif + fpsNum(0), + fpsDen(0) + { +@@ -83,8 +87,12 @@ GStreamerReader::GStreamerReader(AbstractMediaDecoder* aDecoder) + + mSinkCallbacks.eos = GStreamerReader::EosCb; + mSinkCallbacks.new_preroll = GStreamerReader::NewPrerollCb; ++#if GST_VERSION_MAJOR >= 1 ++ mSinkCallbacks.new_sample = GStreamerReader::NewBufferCb; ++#else + mSinkCallbacks.new_buffer = GStreamerReader::NewBufferCb; + mSinkCallbacks.new_buffer_list = nullptr; ++#endif + + gst_segment_init(&mVideoSegment, GST_FORMAT_UNDEFINED); + gst_segment_init(&mAudioSegment, GST_FORMAT_UNDEFINED); +@@ -108,65 +116,67 @@ GStreamerReader::~GStreamerReader() + mAudioAppSink = nullptr; + gst_object_unref(mBus); + mBus = nullptr; ++#if GST_VERSION_MAJOR >= 1 ++ g_object_unref(mAllocator); ++ g_object_unref(mBufferPool); ++#endif + } + } +- ++ + nsresult GStreamerReader::Init(MediaDecoderReader* aCloneDonor) + { ++#if 0 + GError* error = nullptr; + if (!gst_init_check(0, 0, &error)) { + LOG(PR_LOG_ERROR, ("gst initialization failed: %s", error->message)); + g_error_free(error); + return NS_ERROR_FAILURE; + } ++#endif ++ GStreamerFormatHelper::Instance(); + ++#if GST_VERSION_MAJOR >= 1 ++ mAllocator = static_cast(g_object_new(GST_TYPE_MOZ_GFX_MEMORY_ALLOCATOR, NULL)); ++ moz_gfx_memory_allocator_set_reader(mAllocator, this); ++ ++ mBufferPool = static_cast(g_object_new(GST_TYPE_MOZ_GFX_BUFFER_POOL, NULL)); ++#endif ++ ++#if GST_VERSION_MAJOR >= 1 ++ mPlayBin = gst_element_factory_make("playbin", nullptr); ++#else + mPlayBin = gst_element_factory_make("playbin2", nullptr); ++#endif + if (!mPlayBin) { +- LOG(PR_LOG_ERROR, ("couldn't create playbin2")); ++ LOG(PR_LOG_ERROR, ("couldn't create playbin")); + return NS_ERROR_FAILURE; + } + g_object_set(mPlayBin, "buffer-size", 0, nullptr); + mBus = gst_pipeline_get_bus(GST_PIPELINE(mPlayBin)); + + mVideoSink = gst_parse_bin_from_description("capsfilter name=filter ! " +- "appsink name=videosink sync=true max-buffers=1 " ++ "appsink name=videosink sync=false max-buffers=1 " ++#if GST_VERSION_MAJOR >= 1 ++ "caps=video/x-raw,format=I420" ++#else + "caps=video/x-raw-yuv,format=(fourcc)I420" ++#endif + , TRUE, nullptr); + mVideoAppSink = GST_APP_SINK(gst_bin_get_by_name(GST_BIN(mVideoSink), + "videosink")); +- gst_app_sink_set_callbacks(mVideoAppSink, &mSinkCallbacks, +- (gpointer) this, nullptr); +- GstPad* sinkpad = gst_element_get_pad(GST_ELEMENT(mVideoAppSink), "sink"); +- gst_pad_add_event_probe(sinkpad, +- G_CALLBACK(&GStreamerReader::EventProbeCb), this); +- gst_object_unref(sinkpad); +- gst_pad_set_bufferalloc_function(sinkpad, GStreamerReader::AllocateVideoBufferCb); +- gst_pad_set_element_private(sinkpad, this); +- + mAudioSink = gst_parse_bin_from_description("capsfilter name=filter ! " +-#ifdef MOZ_SAMPLE_TYPE_FLOAT32 +- "appsink name=audiosink max-buffers=2 sync=false caps=audio/x-raw-float," +-#ifdef IS_LITTLE_ENDIAN +- "channels={1,2},width=32,endianness=1234", TRUE, nullptr); +-#else +- "channels={1,2},width=32,endianness=4321", TRUE, nullptr); +-#endif +-#else +- "appsink name=audiosink max-buffers=2 sync=false caps=audio/x-raw-int," +-#ifdef IS_LITTLE_ENDIAN +- "channels={1,2},width=16,endianness=1234", TRUE, nullptr); +-#else +- "channels={1,2},width=16,endianness=4321", TRUE, nullptr); +-#endif +-#endif ++ "appsink name=audiosink sync=false max-buffers=1", TRUE, nullptr); + mAudioAppSink = GST_APP_SINK(gst_bin_get_by_name(GST_BIN(mAudioSink), + "audiosink")); ++ GstCaps* caps = BuildAudioSinkCaps(); ++ g_object_set(mAudioAppSink, "caps", caps, nullptr); ++ gst_caps_unref(caps); ++ ++ gst_app_sink_set_callbacks(mVideoAppSink, &mSinkCallbacks, ++ (gpointer) this, nullptr); + gst_app_sink_set_callbacks(mAudioAppSink, &mSinkCallbacks, +- (gpointer) this, nullptr); +- sinkpad = gst_element_get_pad(GST_ELEMENT(mAudioAppSink), "sink"); +- gst_pad_add_event_probe(sinkpad, +- G_CALLBACK(&GStreamerReader::EventProbeCb), this); +- gst_object_unref(sinkpad); ++ (gpointer) this, nullptr); ++ InstallPadCallbacks(); + + g_object_set(mPlayBin, "uri", "appsrc://", + "video-sink", mVideoSink, +@@ -316,13 +326,13 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo, + /* Little trick: set the target caps to "skip" so that playbin2 fails to + * find a decoder for the stream we want to skip. + */ +- GstCaps* filterCaps = gst_caps_new_simple ("skip", nullptr); ++ GstCaps* filterCaps = gst_caps_new_simple ("skip", nullptr, nullptr); + g_object_set(filter, "caps", filterCaps, nullptr); + gst_caps_unref(filterCaps); + gst_object_unref(filter); + } + +- /* start the pipeline */ ++ LOG(PR_LOG_DEBUG, ("starting metadata pipeline")); + gst_element_set_state(mPlayBin, GST_STATE_PAUSED); + + /* Wait for ASYNC_DONE, which is emitted when the pipeline is built, +@@ -343,6 +353,7 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo, + gst_message_unref(message); + ret = NS_ERROR_FAILURE; + } else { ++ LOG(PR_LOG_DEBUG, ("read metadata pipeline prerolled")); + gst_message_unref(message); + ret = NS_OK; + break; +@@ -358,16 +369,20 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo, + + /* FIXME: workaround for a bug in matroskademux. This seek makes matroskademux + * parse the index */ ++ LOG(PR_LOG_DEBUG, ("doing matroskademux seek hack")); + if (gst_element_seek_simple(mPlayBin, GST_FORMAT_TIME, + GST_SEEK_FLAG_FLUSH, 0)) { + /* after a seek we need to wait again for ASYNC_DONE */ +- message = gst_bus_timed_pop_filtered(mBus, GST_CLOCK_TIME_NONE, ++ message = gst_bus_timed_pop_filtered(mBus, 5 * GST_SECOND, + (GstMessageType)(GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR)); +- if (GST_MESSAGE_TYPE(message) == GST_MESSAGE_ERROR) { ++ LOG(PR_LOG_DEBUG, ("matroskademux seek hack done")); ++ if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_ASYNC_DONE) { + gst_element_set_state(mPlayBin, GST_STATE_NULL); + gst_message_unref(message); + return NS_ERROR_FAILURE; + } ++ } else { ++ LOG(PR_LOG_DEBUG, ("matroskademux seek hack failed (non fatal)")); + } + + bool isMP3 = mDecoder->GetResource()->GetContentType().EqualsASCII(AUDIO_MP3); +@@ -377,7 +392,6 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo, + + /* report the duration */ + gint64 duration; +- GstFormat format = GST_FORMAT_TIME; + + if (isMP3 && mMP3FrameParser.IsMP3()) { + // The MP3FrameParser has reported a duration; use that over the gstreamer +@@ -386,18 +400,25 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo, + mUseParserDuration = true; + mLastParserDuration = mMP3FrameParser.GetDuration(); + mDecoder->SetMediaDuration(mLastParserDuration); +- +- } else if (gst_element_query_duration(GST_ELEMENT(mPlayBin), +- &format, &duration) && format == GST_FORMAT_TIME) { +- // Otherwise use the gstreamer duration. +- ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); +- LOG(PR_LOG_DEBUG, ("returning duration %" GST_TIME_FORMAT, +- GST_TIME_ARGS (duration))); +- duration = GST_TIME_AS_USECONDS (duration); +- mDecoder->SetMediaDuration(duration); +- + } else { +- mDecoder->SetMediaSeekable(false); ++ LOG(PR_LOG_DEBUG, ("querying duration")); ++ // Otherwise use the gstreamer duration. ++#if GST_VERSION_MAJOR >= 1 ++ if (gst_element_query_duration(GST_ELEMENT(mPlayBin), ++ GST_FORMAT_TIME, &duration)) { ++#else ++ GstFormat format = GST_FORMAT_TIME; ++ if (gst_element_query_duration(GST_ELEMENT(mPlayBin), ++ &format, &duration) && format == GST_FORMAT_TIME) { ++#endif ++ ReentrantMonitorAutoEnter mon(mDecoder->GetReentrantMonitor()); ++ LOG(PR_LOG_DEBUG, ("have duration %" GST_TIME_FORMAT, ++ GST_TIME_ARGS (duration))); ++ duration = GST_TIME_AS_USECONDS (duration); ++ mDecoder->SetMediaDuration(duration); ++ } else { ++ mDecoder->SetMediaSeekable(false); ++ } + } + + int n_video = 0, n_audio = 0; +@@ -410,7 +431,11 @@ nsresult GStreamerReader::ReadMetadata(MediaInfo* aInfo, + *aTags = nullptr; + + // Watch the pipeline for fatal errors ++#if GST_VERSION_MAJOR >= 1 ++ gst_bus_set_sync_handler(mBus, GStreamerReader::ErrorCb, this, NULL); ++#else + gst_bus_set_sync_handler(mBus, GStreamerReader::ErrorCb, this); ++#endif + + /* set the pipeline to PLAYING so that it starts decoding and queueing data in + * the appsinks */ +@@ -424,19 +449,35 @@ nsresult GStreamerReader::CheckSupportedFormats() + bool done = false; + bool unsupported = false; + +- GstIterator *it = gst_bin_iterate_recurse(GST_BIN(mPlayBin)); ++ GstIterator* it = gst_bin_iterate_recurse(GST_BIN(mPlayBin)); + while (!done) { ++ GstIteratorResult res; + GstElement* element; +- GstIteratorResult res = gst_iterator_next(it, (void **)&element); ++ ++#if GST_VERSION_MAJOR >= 1 ++ GValue value = {0,}; ++ res = gst_iterator_next(it, &value); ++#else ++ res = gst_iterator_next(it, (void **) &element); ++#endif + switch(res) { + case GST_ITERATOR_OK: +- { ++ { ++#if GST_VERSION_MAJOR >= 1 ++ element = GST_ELEMENT (g_value_get_object (&value)); ++#endif + GstElementFactory* factory = gst_element_get_factory(element); + if (factory) { + const char* klass = gst_element_factory_get_klass(factory); +- GstPad* pad = gst_element_get_pad(element, "sink"); ++ GstPad* pad = gst_element_get_static_pad(element, "sink"); + if (pad) { +- GstCaps* caps = gst_pad_get_negotiated_caps(pad); ++ GstCaps* caps; ++ ++#if GST_VERSION_MAJOR >= 1 ++ caps = gst_pad_get_current_caps(pad); ++#else ++ caps = gst_pad_get_negotiated_caps(pad); ++#endif + + if (caps) { + /* check for demuxers but ignore elements like id3demux */ +@@ -451,7 +492,11 @@ nsresult GStreamerReader::CheckSupportedFormats() + } + } + ++#if GST_VERSION_MAJOR >= 1 ++ g_value_unset (&value); ++#else + gst_object_unref(element); ++#endif + done = unsupported; + break; + } +@@ -475,16 +520,23 @@ nsresult GStreamerReader::ResetDecode() + { + nsresult res = NS_OK; + ++ LOG(PR_LOG_DEBUG, ("reset decode")); ++ + if (NS_FAILED(MediaDecoderReader::ResetDecode())) { + res = NS_ERROR_FAILURE; + } +- ++ + mVideoQueue.Reset(); + mAudioQueue.Reset(); + + mVideoSinkBufferCount = 0; + mAudioSinkBufferCount = 0; + mReachedEos = false; ++#if GST_VERSION_MAJOR >= 1 ++ mConfigureAlignment = true; ++#endif ++ ++ LOG(PR_LOG_DEBUG, ("reset decode done")); + + return res; + } +@@ -524,24 +576,43 @@ bool GStreamerReader::DecodeAudioData() + } + } + ++#if GST_VERSION_MAJOR >= 1 ++ GstSample *sample = gst_app_sink_pull_sample(mAudioAppSink); ++ buffer = gst_buffer_ref(gst_sample_get_buffer(sample)); ++ gst_sample_unref(sample); ++#else + buffer = gst_app_sink_pull_buffer(mAudioAppSink); ++#endif ++ + mAudioSinkBufferCount--; + } + + int64_t timestamp = GST_BUFFER_TIMESTAMP(buffer); + timestamp = gst_segment_to_stream_time(&mAudioSegment, + GST_FORMAT_TIME, timestamp); ++ + timestamp = GST_TIME_AS_USECONDS(timestamp); + int64_t duration = 0; + if (GST_CLOCK_TIME_IS_VALID(GST_BUFFER_DURATION(buffer))) + duration = GST_TIME_AS_USECONDS(GST_BUFFER_DURATION(buffer)); + + int64_t offset = GST_BUFFER_OFFSET(buffer); ++#if GST_VERSION_MAJOR >= 1 ++ GstMapInfo info; ++ gst_buffer_map(buffer, &info, GST_MAP_READ); ++ unsigned int size = info.size; ++#else + unsigned int size = GST_BUFFER_SIZE(buffer); ++#endif + int32_t frames = (size / sizeof(AudioDataValue)) / mInfo.mAudio.mChannels; + ssize_t outSize = static_cast(size / sizeof(AudioDataValue)); + nsAutoArrayPtr data(new AudioDataValue[outSize]); ++#if GST_VERSION_MAJOR >= 1 ++ memcpy(data, info.data, info.size); ++ gst_buffer_unmap(buffer, &info); ++#else + memcpy(data, GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer)); ++#endif + AudioData* audio = new AudioData(offset, timestamp, duration, + frames, data.forget(), mInfo.mAudio.mChannels); + +@@ -550,9 +621,9 @@ bool GStreamerReader::DecodeAudioData() + + return true; + } +- ++ + bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip, +- int64_t aTimeThreshold) ++ int64_t aTimeThreshold) + { + NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); + +@@ -589,11 +660,17 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip, + + mDecoder->NotifyDecodedFrames(0, 1); + ++#if GST_VERSION_MAJOR >= 1 ++ GstSample *sample = gst_app_sink_pull_sample(mVideoAppSink); ++ buffer = gst_buffer_ref(gst_sample_get_buffer(sample)); ++ gst_sample_unref(sample); ++#else + buffer = gst_app_sink_pull_buffer(mVideoAppSink); ++#endif + mVideoSinkBufferCount--; + } + +- bool isKeyframe = !GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DISCONT); ++ bool isKeyframe = !GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT); + if ((aKeyFrameSkip && !isKeyframe)) { + gst_buffer_unref(buffer); + return true; +@@ -609,10 +686,18 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip, + "frame has invalid timestamp"); + + timestamp = GST_TIME_AS_USECONDS(timestamp); ++ int64_t duration; ++ if (GST_CLOCK_TIME_IS_VALID(GST_BUFFER_DURATION(buffer))) ++ duration = GST_TIME_AS_USECONDS(GST_BUFFER_DURATION(buffer)); ++ else if (fpsNum && fpsDen) ++ /* add 1-frame duration */ ++ duration = gst_util_uint64_scale(GST_USECOND, fpsDen, fpsNum); ++ + if (timestamp < aTimeThreshold) { + LOG(PR_LOG_DEBUG, ("skipping frame %" GST_TIME_FORMAT + " threshold %" GST_TIME_FORMAT, +- GST_TIME_ARGS(timestamp), GST_TIME_ARGS(aTimeThreshold))); ++ GST_TIME_ARGS(timestamp * 1000), ++ GST_TIME_ARGS(aTimeThreshold * 1000))); + gst_buffer_unref(buffer); + return true; + } +@@ -621,61 +706,36 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip, + /* no more frames */ + return false; + +- int64_t duration = 0; +- if (GST_CLOCK_TIME_IS_VALID(GST_BUFFER_DURATION(buffer))) +- duration = GST_TIME_AS_USECONDS(GST_BUFFER_DURATION(buffer)); +- else if (fpsNum && fpsDen) +- /* 1-frame duration */ +- duration = gst_util_uint64_scale(GST_USECOND, fpsNum, fpsDen); +- +- nsRefPtr image; +- GstMozVideoBufferData* bufferdata = reinterpret_cast +- GST_IS_MOZ_VIDEO_BUFFER(buffer)?gst_moz_video_buffer_get_data(GST_MOZ_VIDEO_BUFFER(buffer)):nullptr; +- +- if(bufferdata) +- image = bufferdata->mImage; ++#if GST_VERSION_MAJOR >= 1 ++ if (mConfigureAlignment && buffer->pool) { ++ GstStructure *config = gst_buffer_pool_get_config(buffer->pool); ++ GstVideoAlignment align; ++ if (gst_buffer_pool_config_get_video_alignment(config, &align)) ++ gst_video_info_align(&mVideoInfo, &align); ++ gst_structure_free(config); ++ mConfigureAlignment = false; ++ } ++#endif + ++ nsRefPtr image = GetImageFromBuffer(buffer); + if (!image) { + /* Ugh, upstream is not calling gst_pad_alloc_buffer(). Fallback to + * allocating a PlanarYCbCrImage backed GstBuffer here and memcpy. + */ + GstBuffer* tmp = nullptr; +- AllocateVideoBufferFull(nullptr, GST_BUFFER_OFFSET(buffer), +- GST_BUFFER_SIZE(buffer), nullptr, &tmp, image); +- +- /* copy */ +- gst_buffer_copy_metadata(tmp, buffer, (GstBufferCopyFlags)GST_BUFFER_COPY_ALL); +- memcpy(GST_BUFFER_DATA(tmp), GST_BUFFER_DATA(buffer), +- GST_BUFFER_SIZE(tmp)); ++ CopyIntoImageBuffer(buffer, &tmp, image); + gst_buffer_unref(buffer); + buffer = tmp; + } + +- guint8* data = GST_BUFFER_DATA(buffer); +- +- int width = mPicture.width; +- int height = mPicture.height; +- GstVideoFormat format = mFormat; +- +- VideoData::YCbCrBuffer b; +- for(int i = 0; i < 3; i++) { +- b.mPlanes[i].mData = data + gst_video_format_get_component_offset(format, i, +- width, height); +- b.mPlanes[i].mStride = gst_video_format_get_row_stride(format, i, width); +- b.mPlanes[i].mHeight = gst_video_format_get_component_height(format, +- i, height); +- b.mPlanes[i].mWidth = gst_video_format_get_component_width(format, +- i, width); +- b.mPlanes[i].mOffset = 0; +- b.mPlanes[i].mSkip = 0; +- } +- +- isKeyframe = !GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT); + int64_t offset = mDecoder->GetResource()->Tell(); // Estimate location in media. +- VideoData* video = VideoData::Create(mInfo.mVideo, image, offset, +- timestamp, duration, b, +- isKeyframe, -1, mPicture); ++ VideoData* video = VideoData::CreateFromImage(mInfo.mVideo, ++ mDecoder->GetImageContainer(), ++ offset, timestamp, duration, ++ static_cast(image.get()), ++ isKeyframe, -1, mPicture); + mVideoQueue.Push(video); ++ + gst_buffer_unref(buffer); + + return true; +@@ -698,6 +758,10 @@ nsresult GStreamerReader::Seek(int64_t aTarget, + return NS_ERROR_FAILURE; + } + LOG(PR_LOG_DEBUG, ("seek succeeded")); ++ GstMessage* message = gst_bus_timed_pop_filtered(mBus, GST_CLOCK_TIME_NONE, ++ (GstMessageType)(GST_MESSAGE_ASYNC_DONE | GST_MESSAGE_ERROR)); ++ gst_message_unref(message); ++ LOG(PR_LOG_DEBUG, ("seek completed")); + + return DecodeToTarget(aTarget); + } +@@ -709,7 +773,9 @@ nsresult GStreamerReader::GetBuffered(dom::TimeRanges* aBuffered, + return NS_OK; + } + ++#if GST_VERSION_MAJOR == 0 + GstFormat format = GST_FORMAT_TIME; ++#endif + MediaResource* resource = mDecoder->GetResource(); + nsTArray ranges; + resource->GetCachedRanges(ranges); +@@ -731,12 +797,21 @@ nsresult GStreamerReader::GetBuffered(dom::TimeRanges* aBuffered, + int64_t endOffset = ranges[index].mEnd; + gint64 startTime, endTime; + ++#if GST_VERSION_MAJOR >= 1 ++ if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES, ++ startOffset, GST_FORMAT_TIME, &startTime)) ++ continue; ++ if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES, ++ endOffset, GST_FORMAT_TIME, &endTime)) ++ continue; ++#else + if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES, + startOffset, &format, &startTime) || format != GST_FORMAT_TIME) + continue; + if (!gst_element_query_convert(GST_ELEMENT(mPlayBin), GST_FORMAT_BYTES, + endOffset, &format, &endTime) || format != GST_FORMAT_TIME) + continue; ++#endif + + double start = (double) GST_TIME_AS_USECONDS (startTime) / GST_MSECOND; + double end = (double) GST_TIME_AS_USECONDS (endTime) / GST_MSECOND; +@@ -755,7 +830,13 @@ void GStreamerReader::ReadAndPushData(guint aLength) + nsresult rv = NS_OK; + + GstBuffer* buffer = gst_buffer_new_and_alloc(aLength); ++#if GST_VERSION_MAJOR >= 1 ++ GstMapInfo info; ++ gst_buffer_map(buffer, &info, GST_MAP_WRITE); ++ guint8 *data = info.data; ++#else + guint8* data = GST_BUFFER_DATA(buffer); ++#endif + uint32_t size = 0, bytesRead = 0; + while(bytesRead < aLength) { + rv = resource->Read(reinterpret_cast(data + bytesRead), +@@ -766,14 +847,19 @@ void GStreamerReader::ReadAndPushData(guint aLength) + bytesRead += size; + } + ++#if GST_VERSION_MAJOR >= 1 ++ gst_buffer_unmap(buffer, &info); ++ gst_buffer_set_size(buffer, bytesRead); ++#else + GST_BUFFER_SIZE(buffer) = bytesRead; ++#endif + + GstFlowReturn ret = gst_app_src_push_buffer(mSource, gst_buffer_ref(buffer)); + if (ret != GST_FLOW_OK) { + LOG(PR_LOG_ERROR, ("ReadAndPushData push ret %s", gst_flow_get_name(ret))); + } + +- if (GST_BUFFER_SIZE (buffer) < aLength) { ++ if (bytesRead < aLength) { + /* If we read less than what we wanted, we reached the end */ + gst_app_src_end_of_stream(mSource); + } +@@ -786,8 +872,13 @@ int64_t GStreamerReader::QueryDuration() + gint64 duration = 0; + GstFormat format = GST_FORMAT_TIME; + ++#if GST_VERSION_MAJOR >= 1 ++ if (gst_element_query_duration(GST_ELEMENT(mPlayBin), ++ format, &duration)) { ++#else + if (gst_element_query_duration(GST_ELEMENT(mPlayBin), + &format, &duration)) { ++#endif + if (format == GST_FORMAT_TIME) { + LOG(PR_LOG_DEBUG, ("pipeline duration %" GST_TIME_FORMAT, + GST_TIME_ARGS (duration))); +@@ -866,103 +957,6 @@ gboolean GStreamerReader::SeekData(GstAppSrc* aSrc, guint64 aOffset) + return NS_SUCCEEDED(rv); + } + +-gboolean GStreamerReader::EventProbeCb(GstPad* aPad, +- GstEvent* aEvent, +- gpointer aUserData) +-{ +- GStreamerReader* reader = reinterpret_cast(aUserData); +- return reader->EventProbe(aPad, aEvent); +-} +- +-gboolean GStreamerReader::EventProbe(GstPad* aPad, GstEvent* aEvent) +-{ +- GstElement* parent = GST_ELEMENT(gst_pad_get_parent(aPad)); +- switch(GST_EVENT_TYPE(aEvent)) { +- case GST_EVENT_NEWSEGMENT: +- { +- gboolean update; +- gdouble rate; +- GstFormat format; +- gint64 start, stop, position; +- GstSegment* segment; +- +- /* Store the segments so we can convert timestamps to stream time, which +- * is what the upper layers sync on. +- */ +- ReentrantMonitorAutoEnter mon(mGstThreadsMonitor); +- gst_event_parse_new_segment(aEvent, &update, &rate, &format, +- &start, &stop, &position); +- if (parent == GST_ELEMENT(mVideoAppSink)) +- segment = &mVideoSegment; +- else +- segment = &mAudioSegment; +- gst_segment_set_newsegment(segment, update, rate, format, +- start, stop, position); +- break; +- } +- case GST_EVENT_FLUSH_STOP: +- /* Reset on seeks */ +- ResetDecode(); +- break; +- default: +- break; +- } +- gst_object_unref(parent); +- +- return TRUE; +-} +- +-GstFlowReturn GStreamerReader::AllocateVideoBufferFull(GstPad* aPad, +- guint64 aOffset, +- guint aSize, +- GstCaps* aCaps, +- GstBuffer** aBuf, +- nsRefPtr& aImage) +-{ +- /* allocate an image using the container */ +- ImageContainer* container = mDecoder->GetImageContainer(); +- ImageFormat format = PLANAR_YCBCR; +- PlanarYCbCrImage* img = reinterpret_cast(container->CreateImage(&format, 1).get()); +- nsRefPtr image = dont_AddRef(img); +- +- /* prepare a GstBuffer pointing to the underlying PlanarYCbCrImage buffer */ +- GstBuffer* buf = GST_BUFFER(gst_moz_video_buffer_new()); +- GST_BUFFER_SIZE(buf) = aSize; +- /* allocate the actual YUV buffer */ +- GST_BUFFER_DATA(buf) = image->AllocateAndGetNewBuffer(aSize); +- +- aImage = image; +- +- /* create a GstMozVideoBufferData to hold the image */ +- GstMozVideoBufferData* bufferdata = new GstMozVideoBufferData(image); +- +- /* Attach bufferdata to our GstMozVideoBuffer, it will take care to free it */ +- gst_moz_video_buffer_set_data(GST_MOZ_VIDEO_BUFFER(buf), bufferdata); +- +- *aBuf = buf; +- return GST_FLOW_OK; +-} +- +-GstFlowReturn GStreamerReader::AllocateVideoBufferCb(GstPad* aPad, +- guint64 aOffset, +- guint aSize, +- GstCaps* aCaps, +- GstBuffer** aBuf) +-{ +- GStreamerReader* reader = reinterpret_cast(gst_pad_get_element_private(aPad)); +- return reader->AllocateVideoBuffer(aPad, aOffset, aSize, aCaps, aBuf); +-} +- +-GstFlowReturn GStreamerReader::AllocateVideoBuffer(GstPad* aPad, +- guint64 aOffset, +- guint aSize, +- GstCaps* aCaps, +- GstBuffer** aBuf) +-{ +- nsRefPtr image; +- return AllocateVideoBufferFull(aPad, aOffset, aSize, aCaps, aBuf, image); +-} +- + GstFlowReturn GStreamerReader::NewPrerollCb(GstAppSink* aSink, + gpointer aUserData) + { +@@ -979,8 +973,12 @@ void GStreamerReader::AudioPreroll() + { + /* The first audio buffer has reached the audio sink. Get rate and channels */ + LOG(PR_LOG_DEBUG, ("Audio preroll")); +- GstPad* sinkpad = gst_element_get_pad(GST_ELEMENT(mAudioAppSink), "sink"); ++ GstPad* sinkpad = gst_element_get_static_pad(GST_ELEMENT(mAudioAppSink), "sink"); ++#if GST_VERSION_MAJOR >= 1 ++ GstCaps *caps = gst_pad_get_current_caps(sinkpad); ++#else + GstCaps* caps = gst_pad_get_negotiated_caps(sinkpad); ++#endif + GstStructure* s = gst_caps_get_structure(caps, 0); + mInfo.mAudio.mRate = mInfo.mAudio.mChannels = 0; + gst_structure_get_int(s, "rate", (gint*) &mInfo.mAudio.mRate); +@@ -998,9 +996,18 @@ void GStreamerReader::VideoPreroll() + { + /* The first video buffer has reached the video sink. Get width and height */ + LOG(PR_LOG_DEBUG, ("Video preroll")); +- GstPad* sinkpad = gst_element_get_pad(GST_ELEMENT(mVideoAppSink), "sink"); ++ GstPad* sinkpad = gst_element_get_static_pad(GST_ELEMENT(mVideoAppSink), "sink"); ++#if GST_VERSION_MAJOR >= 1 ++ GstCaps* caps = gst_pad_get_current_caps(sinkpad); ++ memset (&mVideoInfo, 0, sizeof (mVideoInfo)); ++ gst_video_info_from_caps(&mVideoInfo, caps); ++ mFormat = mVideoInfo.finfo->format; ++ mPicture.width = mVideoInfo.width; ++ mPicture.height = mVideoInfo.height; ++#else + GstCaps* caps = gst_pad_get_negotiated_caps(sinkpad); + gst_video_format_parse_caps(caps, &mFormat, &mPicture.width, &mPicture.height); ++#endif + GstStructure* structure = gst_caps_get_structure(caps, 0); + gst_structure_get_fraction(structure, "framerate", &fpsNum, &fpsDen); + NS_ASSERTION(mPicture.width && mPicture.height, "invalid video resolution"); +@@ -1029,6 +1036,7 @@ void GStreamerReader::NewVideoBuffer() + /* We have a new video buffer queued in the video sink. Increment the counter + * and notify the decode thread potentially blocked in DecodeVideoFrame + */ ++ + mDecoder->NotifyDecodedFrames(1, 0); + mVideoSinkBufferCount++; + mon.NotifyAll(); +@@ -1095,5 +1103,199 @@ void GStreamerReader::NotifyDataArrived(const char *aBuffer, + } + } + ++#if GST_VERSION_MAJOR >= 1 ++GstCaps* GStreamerReader::BuildAudioSinkCaps() ++{ ++ GstCaps* caps = gst_caps_from_string("audio/x-raw, channels={1,2}"); ++ const char* format; ++#ifdef MOZ_SAMPLE_TYPE_FLOAT32 ++#ifdef IS_LITTLE_ENDIAN ++ format = "F32LE"; ++#else ++ format = "F32BE"; ++#endif ++#else /* !MOZ_SAMPLE_TYPE_FLOAT32 */ ++#ifdef IS_LITTLE_ENDIAN ++ format = "S16LE"; ++#else ++ format = "S16BE"; ++#endif ++#endif ++ gst_caps_set_simple(caps, "format", G_TYPE_STRING, format, NULL); ++ ++ return caps; ++} ++ ++void GStreamerReader::InstallPadCallbacks() ++{ ++ GstPad* sinkpad = gst_element_get_static_pad(GST_ELEMENT(mVideoAppSink), "sink"); ++ ++ gst_pad_add_probe(sinkpad, ++ (GstPadProbeType) (GST_PAD_PROBE_TYPE_SCHEDULING | ++ GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | ++ GST_PAD_PROBE_TYPE_EVENT_UPSTREAM | ++ GST_PAD_PROBE_TYPE_EVENT_FLUSH), ++ &GStreamerReader::EventProbeCb, this, nullptr); ++ gst_pad_add_probe(sinkpad, GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM, ++ GStreamerReader::QueryProbeCb, nullptr, nullptr); ++ ++ gst_pad_set_element_private(sinkpad, this); ++ gst_object_unref(sinkpad); ++ ++ sinkpad = gst_element_get_static_pad(GST_ELEMENT(mAudioAppSink), "sink"); ++ gst_pad_add_probe(sinkpad, ++ (GstPadProbeType) (GST_PAD_PROBE_TYPE_SCHEDULING | ++ GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | ++ GST_PAD_PROBE_TYPE_EVENT_UPSTREAM | ++ GST_PAD_PROBE_TYPE_EVENT_FLUSH), ++ &GStreamerReader::EventProbeCb, this, nullptr); ++ gst_object_unref(sinkpad); ++} ++ ++GstPadProbeReturn GStreamerReader::EventProbeCb(GstPad *aPad, ++ GstPadProbeInfo *aInfo, ++ gpointer aUserData) ++{ ++ GStreamerReader *reader = (GStreamerReader *) aUserData; ++ GstEvent *aEvent = (GstEvent *)aInfo->data; ++ return reader->EventProbe(aPad, aEvent); ++} ++ ++GstPadProbeReturn GStreamerReader::EventProbe(GstPad *aPad, GstEvent *aEvent) ++{ ++ GstElement* parent = GST_ELEMENT(gst_pad_get_parent(aPad)); ++ ++ LOG(PR_LOG_DEBUG, ("event probe %s", GST_EVENT_TYPE_NAME (aEvent))); ++ ++ switch(GST_EVENT_TYPE(aEvent)) { ++ case GST_EVENT_SEGMENT: ++ { ++ const GstSegment *newSegment; ++ GstSegment* segment; ++ ++ /* Store the segments so we can convert timestamps to stream time, which ++ * is what the upper layers sync on. ++ */ ++ ReentrantMonitorAutoEnter mon(mGstThreadsMonitor); ++#if GST_VERSION_MINOR <= 1 && GST_VERSION_MICRO < 1 ++ ResetDecode(); ++#endif ++ gst_event_parse_segment(aEvent, &newSegment); ++ if (parent == GST_ELEMENT(mVideoAppSink)) ++ segment = &mVideoSegment; ++ else ++ segment = &mAudioSegment; ++ gst_segment_copy_into (newSegment, segment); ++ break; ++ } ++ case GST_EVENT_FLUSH_STOP: ++ /* Reset on seeks */ ++ ResetDecode(); ++ break; ++ default: ++ break; ++ } ++ gst_object_unref(parent); ++ ++ return GST_PAD_PROBE_OK; ++} ++ ++GstPadProbeReturn GStreamerReader::QueryProbeCb(GstPad* aPad, GstPadProbeInfo* aInfo, gpointer aUserData) ++{ ++ GStreamerReader* reader = reinterpret_cast(gst_pad_get_element_private(aPad)); ++ return reader->QueryProbe(aPad, aInfo, aUserData); ++} ++ ++GstPadProbeReturn GStreamerReader::QueryProbe(GstPad* aPad, GstPadProbeInfo* aInfo, gpointer aUserData) ++{ ++ GstQuery *query = gst_pad_probe_info_get_query(aInfo); ++ GstPadProbeReturn ret = GST_PAD_PROBE_OK; ++ ++ switch (GST_QUERY_TYPE (query)) { ++ case GST_QUERY_ALLOCATION: ++ GstCaps *caps; ++ GstVideoInfo info; ++ gboolean need_pool; ++ ++ gst_query_parse_allocation(query, &caps, &need_pool); ++ gst_video_info_init(&info); ++ gst_video_info_from_caps(&info, caps); ++ gst_query_add_allocation_param(query, mAllocator, NULL); ++ gst_query_add_allocation_pool(query, mBufferPool, info.size, 0, 0); ++ gst_query_add_allocation_meta(query, GST_VIDEO_META_API_TYPE, NULL); ++ break; ++ default: ++ break; ++ } ++ ++ return ret; ++} ++ ++void GStreamerReader::ImageDataFromVideoFrame(GstVideoFrame *aFrame, ++ PlanarYCbCrImage::Data *aData) ++{ ++ NS_ASSERTION(GST_VIDEO_INFO_IS_YUV(&mVideoInfo), ++ "Non-YUV video frame formats not supported"); ++ NS_ASSERTION(GST_VIDEO_FRAME_N_COMPONENTS(aFrame) == 3, ++ "Unsupported number of components in video frame"); ++ ++ aData->mPicX = aData->mPicY = 0; ++ aData->mPicSize = nsIntSize(mPicture.width, mPicture.height); ++ aData->mStereoMode = STEREO_MODE_MONO; ++ ++ aData->mYChannel = GST_VIDEO_FRAME_COMP_DATA(aFrame, 0); ++ aData->mYStride = GST_VIDEO_FRAME_COMP_STRIDE(aFrame, 0); ++ aData->mYSize = nsIntSize(GST_VIDEO_FRAME_COMP_WIDTH(aFrame, 0), ++ GST_VIDEO_FRAME_COMP_HEIGHT(aFrame, 0)); ++ aData->mYSkip = GST_VIDEO_FRAME_COMP_PSTRIDE(aFrame, 0) - 1; ++ aData->mCbCrStride = GST_VIDEO_FRAME_COMP_STRIDE(aFrame, 1); ++ aData->mCbCrSize = nsIntSize(GST_VIDEO_FRAME_COMP_WIDTH(aFrame, 1), ++ GST_VIDEO_FRAME_COMP_HEIGHT(aFrame, 1)); ++ aData->mCbChannel = GST_VIDEO_FRAME_COMP_DATA(aFrame, 1); ++ aData->mCrChannel = GST_VIDEO_FRAME_COMP_DATA(aFrame, 2); ++ aData->mCbSkip = GST_VIDEO_FRAME_COMP_PSTRIDE(aFrame, 1) - 1; ++ aData->mCrSkip = GST_VIDEO_FRAME_COMP_PSTRIDE(aFrame, 2) - 1; ++} ++ ++nsRefPtr GStreamerReader::GetImageFromBuffer(GstBuffer* aBuffer) ++{ ++ nsRefPtr image = nullptr; ++ ++ if (gst_buffer_n_memory(aBuffer) == 1) { ++ GstMemory* mem = gst_buffer_peek_memory(aBuffer, 0); ++ if (GST_IS_MOZ_GFX_MEMORY_ALLOCATOR(mem->allocator)) { ++ image = moz_gfx_memory_get_image(mem); ++ ++ GstVideoFrame frame; ++ gst_video_frame_map(&frame, &mVideoInfo, aBuffer, GST_MAP_READ); ++ PlanarYCbCrImage::Data data; ++ ImageDataFromVideoFrame(&frame, &data); ++ image->SetDataNoCopy(data); ++ gst_video_frame_unmap(&frame); ++ } ++ } ++ ++ return image; ++} ++ ++void GStreamerReader::CopyIntoImageBuffer(GstBuffer* aBuffer, ++ GstBuffer** aOutBuffer, ++ nsRefPtr &image) ++{ ++ *aOutBuffer = gst_buffer_new_allocate(mAllocator, gst_buffer_get_size(aBuffer), NULL); ++ GstMemory *mem = gst_buffer_peek_memory(*aOutBuffer, 0); ++ GstMapInfo map_info; ++ gst_memory_map(mem, &map_info, GST_MAP_WRITE); ++ gst_buffer_extract(aBuffer, 0, map_info.data, gst_buffer_get_size(aBuffer)); ++ gst_memory_unmap(mem, &map_info); ++ ++ /* create a new gst buffer with the newly created memory and copy the ++ * metadata over from the incoming buffer */ ++ gst_buffer_copy_into(*aOutBuffer, aBuffer, ++ (GstBufferCopyFlags)(GST_BUFFER_COPY_METADATA), 0, -1); ++ image = GetImageFromBuffer(*aOutBuffer); ++} ++#endif ++ + } // namespace mozilla + +diff --git content/media/gstreamer/GStreamerReader.h content/media/gstreamer/GStreamerReader.h +index 1e30bed..6a90702 100644 +--- content/media/gstreamer/GStreamerReader.h ++++ content/media/gstreamer/GStreamerReader.h +@@ -22,6 +22,7 @@ + + #include "MediaDecoderReader.h" + #include "MP3FrameParser.h" ++#include "ImageContainer.h" + #include "nsRect.h" + + namespace mozilla { +@@ -30,10 +31,6 @@ namespace dom { + class TimeRanges; + } + +-namespace layers { +-class PlanarYCbCrImage; +-} +- + class AbstractMediaDecoder; + + class GStreamerReader : public MediaDecoderReader +@@ -67,10 +64,20 @@ public: + return mInfo.HasVideo(); + } + ++ layers::ImageContainer* GetImageContainer() { return mDecoder->GetImageContainer(); } ++ + private: + + void ReadAndPushData(guint aLength); + int64_t QueryDuration(); ++ nsRefPtr GetImageFromBuffer(GstBuffer* aBuffer); ++ void CopyIntoImageBuffer(GstBuffer *aBuffer, GstBuffer** aOutBuffer, nsRefPtr &image); ++ GstCaps* BuildAudioSinkCaps(); ++ void InstallPadCallbacks(); ++ ++#if GST_VERSION_MAJOR >= 1 ++ void ImageDataFromVideoFrame(GstVideoFrame *aFrame, layers::PlanarYCbCrImage::Data *aData); ++#endif + + /* Called once the pipeline is setup to check that the stream only contains + * supported formats +@@ -105,20 +112,31 @@ private: + gboolean SeekData(GstAppSrc* aSrc, guint64 aOffset); + + /* Called when events reach the sinks. See inline comments */ ++#if GST_VERSION_MAJOR == 1 ++ static GstPadProbeReturn EventProbeCb(GstPad *aPad, GstPadProbeInfo *aInfo, gpointer aUserData); ++ GstPadProbeReturn EventProbe(GstPad *aPad, GstEvent *aEvent); ++#else + static gboolean EventProbeCb(GstPad* aPad, GstEvent* aEvent, gpointer aUserData); + gboolean EventProbe(GstPad* aPad, GstEvent* aEvent); ++#endif + +- /* Called when elements in the video branch of the pipeline call +- * gst_pad_alloc_buffer(). Used to provide PlanarYCbCrImage backed GstBuffers +- * to the pipeline so that a memory copy can be avoided when handling YUV +- * buffers from the pipeline to the gfx side. ++ /* Called when the video part of the pipeline allocates buffers. Used to ++ * provide PlanarYCbCrImage backed GstBuffers to the pipeline so that a memory ++ * copy can be avoided when handling YUV buffers from the pipeline to the gfx ++ * side. + */ ++#if GST_VERSION_MAJOR == 1 ++ static GstPadProbeReturn QueryProbeCb(GstPad *aPad, GstPadProbeInfo *aInfo, gpointer aUserData); ++ GstPadProbeReturn QueryProbe(GstPad *aPad, GstPadProbeInfo *aInfo, gpointer aUserData); ++#else + static GstFlowReturn AllocateVideoBufferCb(GstPad* aPad, guint64 aOffset, guint aSize, + GstCaps* aCaps, GstBuffer** aBuf); + GstFlowReturn AllocateVideoBufferFull(GstPad* aPad, guint64 aOffset, guint aSize, + GstCaps* aCaps, GstBuffer** aBuf, nsRefPtr& aImage); + GstFlowReturn AllocateVideoBuffer(GstPad* aPad, guint64 aOffset, guint aSize, + GstCaps* aCaps, GstBuffer** aBuf); ++#endif ++ + + /* Called when the pipeline is prerolled, that is when at start or after a + * seek, the first audio and video buffers are queued in the sinks. +@@ -150,6 +168,11 @@ private: + bool mUseParserDuration; + int64_t mLastParserDuration; + ++#if GST_VERSION_MAJOR >= 1 ++ GstAllocator *mAllocator; ++ GstBufferPool *mBufferPool; ++ GstVideoInfo mVideoInfo; ++#endif + GstElement* mPlayBin; + GstBus* mBus; + GstAppSrc* mSource; +@@ -180,6 +203,9 @@ private: + * DecodeAudioData and DecodeVideoFrame should not expect any more data + */ + bool mReachedEos; ++#if GST_VERSION_MAJOR >= 1 ++ bool mConfigureAlignment; ++#endif + int fpsNum; + int fpsDen; + }; +diff --git content/media/gstreamer/moz.build content/media/gstreamer/moz.build +index 7d51bf5..a3c1856 100644 +--- content/media/gstreamer/moz.build ++++ content/media/gstreamer/moz.build +@@ -15,10 +15,19 @@ SOURCES += [ + 'GStreamerDecoder.cpp', + 'GStreamerFormatHelper.cpp', + 'GStreamerLoader.cpp', +- 'GStreamerMozVideoBuffer.cpp', + 'GStreamerReader.cpp', + ] + ++if CONFIG['GST_API_VERSION'] == '1.0': ++ SOURCES += [ ++ 'GStreamerAllocator.cpp', ++ ] ++else: ++ SOURCES += [ ++ 'GStreamerMozVideoBuffer.cpp', ++ 'GStreamerReader-0.10.cpp', ++ ] ++ + FAIL_ON_WARNINGS = True + + FINAL_LIBRARY = 'gklayout' +diff --git content/media/test/manifest.js content/media/test/manifest.js +index 6e39753..3c8c3b9 100644 +--- content/media/test/manifest.js ++++ content/media/test/manifest.js +@@ -364,9 +364,9 @@ var gUnseekableTests = [ + { name:"bogus.duh", type:"bogus/duh"} + ]; + // Unfortunately big-buck-bunny-unseekable.mp4 is doesn't play on Windows 7, so +-// only include it in the unseekable tests if we're on later versions of Windows. +-if (navigator.userAgent.indexOf("Windows") == -1 || +- IsWindows8OrLater()) { ++// only include it in the unseekable tests if we're on later versions of Windows. ++// This test actually only passes on win8 at the moment. ++if (navigator.userAgent.indexOf("Windows") != -1 && IsWindows8OrLater()) { + gUnseekableTests = gUnseekableTests.concat([ + { name:"big-buck-bunny-unseekable.mp4", type:"video/mp4" } + ]); Deleted: trunk/www/firefox/files/patch-bug810716 ============================================================================== --- trunk/www/firefox/files/patch-bug810716 Wed Feb 5 09:55:30 2014 (r1477) +++ /dev/null 00:00:00 1970 (deleted) @@ -1,68 +0,0 @@ -diff --git configure.in configure.in -index 2084be9..eb6eeb2 100644 ---- configure.in -+++ configure.in -@@ -3369,14 +3369,19 @@ fi - AC_CACHE_CHECK( - [for res_ninit()], - ac_cv_func_res_ninit, -- [AC_TRY_LINK([ -+ [AC_TRY_RUN([ - #ifdef linux - #define _BSD_SOURCE 1 - #endif -+ #include -+ #include -+ #include - #include -- ], -- [int foo = res_ninit(&_res);], -+ int main(int argc, char **argv){ -+ int foo = res_ninit(&_res); -+ }], - [ac_cv_func_res_ninit=yes], -+ [ac_cv_func_res_ninit=no], - [ac_cv_func_res_ninit=no]) - ]) - -diff --git extensions/auth/nsAuthGSSAPI.cpp extensions/auth/nsAuthGSSAPI.cpp -index e828beb..6444246 100644 ---- extensions/auth/nsAuthGSSAPI.cpp -+++ extensions/auth/nsAuthGSSAPI.cpp -@@ -39,6 +39,9 @@ typedef KLStatus (*KLCacheHasValidTickets_type)( - #endif - - #if defined(HAVE_RES_NINIT) -+#include -+#include -+#include - #include - #endif - -diff --git js/src/configure.in js/src/configure.in -index e25f569..b9722f9 100644 ---- js/src/configure.in -+++ js/src/configure.in -@@ -2797,14 +2797,19 @@ fi - AC_CACHE_CHECK( - [for res_ninit()], - ac_cv_func_res_ninit, -- [AC_TRY_LINK([ -+ [AC_TRY_RUN([ - #ifdef linux - #define _BSD_SOURCE 1 - #endif -+ #include -+ #include -+ #include - #include -- ], -- [int foo = res_ninit(&_res);], -+ int main(int argc, char **argv){ -+ int foo = res_ninit(&_res); -+ }], - [ac_cv_func_res_ninit=yes], -+ [ac_cv_func_res_ninit=no], - [ac_cv_func_res_ninit=no]) - ]) - Modified: trunk/www/firefox/files/patch-bug826985 ============================================================================== --- trunk/www/firefox/files/patch-bug826985 Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/firefox/files/patch-bug826985 Wed Feb 5 09:55:30 2014 (r1478) @@ -42,9 +42,9 @@ --- media/webrtc/signaling/test/Makefile.in +++ media/webrtc/signaling/test/Makefile.in @@ -17,6 +17,7 @@ LIBS = \ - $(NSPR_LIBS) \ $(NSS_LIBS) \ $(REALTIME_LIBS) \ + $(MOZ_JS_LIBS) \ + $(MOZ_LIBV4L2_LIBS) \ $(DEPTH)/xpcom/glue/$(LIB_PREFIX)xpcomglue_s.$(LIB_SUFFIX) \ $(DEPTH)/media/mtransport/standalone/$(LIB_PREFIX)mtransport_s.$(LIB_SUFFIX) \ @@ -53,7 +53,7 @@ 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 -@@ -26,11 +26,23 @@ +@@ -25,10 +25,21 @@ #else #include #endif @@ -61,9 +61,8 @@ +#include +#endif - #include "ref_count.h" - #include "trace.h" - + #include "webrtc/system_wrappers/interface/ref_count.h" + #include "webrtc/system_wrappers/interface/trace.h" +#ifdef HAVE_LIBV4L2 +#define open v4l2_open @@ -73,10 +72,9 @@ +#define mmap v4l2_mmap +#define munmap v4l2_munmap +#endif -+ + namespace webrtc { - namespace videocapturemodule @@ -130,6 +142,11 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName( memset(deviceNameUTF8, 0, deviceNameLength); memcpy(cameraName, cap.card, sizeof(cap.card)); @@ -154,11 +152,11 @@ index 9c16ffa..1db3794 100644 --- toolkit/library/Makefile.in +++ toolkit/library/Makefile.in -@@ -405,6 +405,7 @@ endif +@@ -121,6 +121,7 @@ endif EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,gkmedias,$(DIST)/lib) ifdef MOZ_WEBRTC +EXTRA_DSO_LDOPTS += $(MOZ_LIBV4L2_LIBS) - ifdef MOZ_PEERCONNECTION - COMPONENT_LIBS += peerconnection - endif + ifdef MOZ_WEBRTC_SIGNALING + SHARED_LIBRARY_LIBS += \ + $(DEPTH)/media/webrtc/signaling/signaling_ecc/$(LIB_PREFIX)ecc.$(LIB_SUFFIX) \ Deleted: trunk/www/firefox/files/patch-bug945046 ============================================================================== --- trunk/www/firefox/files/patch-bug945046 Wed Feb 5 09:55:30 2014 (r1477) +++ /dev/null 00:00:00 1970 (deleted) @@ -1,160 +0,0 @@ -diff --git config/system-headers config/system-headers -index 432cba6..18a9627 100644 ---- config/system-headers -+++ config/system-headers -@@ -1131,3 +1131,4 @@ unicode/unum.h - unicode/ustring.h - unicode/utypes.h - #endif -+libutil.h -diff --git js/src/config/system-headers js/src/config/system-headers -index 432cba6..18a9627 100644 ---- js/src/config/system-headers -+++ js/src/config/system-headers -@@ -1131,3 +1131,4 @@ unicode/unum.h - unicode/ustring.h - unicode/utypes.h - #endif -+libutil.h -diff --git toolkit/library/Makefile.in toolkit/library/Makefile.in -index 9975621..b4b037d 100644 ---- toolkit/library/Makefile.in -+++ toolkit/library/Makefile.in -@@ -289,6 +289,10 @@ OS_LIBS += $(call EXPAND_LIBNAME,kvm) - EXTRA_DSO_LDOPTS += -Wl,--warn-unresolved-symbols - endif - -+ifeq ($(OS_ARCH),FreeBSD) -+OS_LIBS += $(call EXPAND_LIBNAME,util) -+endif -+ - ifeq ($(OS_ARCH),WINNT) - OS_LIBS += $(call EXPAND_LIBNAME,shell32 ole32 version winspool comdlg32 imm32 msimg32 shlwapi psapi ws2_32 dbghelp rasapi32 rasdlg iphlpapi uxtheme setupapi secur32 sensorsapi portabledeviceguids windowscodecs wininet wbemuuid) - ifdef ACCESSIBILITY -diff --git xpcom/base/nsMemoryReporterManager.cpp xpcom/base/nsMemoryReporterManager.cpp -index b8147c8..0ffb34e 100644 ---- xpcom/base/nsMemoryReporterManager.cpp -+++ xpcom/base/nsMemoryReporterManager.cpp -@@ -204,6 +204,61 @@ ResidentFastDistinguishedAmount(int64_t* aN) - return ResidentDistinguishedAmount(aN); - } - -+#ifdef __FreeBSD__ -+#include -+#include -+ -+static nsresult -+GetKinfoVmentrySelf(int64_t* prss, uint64_t* maxreg) -+{ -+ int cnt; -+ struct kinfo_vmentry *vmmap, *kve; -+ if ((vmmap = kinfo_getvmmap(getpid(), &cnt)) == NULL) -+ return NS_ERROR_FAILURE; -+ -+ if (prss) -+ *prss = 0; -+ if (maxreg) -+ *maxreg = 0; -+ -+ for (int i = 0; i < cnt; i++) { -+ kve = &vmmap[i]; -+ if (prss) -+ *prss += kve->kve_private_resident; -+ if (maxreg) -+ *maxreg = std::max(*maxreg, -+ kve->kve_end - kve->kve_start); -+ } -+ -+ free(vmmap); -+ return NS_OK; -+} -+ -+#define HAVE_PRIVATE_REPORTER -+static nsresult -+PrivateDistinguishedAmount(int64_t* aN) -+{ -+ int64_t priv; -+ nsresult rv = GetKinfoVmentrySelf(&priv, NULL); -+ if (NS_SUCCEEDED(rv)) -+ *aN = priv * getpagesize(); -+ -+ return NS_OK; -+} -+ -+#define HAVE_VSIZE_MAX_CONTIGUOUS_REPORTER 1 -+static nsresult -+VsizeMaxContiguousDistinguishedAmount(int64_t* aN) -+{ -+ uint64_t biggestRegion; -+ nsresult rv = GetKinfoVmentrySelf(NULL, &biggestRegion); -+ if (NS_SUCCEEDED(rv)) -+ *aN = biggestRegion; -+ -+ return NS_OK; -+} -+#endif // FreeBSD -+ - #elif defined(SOLARIS) - - #include -@@ -416,6 +470,25 @@ VsizeMaxContiguousDistinguishedAmount(int64_t* aN) - return NS_OK; - } - -+#define HAVE_PRIVATE_REPORTER -+static nsresult -+PrivateDistinguishedAmount(int64_t* aN) -+{ -+ PROCESS_MEMORY_COUNTERS_EX pmcex; -+ pmcex.cb = sizeof(PROCESS_MEMORY_COUNTERS_EX); -+ -+ if (!GetProcessMemoryInfo( -+ GetCurrentProcess(), -+ (PPROCESS_MEMORY_COUNTERS) &pmcex, sizeof(pmcex))) { -+ return NS_ERROR_FAILURE; -+ } -+ -+ *aN = pmcex.PrivateUsage; -+ return NS_OK; -+} -+#endif // XP_ -+ -+#ifdef HAVE_VSIZE_MAX_CONTIGUOUS_REPORTER - class VsizeMaxContiguousReporter MOZ_FINAL : public MemoryUniReporter - { - public: -@@ -429,8 +502,9 @@ public: - return VsizeMaxContiguousDistinguishedAmount(aAmount); - } - }; -+#endif - --#define HAVE_PRIVATE_REPORTER -+#ifdef HAVE_PRIVATE_REPORTER - class PrivateReporter MOZ_FINAL : public MemoryUniReporter - { - public: -@@ -443,21 +517,10 @@ public: - - NS_IMETHOD GetAmount(int64_t* aAmount) - { -- PROCESS_MEMORY_COUNTERS_EX pmcex; -- pmcex.cb = sizeof(PROCESS_MEMORY_COUNTERS_EX); -- -- if (!GetProcessMemoryInfo( -- GetCurrentProcess(), -- (PPROCESS_MEMORY_COUNTERS) &pmcex, sizeof(pmcex))) { -- return NS_ERROR_FAILURE; -- } -- -- *aAmount = pmcex.PrivateUsage; -- return NS_OK; -+ return PrivateDistinguishedAmount(aAmount); - } - }; -- --#endif // XP_ -+#endif - - #ifdef HAVE_VSIZE_AND_RESIDENT_REPORTERS - class VsizeReporter MOZ_FINAL : public MemoryUniReporter Deleted: trunk/www/firefox/files/patch-bug946560 ============================================================================== --- trunk/www/firefox/files/patch-bug946560 Wed Feb 5 09:55:30 2014 (r1477) +++ /dev/null 00:00:00 1970 (deleted) @@ -1,62 +0,0 @@ -diff --git xpcom/base/nsMemoryInfoDumper.cpp xpcom/base/nsMemoryInfoDumper.cpp -index 0b2f78c..d857374 100644 ---- xpcom/base/nsMemoryInfoDumper.cpp -+++ xpcom/base/nsMemoryInfoDumper.cpp -@@ -6,7 +6,7 @@ - - #include "mozilla/nsMemoryInfoDumper.h" - --#ifdef XP_LINUX -+#if defined(XP_LINUX) || defined(__FreeBSD__) - #include "mozilla/Preferences.h" - #endif - #include "mozilla/unused.h" -@@ -31,7 +31,7 @@ - #include - #endif - --#ifdef XP_LINUX -+#if defined(XP_LINUX) || defined(__FreeBSD__) - #include - #include - #include -@@ -110,7 +110,7 @@ private: - - } // anonymous namespace - --#ifdef XP_LINUX // { -+#if defined(XP_LINUX) || defined(__FreeBSD__) // { - namespace { - - /* -@@ -552,7 +552,7 @@ nsMemoryInfoDumper::~nsMemoryInfoDumper() - /* static */ void - nsMemoryInfoDumper::Initialize() - { --#ifdef XP_LINUX -+#if defined(XP_LINUX) || defined(__FreeBSD__) - SignalPipeWatcher::Create(); - FifoWatcher::MaybeCreate(); - #endif -diff --git xpcom/base/nsMemoryReporterManager.cpp xpcom/base/nsMemoryReporterManager.cpp -index 1252e27..6f22093 100644 ---- xpcom/base/nsMemoryReporterManager.cpp -+++ xpcom/base/nsMemoryReporterManager.cpp -@@ -17,7 +17,7 @@ - #include "nsPIDOMWindow.h" - #include "nsIObserverService.h" - #include "nsIGlobalObject.h" --#if defined(XP_LINUX) -+#if defined(XP_LINUX) || defined(__FreeBSD__) - #include "nsMemoryInfoDumper.h" - #endif - #include "mozilla/Attributes.h" -@@ -898,7 +898,7 @@ nsMemoryReporterManager::Init() - RegisterStrongReporter(new mozilla::dmd::DMDReporter()); - #endif - --#if defined(XP_LINUX) -+#if defined(XP_LINUX) || defined(__FreeBSD__) - nsMemoryInfoDumper::Initialize(); - #endif - Added: trunk/www/firefox/files/patch-js-src-Makefile.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/www/firefox/files/patch-js-src-Makefile.in Wed Feb 5 09:55:30 2014 (r1478) @@ -0,0 +1,11 @@ +--- js/src/Makefile.in~ ++++ js/src/Makefile.in +@@ -373,7 +373,7 @@ endif + ifdef MOZ_SHARED_ICU + EXTRA_DSO_LDOPTS += $(MOZ_ICU_LIBS) + else +-SHARED_LIBRARY_LIBS += $(MOZ_ICU_LIBS) ++SHARED_LIBRARY_LIBS += $(filter-out -L% -l%,$(MOZ_ICU_LIBS)) + endif + + # Prevent floating point errors caused by VC++ optimizations Deleted: trunk/www/firefox/files/patch-toolkit_xre_Makefile.in ============================================================================== --- trunk/www/firefox/files/patch-toolkit_xre_Makefile.in Wed Feb 5 09:55:30 2014 (r1477) +++ /dev/null 00:00:00 1970 (deleted) @@ -1,8 +0,0 @@ ---- toolkit/xre/Makefile.in.orig 2007-09-10 10:31:53.000000000 -0400 -+++ toolkit/xre/Makefile.in 2007-09-10 10:35:00.000000000 -0400 -@@ -263,5 +263,3 @@ - libs:: platform.ini - $(INSTALL) $^ $(DIST)/bin - --install:: -- $(INSTALL) $(IFLAGS1) $^ $(DESTDIR)$(mozappdir) Modified: trunk/www/seamonkey-i18n/Makefile ============================================================================== --- trunk/www/seamonkey-i18n/Makefile Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/seamonkey-i18n/Makefile Wed Feb 5 09:55:30 2014 (r1478) @@ -2,7 +2,7 @@ # $FreeBSD: head/www/seamonkey-i18n/Makefile 336446 2013-12-14 13:42:06Z flo $ PORTNAME= seamonkey-i18n -PORTVERSION= 2.24b1 +PORTVERSION= 2.24 CATEGORIES= www mail news editors irc MASTER_SITES= MOZILLA/${PORTNAME:S|-i18n||}/releases/${PORTVERSION}/langpack PKGNAMEPREFIX= Modified: trunk/www/seamonkey-i18n/distinfo ============================================================================== --- trunk/www/seamonkey-i18n/distinfo Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/seamonkey-i18n/distinfo Wed Feb 5 09:55:30 2014 (r1478) @@ -1,30 +1,30 @@ -SHA256 (xpi/seamonkey-i18n-2.24b1/be.xpi) = 7b4be24c48a065e0e264963f7a5a59d7836a9aaee3affa04ed300db034b346e2 -SIZE (xpi/seamonkey-i18n-2.24b1/be.xpi) = 814307 -SHA256 (xpi/seamonkey-i18n-2.24b1/en-US.xpi) = 58f312c75468ddebeb66d51d5643861b4cbc4e1eb123120e53dd886fafa069af -SIZE (xpi/seamonkey-i18n-2.24b1/en-US.xpi) = 782073 -SHA256 (xpi/seamonkey-i18n-2.24b1/es-AR.xpi) = 73217c85a05a2ca80c4b30aee8e5f2375d68c8594d46d4d960b8846f465e5ad2 -SIZE (xpi/seamonkey-i18n-2.24b1/es-AR.xpi) = 838204 -SHA256 (xpi/seamonkey-i18n-2.24b1/es-ES.xpi) = 9c1a6d32518ca15bdb0408d774b332e8a4ee0e310f468e55efe4189ff381af73 -SIZE (xpi/seamonkey-i18n-2.24b1/es-ES.xpi) = 811306 -SHA256 (xpi/seamonkey-i18n-2.24b1/gl.xpi) = 345854e02ebd9286e98e688e40b4d9b61d215d69c04e5812a62d933eb721ef50 -SIZE (xpi/seamonkey-i18n-2.24b1/gl.xpi) = 789063 -SHA256 (xpi/seamonkey-i18n-2.24b1/hu.xpi) = 0bd93abe392cbfeacd6403dd9b48e005ba7e0e5577db4c25049bfc2e8fc96f07 -SIZE (xpi/seamonkey-i18n-2.24b1/hu.xpi) = 823607 -SHA256 (xpi/seamonkey-i18n-2.24b1/lt.xpi) = f0c03d8be7816c54a91007fd4cae1b9d72450255f1f13607f3125d9760346a65 -SIZE (xpi/seamonkey-i18n-2.24b1/lt.xpi) = 827034 -SHA256 (xpi/seamonkey-i18n-2.24b1/nl.xpi) = b61860af3fb1c448343d2eb21e7c61355288979e262b50426b40e7969ba7d55e -SIZE (xpi/seamonkey-i18n-2.24b1/nl.xpi) = 776386 -SHA256 (xpi/seamonkey-i18n-2.24b1/pl.xpi) = e9c61a3eee9125519f8134f718e74eebd6e59abcc964aa565da49df71d19e478 -SIZE (xpi/seamonkey-i18n-2.24b1/pl.xpi) = 852730 -SHA256 (xpi/seamonkey-i18n-2.24b1/ru.xpi) = 4d49e4ebf438cc38e06206fde3f3e0461672e48a8f19ca6d5bb1858dc58b77a8 -SIZE (xpi/seamonkey-i18n-2.24b1/ru.xpi) = 882614 -SHA256 (xpi/seamonkey-i18n-2.24b1/sk.xpi) = 5912e60ef0d7f31a3ee02fd05d7cf3ff6f7e4c6288c591909be3628904dfb152 -SIZE (xpi/seamonkey-i18n-2.24b1/sk.xpi) = 836795 -SHA256 (xpi/seamonkey-i18n-2.24b1/tr.xpi) = 6f114c6b671aad9b027479da4e32b0c44bf2425096c05e7b349461e4764d76b3 -SIZE (xpi/seamonkey-i18n-2.24b1/tr.xpi) = 850114 -SHA256 (xpi/seamonkey-i18n-2.24b1/uk.xpi) = 92394ed40dade39d8b1a2e6cb2385883aade942a0e4572adf854cebf2b579757 -SIZE (xpi/seamonkey-i18n-2.24b1/uk.xpi) = 852876 -SHA256 (xpi/seamonkey-i18n-2.24b1/zh-CN.xpi) = 82eaba3f73fbfdb3b7175a066c66d7eba3a9c4feba5986df9180ada4be791704 -SIZE (xpi/seamonkey-i18n-2.24b1/zh-CN.xpi) = 813619 -SHA256 (xpi/seamonkey-i18n-2.24b1/zh-TW.xpi) = af0501364cf79a8abfce50127107da278311f9774b2c4d9ed1db6726259be544 -SIZE (xpi/seamonkey-i18n-2.24b1/zh-TW.xpi) = 837900 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.be.langpack.xpi) = 1d2c583dd8bc513127d6f605f129d7675865f0e32ac294313b803a9690e87acf +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.be.langpack.xpi) = 814307 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.en-US.langpack.xpi) = 3fae3e80f0b046ee88133c949705264e7b002ec00b2ada403c5d811a77ae87d1 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.en-US.langpack.xpi) = 782073 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.es-AR.langpack.xpi) = c96e94479dc6819a0a60341cc661801d72fabf9343344a8dbcf782eece9cbf61 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.es-AR.langpack.xpi) = 838204 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.es-ES.langpack.xpi) = 9c8ef69f5f142c52edde2c26e383af76a2f71accc816babb7a1d08986e05c335 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.es-ES.langpack.xpi) = 811306 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.gl.langpack.xpi) = c08bad0701e6cb7f3b042a24879a16a4f0614e92c623744b4f415f050b0dfaa9 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.gl.langpack.xpi) = 789063 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.hu.langpack.xpi) = 1b2bda6ee49db7a6b351a1b156058b95a3d0d45abd075b26469d4890eb81f1a7 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.hu.langpack.xpi) = 823607 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.lt.langpack.xpi) = f241fb89d6392e086d53ff07686be700557ff892958a054ca74c93c8bf5f8f84 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.lt.langpack.xpi) = 827034 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.nl.langpack.xpi) = 1029c64658d7548d31202bbe37e1287537899eb2a52040a71f3acda32586b286 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.nl.langpack.xpi) = 776386 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.pl.langpack.xpi) = 719dcebd471be8840f47d7cf427e988fbc37bd7349e33a278358b8c4d79f7049 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.pl.langpack.xpi) = 852730 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.ru.langpack.xpi) = 23a1b8a21410a4d06b248918a5432951072dd02a188818f8bcb20e0456f6dac0 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.ru.langpack.xpi) = 882614 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.sk.langpack.xpi) = 8b44077e774f36d56e90ce1aa7b3f2acf51511429cb2d4620e2be5e42f25188a +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.sk.langpack.xpi) = 836795 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.tr.langpack.xpi) = e7f97c238050da3986bae68ce5b916cccde5f2148051c91c7e02c7af388bab66 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.tr.langpack.xpi) = 850114 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.uk.langpack.xpi) = 80a72905a03d2cadfb60e169027dfe5828df9513d04a8b19de098d094d26b33f +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.uk.langpack.xpi) = 852876 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.zh-CN.langpack.xpi) = c6d97ec69db69d791e709931e6f0acc66fb526f0629545cfc3949d3445c525d9 +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.zh-CN.langpack.xpi) = 813619 +SHA256 (xpi/seamonkey-i18n-2.24/seamonkey-2.24.zh-TW.langpack.xpi) = dda948359944a67331752fcc45ada941ea30ff4f11d0de7a6e7fb5e7a194509e +SIZE (xpi/seamonkey-i18n-2.24/seamonkey-2.24.zh-TW.langpack.xpi) = 837900 Modified: trunk/www/seamonkey/Makefile ============================================================================== --- trunk/www/seamonkey/Makefile Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/seamonkey/Makefile Wed Feb 5 09:55:30 2014 (r1478) @@ -2,7 +2,7 @@ # $FreeBSD: head/www/seamonkey/Makefile 339634 2014-01-13 21:00:02Z rene $ PORTNAME= seamonkey -DISTVERSION= 2.24b1 +DISTVERSION= 2.24 CATEGORIES?= www mail news editors irc ipv6 MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \ https://ftp.mozilla.org/pub/mozilla.org/${PORTNAME}/candidates/${DISTVERSION}-candidates/build1/source/ Modified: trunk/www/seamonkey/distinfo ============================================================================== --- trunk/www/seamonkey/distinfo Sun Feb 2 11:33:35 2014 (r1477) +++ trunk/www/seamonkey/distinfo Wed Feb 5 09:55:30 2014 (r1478) @@ -1,4 +1,4 @@ -SHA256 (seamonkey-2.24b1.source.tar.bz2) = 85889226ba21c0202583daf832b6533c02b688d2d6e9b56b48ae102a719b7e58 -SIZE (seamonkey-2.24b1.source.tar.bz2) = 150208012 +SHA256 (seamonkey-2.24.source.tar.bz2) = 63855265b4754dd056af8d611b50219577a592466cdf1d3865028d86ed680474 +SIZE (seamonkey-2.24.source.tar.bz2) = 149845514 SHA256 (enigmail-1.6.tar.gz) = 10d5eb7ba364b9b6e6275aae8bba1d0e4321ed7d55a715337d566ccf2a56ea4d SIZE (enigmail-1.6.tar.gz) = 1231111