Date: Tue, 11 Feb 2014 21:11:25 GMT From: svn-freebsd-gecko@chruetertee.ch To: freebsd-gecko@freebsd.org Subject: [SVN-Commit] r1492 - in trunk: Mk www/firefox-i18n www/linux-firefox www/seamonkey www/seamonkey/files Message-ID: <201402112111.s1BLBP3P052107@trillian.chruetertee.ch>
next in thread | raw e-mail | index | archive | help
Author: jbeich
Date: Tue Feb 11 21:11:25 2014
New Revision: 1492
Log:
update
Added:
trunk/www/seamonkey/files/patch-bug806917
trunk/www/seamonkey/files/patch-mozilla-extensions
trunk/www/seamonkey/files/patch-mozilla-js-src-Makefile.in
Deleted:
trunk/www/seamonkey/files/patch-bug810716
trunk/www/seamonkey/files/patch-bug945046
trunk/www/seamonkey/files/patch-bug946560
Modified:
trunk/Mk/bsd.gecko.mk
trunk/www/firefox-i18n/Makefile
trunk/www/firefox-i18n/distinfo
trunk/www/linux-firefox/Makefile
trunk/www/linux-firefox/distinfo
trunk/www/seamonkey/Makefile
trunk/www/seamonkey/distinfo
trunk/www/seamonkey/files/patch-bug826985
trunk/www/seamonkey/files/patch-bug970031
Modified: trunk/Mk/bsd.gecko.mk
==============================================================================
--- trunk/Mk/bsd.gecko.mk Tue Feb 11 21:11:14 2014 (r1491)
+++ trunk/Mk/bsd.gecko.mk Tue Feb 11 21:11:25 2014 (r1492)
@@ -187,9 +187,9 @@
# version 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+ 24
+# Available values: yes 25+ 25
# NOTE:
-# default value 24 is used in case of USE_SEAMONKEY=yes
+# default value 25 is used in case of USE_SEAMONKEY=yes
#
# USE_SEAMONKEY_BUILD Add buildtime dependency on SeaMonkey.
# Available values: see USE_SEAMONKEY
@@ -291,12 +291,12 @@
_SEAMONKEY_BUILD_DEPENDS= yes
.endif
-_SEAMONKEY_DEFAULT_VERSION= 24
-_SEAMONKEY_VERSIONS= 24
-_SEAMONKEY_RANGE_VERSIONS= 24+
+_SEAMONKEY_DEFAULT_VERSION= 25
+_SEAMONKEY_VERSIONS= 25
+_SEAMONKEY_RANGE_VERSIONS= 25+
-# For specifying [24, ..]+
-_SEAMONKEY_24P= 24
+# For specifying [25, ..]+
+_SEAMONKEY_25P= 25
# Set the default SeaMonkey version and check if USE_SEAMONKEY=yes was given
.if ${USE_SEAMONKEY} == "yes"
@@ -338,7 +338,7 @@
.endif
# Dependence lines for different SeaMonkey versions
-24_DEPENDS= ${LOCALBASE}/lib/seamonkey/seamonkey:${PORTSDIR}/www/seamonkey
+25_DEPENDS= ${LOCALBASE}/lib/seamonkey/seamonkey:${PORTSDIR}/www/seamonkey
# Add dependencies
.if defined(USE_SEAMONKEY)
Modified: trunk/www/firefox-i18n/Makefile
==============================================================================
--- trunk/www/firefox-i18n/Makefile Tue Feb 11 21:11:14 2014 (r1491)
+++ trunk/www/firefox-i18n/Makefile Tue Feb 11 21:11:25 2014 (r1492)
@@ -2,7 +2,7 @@
# $FreeBSD: head/www/firefox-i18n/Makefile 336446 2013-12-14 13:42:06Z flo $
PORTNAME= firefox-i18n
-PORTVERSION= 28.0b1
+PORTVERSION= 28.0b2
CATEGORIES= www
MASTER_SITES= MOZILLA/${PORTNAME:S|-i18n||}/releases/${PORTVERSION}/linux-i686/xpi
PKGNAMEPREFIX=
Modified: trunk/www/firefox-i18n/distinfo
==============================================================================
--- trunk/www/firefox-i18n/distinfo Tue Feb 11 21:11:14 2014 (r1491)
+++ trunk/www/firefox-i18n/distinfo Tue Feb 11 21:11:25 2014 (r1492)
@@ -1,170 +1,170 @@
-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) = f2ccca94bfa5ee627f30accfe0ec3c9189d674f3cf73ac67af93d4af9f6e3ff5
-SIZE (xpi/firefox-i18n-28.0b1/ar.xpi) = 386471
-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) = 800f55a23a997a64a49dc4172889b77e8c9354b5ad50282b33581a4614ff89e4
-SIZE (xpi/firefox-i18n-28.0b1/bn-IN.xpi) = 411038
-SHA256 (xpi/firefox-i18n-28.0b1/br.xpi) = f1bbbec622cc926fbf29da278f611ff6d75adfb893c2fe5126cb18767b24d6fa
-SIZE (xpi/firefox-i18n-28.0b1/br.xpi) = 353934
-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) = 5f7a6a5ddc48a6a5990d7cfc602d1eab3c4ae01d7168bcbd3a302093c91ef8ad
-SIZE (xpi/firefox-i18n-28.0b1/de.xpi) = 350191
-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) = d4ab36baf6e83fa5a2d20259f993bb8527d75d795386a6eb8df363d22f063d6e
-SIZE (xpi/firefox-i18n-28.0b1/es-ES.xpi) = 295154
-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) = 1328fa245aea5328acb8139c643850fa4911de40e82c3d6a46b09e21c2f2e296
-SIZE (xpi/firefox-i18n-28.0b1/et.xpi) = 345631
-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) = 58df1e54571786d4b16dcaf5bf2203c5382880692acd1d417565f81d76bc561f
-SIZE (xpi/firefox-i18n-28.0b1/fr.xpi) = 363391
-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) = b3acd8de5bb12e6bb1a764a868ffd5601f56890de8cf9f5f73bd24d2acd8703b
-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) = 2f01023cbb36dcdf01c873a87d2cee1efe46f905806c83da182892fe81cc41ec
-SIZE (xpi/firefox-i18n-28.0b1/id.xpi) = 342616
-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) = b3ef9a46330e0d57f64c869c58a8377d9cecf86bd13a4b219abe9c412fcb0fe4
-SIZE (xpi/firefox-i18n-28.0b1/it.xpi) = 292743
-SHA256 (xpi/firefox-i18n-28.0b1/ja.xpi) = 26681b756f03bd5ad16c5d8a0b97bd99dfb783f35a031e7cf5a632aaff7a034b
-SIZE (xpi/firefox-i18n-28.0b1/ja.xpi) = 397188
-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) = 633b66134b722acc04df08976a3738293ca19307222d63fb4321947b091eea1b
-SIZE (xpi/firefox-i18n-28.0b1/ko.xpi) = 364493
-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) = 9132aea2ea8401bdef3a4e6c836250aeccb0750d425a3eddff1d4cc1f3cfad31
-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) = 47cb1f4324b8501d3376eca3c06bd22da4f805827c04215cf7743a041134673a
-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) = c8754e163802112494e31a722d43323cd79636f708937793c7f3717db2e4a9f4
-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) = bc8db3ad67feea767d75cbc5d2da06b3dcb42549e5c5fb1875bc919378aa430d
-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) = de9e47af9d90298b3d4b1715326b16bd72b14ae57e2a4bf5120431c248963df8
-SIZE (xpi/firefox-i18n-28.0b1/ru.xpi) = 338418
-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) = 1c19f5b203e11047fbbba76803e0131bbdb6bb3e75fa24771510656e75365c0c
-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) = 0b93ea7ddae90f40744a33f8e52d091e7a185dbb1b3ef8c452e91c5772d9782f
-SIZE (xpi/firefox-i18n-28.0b1/te.xpi) = 421142
-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) = d0317eeee84a0ade0f38d5772effe1a5399db97d5afd76332faf739fe1049815
-SIZE (xpi/firefox-i18n-28.0b1/zh-CN.xpi) = 379261
-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
+SHA256 (xpi/firefox-i18n-28.0b2/ach.xpi) = 39d9d03d5732a74a068031f2b21d19c989b1dcd171fc1cde1bf54a3410d03ea2
+SIZE (xpi/firefox-i18n-28.0b2/ach.xpi) = 363208
+SHA256 (xpi/firefox-i18n-28.0b2/af.xpi) = 12f4782bacd1c2cee7d3e761fc58ed2ccf5a746fbe089572bba04604285d9a85
+SIZE (xpi/firefox-i18n-28.0b2/af.xpi) = 357086
+SHA256 (xpi/firefox-i18n-28.0b2/ar.xpi) = dfa8db613b562d452ca180f8ba9cac5ae2b1632d5bc76ba5976cb447994a8500
+SIZE (xpi/firefox-i18n-28.0b2/ar.xpi) = 386471
+SHA256 (xpi/firefox-i18n-28.0b2/as.xpi) = d33a1fdf91f17a8cfa2e9cd47328f9b0b44c663e45ab9b0b579144e4b1e489ac
+SIZE (xpi/firefox-i18n-28.0b2/as.xpi) = 404108
+SHA256 (xpi/firefox-i18n-28.0b2/ast.xpi) = a7fb5ce187445f6235a8a41233fef5e0a0a901cdaf2462817cbd00cc2d92a6dd
+SIZE (xpi/firefox-i18n-28.0b2/ast.xpi) = 313719
+SHA256 (xpi/firefox-i18n-28.0b2/be.xpi) = 552c6ee898467f38f175c345fca2f74c8b1d29d9ae151f393dcfd83dcaeeb659
+SIZE (xpi/firefox-i18n-28.0b2/be.xpi) = 342306
+SHA256 (xpi/firefox-i18n-28.0b2/bg.xpi) = d03432707aed020d64689e4d21260d133f30ac4a4f4aa981d2b5cd7587f08061
+SIZE (xpi/firefox-i18n-28.0b2/bg.xpi) = 393205
+SHA256 (xpi/firefox-i18n-28.0b2/bn-BD.xpi) = fe65c8454fc901bd3290e7ef766887e0d2cec519989d3d86ec765cf3f4fd9fe5
+SIZE (xpi/firefox-i18n-28.0b2/bn-BD.xpi) = 416037
+SHA256 (xpi/firefox-i18n-28.0b2/bn-IN.xpi) = 4aa4b46b48272f40d4a63ae9a0a711402deab7252059f88145220d55ed9d0e19
+SIZE (xpi/firefox-i18n-28.0b2/bn-IN.xpi) = 411038
+SHA256 (xpi/firefox-i18n-28.0b2/br.xpi) = e11ed8b94f906d3dbfd07bdb35962d7f82f37c05d6650dba90c79157fadf7330
+SIZE (xpi/firefox-i18n-28.0b2/br.xpi) = 353934
+SHA256 (xpi/firefox-i18n-28.0b2/bs.xpi) = a22023601ad2b8b8dbf91e9eafd40d9f40aec7aadecc0435fdfb15135931eba9
+SIZE (xpi/firefox-i18n-28.0b2/bs.xpi) = 363405
+SHA256 (xpi/firefox-i18n-28.0b2/ca.xpi) = 381523fc5f58e339baf9df3cee632aba1bf1b31be28f587e64fc22360350c7a5
+SIZE (xpi/firefox-i18n-28.0b2/ca.xpi) = 360465
+SHA256 (xpi/firefox-i18n-28.0b2/cs.xpi) = 6ffdf20e2240f7138973aad13be33fc4bc679c5fddae62bf875c853ee0d64f78
+SIZE (xpi/firefox-i18n-28.0b2/cs.xpi) = 356819
+SHA256 (xpi/firefox-i18n-28.0b2/csb.xpi) = debd934c0d94a899970d7fbfb74980426673cdb710eda328e77a2348a089e93a
+SIZE (xpi/firefox-i18n-28.0b2/csb.xpi) = 347623
+SHA256 (xpi/firefox-i18n-28.0b2/cy.xpi) = aef9b352aa1dba3f901561827f8238d412ed77057455d2e45534bc79547626ed
+SIZE (xpi/firefox-i18n-28.0b2/cy.xpi) = 354722
+SHA256 (xpi/firefox-i18n-28.0b2/da.xpi) = 13b57f687113deae0c38fb911052c5d584cc165d775bfd6c426e96bd039c0a9a
+SIZE (xpi/firefox-i18n-28.0b2/da.xpi) = 346221
+SHA256 (xpi/firefox-i18n-28.0b2/de.xpi) = f93ea52074f1b7fcaba9c92464da94a6f3d1ef143d6b1b74eb4c3e2160a547ba
+SIZE (xpi/firefox-i18n-28.0b2/de.xpi) = 350191
+SHA256 (xpi/firefox-i18n-28.0b2/el.xpi) = 8e07597d6ce81c0a9b38b5dc2b0bc54e31c5be7cffbb937f29018502ff1fe8f4
+SIZE (xpi/firefox-i18n-28.0b2/el.xpi) = 386921
+SHA256 (xpi/firefox-i18n-28.0b2/en-GB.xpi) = c86a01cb9cdb2201e52475f009a6ef8ac08e0b02b02943ba36fc7a5a91214f7a
+SIZE (xpi/firefox-i18n-28.0b2/en-GB.xpi) = 340359
+SHA256 (xpi/firefox-i18n-28.0b2/en-US.xpi) = 76830a251859b641caa437f92c5372b9f8bb4217286d9254167c0c02dfcc1678
+SIZE (xpi/firefox-i18n-28.0b2/en-US.xpi) = 343398
+SHA256 (xpi/firefox-i18n-28.0b2/en-ZA.xpi) = dcdfeabba2c572dedd80c31daa14862287e8f906a049122adea8a4cb6a1ca45f
+SIZE (xpi/firefox-i18n-28.0b2/en-ZA.xpi) = 335613
+SHA256 (xpi/firefox-i18n-28.0b2/eo.xpi) = e238e1a166e25686efcc9b10ebac6982ef488b23d9e09a2c6659fa7adf02513b
+SIZE (xpi/firefox-i18n-28.0b2/eo.xpi) = 359247
+SHA256 (xpi/firefox-i18n-28.0b2/es-AR.xpi) = 4d6b909181daefb511b21e9700001a589300daa0c93b9bd6e97c9c57c537882e
+SIZE (xpi/firefox-i18n-28.0b2/es-AR.xpi) = 357326
+SHA256 (xpi/firefox-i18n-28.0b2/es-CL.xpi) = e80e5cb855e928590e76e8d09d2aca207c94739e790401ab5a31e033ac3ae874
+SIZE (xpi/firefox-i18n-28.0b2/es-CL.xpi) = 307249
+SHA256 (xpi/firefox-i18n-28.0b2/es-ES.xpi) = f415ea8c0264318d64f2c23ab8557433ecad7c6bb920afb7eb093e82c04560f6
+SIZE (xpi/firefox-i18n-28.0b2/es-ES.xpi) = 295154
+SHA256 (xpi/firefox-i18n-28.0b2/es-MX.xpi) = 018bfbcd7b4628d9c34240c4f16157ab2b05bed5b984de9a2d0321d81e7a0e56
+SIZE (xpi/firefox-i18n-28.0b2/es-MX.xpi) = 359355
+SHA256 (xpi/firefox-i18n-28.0b2/et.xpi) = 6c4adf9a3bf7487fbfefe16e0a8eeabe12c2fb293af590c07cead6f146a03a98
+SIZE (xpi/firefox-i18n-28.0b2/et.xpi) = 345631
+SHA256 (xpi/firefox-i18n-28.0b2/eu.xpi) = 0edcd61a5861109a0223771aa1754b0be2f520fcf51e4e32ff8a52afeb83b328
+SIZE (xpi/firefox-i18n-28.0b2/eu.xpi) = 358942
+SHA256 (xpi/firefox-i18n-28.0b2/fa.xpi) = c5892fbbd075c17dbe1238db7e6afa884004392e14e379401229904be5a3d05b
+SIZE (xpi/firefox-i18n-28.0b2/fa.xpi) = 399201
+SHA256 (xpi/firefox-i18n-28.0b2/ff.xpi) = e2ac2692f10c618cdc746fe4f4c659b788c848bbb42892ef1696fe4d9f568562
+SIZE (xpi/firefox-i18n-28.0b2/ff.xpi) = 351536
+SHA256 (xpi/firefox-i18n-28.0b2/fi.xpi) = 95111a96c788800a0a830f67dbb2e84fde99dd8b2fe826ff5634594e9b40b519
+SIZE (xpi/firefox-i18n-28.0b2/fi.xpi) = 350325
+SHA256 (xpi/firefox-i18n-28.0b2/fr.xpi) = d4206e655e060bee33fdbac8cfceeb39a150e307e43ec32a696863249a5c91e3
+SIZE (xpi/firefox-i18n-28.0b2/fr.xpi) = 363391
+SHA256 (xpi/firefox-i18n-28.0b2/fy-NL.xpi) = 10e7248f746ce9fa413b4c4dbb861cd7c1119f871f5c5ed796d625d7b1f50ffe
+SIZE (xpi/firefox-i18n-28.0b2/fy-NL.xpi) = 359724
+SHA256 (xpi/firefox-i18n-28.0b2/ga-IE.xpi) = 771ffbdd89aee3a23ec91c1771405491c80e6773ffd82870355b68bf7bc6640e
+SIZE (xpi/firefox-i18n-28.0b2/ga-IE.xpi) = 364856
+SHA256 (xpi/firefox-i18n-28.0b2/gd.xpi) = 0a2fde4650fc75bb9ca935e503734cc9b583a7f18c55a6d7ea5e8a5d5e38889a
+SIZE (xpi/firefox-i18n-28.0b2/gd.xpi) = 365218
+SHA256 (xpi/firefox-i18n-28.0b2/gl.xpi) = e87e33e1144948016612835264ebba069c84ad7c655dc91f0d83dd95bcf9b17e
+SIZE (xpi/firefox-i18n-28.0b2/gl.xpi) = 356139
+SHA256 (xpi/firefox-i18n-28.0b2/gu-IN.xpi) = 65fb45ca2a8ccd7fd14352c1c41720f512ed2cda133aeffcafe5f5b91ae2c1d0
+SIZE (xpi/firefox-i18n-28.0b2/gu-IN.xpi) = 381328
+SHA256 (xpi/firefox-i18n-28.0b2/he.xpi) = e326f08668eada4762f473d7ff3041393ddd62382f8a7dd5074ae3d0114c50df
+SIZE (xpi/firefox-i18n-28.0b2/he.xpi) = 377881
+SHA256 (xpi/firefox-i18n-28.0b2/hi-IN.xpi) = 43a6db554bf63938b32b3bdd306929610076e03734049471ffad461aea255b34
+SIZE (xpi/firefox-i18n-28.0b2/hi-IN.xpi) = 399892
+SHA256 (xpi/firefox-i18n-28.0b2/hr.xpi) = 21e714a9934fce895967bd7a50de68c9229559da0497b693e0ac22c0663a562f
+SIZE (xpi/firefox-i18n-28.0b2/hr.xpi) = 365918
+SHA256 (xpi/firefox-i18n-28.0b2/hu.xpi) = d483c3e4a652d82b037731d3f58e401800d78e44f8ab7a8055c38c4ddbce27d4
+SIZE (xpi/firefox-i18n-28.0b2/hu.xpi) = 365034
+SHA256 (xpi/firefox-i18n-28.0b2/hy-AM.xpi) = a5ce8dec5daf9c6f4516f471e53a68486fa81e5b71d974a2b6770889a4af0ca8
+SIZE (xpi/firefox-i18n-28.0b2/hy-AM.xpi) = 411721
+SHA256 (xpi/firefox-i18n-28.0b2/id.xpi) = b7703bfff67d4d385ea0ce0811d85dad222407cf78347c531ad6a051ebbabe1c
+SIZE (xpi/firefox-i18n-28.0b2/id.xpi) = 342616
+SHA256 (xpi/firefox-i18n-28.0b2/is.xpi) = 13266dcad5bbb9dc00f8ae3ac17f6804d762c100ad50e3114117cce89483a383
+SIZE (xpi/firefox-i18n-28.0b2/is.xpi) = 355314
+SHA256 (xpi/firefox-i18n-28.0b2/it.xpi) = 128530944ad096e530066c46c7289099254b9befade84f463906f62b6652a823
+SIZE (xpi/firefox-i18n-28.0b2/it.xpi) = 292743
+SHA256 (xpi/firefox-i18n-28.0b2/ja.xpi) = 8fd761335bf2efa4b70dd832a0e7434e7a7f6223bd7ba487f880493d54bab7c3
+SIZE (xpi/firefox-i18n-28.0b2/ja.xpi) = 397188
+SHA256 (xpi/firefox-i18n-28.0b2/kk.xpi) = a76762f785e31a8cf5d26149a678aeef851badfb56786a5bc2b62b4b4ae9dcaa
+SIZE (xpi/firefox-i18n-28.0b2/kk.xpi) = 400320
+SHA256 (xpi/firefox-i18n-28.0b2/km.xpi) = 2ebd35ba623eaf4a2cfcd6e449b38e3bca209324bc538b4fbc27ba867b474216
+SIZE (xpi/firefox-i18n-28.0b2/km.xpi) = 427924
+SHA256 (xpi/firefox-i18n-28.0b2/kn.xpi) = 2d4a6f84531cc58a262bb4a3d14350555550690c5224fcc9f511d0bd032b8dee
+SIZE (xpi/firefox-i18n-28.0b2/kn.xpi) = 411751
+SHA256 (xpi/firefox-i18n-28.0b2/ko.xpi) = 37903e4c17a97fd6cb3215eb7cfafd3670b8ace223a1bc9fcf3bd79ca50c597d
+SIZE (xpi/firefox-i18n-28.0b2/ko.xpi) = 364493
+SHA256 (xpi/firefox-i18n-28.0b2/ku.xpi) = 04c59de6b910ab3eb9a46b4320f40f879e54a977e3013d4b3cb0e560a7094a68
+SIZE (xpi/firefox-i18n-28.0b2/ku.xpi) = 378841
+SHA256 (xpi/firefox-i18n-28.0b2/lij.xpi) = 227635c91417a6fc701ae009f135d07b77486188ea07dd36efb95ee72afc69ad
+SIZE (xpi/firefox-i18n-28.0b2/lij.xpi) = 344099
+SHA256 (xpi/firefox-i18n-28.0b2/lt.xpi) = 2b73522481e67c0ceb9829f60d295b09685de67bcca6e7aad780950b79d7c3cb
+SIZE (xpi/firefox-i18n-28.0b2/lt.xpi) = 372726
+SHA256 (xpi/firefox-i18n-28.0b2/lv.xpi) = 61116e6a6f03b36ead5848cafad8f2b2b0cd53da75dfd988a241f7260deb0245
+SIZE (xpi/firefox-i18n-28.0b2/lv.xpi) = 352617
+SHA256 (xpi/firefox-i18n-28.0b2/mai.xpi) = 7114d24647137863290c5c193d85335eaab2a1048986eff62e8d3ed9a73b9bc9
+SIZE (xpi/firefox-i18n-28.0b2/mai.xpi) = 399987
+SHA256 (xpi/firefox-i18n-28.0b2/mk.xpi) = f44a4103bfb758a63a7dc3f2b763198c2cf3efe04f821aa1a65a458d3cdd74f8
+SIZE (xpi/firefox-i18n-28.0b2/mk.xpi) = 400747
+SHA256 (xpi/firefox-i18n-28.0b2/ml.xpi) = 059e3afabd5a53bfd9e6097fbd03a3acfc464b046a24a305ce522cbf87329083
+SIZE (xpi/firefox-i18n-28.0b2/ml.xpi) = 420453
+SHA256 (xpi/firefox-i18n-28.0b2/mr.xpi) = 0273d63b1e857f4446d20a4c7f930ac61c6ff4b88a371f96e06bdebd4f08815d
+SIZE (xpi/firefox-i18n-28.0b2/mr.xpi) = 400782
+SHA256 (xpi/firefox-i18n-28.0b2/nb-NO.xpi) = 0db98a9749d3158a21af1ab391e4391b769af3b0b006d73a354d3cb868625574
+SIZE (xpi/firefox-i18n-28.0b2/nb-NO.xpi) = 350402
+SHA256 (xpi/firefox-i18n-28.0b2/nl.xpi) = cdd690cf554846b1a2d4891df2be45457f9f8b2fe16c858f982c8ccfc080d362
+SIZE (xpi/firefox-i18n-28.0b2/nl.xpi) = 351559
+SHA256 (xpi/firefox-i18n-28.0b2/nn-NO.xpi) = 0696c453b5aac06c7094b77a9798835e32e27000068a5fd5676a55d7e3505de4
+SIZE (xpi/firefox-i18n-28.0b2/nn-NO.xpi) = 348405
+SHA256 (xpi/firefox-i18n-28.0b2/or.xpi) = 6d1d3e2e0cfbef6bed5c2a04aef9cc56e67518c7f86e27f1045dc946a131e0b2
+SIZE (xpi/firefox-i18n-28.0b2/or.xpi) = 413667
+SHA256 (xpi/firefox-i18n-28.0b2/pa-IN.xpi) = d9fe05c8764801b0375344894a5e861f6ca45481589ca4fa0661fc9c018a0b88
+SIZE (xpi/firefox-i18n-28.0b2/pa-IN.xpi) = 389012
+SHA256 (xpi/firefox-i18n-28.0b2/pl.xpi) = 46bd5e9745091b007c037ad1a512a79683cc60f5bb20fcb8e71dc3023f181c29
+SIZE (xpi/firefox-i18n-28.0b2/pl.xpi) = 350844
+SHA256 (xpi/firefox-i18n-28.0b2/pt-BR.xpi) = 53c916456598efafa2c09a6f12d79a4409e764ed0167f43b3b8f0ae379a637e6
+SIZE (xpi/firefox-i18n-28.0b2/pt-BR.xpi) = 359253
+SHA256 (xpi/firefox-i18n-28.0b2/pt-PT.xpi) = cb328c9f42fa4c28304956435073dadf4368d097a946ac41f61b6b1ba7e87f58
+SIZE (xpi/firefox-i18n-28.0b2/pt-PT.xpi) = 351716
+SHA256 (xpi/firefox-i18n-28.0b2/rm.xpi) = b6616481c67054488b9009010cdc388295ba6e5d41228782b6c341c05daff1c9
+SIZE (xpi/firefox-i18n-28.0b2/rm.xpi) = 352772
+SHA256 (xpi/firefox-i18n-28.0b2/ro.xpi) = 5b5fd9f764e06c044f1c09f3f7bd99c6d4bc587c0c989c45db505a00ab4b8136
+SIZE (xpi/firefox-i18n-28.0b2/ro.xpi) = 387416
+SHA256 (xpi/firefox-i18n-28.0b2/ru.xpi) = 342089681facb482b1d2c3052ec393ebe0eafabcf0e375e3834a7322086a5ce3
+SIZE (xpi/firefox-i18n-28.0b2/ru.xpi) = 338418
+SHA256 (xpi/firefox-i18n-28.0b2/si.xpi) = 3201fe2217c4a0321cbc8d8be488cdf18e0322ed12e91101dc3094fcfdad6056
+SIZE (xpi/firefox-i18n-28.0b2/si.xpi) = 395719
+SHA256 (xpi/firefox-i18n-28.0b2/sk.xpi) = 8a2c1726d25c4bb2cfb2df52df2786aeca080d316a09e3a609a51aa4943d4b99
+SIZE (xpi/firefox-i18n-28.0b2/sk.xpi) = 367793
+SHA256 (xpi/firefox-i18n-28.0b2/sl.xpi) = dac1baf16bdaefbd91f8741311cf31a53e9821017ecc05db29812a3099fae05e
+SIZE (xpi/firefox-i18n-28.0b2/sl.xpi) = 350318
+SHA256 (xpi/firefox-i18n-28.0b2/son.xpi) = 2ae46c74e06806b23903ef1d95eb24582c12be6262e5e1b8193834916db3ab9d
+SIZE (xpi/firefox-i18n-28.0b2/son.xpi) = 348056
+SHA256 (xpi/firefox-i18n-28.0b2/sq.xpi) = 8c9cb78ce1b9db9b19bc00fd841e5bc727ab74c67f13932cd8f69f35e8c18498
+SIZE (xpi/firefox-i18n-28.0b2/sq.xpi) = 365886
+SHA256 (xpi/firefox-i18n-28.0b2/sr.xpi) = a275d2d7bd53e03fcbfeca360350a6b5b268a302321bebba036529990237e0d7
+SIZE (xpi/firefox-i18n-28.0b2/sr.xpi) = 402632
+SHA256 (xpi/firefox-i18n-28.0b2/sv-SE.xpi) = 041b113dc5ec4e42830cdbaa4c3d262f57639a82151766dfcb42af17b4118a0d
+SIZE (xpi/firefox-i18n-28.0b2/sv-SE.xpi) = 355812
+SHA256 (xpi/firefox-i18n-28.0b2/ta.xpi) = 014f79713e01f3e40aad0de81ea904bd8dcd2ab52606c05a70ffda8c4189c44b
+SIZE (xpi/firefox-i18n-28.0b2/ta.xpi) = 408328
+SHA256 (xpi/firefox-i18n-28.0b2/te.xpi) = 475b3217b11b9a524bf266e0174fe2fe172d01826472cd8137503c88c2da1d7a
+SIZE (xpi/firefox-i18n-28.0b2/te.xpi) = 421142
+SHA256 (xpi/firefox-i18n-28.0b2/th.xpi) = 3248c09fa71e96c3da889d5702593b4515be4a32fceb634aa4d99537ac871978
+SIZE (xpi/firefox-i18n-28.0b2/th.xpi) = 403633
+SHA256 (xpi/firefox-i18n-28.0b2/tr.xpi) = ded4e2f4efcd59ea1ba6646568fbd78ff4d9ca6a4afb6d34195d70e30789aa0d
+SIZE (xpi/firefox-i18n-28.0b2/tr.xpi) = 362002
+SHA256 (xpi/firefox-i18n-28.0b2/uk.xpi) = 70de165e021d20d14447409bc43ab9eb5dfc6ccefbea3cdea495aa7655f56081
+SIZE (xpi/firefox-i18n-28.0b2/uk.xpi) = 385138
+SHA256 (xpi/firefox-i18n-28.0b2/vi.xpi) = ba7e1558ffd4f2a6ca27f61858e5daa981d53652d02b1dc8a10b7b458eb35495
+SIZE (xpi/firefox-i18n-28.0b2/vi.xpi) = 378860
+SHA256 (xpi/firefox-i18n-28.0b2/zh-CN.xpi) = b02c9ef48870e75f77affca75531583a86f70079491f7d2ce72d0445a0018234
+SIZE (xpi/firefox-i18n-28.0b2/zh-CN.xpi) = 379261
+SHA256 (xpi/firefox-i18n-28.0b2/zh-TW.xpi) = 9645ca2b0bc27f8f525346683c7bb353f97158ef6e32a7c1e6215d89e51bdc32
+SIZE (xpi/firefox-i18n-28.0b2/zh-TW.xpi) = 375532
+SHA256 (xpi/firefox-i18n-28.0b2/zu.xpi) = e44c57b746ebbefefe8df06090be0071b7aaf93d59acb5dfc5f914d0f0916921
+SIZE (xpi/firefox-i18n-28.0b2/zu.xpi) = 365911
Modified: trunk/www/linux-firefox/Makefile
==============================================================================
--- trunk/www/linux-firefox/Makefile Tue Feb 11 21:11:14 2014 (r1491)
+++ trunk/www/linux-firefox/Makefile Tue Feb 11 21:11:25 2014 (r1492)
@@ -2,7 +2,7 @@
# $FreeBSD: head/www/linux-firefox/Makefile 336446 2013-12-14 13:42:06Z flo $
PORTNAME= firefox
-DISTVERSION= 28.0b1
+DISTVERSION= 28.0b2
PORTEPOCH= 1
CATEGORIES= www ipv6
MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/linux-i686/en-US
Modified: trunk/www/linux-firefox/distinfo
==============================================================================
--- trunk/www/linux-firefox/distinfo Tue Feb 11 21:11:14 2014 (r1491)
+++ trunk/www/linux-firefox/distinfo Tue Feb 11 21:11:25 2014 (r1492)
@@ -1,5 +1,5 @@
-SHA256 (firefox-28.0b1.tar.bz2) = d5fb7f7a7862969195a2e776deda99a7e6508c46c691070c97d6b38ff44390fd
-SIZE (firefox-28.0b1.tar.bz2) = 31274665
+SHA256 (firefox-28.0b2.tar.bz2) = f7e3aa99730dccc7a74a4db3a6cc87251adca8d7562e3ae6796d9cd702d14570
+SIZE (firefox-28.0b2.tar.bz2) = 31227192
SHA256 (glib2-2.22.2-2.fc12.i686.rpm) = e3b459c245ec14e7248e9de4b506963a4773407f3e58835db5070d0ed02ecc99
SIZE (glib2-2.22.2-2.fc12.i686.rpm) = 1162908
SHA256 (gtk2-2.18.3-19.fc12.i686.rpm) = aea9cf7ffe9c8dae0faa2bf3d2aa1b2117c55dce03da72dcce8c268279ec0a4b
Modified: trunk/www/seamonkey/Makefile
==============================================================================
--- trunk/www/seamonkey/Makefile Tue Feb 11 21:11:14 2014 (r1491)
+++ trunk/www/seamonkey/Makefile Tue Feb 11 21:11:25 2014 (r1492)
@@ -2,7 +2,7 @@
# $FreeBSD: head/www/seamonkey/Makefile 339634 2014-01-13 21:00:02Z rene $
PORTNAME= seamonkey
-DISTVERSION= 2.24
+DISTVERSION= 2.25b1
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/
@@ -12,9 +12,10 @@
MAINTAINER= gecko@FreeBSD.org
COMMENT= The open source, standards compliant web browser
-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
@@ -23,7 +24,7 @@
LIB_DEPENDS= libv4l2.so:${PORTSDIR}/multimedia/libv4l
EM_VERSION= 1.6.1_pre20140112
-L_VERSION= 2.9b1
+L_VERSION= 3.0b1
SSP_UNSAFE= yes
USE_AUTOTOOLS= autoconf213:env
@@ -73,7 +74,7 @@
.include <bsd.port.pre.mk>
-WRKSRC= ${WRKDIR}/comm-release
+WRKSRC= ${WRKDIR}/comm-beta
MOZSRC:= ${WRKSRC}/mozilla
XPI_LIBDIR= ${PREFIX}/lib/xpi
Modified: trunk/www/seamonkey/distinfo
==============================================================================
--- trunk/www/seamonkey/distinfo Tue Feb 11 21:11:14 2014 (r1491)
+++ trunk/www/seamonkey/distinfo Tue Feb 11 21:11:25 2014 (r1492)
@@ -1,4 +1,4 @@
-SHA256 (seamonkey-2.24.source.tar.bz2) = 63855265b4754dd056af8d611b50219577a592466cdf1d3865028d86ed680474
-SIZE (seamonkey-2.24.source.tar.bz2) = 149845514
+SHA256 (seamonkey-2.25b1.source.tar.bz2) = 87fc067ca31e3aa88fea24e69d4a56a8bf8f09bbf1e40f808f7869991bb98120
+SIZE (seamonkey-2.25b1.source.tar.bz2) = 155402216
SHA256 (enigmail-1.6.1_pre20140112.tar.xz) = 2d89a9186c3ccfc9397c933c6f63c0518224fea0096d7a292dba3765de088149
SIZE (enigmail-1.6.1_pre20140112.tar.xz) = 916028
Added: trunk/www/seamonkey/files/patch-bug806917
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/www/seamonkey/files/patch-bug806917 Tue Feb 11 21:11:25 2014 (r1492)
@@ -0,0 +1,2000 @@
+commit cb40a26
+Author: Alessandro Decina <alessandro.d@gmail.com>
+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
+--- mozilla/configure.in
++++ mozilla/configure.in
+@@ -3955,6 +3955,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,60 @@ 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
++ elif test "$enableval" = "no"; then
++ MOZ_GSTREAMER=
++ 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
++++ mozilla/content/media/gstreamer/GStreamerAllocator.cpp
+@@ -0,0 +1,198 @@
++#ifdef HAVE_CONFIG_H
++#include "config.h"
++#endif
++
++#include "GStreamerAllocator.h"
++
++#include <gst/video/video.h>
++#include <gst/video/gstvideometa.h>
++
++#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<PlanarYCbCrImage*>(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)
++{
++ // check that the allocation didn't fail
++ if (mem->data == nullptr)
++ return nullptr;
++
++ 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<PlanarYCbCrImage>
++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
++++ mozilla/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<layers::PlanarYCbCrImage> 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
+--- mozilla/content/media/gstreamer/GStreamerFormatHelper.cpp
++++ mozilla/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
+--- mozilla/content/media/gstreamer/GStreamerFunctionList.h
++++ mozilla/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
+--- mozilla/content/media/gstreamer/GStreamerLoader.cpp
++++ mozilla/content/media/gstreamer/GStreamerLoader.cpp
+@@ -6,13 +6,21 @@
+ #include <dlfcn.h>
+ #include <stdio.h>
+
+-#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
+--- mozilla/content/media/gstreamer/GStreamerLoader.h
++++ mozilla/content/media/gstreamer/GStreamerLoader.h
+@@ -22,6 +22,11 @@
+ #include <gst/video/video.h>
+ #pragma GCC diagnostic pop
+
++#if GST_VERSION_MAJOR == 1
++#include <gst/video/gstvideometa.h>
++#include <gst/video/gstvideopool.h>
++#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
++++ mozilla/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<GStreamerReader*>(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<PlanarYCbCrImage> image;
++ return AllocateVideoBufferFull(aPad, aOffset, aSize, aCaps, aBuf, image);
++}
++
++GstFlowReturn GStreamerReader::AllocateVideoBufferFull(GstPad* aPad,
++ guint64 aOffset,
++ guint aSize,
++ GstCaps* aCaps,
++ GstBuffer** aBuf,
++ nsRefPtr<PlanarYCbCrImage>& aImage)
++{
++ /* allocate an image using the container */
++ ImageContainer* container = mDecoder->GetImageContainer();
++ ImageFormat format = PLANAR_YCBCR;
++ PlanarYCbCrImage* img = reinterpret_cast<PlanarYCbCrImage*>(container->CreateImage(&format, 1).get());
++ nsRefPtr<PlanarYCbCrImage> 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<GStreamerReader*>(aUserData);
++ return reader->EventProbe(aPad, aEvent);
++}
++
++nsRefPtr<PlanarYCbCrImage> GStreamerReader::GetImageFromBuffer(GstBuffer* aBuffer)
++{
++ if (!GST_IS_MOZ_VIDEO_BUFFER (aBuffer))
++ return nullptr;
++
++ nsRefPtr<PlanarYCbCrImage> image;
++ GstMozVideoBufferData* bufferdata = reinterpret_cast<GstMozVideoBufferData*>(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<PlanarYCbCrImage> &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
+--- mozilla/content/media/gstreamer/GStreamerReader.cpp
++++ mozilla/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,14 @@ 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;
++// Let the demuxer work in pull mode for short files. This used to be a micro
++// optimization to have more accurate durations for ogg files in mochitests.
++// Since as of today we aren't using gstreamer to demux ogg, and having demuxers
++// work in pull mode over http makes them slower (since they really assume
++// near-zero latency in pull mode) set the constant to 0 for now, which
++// effectively disables it.
++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 +62,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 +78,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 +92,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 +121,59 @@ 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)
+ {
+- 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;
+- }
++ GStreamerFormatHelper::Instance();
++
++#if GST_VERSION_MAJOR >= 1
++ mAllocator = static_cast<GstAllocator*>(g_object_new(GST_TYPE_MOZ_GFX_MEMORY_ALLOCATOR, nullptr));
++ moz_gfx_memory_allocator_set_reader(mAllocator, this);
++
++ mBufferPool = static_cast<GstBufferPool*>(g_object_new(GST_TYPE_MOZ_GFX_BUFFER_POOL, nullptr));
++#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);
++ InstallPadCallbacks();
+
+ g_object_set(mPlayBin, "uri", "appsrc://",
+ "video-sink", mVideoSink,
+@@ -316,13 +323,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 +350,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 +366,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 +389,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 +397,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 +428,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, nullptr);
++#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 +446,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 +489,11 @@ nsresult GStreamerReader::CheckSupportedFormats()
+ }
+ }
+
++#if GST_VERSION_MAJOR >= 1
++ g_value_unset (&value);
++#else
+ gst_object_unref(element);
++#endif
+ done = unsupported;
+ break;
+ }
+@@ -475,6 +517,8 @@ nsresult GStreamerReader::ResetDecode()
+ {
+ nsresult res = NS_OK;
+
++ LOG(PR_LOG_DEBUG, ("reset decode"));
++
+ if (NS_FAILED(MediaDecoderReader::ResetDecode())) {
+ res = NS_ERROR_FAILURE;
+ }
+@@ -485,6 +529,11 @@ nsresult GStreamerReader::ResetDecode()
+ mVideoSinkBufferCount = 0;
+ mAudioSinkBufferCount = 0;
+ mReachedEos = false;
++#if GST_VERSION_MAJOR >= 1
++ mConfigureAlignment = true;
++#endif
++
++ LOG(PR_LOG_DEBUG, ("reset decode done"));
+
+ return res;
+ }
+@@ -508,11 +557,11 @@ bool GStreamerReader::DecodeAudioData()
+ /* We have nothing decoded so it makes no sense to return to the state machine
+ * as it will call us back immediately, we'll return again and so on, wasting
+ * CPU cycles for no job done. So, block here until there is either video or
+- * audio data available
++ * audio data available
+ */
+ mon.Wait();
+ if (!mAudioSinkBufferCount) {
+- /* There is still no audio data available, so either there is video data or
++ /* There is still no audio data available, so either there is video data or
+ * something else has happened (Eos, etc...). Return to the state machine
+ * to process it.
+ */
+@@ -524,24 +573,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_t>(size / sizeof(AudioDataValue));
+ nsAutoArrayPtr<AudioDataValue> 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);
+
+@@ -552,7 +620,7 @@ bool GStreamerReader::DecodeAudioData()
+ }
+
+ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip,
+- int64_t aTimeThreshold)
++ int64_t aTimeThreshold)
+ {
+ NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread.");
+
+@@ -571,11 +639,11 @@ bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip,
+ /* We have nothing decoded so it makes no sense to return to the state machine
+ * as it will call us back immediately, we'll return again and so on, wasting
+ * CPU cycles for no job done. So, block here until there is either video or
+- * audio data available
++ * audio data available
+ */
+ mon.Wait();
+ if (!mVideoSinkBufferCount) {
+- /* There is still no video data available, so either there is audio data or
++ /* There is still no video data available, so either there is audio data or
+ * something else has happened (Eos, etc...). Return to the state machine
+ * to process it
+ */
+@@ -589,11 +657,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 +683,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 +703,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<PlanarYCbCrImage> image;
+- GstMozVideoBufferData* bufferdata = reinterpret_cast<GstMozVideoBufferData*>
+- 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<PlanarYCbCrImage> 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*>(image.get()),
++ isKeyframe, -1, mPicture);
+ mVideoQueue.Push(video);
++
+ gst_buffer_unref(buffer);
+
+ return true;
+@@ -698,6 +755,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 +770,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<MediaByteRange> ranges;
+ resource->GetCachedRanges(ranges);
+@@ -731,12 +794,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 +827,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<char*>(data + bytesRead),
+@@ -766,14 +844,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 +869,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 +954,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<GStreamerReader*>(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<PlanarYCbCrImage>& aImage)
+-{
+- /* allocate an image using the container */
+- ImageContainer* container = mDecoder->GetImageContainer();
+- ImageFormat format = PLANAR_YCBCR;
+- PlanarYCbCrImage* img = reinterpret_cast<PlanarYCbCrImage*>(container->CreateImage(&format, 1).get());
+- nsRefPtr<PlanarYCbCrImage> 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<GStreamerReader*>(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<PlanarYCbCrImage> image;
+- return AllocateVideoBufferFull(aPad, aOffset, aSize, aCaps, aBuf, image);
+-}
+-
+ GstFlowReturn GStreamerReader::NewPrerollCb(GstAppSink* aSink,
+ gpointer aUserData)
+ {
+@@ -979,8 +970,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 +993,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 +1033,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 +1100,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, nullptr);
++
++ 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<GStreamerReader*>(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, nullptr);
++ gst_query_add_allocation_pool(query, mBufferPool, info.size, 0, 0);
++ gst_query_add_allocation_meta(query, GST_VIDEO_META_API_TYPE, nullptr);
++ 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<PlanarYCbCrImage> GStreamerReader::GetImageFromBuffer(GstBuffer* aBuffer)
++{
++ nsRefPtr<PlanarYCbCrImage> 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<PlanarYCbCrImage> &image)
++{
++ *aOutBuffer = gst_buffer_new_allocate(mAllocator, gst_buffer_get_size(aBuffer), nullptr);
++ 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
+--- mozilla/content/media/gstreamer/GStreamerReader.h
++++ mozilla/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<layers::PlanarYCbCrImage> GetImageFromBuffer(GstBuffer* aBuffer);
++ void CopyIntoImageBuffer(GstBuffer *aBuffer, GstBuffer** aOutBuffer, nsRefPtr<layers::PlanarYCbCrImage> &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<layers::PlanarYCbCrImage>& 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
+--- mozilla/content/media/gstreamer/moz.build
++++ mozilla/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
+--- mozilla/content/media/test/manifest.js
++++ mozilla/content/media/test/manifest.js
+@@ -357,9 +357,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/seamonkey/files/patch-bug810716
==============================================================================
--- trunk/www/seamonkey/files/patch-bug810716 Tue Feb 11 21:11:25 2014 (r1491)
+++ /dev/null 00:00:00 1970 (deleted)
@@ -1,68 +0,0 @@
-diff --git configure.in configure.in
-index 2084be9..eb6eeb2 100644
---- mozilla/configure.in
-+++ mozilla/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 <sys/types.h>
-+ #include <netinet/in.h>
-+ #include <arpa/nameser.h>
- #include <resolv.h>
-- ],
-- [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
---- mozilla/extensions/auth/nsAuthGSSAPI.cpp
-+++ mozilla/extensions/auth/nsAuthGSSAPI.cpp
-@@ -39,6 +39,9 @@ typedef KLStatus (*KLCacheHasValidTickets_type)(
- #endif
-
- #if defined(HAVE_RES_NINIT)
-+#include <sys/types.h>
-+#include <netinet/in.h>
-+#include <arpa/nameser.h>
- #include <resolv.h>
- #endif
-
-diff --git js/src/configure.in js/src/configure.in
-index e25f569..b9722f9 100644
---- mozilla/js/src/configure.in
-+++ mozilla/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 <sys/types.h>
-+ #include <netinet/in.h>
-+ #include <arpa/nameser.h>
- #include <resolv.h>
-- ],
-- [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/seamonkey/files/patch-bug826985
==============================================================================
--- trunk/www/seamonkey/files/patch-bug826985 Tue Feb 11 21:11:14 2014 (r1491)
+++ trunk/www/seamonkey/files/patch-bug826985 Tue Feb 11 21:11:25 2014 (r1492)
@@ -42,9 +42,9 @@
--- mozilla/media/webrtc/signaling/test/Makefile.in
+++ mozilla/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
--- mozilla/media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc
+++ mozilla/media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc
-@@ -26,11 +26,23 @@
+@@ -25,10 +25,21 @@
#else
#include <linux/videodev2.h>
#endif
@@ -61,9 +61,8 @@
+#include <libv4l2.h>
+#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
--- mozilla/toolkit/library/Makefile.in
+++ mozilla/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/seamonkey/files/patch-bug945046
==============================================================================
--- trunk/www/seamonkey/files/patch-bug945046 Tue Feb 11 21:11:25 2014 (r1491)
+++ /dev/null 00:00:00 1970 (deleted)
@@ -1,160 +0,0 @@
-diff --git config/system-headers config/system-headers
-index 432cba6..18a9627 100644
---- mozilla/config/system-headers
-+++ mozilla/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
---- mozilla/js/src/config/system-headers
-+++ mozilla/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
---- mozilla/toolkit/library/Makefile.in
-+++ mozilla/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
---- mozilla/xpcom/base/nsMemoryReporterManager.cpp
-+++ mozilla/xpcom/base/nsMemoryReporterManager.cpp
-@@ -204,6 +204,61 @@ ResidentFastDistinguishedAmount(int64_t* aN)
- return ResidentDistinguishedAmount(aN);
- }
-
-+#ifdef __FreeBSD__
-+#include <libutil.h>
-+#include <algorithm>
-+
-+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 <procfs.h>
-@@ -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_<PLATFORM>
-+
-+#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_<PLATFORM>
-+#endif
-
- #ifdef HAVE_VSIZE_AND_RESIDENT_REPORTERS
- class VsizeReporter MOZ_FINAL : public MemoryUniReporter
Deleted: trunk/www/seamonkey/files/patch-bug946560
==============================================================================
--- trunk/www/seamonkey/files/patch-bug946560 Tue Feb 11 21:11:25 2014 (r1491)
+++ /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
---- mozilla/xpcom/base/nsMemoryInfoDumper.cpp
-+++ mozilla/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 <unistd.h>
- #endif
-
--#ifdef XP_LINUX
-+#if defined(XP_LINUX) || defined(__FreeBSD__)
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
-@@ -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
---- mozilla/xpcom/base/nsMemoryReporterManager.cpp
-+++ mozilla/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
-
Modified: trunk/www/seamonkey/files/patch-bug970031
==============================================================================
--- trunk/www/seamonkey/files/patch-bug970031 Tue Feb 11 21:11:14 2014 (r1491)
+++ trunk/www/seamonkey/files/patch-bug970031 Tue Feb 11 21:11:25 2014 (r1492)
@@ -2,12 +2,12 @@
index 5f88066..bd2a94f 100644
--- mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build
+++ mozilla/xpcom/reflect/xptcall/src/md/unix/moz.build
-@@ -222,7 +222,7 @@ if CONFIG['OS_ARCH'] == 'OpenBSD' and CO
+@@ -256,7 +256,7 @@ if CONFIG['OS_ARCH'] == 'OpenBSD' and CONFIG['OS_TEST'] == 'sparc':
'xptcstubs_sparc_openbsd.cpp',
]
-if CONFIG['OS_ARCH'] == 'OpenBSD' and CONFIG['OS_TEST'] == 'sparc64':
+if CONFIG['OS_ARCH'] in ('OpenBSD', 'FreeBSD') and CONFIG['OS_TEST'] == 'sparc64':
SOURCES += [
+ 'xptcinvoke_asm_sparc64_openbsd.s',
'xptcinvoke_sparc64_openbsd.cpp',
- 'xptcstubs_sparc64_openbsd.cpp',
Added: trunk/www/seamonkey/files/patch-mozilla-extensions
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/www/seamonkey/files/patch-mozilla-extensions Tue Feb 11 21:11:25 2014 (r1492)
@@ -0,0 +1,42 @@
+# JAR_MANIFESTS cannot be defined before sm2.26 or without bug 774572
+
+--- mozilla/extensions/inspector/moz.build~
++++ mozilla/extensions/inspector/moz.build
+@@ -10,5 +10,3 @@ DIRS += [
+
+ XPI_NAME = 'inspector'
+ export('XPI_NAME')
+-
+-JAR_MANIFESTS += ['jar.mn']
+--- mozilla/extensions/irc/ff/moz.build~
++++ mozilla/extensions/irc/ff/moz.build
+@@ -2,5 +2,3 @@
+ # 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/.
+-
+-JAR_MANIFESTS += ['jar.mn']
+--- mozilla/extensions/irc/moz.build~
++++ mozilla/extensions/irc/moz.build
+@@ -12,5 +12,3 @@ CONFIGURE_SUBST_FILES += ['locales/Makef
+
+ XPI_NAME = 'chatzilla'
+ export('XPI_NAME')
+-
+-JAR_MANIFESTS += ['jar.mn']
+--- mozilla/extensions/irc/sm/moz.build~
++++ mozilla/extensions/irc/sm/moz.build
+@@ -2,5 +2,3 @@
+ # 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/.
+-
+-JAR_MANIFESTS += ['jar.mn']
+--- mozilla/extensions/venkman/resources/moz.build~
++++ mozilla/extensions/venkman/resources/moz.build
+@@ -2,5 +2,3 @@
+ # 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/.
+-
+-JAR_MANIFESTS += ['jar.mn']
Added: trunk/www/seamonkey/files/patch-mozilla-js-src-Makefile.in
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/www/seamonkey/files/patch-mozilla-js-src-Makefile.in Tue Feb 11 21:11:25 2014 (r1492)
@@ -0,0 +1,11 @@
+--- mozilla/js/src/Makefile.in~
++++ mozilla/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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201402112111.s1BLBP3P052107>
