From owner-freebsd-gecko@FreeBSD.ORG Tue Feb 11 21:11:33 2014 Return-Path: Delivered-To: freebsd-gecko@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 546FBB44 for ; Tue, 11 Feb 2014 21:11:33 +0000 (UTC) Received: from trillian.chruetertee.ch (trillian.chruetertee.ch [217.150.244.247]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 6FC7712BC for ; Tue, 11 Feb 2014 21:11:32 +0000 (UTC) Received: from trillian.chruetertee.ch (trillian [217.150.244.247]) by trillian.chruetertee.ch (8.14.4/8.14.3) with ESMTP id s1BLBU4n054637 for ; Tue, 11 Feb 2014 21:11:30 GMT (envelope-from svn-freebsd-gecko@chruetertee.ch) Received: (from www@localhost) by trillian.chruetertee.ch (8.14.4/8.14.3/Submit) id s1BLBP3P052107 for freebsd-gecko@freebsd.org; Tue, 11 Feb 2014 21:11:25 GMT (envelope-from svn-freebsd-gecko@chruetertee.ch) Date: Tue, 11 Feb 2014 21:11:25 GMT Message-Id: <201402112111.s1BLBP3P052107@trillian.chruetertee.ch> X-Authentication-Warning: trillian.chruetertee.ch: www set sender to svn-freebsd-gecko@chruetertee.ch using -f From: svn-freebsd-gecko@chruetertee.ch To: freebsd-gecko@freebsd.org Subject: [SVN-Commit] r1492 - in trunk: Mk www/firefox-i18n www/linux-firefox www/seamonkey www/seamonkey/files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list Reply-To: freebsd-gecko@freebsd.org List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Feb 2014 21:11:33 -0000 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 -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 +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 ++#include ++ ++#include "GStreamerLoader.h" ++ ++using namespace mozilla::layers; ++ ++namespace mozilla { ++ ++typedef struct ++{ ++ GstAllocator parent; ++ GStreamerReader *reader; ++} MozGfxMemoryAllocator; ++ ++typedef struct ++{ ++ GstAllocatorClass parent; ++} MozGfxMemoryAllocatorClass; ++ ++typedef struct ++{ ++ GstMemory memory; ++ PlanarYCbCrImage* image; ++ guint8* data; ++} MozGfxMemory; ++ ++typedef struct ++{ ++ GstMeta meta; ++} MozGfxMeta; ++ ++typedef struct ++{ ++ GstVideoBufferPoolClass parent_class; ++} MozGfxBufferPoolClass; ++ ++typedef struct ++{ ++ GstVideoBufferPool pool; ++} MozGfxBufferPool; ++ ++G_DEFINE_TYPE(MozGfxMemoryAllocator, moz_gfx_memory_allocator, GST_TYPE_ALLOCATOR); ++G_DEFINE_TYPE(MozGfxBufferPool, moz_gfx_buffer_pool, GST_TYPE_VIDEO_BUFFER_POOL); ++ ++void ++moz_gfx_memory_reset(MozGfxMemory *mem) ++{ ++ if (mem->image) ++ mem->image->Release(); ++ ++ ImageContainer* container = ((MozGfxMemoryAllocator*) mem->memory.allocator)->reader->GetImageContainer(); ++ ImageFormat format = PLANAR_YCBCR; ++ mem->image = reinterpret_cast(container->CreateImage(&format, 1).get()); ++ mem->data = mem->image->AllocateAndGetNewBuffer(mem->memory.size); ++} ++ ++static GstMemory* ++moz_gfx_memory_allocator_alloc(GstAllocator* aAllocator, gsize aSize, ++ GstAllocationParams* aParams) ++{ ++ MozGfxMemory* mem = g_slice_new (MozGfxMemory); ++ gsize maxsize = aSize + aParams->prefix + aParams->padding; ++ gst_memory_init(GST_MEMORY_CAST (mem), ++ (GstMemoryFlags)aParams->flags, ++ aAllocator, NULL, maxsize, aParams->align, ++ aParams->prefix, aSize); ++ mem->image = NULL; ++ moz_gfx_memory_reset(mem); ++ ++ return (GstMemory *) mem; ++} ++ ++static void ++moz_gfx_memory_allocator_free (GstAllocator * allocator, GstMemory * gmem) ++{ ++ MozGfxMemory *mem = (MozGfxMemory *) gmem; ++ ++ if (mem->memory.parent) ++ goto sub_mem; ++ ++ if (mem->image) ++ mem->image->Release(); ++ ++sub_mem: ++ g_slice_free (MozGfxMemory, mem); ++} ++ ++static gpointer ++moz_gfx_memory_map (MozGfxMemory * mem, gsize maxsize, GstMapFlags flags) ++{ ++ // 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 ++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 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 + #include + +-#include "GStreamerLoader.h" ++#include "nsDebug.h" + #include "mozilla/NullPtr.h" + ++#include "GStreamerLoader.h" ++ + #define LIBGSTREAMER 0 + #define LIBGSTAPP 1 + #define LIBGSTVIDEO 2 + ++#ifdef __OpenBSD__ ++#define LIB_GST_SUFFIX ".so" ++#else ++#define LIB_GST_SUFFIX ".so.0" ++#endif ++ + namespace mozilla { + + /* +@@ -32,6 +40,11 @@ namespace mozilla { + GstBuffer * gst_buffer_ref_impl(GstBuffer *buf); + void gst_buffer_unref_impl(GstBuffer *buf); + void gst_message_unref_impl(GstMessage *msg); ++void gst_caps_unref_impl(GstCaps *caps); ++ ++#if GST_VERSION_MAJOR == 1 ++void gst_sample_unref_impl(GstSample *sample); ++#endif + + bool + load_gstreamer() +@@ -58,32 +71,25 @@ load_gstreamer() + if (major == GST_VERSION_MAJOR && minor == GST_VERSION_MINOR) { + gstreamerLib = RTLD_DEFAULT; + } else { +-#ifdef __OpenBSD__ +- gstreamerLib = dlopen("libgstreamer-0.10.so", RTLD_NOW | RTLD_LOCAL); +-#else +- gstreamerLib = dlopen("libgstreamer-0.10.so.0", RTLD_NOW | RTLD_LOCAL); +-#endif ++ gstreamerLib = dlopen("libgstreamer-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL); + } + +- void *handles[] = { ++ void *handles[3] = { + gstreamerLib, +-#ifdef __OpenBSD__ +- dlopen("libgstapp-0.10.so", RTLD_NOW | RTLD_LOCAL), +- dlopen("libgstvideo-0.10.so", RTLD_NOW | RTLD_LOCAL) +-#else +- dlopen("libgstapp-0.10.so.0", RTLD_NOW | RTLD_LOCAL), +- dlopen("libgstvideo-0.10.so.0", RTLD_NOW | RTLD_LOCAL) +-#endif ++ dlopen("libgstapp-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL), ++ dlopen("libgstvideo-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL) + }; + + for (size_t i = 0; i < sizeof(handles) / sizeof(handles[0]); i++) { + if (!handles[i]) { ++ NS_WARNING("Couldn't link gstreamer libraries"); + goto fail; + } + } + + #define GST_FUNC(lib, symbol) \ + if (!(symbol = (typeof(symbol))dlsym(handles[lib], #symbol))) { \ ++ NS_WARNING("Couldn't link symbol " #symbol); \ + goto fail; \ + } + #define REPLACE_FUNC(symbol) symbol = symbol##_impl; +@@ -123,4 +129,18 @@ gst_message_unref_impl(GstMessage *msg) + gst_mini_object_unref(GST_MINI_OBJECT_CAST(msg)); + } + ++#if GST_VERSION_MAJOR == 1 ++void ++gst_sample_unref_impl(GstSample *sample) ++{ ++ gst_mini_object_unref(GST_MINI_OBJECT_CAST(sample)); ++} ++#endif ++ ++void ++gst_caps_unref_impl(GstCaps *caps) ++{ ++ gst_mini_object_unref(GST_MINI_OBJECT_CAST(caps)); ++} ++ + } +diff --git content/media/gstreamer/GStreamerLoader.h content/media/gstreamer/GStreamerLoader.h +index 2d801722..cd7fe6d 100644 +--- mozilla/content/media/gstreamer/GStreamerLoader.h ++++ mozilla/content/media/gstreamer/GStreamerLoader.h +@@ -22,6 +22,11 @@ + #include + #pragma GCC diagnostic pop + ++#if GST_VERSION_MAJOR == 1 ++#include ++#include ++#endif ++ + namespace mozilla { + + /* +@@ -42,4 +47,7 @@ bool load_gstreamer(); + + } + ++#undef GST_CAPS_ANY ++#define GST_CAPS_ANY (*_gst_caps_any) ++ + #endif // GStreamerLoader_h_ +diff --git content/media/gstreamer/GStreamerReader-0.10.cpp content/media/gstreamer/GStreamerReader-0.10.cpp +new file mode 100644 +index 0000000..fb98bde +--- /dev/null ++++ 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(gst_pad_get_element_private(aPad)); ++ return reader->AllocateVideoBuffer(aPad, aOffset, aSize, aCaps, aBuf); ++} ++ ++GstFlowReturn GStreamerReader::AllocateVideoBuffer(GstPad* aPad, ++ guint64 aOffset, ++ guint aSize, ++ GstCaps* aCaps, ++ GstBuffer** aBuf) ++{ ++ nsRefPtr image; ++ return AllocateVideoBufferFull(aPad, aOffset, aSize, aCaps, aBuf, image); ++} ++ ++GstFlowReturn GStreamerReader::AllocateVideoBufferFull(GstPad* aPad, ++ guint64 aOffset, ++ guint aSize, ++ GstCaps* aCaps, ++ GstBuffer** aBuf, ++ nsRefPtr& aImage) ++{ ++ /* allocate an image using the container */ ++ ImageContainer* container = mDecoder->GetImageContainer(); ++ ImageFormat format = PLANAR_YCBCR; ++ PlanarYCbCrImage* img = reinterpret_cast(container->CreateImage(&format, 1).get()); ++ nsRefPtr image = dont_AddRef(img); ++ ++ /* prepare a GstBuffer pointing to the underlying PlanarYCbCrImage buffer */ ++ GstBuffer* buf = GST_BUFFER(gst_moz_video_buffer_new()); ++ GST_BUFFER_SIZE(buf) = aSize; ++ /* allocate the actual YUV buffer */ ++ GST_BUFFER_DATA(buf) = image->AllocateAndGetNewBuffer(aSize); ++ ++ aImage = image; ++ ++ /* create a GstMozVideoBufferData to hold the image */ ++ GstMozVideoBufferData* bufferdata = new GstMozVideoBufferData(image); ++ ++ /* Attach bufferdata to our GstMozVideoBuffer, it will take care to free it */ ++ gst_moz_video_buffer_set_data(GST_MOZ_VIDEO_BUFFER(buf), bufferdata); ++ ++ *aBuf = buf; ++ return GST_FLOW_OK; ++} ++ ++gboolean GStreamerReader::EventProbe(GstPad* aPad, GstEvent* aEvent) ++{ ++ GstElement* parent = GST_ELEMENT(gst_pad_get_parent(aPad)); ++ switch(GST_EVENT_TYPE(aEvent)) { ++ case GST_EVENT_NEWSEGMENT: ++ { ++ gboolean update; ++ gdouble rate; ++ GstFormat format; ++ gint64 start, stop, position; ++ GstSegment* segment; ++ ++ /* Store the segments so we can convert timestamps to stream time, which ++ * is what the upper layers sync on. ++ */ ++ ReentrantMonitorAutoEnter mon(mGstThreadsMonitor); ++ gst_event_parse_new_segment(aEvent, &update, &rate, &format, ++ &start, &stop, &position); ++ if (parent == GST_ELEMENT(mVideoAppSink)) ++ segment = &mVideoSegment; ++ else ++ segment = &mAudioSegment; ++ gst_segment_set_newsegment(segment, update, rate, format, ++ start, stop, position); ++ break; ++ } ++ case GST_EVENT_FLUSH_STOP: ++ /* Reset on seeks */ ++ ResetDecode(); ++ break; ++ default: ++ break; ++ } ++ gst_object_unref(parent); ++ ++ return TRUE; ++} ++ ++gboolean GStreamerReader::EventProbeCb(GstPad* aPad, ++ GstEvent* aEvent, ++ gpointer aUserData) ++{ ++ GStreamerReader* reader = reinterpret_cast(aUserData); ++ return reader->EventProbe(aPad, aEvent); ++} ++ ++nsRefPtr GStreamerReader::GetImageFromBuffer(GstBuffer* aBuffer) ++{ ++ if (!GST_IS_MOZ_VIDEO_BUFFER (aBuffer)) ++ return nullptr; ++ ++ nsRefPtr image; ++ GstMozVideoBufferData* bufferdata = reinterpret_cast(gst_moz_video_buffer_get_data(GST_MOZ_VIDEO_BUFFER(aBuffer))); ++ image = bufferdata->mImage; ++ ++ PlanarYCbCrImage::Data data; ++ data.mPicX = data.mPicY = 0; ++ data.mPicSize = nsIntSize(mPicture.width, mPicture.height); ++ data.mStereoMode = STEREO_MODE_MONO; ++ ++ data.mYChannel = GST_BUFFER_DATA(aBuffer); ++ data.mYStride = gst_video_format_get_row_stride(mFormat, 0, mPicture.width); ++ data.mYSize = nsIntSize(data.mYStride, ++ gst_video_format_get_component_height(mFormat, 0, mPicture.height)); ++ data.mYSkip = 0; ++ data.mCbCrStride = gst_video_format_get_row_stride(mFormat, 1, mPicture.width); ++ data.mCbCrSize = nsIntSize(data.mCbCrStride, ++ gst_video_format_get_component_height(mFormat, 1, mPicture.height)); ++ data.mCbChannel = data.mYChannel + gst_video_format_get_component_offset(mFormat, 1, ++ mPicture.width, mPicture.height); ++ data.mCrChannel = data.mYChannel + gst_video_format_get_component_offset(mFormat, 2, ++ mPicture.width, mPicture.height); ++ data.mCbSkip = 0; ++ data.mCrSkip = 0; ++ ++ image->SetDataNoCopy(data); ++ ++ return image; ++} ++ ++void GStreamerReader::CopyIntoImageBuffer(GstBuffer* aBuffer, ++ GstBuffer** aOutBuffer, ++ nsRefPtr &aImage) ++{ ++ AllocateVideoBufferFull(nullptr, GST_BUFFER_OFFSET(aBuffer), ++ GST_BUFFER_SIZE(aBuffer), nullptr, aOutBuffer, aImage); ++ ++ gst_buffer_copy_metadata(*aOutBuffer, aBuffer, (GstBufferCopyFlags)GST_BUFFER_COPY_ALL); ++ memcpy(GST_BUFFER_DATA(*aOutBuffer), GST_BUFFER_DATA(aBuffer), GST_BUFFER_SIZE(*aOutBuffer)); ++ ++ aImage = GetImageFromBuffer(*aOutBuffer); ++} ++ ++GstCaps* GStreamerReader::BuildAudioSinkCaps() ++{ ++ GstCaps* caps; ++#ifdef IS_LITTLE_ENDIAN ++ int endianness = 1234; ++#else ++ int endianness = 4321; ++#endif ++ gint width; ++#ifdef MOZ_SAMPLE_TYPE_FLOAT32 ++ caps = gst_caps_from_string("audio/x-raw-float, channels={1,2}"); ++ width = 32; ++#else /* !MOZ_SAMPLE_TYPE_FLOAT32 */ ++ caps = gst_caps_from_string("audio/x-raw-int, channels={1,2}"); ++ width = 16; ++#endif ++ gst_caps_set_simple(caps, ++ "width", G_TYPE_INT, width, ++ "endianness", G_TYPE_INT, endianness, ++ NULL); ++ ++ return caps; ++} ++ ++void GStreamerReader::InstallPadCallbacks() ++{ ++ GstPad* sinkpad = gst_element_get_static_pad(GST_ELEMENT(mVideoAppSink), "sink"); ++ gst_pad_add_event_probe(sinkpad, ++ G_CALLBACK(&GStreamerReader::EventProbeCb), this); ++ ++ gst_pad_set_bufferalloc_function(sinkpad, GStreamerReader::AllocateVideoBufferCb); ++ gst_pad_set_element_private(sinkpad, this); ++ gst_object_unref(sinkpad); ++ ++ sinkpad = gst_element_get_static_pad(GST_ELEMENT(mAudioAppSink), "sink"); ++ gst_pad_add_event_probe(sinkpad, ++ G_CALLBACK(&GStreamerReader::EventProbeCb), this); ++ gst_object_unref(sinkpad); ++} +diff --git content/media/gstreamer/GStreamerReader.cpp content/media/gstreamer/GStreamerReader.cpp +index 2be45dc..54509e3 100644 +--- 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(g_object_new(GST_TYPE_MOZ_GFX_MEMORY_ALLOCATOR, nullptr)); ++ moz_gfx_memory_allocator_set_reader(mAllocator, this); ++ ++ mBufferPool = static_cast(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 / sizeof(AudioDataValue)); + nsAutoArrayPtr data(new AudioDataValue[outSize]); ++#if GST_VERSION_MAJOR >= 1 ++ memcpy(data, info.data, info.size); ++ gst_buffer_unmap(buffer, &info); ++#else + memcpy(data, GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE(buffer)); ++#endif + AudioData* audio = new AudioData(offset, timestamp, duration, + frames, data.forget(), mInfo.mAudio.mChannels); + +@@ -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 image; +- GstMozVideoBufferData* bufferdata = reinterpret_cast +- GST_IS_MOZ_VIDEO_BUFFER(buffer)?gst_moz_video_buffer_get_data(GST_MOZ_VIDEO_BUFFER(buffer)):nullptr; +- +- if(bufferdata) +- image = bufferdata->mImage; ++#if GST_VERSION_MAJOR >= 1 ++ if (mConfigureAlignment && buffer->pool) { ++ GstStructure *config = gst_buffer_pool_get_config(buffer->pool); ++ GstVideoAlignment align; ++ if (gst_buffer_pool_config_get_video_alignment(config, &align)) ++ gst_video_info_align(&mVideoInfo, &align); ++ gst_structure_free(config); ++ mConfigureAlignment = false; ++ } ++#endif + ++ nsRefPtr image = GetImageFromBuffer(buffer); + if (!image) { + /* Ugh, upstream is not calling gst_pad_alloc_buffer(). Fallback to + * allocating a PlanarYCbCrImage backed GstBuffer here and memcpy. + */ + GstBuffer* tmp = nullptr; +- AllocateVideoBufferFull(nullptr, GST_BUFFER_OFFSET(buffer), +- GST_BUFFER_SIZE(buffer), nullptr, &tmp, image); +- +- /* copy */ +- gst_buffer_copy_metadata(tmp, buffer, (GstBufferCopyFlags)GST_BUFFER_COPY_ALL); +- memcpy(GST_BUFFER_DATA(tmp), GST_BUFFER_DATA(buffer), +- GST_BUFFER_SIZE(tmp)); ++ CopyIntoImageBuffer(buffer, &tmp, image); + gst_buffer_unref(buffer); + buffer = tmp; + } + +- guint8* data = GST_BUFFER_DATA(buffer); +- +- int width = mPicture.width; +- int height = mPicture.height; +- GstVideoFormat format = mFormat; +- +- VideoData::YCbCrBuffer b; +- for(int i = 0; i < 3; i++) { +- b.mPlanes[i].mData = data + gst_video_format_get_component_offset(format, i, +- width, height); +- b.mPlanes[i].mStride = gst_video_format_get_row_stride(format, i, width); +- b.mPlanes[i].mHeight = gst_video_format_get_component_height(format, +- i, height); +- b.mPlanes[i].mWidth = gst_video_format_get_component_width(format, +- i, width); +- b.mPlanes[i].mOffset = 0; +- b.mPlanes[i].mSkip = 0; +- } +- +- isKeyframe = !GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT); + int64_t offset = mDecoder->GetResource()->Tell(); // Estimate location in media. +- VideoData* video = VideoData::Create(mInfo.mVideo, image, offset, +- timestamp, duration, b, +- isKeyframe, -1, mPicture); ++ VideoData* video = VideoData::CreateFromImage(mInfo.mVideo, ++ mDecoder->GetImageContainer(), ++ offset, timestamp, duration, ++ static_cast(image.get()), ++ isKeyframe, -1, mPicture); + mVideoQueue.Push(video); ++ + gst_buffer_unref(buffer); + + return true; +@@ -698,6 +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 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(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(aUserData); +- return reader->EventProbe(aPad, aEvent); +-} +- +-gboolean GStreamerReader::EventProbe(GstPad* aPad, GstEvent* aEvent) +-{ +- GstElement* parent = GST_ELEMENT(gst_pad_get_parent(aPad)); +- switch(GST_EVENT_TYPE(aEvent)) { +- case GST_EVENT_NEWSEGMENT: +- { +- gboolean update; +- gdouble rate; +- GstFormat format; +- gint64 start, stop, position; +- GstSegment* segment; +- +- /* Store the segments so we can convert timestamps to stream time, which +- * is what the upper layers sync on. +- */ +- ReentrantMonitorAutoEnter mon(mGstThreadsMonitor); +- gst_event_parse_new_segment(aEvent, &update, &rate, &format, +- &start, &stop, &position); +- if (parent == GST_ELEMENT(mVideoAppSink)) +- segment = &mVideoSegment; +- else +- segment = &mAudioSegment; +- gst_segment_set_newsegment(segment, update, rate, format, +- start, stop, position); +- break; +- } +- case GST_EVENT_FLUSH_STOP: +- /* Reset on seeks */ +- ResetDecode(); +- break; +- default: +- break; +- } +- gst_object_unref(parent); +- +- return TRUE; +-} +- +-GstFlowReturn GStreamerReader::AllocateVideoBufferFull(GstPad* aPad, +- guint64 aOffset, +- guint aSize, +- GstCaps* aCaps, +- GstBuffer** aBuf, +- nsRefPtr& aImage) +-{ +- /* allocate an image using the container */ +- ImageContainer* container = mDecoder->GetImageContainer(); +- ImageFormat format = PLANAR_YCBCR; +- PlanarYCbCrImage* img = reinterpret_cast(container->CreateImage(&format, 1).get()); +- nsRefPtr image = dont_AddRef(img); +- +- /* prepare a GstBuffer pointing to the underlying PlanarYCbCrImage buffer */ +- GstBuffer* buf = GST_BUFFER(gst_moz_video_buffer_new()); +- GST_BUFFER_SIZE(buf) = aSize; +- /* allocate the actual YUV buffer */ +- GST_BUFFER_DATA(buf) = image->AllocateAndGetNewBuffer(aSize); +- +- aImage = image; +- +- /* create a GstMozVideoBufferData to hold the image */ +- GstMozVideoBufferData* bufferdata = new GstMozVideoBufferData(image); +- +- /* Attach bufferdata to our GstMozVideoBuffer, it will take care to free it */ +- gst_moz_video_buffer_set_data(GST_MOZ_VIDEO_BUFFER(buf), bufferdata); +- +- *aBuf = buf; +- return GST_FLOW_OK; +-} +- +-GstFlowReturn GStreamerReader::AllocateVideoBufferCb(GstPad* aPad, +- guint64 aOffset, +- guint aSize, +- GstCaps* aCaps, +- GstBuffer** aBuf) +-{ +- GStreamerReader* reader = reinterpret_cast(gst_pad_get_element_private(aPad)); +- return reader->AllocateVideoBuffer(aPad, aOffset, aSize, aCaps, aBuf); +-} +- +-GstFlowReturn GStreamerReader::AllocateVideoBuffer(GstPad* aPad, +- guint64 aOffset, +- guint aSize, +- GstCaps* aCaps, +- GstBuffer** aBuf) +-{ +- nsRefPtr image; +- return AllocateVideoBufferFull(aPad, aOffset, aSize, aCaps, aBuf, image); +-} +- + GstFlowReturn GStreamerReader::NewPrerollCb(GstAppSink* aSink, + gpointer aUserData) + { +@@ -979,8 +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(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 GStreamerReader::GetImageFromBuffer(GstBuffer* aBuffer) ++{ ++ nsRefPtr image = nullptr; ++ ++ if (gst_buffer_n_memory(aBuffer) == 1) { ++ GstMemory* mem = gst_buffer_peek_memory(aBuffer, 0); ++ if (GST_IS_MOZ_GFX_MEMORY_ALLOCATOR(mem->allocator)) { ++ image = moz_gfx_memory_get_image(mem); ++ ++ GstVideoFrame frame; ++ gst_video_frame_map(&frame, &mVideoInfo, aBuffer, GST_MAP_READ); ++ PlanarYCbCrImage::Data data; ++ ImageDataFromVideoFrame(&frame, &data); ++ image->SetDataNoCopy(data); ++ gst_video_frame_unmap(&frame); ++ } ++ } ++ ++ return image; ++} ++ ++void GStreamerReader::CopyIntoImageBuffer(GstBuffer* aBuffer, ++ GstBuffer** aOutBuffer, ++ nsRefPtr &image) ++{ ++ *aOutBuffer = gst_buffer_new_allocate(mAllocator, gst_buffer_get_size(aBuffer), 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 GetImageFromBuffer(GstBuffer* aBuffer); ++ void CopyIntoImageBuffer(GstBuffer *aBuffer, GstBuffer** aOutBuffer, nsRefPtr &image); ++ GstCaps* BuildAudioSinkCaps(); ++ void InstallPadCallbacks(); ++ ++#if GST_VERSION_MAJOR >= 1 ++ void ImageDataFromVideoFrame(GstVideoFrame *aFrame, layers::PlanarYCbCrImage::Data *aData); ++#endif + + /* Called once the pipeline is setup to check that the stream only contains + * supported formats +@@ -105,20 +112,31 @@ private: + gboolean SeekData(GstAppSrc* aSrc, guint64 aOffset); + + /* Called when events reach the sinks. See inline comments */ ++#if GST_VERSION_MAJOR == 1 ++ static GstPadProbeReturn EventProbeCb(GstPad *aPad, GstPadProbeInfo *aInfo, gpointer aUserData); ++ GstPadProbeReturn EventProbe(GstPad *aPad, GstEvent *aEvent); ++#else + static gboolean EventProbeCb(GstPad* aPad, GstEvent* aEvent, gpointer aUserData); + gboolean EventProbe(GstPad* aPad, GstEvent* aEvent); ++#endif + +- /* Called when elements in the video branch of the pipeline call +- * gst_pad_alloc_buffer(). Used to provide PlanarYCbCrImage backed GstBuffers +- * to the pipeline so that a memory copy can be avoided when handling YUV +- * buffers from the pipeline to the gfx side. ++ /* Called when the video part of the pipeline allocates buffers. Used to ++ * provide PlanarYCbCrImage backed GstBuffers to the pipeline so that a memory ++ * copy can be avoided when handling YUV buffers from the pipeline to the gfx ++ * side. + */ ++#if GST_VERSION_MAJOR == 1 ++ static GstPadProbeReturn QueryProbeCb(GstPad *aPad, GstPadProbeInfo *aInfo, gpointer aUserData); ++ GstPadProbeReturn QueryProbe(GstPad *aPad, GstPadProbeInfo *aInfo, gpointer aUserData); ++#else + static GstFlowReturn AllocateVideoBufferCb(GstPad* aPad, guint64 aOffset, guint aSize, + GstCaps* aCaps, GstBuffer** aBuf); + GstFlowReturn AllocateVideoBufferFull(GstPad* aPad, guint64 aOffset, guint aSize, + GstCaps* aCaps, GstBuffer** aBuf, nsRefPtr& aImage); + GstFlowReturn AllocateVideoBuffer(GstPad* aPad, guint64 aOffset, guint aSize, + GstCaps* aCaps, GstBuffer** aBuf); ++#endif ++ + + /* Called when the pipeline is prerolled, that is when at start or after a + * seek, the first audio and video buffers are queued in the sinks. +@@ -150,6 +168,11 @@ private: + bool mUseParserDuration; + int64_t mLastParserDuration; + ++#if GST_VERSION_MAJOR >= 1 ++ GstAllocator *mAllocator; ++ GstBufferPool *mBufferPool; ++ GstVideoInfo mVideoInfo; ++#endif + GstElement* mPlayBin; + GstBus* mBus; + GstAppSrc* mSource; +@@ -180,6 +203,9 @@ private: + * DecodeAudioData and DecodeVideoFrame should not expect any more data + */ + bool mReachedEos; ++#if GST_VERSION_MAJOR >= 1 ++ bool mConfigureAlignment; ++#endif + int fpsNum; + int fpsDen; + }; +diff --git content/media/gstreamer/moz.build content/media/gstreamer/moz.build +index 7d51bf5..a3c1856 100644 +--- 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 -+ #include -+ #include - #include -- ], -- [int foo = res_ninit(&_res);], -+ int main(int argc, char **argv){ -+ int foo = res_ninit(&_res); -+ }], - [ac_cv_func_res_ninit=yes], -+ [ac_cv_func_res_ninit=no], - [ac_cv_func_res_ninit=no]) - ]) - -diff --git extensions/auth/nsAuthGSSAPI.cpp extensions/auth/nsAuthGSSAPI.cpp -index e828beb..6444246 100644 ---- 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 -+#include -+#include - #include - #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 -+ #include -+ #include - #include -- ], -- [int foo = res_ninit(&_res);], -+ int main(int argc, char **argv){ -+ int foo = res_ninit(&_res); -+ }], - [ac_cv_func_res_ninit=yes], -+ [ac_cv_func_res_ninit=no], - [ac_cv_func_res_ninit=no]) - ]) - Modified: trunk/www/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 #endif @@ -61,9 +61,8 @@ +#include +#endif - #include "ref_count.h" - #include "trace.h" - + #include "webrtc/system_wrappers/interface/ref_count.h" + #include "webrtc/system_wrappers/interface/trace.h" +#ifdef HAVE_LIBV4L2 +#define open v4l2_open @@ -73,10 +72,9 @@ +#define mmap v4l2_mmap +#define munmap v4l2_munmap +#endif -+ + namespace webrtc { - namespace videocapturemodule @@ -130,6 +142,11 @@ WebRtc_Word32 DeviceInfoLinux::GetDeviceName( memset(deviceNameUTF8, 0, deviceNameLength); memcpy(cameraName, cap.card, sizeof(cap.card)); @@ -154,11 +152,11 @@ index 9c16ffa..1db3794 100644 --- 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 -+#include -+ -+static nsresult -+GetKinfoVmentrySelf(int64_t* prss, uint64_t* maxreg) -+{ -+ int cnt; -+ struct kinfo_vmentry *vmmap, *kve; -+ if ((vmmap = kinfo_getvmmap(getpid(), &cnt)) == NULL) -+ return NS_ERROR_FAILURE; -+ -+ if (prss) -+ *prss = 0; -+ if (maxreg) -+ *maxreg = 0; -+ -+ for (int i = 0; i < cnt; i++) { -+ kve = &vmmap[i]; -+ if (prss) -+ *prss += kve->kve_private_resident; -+ if (maxreg) -+ *maxreg = std::max(*maxreg, -+ kve->kve_end - kve->kve_start); -+ } -+ -+ free(vmmap); -+ return NS_OK; -+} -+ -+#define HAVE_PRIVATE_REPORTER -+static nsresult -+PrivateDistinguishedAmount(int64_t* aN) -+{ -+ int64_t priv; -+ nsresult rv = GetKinfoVmentrySelf(&priv, NULL); -+ if (NS_SUCCEEDED(rv)) -+ *aN = priv * getpagesize(); -+ -+ return NS_OK; -+} -+ -+#define HAVE_VSIZE_MAX_CONTIGUOUS_REPORTER 1 -+static nsresult -+VsizeMaxContiguousDistinguishedAmount(int64_t* aN) -+{ -+ uint64_t biggestRegion; -+ nsresult rv = GetKinfoVmentrySelf(NULL, &biggestRegion); -+ if (NS_SUCCEEDED(rv)) -+ *aN = biggestRegion; -+ -+ return NS_OK; -+} -+#endif // FreeBSD -+ - #elif defined(SOLARIS) - - #include -@@ -416,6 +470,25 @@ VsizeMaxContiguousDistinguishedAmount(int64_t* aN) - return NS_OK; - } - -+#define HAVE_PRIVATE_REPORTER -+static nsresult -+PrivateDistinguishedAmount(int64_t* aN) -+{ -+ PROCESS_MEMORY_COUNTERS_EX pmcex; -+ pmcex.cb = sizeof(PROCESS_MEMORY_COUNTERS_EX); -+ -+ if (!GetProcessMemoryInfo( -+ GetCurrentProcess(), -+ (PPROCESS_MEMORY_COUNTERS) &pmcex, sizeof(pmcex))) { -+ return NS_ERROR_FAILURE; -+ } -+ -+ *aN = pmcex.PrivateUsage; -+ return NS_OK; -+} -+#endif // XP_ -+ -+#ifdef HAVE_VSIZE_MAX_CONTIGUOUS_REPORTER - class VsizeMaxContiguousReporter MOZ_FINAL : public MemoryUniReporter - { - public: -@@ -429,8 +502,9 @@ public: - return VsizeMaxContiguousDistinguishedAmount(aAmount); - } - }; -+#endif - --#define HAVE_PRIVATE_REPORTER -+#ifdef HAVE_PRIVATE_REPORTER - class PrivateReporter MOZ_FINAL : public MemoryUniReporter - { - public: -@@ -443,21 +517,10 @@ public: - - NS_IMETHOD GetAmount(int64_t* aAmount) - { -- PROCESS_MEMORY_COUNTERS_EX pmcex; -- pmcex.cb = sizeof(PROCESS_MEMORY_COUNTERS_EX); -- -- if (!GetProcessMemoryInfo( -- GetCurrentProcess(), -- (PPROCESS_MEMORY_COUNTERS) &pmcex, sizeof(pmcex))) { -- return NS_ERROR_FAILURE; -- } -- -- *aAmount = pmcex.PrivateUsage; -- return NS_OK; -+ return PrivateDistinguishedAmount(aAmount); - } - }; -- --#endif // XP_ -+#endif - - #ifdef HAVE_VSIZE_AND_RESIDENT_REPORTERS - class VsizeReporter MOZ_FINAL : public MemoryUniReporter Deleted: trunk/www/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 - #endif - --#ifdef XP_LINUX -+#if defined(XP_LINUX) || defined(__FreeBSD__) - #include - #include - #include -@@ -110,7 +110,7 @@ private: - - } // anonymous namespace - --#ifdef XP_LINUX // { -+#if defined(XP_LINUX) || defined(__FreeBSD__) // { - namespace { - - /* -@@ -552,7 +552,7 @@ nsMemoryInfoDumper::~nsMemoryInfoDumper() - /* static */ void - nsMemoryInfoDumper::Initialize() - { --#ifdef XP_LINUX -+#if defined(XP_LINUX) || defined(__FreeBSD__) - SignalPipeWatcher::Create(); - FifoWatcher::MaybeCreate(); - #endif -diff --git xpcom/base/nsMemoryReporterManager.cpp xpcom/base/nsMemoryReporterManager.cpp -index 1252e27..6f22093 100644 ---- 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