From owner-freebsd-gecko@FreeBSD.ORG Fri Feb 14 06:30:39 2014 Return-Path: Delivered-To: freebsd-gecko@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id CEDDF955 for ; Fri, 14 Feb 2014 06:30:39 +0000 (UTC) Received: from trillian.chruetertee.ch (trillian.chruetertee.ch [217.150.244.247]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id C86BB1470 for ; Fri, 14 Feb 2014 06:30:38 +0000 (UTC) Received: from trillian.chruetertee.ch (trillian [217.150.244.247]) by trillian.chruetertee.ch (8.14.4/8.14.3) with ESMTP id s1E6UTF2021701 for ; Fri, 14 Feb 2014 06:30:29 GMT (envelope-from svn-freebsd-gecko@chruetertee.ch) Received: (from www@localhost) by trillian.chruetertee.ch (8.14.4/8.14.3/Submit) id s1E6UOkC018826 for freebsd-gecko@freebsd.org; Fri, 14 Feb 2014 06:30:24 GMT (envelope-from svn-freebsd-gecko@chruetertee.ch) Date: Fri, 14 Feb 2014 06:30:24 GMT Message-Id: <201402140630.s1E6UOkC018826@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] r1496 - in trunk/www: firefox firefox-i18n firefox-nightly firefox-nightly/files firefox/files linux-firefox linux-seamonkey seamonkey-i18n MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: freebsd-gecko@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list Reply-To: freebsd-gecko@freebsd.org List-Id: Gecko Rendering Engine issues List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Feb 2014 06:30:39 -0000 Author: jbeich Date: Fri Feb 14 06:30:24 2014 New Revision: 1496 Log: update Deleted: trunk/www/firefox-nightly/files/patch-bug806917 trunk/www/firefox/files/patch-bug970031 Modified: trunk/www/firefox-i18n/Makefile trunk/www/firefox-i18n/distinfo trunk/www/firefox-nightly/Makefile.hgrev trunk/www/firefox-nightly/distinfo trunk/www/firefox/Makefile trunk/www/firefox/distinfo trunk/www/linux-firefox/Makefile trunk/www/linux-firefox/distinfo trunk/www/linux-seamonkey/Makefile trunk/www/linux-seamonkey/distinfo trunk/www/seamonkey-i18n/Makefile trunk/www/seamonkey-i18n/distinfo Modified: trunk/www/firefox-i18n/Makefile ============================================================================== --- trunk/www/firefox-i18n/Makefile Thu Feb 13 06:31:24 2014 (r1495) +++ trunk/www/firefox-i18n/Makefile Fri Feb 14 06:30:24 2014 (r1496) @@ -2,7 +2,7 @@ # $FreeBSD: head/www/firefox-i18n/Makefile 336446 2013-12-14 13:42:06Z flo $ PORTNAME= firefox-i18n -PORTVERSION= 28.0b2 +PORTVERSION= 28.0b3 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 Thu Feb 13 06:31:24 2014 (r1495) +++ trunk/www/firefox-i18n/distinfo Fri Feb 14 06:30:24 2014 (r1496) @@ -1,170 +1,170 @@ -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 +SHA256 (xpi/firefox-i18n-28.0b3/ach.xpi) = 4ce4b328d6df33b29e623b6405abab255a815116112c372b1b356242b731af4e +SIZE (xpi/firefox-i18n-28.0b3/ach.xpi) = 363208 +SHA256 (xpi/firefox-i18n-28.0b3/af.xpi) = ab1759682ede0badcfb525c79115335587377d31d92ac2e6dba324aebbaa8d9f +SIZE (xpi/firefox-i18n-28.0b3/af.xpi) = 357086 +SHA256 (xpi/firefox-i18n-28.0b3/ar.xpi) = f18266673236af6f50f1303ce449d06ff903dafcbcfe5b46fbc1c5cb205d80c9 +SIZE (xpi/firefox-i18n-28.0b3/ar.xpi) = 386471 +SHA256 (xpi/firefox-i18n-28.0b3/as.xpi) = 9c5c94047132cc6ca3fc6012e0eb01921c9775b6bcf9ea2b4bf87dd86af75e0e +SIZE (xpi/firefox-i18n-28.0b3/as.xpi) = 404108 +SHA256 (xpi/firefox-i18n-28.0b3/ast.xpi) = 3739bb56b4d95fec0a28ed99d30a9023197e11d61c105b3c5b593bc3ccf99e60 +SIZE (xpi/firefox-i18n-28.0b3/ast.xpi) = 313719 +SHA256 (xpi/firefox-i18n-28.0b3/be.xpi) = f02d2ae5fd61572074385c1467c59cd390cc1ad3811a579b4b16fdbcfb1ff6a6 +SIZE (xpi/firefox-i18n-28.0b3/be.xpi) = 342306 +SHA256 (xpi/firefox-i18n-28.0b3/bg.xpi) = e548ae2887092fb7b2c0d2a9d6058cff3969178b10aa6a4b959ad63d31ff66d0 +SIZE (xpi/firefox-i18n-28.0b3/bg.xpi) = 393205 +SHA256 (xpi/firefox-i18n-28.0b3/bn-BD.xpi) = ba3c078ce5c60f3cd85c3323163506c88c454e519f652783c4028645b64e02b4 +SIZE (xpi/firefox-i18n-28.0b3/bn-BD.xpi) = 416037 +SHA256 (xpi/firefox-i18n-28.0b3/bn-IN.xpi) = e817c14df429f2725c823d5f9dba864dc7f2026a4da06127dc1c471f4f89304c +SIZE (xpi/firefox-i18n-28.0b3/bn-IN.xpi) = 411038 +SHA256 (xpi/firefox-i18n-28.0b3/br.xpi) = 644c2a8abcb0bf62ef3c5e228c1b2331c0372aef7b97b793c1260c8ce8de7929 +SIZE (xpi/firefox-i18n-28.0b3/br.xpi) = 353934 +SHA256 (xpi/firefox-i18n-28.0b3/bs.xpi) = e82cc9e8016e8f6b05e99eab567d18abae95daac224cfa484b5c604aa06489ee +SIZE (xpi/firefox-i18n-28.0b3/bs.xpi) = 363405 +SHA256 (xpi/firefox-i18n-28.0b3/ca.xpi) = acda62b146e154e57b35e53eb64904006b9e7f26f20cce2927c403687911b532 +SIZE (xpi/firefox-i18n-28.0b3/ca.xpi) = 360465 +SHA256 (xpi/firefox-i18n-28.0b3/cs.xpi) = b472cd8e41822b4d083fc97e339f23b61e2f7a2d8cce7d52a3c72a338c202998 +SIZE (xpi/firefox-i18n-28.0b3/cs.xpi) = 356819 +SHA256 (xpi/firefox-i18n-28.0b3/csb.xpi) = edbafb9c7527f4d74092eb07205d797e042bb620dcf8aea07cbbe7fd14caa5ca +SIZE (xpi/firefox-i18n-28.0b3/csb.xpi) = 347623 +SHA256 (xpi/firefox-i18n-28.0b3/cy.xpi) = f885803793694ef7b3522063bbf97b4dce2ff44d761a247554ec68c2f34fd09b +SIZE (xpi/firefox-i18n-28.0b3/cy.xpi) = 354722 +SHA256 (xpi/firefox-i18n-28.0b3/da.xpi) = fed5455b2f6006c0ecd67241415df12c5837198a1957c0648673e880a7976674 +SIZE (xpi/firefox-i18n-28.0b3/da.xpi) = 346221 +SHA256 (xpi/firefox-i18n-28.0b3/de.xpi) = 2914c129d6ccba5fe21fa4987e9a20bb43e6f0a4a12b3f33a21da2fa370ee6ad +SIZE (xpi/firefox-i18n-28.0b3/de.xpi) = 350191 +SHA256 (xpi/firefox-i18n-28.0b3/el.xpi) = 86586226f872001074f9a61b17a81890f3f1a1fd9ff928789b17f6753c50ad9b +SIZE (xpi/firefox-i18n-28.0b3/el.xpi) = 386921 +SHA256 (xpi/firefox-i18n-28.0b3/en-GB.xpi) = 3d563af9a0ddc8d887532b76c44f091590e956cc8fbd13a6c4b0b76f46e806ca +SIZE (xpi/firefox-i18n-28.0b3/en-GB.xpi) = 340359 +SHA256 (xpi/firefox-i18n-28.0b3/en-US.xpi) = cd30d73815fe4fa67b89b48b39f1ddef2633a663fccf81a829d5edb45e774b0f +SIZE (xpi/firefox-i18n-28.0b3/en-US.xpi) = 343398 +SHA256 (xpi/firefox-i18n-28.0b3/en-ZA.xpi) = 5bf13a069b16668496728d948768f3efcf267d4ef494c3336888557ed26d978d +SIZE (xpi/firefox-i18n-28.0b3/en-ZA.xpi) = 335613 +SHA256 (xpi/firefox-i18n-28.0b3/eo.xpi) = 0bbe25329947f02e201de9545d69cedadda7d1cfb6b0173703c119634deac48b +SIZE (xpi/firefox-i18n-28.0b3/eo.xpi) = 359247 +SHA256 (xpi/firefox-i18n-28.0b3/es-AR.xpi) = a27857302d96cf3160f240f26ef0c0ee0e89d1144a022f63866366cb6461e19c +SIZE (xpi/firefox-i18n-28.0b3/es-AR.xpi) = 357326 +SHA256 (xpi/firefox-i18n-28.0b3/es-CL.xpi) = a17637d533ba21a837ade998397ea54a273d37a3d83515039accc1ffc0eea520 +SIZE (xpi/firefox-i18n-28.0b3/es-CL.xpi) = 307249 +SHA256 (xpi/firefox-i18n-28.0b3/es-ES.xpi) = c137e0d803e791dafeaa0eba92953bc59d6b8484a3e5be582b55b3e15d9e0375 +SIZE (xpi/firefox-i18n-28.0b3/es-ES.xpi) = 295154 +SHA256 (xpi/firefox-i18n-28.0b3/es-MX.xpi) = 16fd3e2cf8c0200d3d3295fcd56f0876587a8234a9d94f199c863fb0c7ea9e7f +SIZE (xpi/firefox-i18n-28.0b3/es-MX.xpi) = 359355 +SHA256 (xpi/firefox-i18n-28.0b3/et.xpi) = fc5576ee2ec05860014a75c85f8e5778c1ce7d93e3d7f822eee41f4305b2ef3b +SIZE (xpi/firefox-i18n-28.0b3/et.xpi) = 345631 +SHA256 (xpi/firefox-i18n-28.0b3/eu.xpi) = bdee2019df1d529aee4f54c3caf17d0b39a097554090f610283d9d6f518fc79c +SIZE (xpi/firefox-i18n-28.0b3/eu.xpi) = 358942 +SHA256 (xpi/firefox-i18n-28.0b3/fa.xpi) = b8b25f22bce3c5b244388819b800e3c37b81e38cf3dc0494db3499d263ed434d +SIZE (xpi/firefox-i18n-28.0b3/fa.xpi) = 399201 +SHA256 (xpi/firefox-i18n-28.0b3/ff.xpi) = b907844d75b6d47cfed33400a16c5f33dfc3c99963c089dbc1ee00a4894329c1 +SIZE (xpi/firefox-i18n-28.0b3/ff.xpi) = 351536 +SHA256 (xpi/firefox-i18n-28.0b3/fi.xpi) = 8bfed2a71a4bcd7371ce3baf76996f5f3d51e53d9fe865e74a4ec66564fdda5e +SIZE (xpi/firefox-i18n-28.0b3/fi.xpi) = 350325 +SHA256 (xpi/firefox-i18n-28.0b3/fr.xpi) = 75481664cee3c5528e25468897166c2f8e579229d1462ac26519c2cd32ff24cf +SIZE (xpi/firefox-i18n-28.0b3/fr.xpi) = 363391 +SHA256 (xpi/firefox-i18n-28.0b3/fy-NL.xpi) = 960324f09542ee50bef154c50a314cefe4f8dc0ad12472e0ed835223a8da2506 +SIZE (xpi/firefox-i18n-28.0b3/fy-NL.xpi) = 359724 +SHA256 (xpi/firefox-i18n-28.0b3/ga-IE.xpi) = b4859791bd397a357c0c651277cec8cf7fe10aec39a4292072e388fd09771530 +SIZE (xpi/firefox-i18n-28.0b3/ga-IE.xpi) = 364856 +SHA256 (xpi/firefox-i18n-28.0b3/gd.xpi) = 48ba275942376560869c0dd91dda6181441c51253431b3893e6df637c6960f50 +SIZE (xpi/firefox-i18n-28.0b3/gd.xpi) = 365218 +SHA256 (xpi/firefox-i18n-28.0b3/gl.xpi) = 79bd206ced4a9fecea430e1799c196f8123ffce1fd0fc476e8bc5f063b950bc0 +SIZE (xpi/firefox-i18n-28.0b3/gl.xpi) = 356139 +SHA256 (xpi/firefox-i18n-28.0b3/gu-IN.xpi) = d9197396cc8b841736b7ddd7f0850df56fca475410df6ba2fb884e98c1b427ab +SIZE (xpi/firefox-i18n-28.0b3/gu-IN.xpi) = 381328 +SHA256 (xpi/firefox-i18n-28.0b3/he.xpi) = 4f0f003ad4ba680b487567008002cf10f17786ebcd4276a0a8ea39cf05a74b67 +SIZE (xpi/firefox-i18n-28.0b3/he.xpi) = 377881 +SHA256 (xpi/firefox-i18n-28.0b3/hi-IN.xpi) = 8a145afde59ca0055e537fd5d2cd16ce4b295371464dc79de412199e50ee43fd +SIZE (xpi/firefox-i18n-28.0b3/hi-IN.xpi) = 399892 +SHA256 (xpi/firefox-i18n-28.0b3/hr.xpi) = 18d65ac9d9c1ee3e65158c8e62e7ce4df3b8cc430fa2501e0d94cf496b28d4da +SIZE (xpi/firefox-i18n-28.0b3/hr.xpi) = 365918 +SHA256 (xpi/firefox-i18n-28.0b3/hu.xpi) = 81801923e50fb4851211da4f5af3ddc85efe61e56a9ff8dd79c951317b070903 +SIZE (xpi/firefox-i18n-28.0b3/hu.xpi) = 365034 +SHA256 (xpi/firefox-i18n-28.0b3/hy-AM.xpi) = 3ec5e7206f72dd37c7b88f53465ce5a0e06aab44a5f8db4933927affd9694471 +SIZE (xpi/firefox-i18n-28.0b3/hy-AM.xpi) = 411721 +SHA256 (xpi/firefox-i18n-28.0b3/id.xpi) = 078d0268732ae76aa458c3872b87c24d1a97076ad75f70824f057fddc1c4b8e3 +SIZE (xpi/firefox-i18n-28.0b3/id.xpi) = 342616 +SHA256 (xpi/firefox-i18n-28.0b3/is.xpi) = 00abdf161a7e0d43d9c9b20edd7315c885e2c3ee55627eab5edd6112ef145f64 +SIZE (xpi/firefox-i18n-28.0b3/is.xpi) = 355314 +SHA256 (xpi/firefox-i18n-28.0b3/it.xpi) = ad091da8b85a769644338199b5641ab5512dc67704446449d7871848d26dea4d +SIZE (xpi/firefox-i18n-28.0b3/it.xpi) = 292743 +SHA256 (xpi/firefox-i18n-28.0b3/ja.xpi) = b237140860da06cdf1ab2629702772c48a9227c60bde265c05fe65dbb4a1fc75 +SIZE (xpi/firefox-i18n-28.0b3/ja.xpi) = 397188 +SHA256 (xpi/firefox-i18n-28.0b3/kk.xpi) = d8497c6d50d7061f1dc55ed436f81a58b2409a81242453e00e24895e5bf78b42 +SIZE (xpi/firefox-i18n-28.0b3/kk.xpi) = 400320 +SHA256 (xpi/firefox-i18n-28.0b3/km.xpi) = 1e6bc9a85c5030103da94ed1ae589cc7fc4f72ca550a6510712dcc9603ee9856 +SIZE (xpi/firefox-i18n-28.0b3/km.xpi) = 427924 +SHA256 (xpi/firefox-i18n-28.0b3/kn.xpi) = d2aab8e901aa4c66b3350a6b9ddaa05f6059bd150497a552c459f164443358e4 +SIZE (xpi/firefox-i18n-28.0b3/kn.xpi) = 411751 +SHA256 (xpi/firefox-i18n-28.0b3/ko.xpi) = 8faf5fe789b206f5ddc56076d91a5f7665ba0d94ec96309a8fc52fb31a32c284 +SIZE (xpi/firefox-i18n-28.0b3/ko.xpi) = 364493 +SHA256 (xpi/firefox-i18n-28.0b3/ku.xpi) = eb67408ab5b223bfb417b9d23309afa57ebca245ec008f97dc227f62c8645c9f +SIZE (xpi/firefox-i18n-28.0b3/ku.xpi) = 378841 +SHA256 (xpi/firefox-i18n-28.0b3/lij.xpi) = 85c1b300dfb343d37311125e4cfeaf8e52a7ee12f04942ca90c579d3f7420f8a +SIZE (xpi/firefox-i18n-28.0b3/lij.xpi) = 344099 +SHA256 (xpi/firefox-i18n-28.0b3/lt.xpi) = 63b5ce2a990d38e45b6cc2ad3d0f5e7507771f6f9ac1331c2212264a87b80328 +SIZE (xpi/firefox-i18n-28.0b3/lt.xpi) = 372726 +SHA256 (xpi/firefox-i18n-28.0b3/lv.xpi) = 4bf38c07f80dbb72fa9de078658ac904498653b2f7afe4674298b3f443ea41d7 +SIZE (xpi/firefox-i18n-28.0b3/lv.xpi) = 352617 +SHA256 (xpi/firefox-i18n-28.0b3/mai.xpi) = bf1cb94ba1479489e56e384fccd40b7b320bb3f32bf7d7f3b015fca31ea26278 +SIZE (xpi/firefox-i18n-28.0b3/mai.xpi) = 399987 +SHA256 (xpi/firefox-i18n-28.0b3/mk.xpi) = 434435926aba9e3b3691742319b2e64b1da94765163afde4158d1100d83f47ce +SIZE (xpi/firefox-i18n-28.0b3/mk.xpi) = 400747 +SHA256 (xpi/firefox-i18n-28.0b3/ml.xpi) = 101a322be7cdcd84da7ff3ed68623097beb374d4b8dcbd555689bbf5a621d88c +SIZE (xpi/firefox-i18n-28.0b3/ml.xpi) = 420453 +SHA256 (xpi/firefox-i18n-28.0b3/mr.xpi) = 302477a761e34e17b307ccb0da406c0edc7e60fb25d64cc9755c45ec337c5419 +SIZE (xpi/firefox-i18n-28.0b3/mr.xpi) = 400782 +SHA256 (xpi/firefox-i18n-28.0b3/nb-NO.xpi) = a823c2c637773b8ccdb2782d317ae97cfb5e5adadacbe7440989158c27fef696 +SIZE (xpi/firefox-i18n-28.0b3/nb-NO.xpi) = 350402 +SHA256 (xpi/firefox-i18n-28.0b3/nl.xpi) = dc5f89ed758c8f274989e1e6f18bf043b0ac7d5900a19550088e37ead590c262 +SIZE (xpi/firefox-i18n-28.0b3/nl.xpi) = 351559 +SHA256 (xpi/firefox-i18n-28.0b3/nn-NO.xpi) = f6544f35246ae9aa683fc1c0144a7c157ac37363c4cbeb2521b6e49b88f77fe9 +SIZE (xpi/firefox-i18n-28.0b3/nn-NO.xpi) = 348405 +SHA256 (xpi/firefox-i18n-28.0b3/or.xpi) = ac60467f06faec095aada825aee52aedbb381d4a6f86608a8d80c4ea7a975e8e +SIZE (xpi/firefox-i18n-28.0b3/or.xpi) = 413667 +SHA256 (xpi/firefox-i18n-28.0b3/pa-IN.xpi) = e044a6711247e09ba031e0ab86148d5dba6de0b1ba15b915a0cd1fab462b2a6a +SIZE (xpi/firefox-i18n-28.0b3/pa-IN.xpi) = 389012 +SHA256 (xpi/firefox-i18n-28.0b3/pl.xpi) = e3945d6b72b16e1c4cf0435d133b32fe3b01336c3321790de0944057356fcec0 +SIZE (xpi/firefox-i18n-28.0b3/pl.xpi) = 350844 +SHA256 (xpi/firefox-i18n-28.0b3/pt-BR.xpi) = 15b7507dbe7d9cd561fa9ed9343cc870a439a4ae7acebe0a3104511c42bc5454 +SIZE (xpi/firefox-i18n-28.0b3/pt-BR.xpi) = 359253 +SHA256 (xpi/firefox-i18n-28.0b3/pt-PT.xpi) = aec9695f250039385eb23965f9fe69dd6495b5b626eae7bd3491ea776ee147fa +SIZE (xpi/firefox-i18n-28.0b3/pt-PT.xpi) = 351716 +SHA256 (xpi/firefox-i18n-28.0b3/rm.xpi) = bb41e16b7e7a6cb45424d984a3a8107d7ab842de03e966b0d3f68041f10a9126 +SIZE (xpi/firefox-i18n-28.0b3/rm.xpi) = 352772 +SHA256 (xpi/firefox-i18n-28.0b3/ro.xpi) = 02a159772748b56492f96120593b45513833b261049edb2d016d4e9a5d3c6392 +SIZE (xpi/firefox-i18n-28.0b3/ro.xpi) = 387416 +SHA256 (xpi/firefox-i18n-28.0b3/ru.xpi) = 729ee75304102b902446f1734cca4694cf5c32f1bdf37bc12ad8f453cb8135da +SIZE (xpi/firefox-i18n-28.0b3/ru.xpi) = 338425 +SHA256 (xpi/firefox-i18n-28.0b3/si.xpi) = 621cd9cdaebdd6b7d0eed160fe6178e173a2cf8390fb01a390880f030fcaf176 +SIZE (xpi/firefox-i18n-28.0b3/si.xpi) = 395719 +SHA256 (xpi/firefox-i18n-28.0b3/sk.xpi) = 26f0e3e7d24fecd0704ca4d4388efd05931271311a632d4efe5c70e6ff96a7b6 +SIZE (xpi/firefox-i18n-28.0b3/sk.xpi) = 367793 +SHA256 (xpi/firefox-i18n-28.0b3/sl.xpi) = e9ebcf27f1bed5fae9b28a7044efe7eb951456004324e862d4fce397044ee8c0 +SIZE (xpi/firefox-i18n-28.0b3/sl.xpi) = 350318 +SHA256 (xpi/firefox-i18n-28.0b3/son.xpi) = f89c0db4972be8c7bdb0b550a05e7bf5045200a809f66ddf852b377f9225e9f9 +SIZE (xpi/firefox-i18n-28.0b3/son.xpi) = 348056 +SHA256 (xpi/firefox-i18n-28.0b3/sq.xpi) = c8346bb371bbcc102f9fb10c46e34edd5674d2ec13b5ce717a9ef912656f4957 +SIZE (xpi/firefox-i18n-28.0b3/sq.xpi) = 365886 +SHA256 (xpi/firefox-i18n-28.0b3/sr.xpi) = 06892ac3f90b240dba419fe2fa272a2c783514bc632a21a6289d5f5de13f46d3 +SIZE (xpi/firefox-i18n-28.0b3/sr.xpi) = 402632 +SHA256 (xpi/firefox-i18n-28.0b3/sv-SE.xpi) = 2560ca4c1aa9f6608c3c2bc9fd0e80f76f04656b5523e4f8d76fb124dc8ea41e +SIZE (xpi/firefox-i18n-28.0b3/sv-SE.xpi) = 355812 +SHA256 (xpi/firefox-i18n-28.0b3/ta.xpi) = 0fc694744f5679e70343ebbf79e4eae29c458c66fae644fa7b16d25c539f6d2e +SIZE (xpi/firefox-i18n-28.0b3/ta.xpi) = 408328 +SHA256 (xpi/firefox-i18n-28.0b3/te.xpi) = 58578d166cf6da1557b7620fa03ec208bbc7a4f3666a45248c18504c0c99f4c2 +SIZE (xpi/firefox-i18n-28.0b3/te.xpi) = 421142 +SHA256 (xpi/firefox-i18n-28.0b3/th.xpi) = baf62cab977e445bd18f5561453bbf0b6e4d15a490bdc9d30e8b3bfb80cbec46 +SIZE (xpi/firefox-i18n-28.0b3/th.xpi) = 403633 +SHA256 (xpi/firefox-i18n-28.0b3/tr.xpi) = f597a2cca4d53ed141aff48bfb130bc8f8824d73adf57c5dd766cc349da2ceea +SIZE (xpi/firefox-i18n-28.0b3/tr.xpi) = 362002 +SHA256 (xpi/firefox-i18n-28.0b3/uk.xpi) = 3c6adfa7f5ac82b2b7865f0e8581b79f58698e33b2696d67c73161c33e102635 +SIZE (xpi/firefox-i18n-28.0b3/uk.xpi) = 385138 +SHA256 (xpi/firefox-i18n-28.0b3/vi.xpi) = 9ce8fdf9265ab6f5b7b47cda37fa2e14af463111194931a1c6883bfe998c26e0 +SIZE (xpi/firefox-i18n-28.0b3/vi.xpi) = 378860 +SHA256 (xpi/firefox-i18n-28.0b3/zh-CN.xpi) = 5fea4685a17a206a71ebed7094a228d052d474513cf34d7138685702d1cd6c4f +SIZE (xpi/firefox-i18n-28.0b3/zh-CN.xpi) = 379261 +SHA256 (xpi/firefox-i18n-28.0b3/zh-TW.xpi) = e459b6d04ea92e7161bb7fe10f1bf4b50ba2f65093f38e98c1b84c5c31634048 +SIZE (xpi/firefox-i18n-28.0b3/zh-TW.xpi) = 375532 +SHA256 (xpi/firefox-i18n-28.0b3/zu.xpi) = a92009d572a3c28ae8406616766e05c7588aa2f3dd3324b3d5bc0c36b9c8bbc3 +SIZE (xpi/firefox-i18n-28.0b3/zu.xpi) = 365911 Modified: trunk/www/firefox-nightly/Makefile.hgrev ============================================================================== --- trunk/www/firefox-nightly/Makefile.hgrev Thu Feb 13 06:31:24 2014 (r1495) +++ trunk/www/firefox-nightly/Makefile.hgrev Fri Feb 14 06:30:24 2014 (r1496) @@ -1 +1 @@ -HGREV= 167979:221df43616ab +HGREV= 168731:c7802c9d6eec Modified: trunk/www/firefox-nightly/distinfo ============================================================================== --- trunk/www/firefox-nightly/distinfo Thu Feb 13 06:31:24 2014 (r1495) +++ trunk/www/firefox-nightly/distinfo Fri Feb 14 06:30:24 2014 (r1496) @@ -1,2 +1,2 @@ -SHA256 (firefox-nightly/221df43616ab.tar.bz2) = db00823267464793c4de7c82234ed21c4044582f35e5021f14dd3030f7e86f22 -SIZE (firefox-nightly/221df43616ab.tar.bz2) = 135901109 +SHA256 (firefox-nightly/c7802c9d6eec.tar.bz2) = c8d97c7c624a5d051f25411b419476da94aa87b2c0f54651f8a4a2c31afbf32c +SIZE (firefox-nightly/c7802c9d6eec.tar.bz2) = 135962893 Deleted: trunk/www/firefox-nightly/files/patch-bug806917 ============================================================================== --- trunk/www/firefox-nightly/files/patch-bug806917 Fri Feb 14 06:30:24 2014 (r1495) +++ /dev/null 00:00:00 1970 (deleted) @@ -1,2016 +0,0 @@ -commit cb40a26 -Author: Alessandro Decina -Date: Fri Jan 03 08:16:54 2014 -0800 - - Bug 806917 - support GStreamer 1.0 ---- - configure.in | 64 ++- - content/media/gstreamer/GStreamerAllocator.cpp | 194 +++++++ - content/media/gstreamer/GStreamerAllocator.h | 25 + - content/media/gstreamer/GStreamerFormatHelper.cpp | 13 +- - content/media/gstreamer/GStreamerFunctionList.h | 93 +++- - content/media/gstreamer/GStreamerLoader.cpp | 48 +- - content/media/gstreamer/GStreamerLoader.h | 8 + - content/media/gstreamer/GStreamerReader-0.10.cpp | 198 +++++++ - content/media/gstreamer/GStreamerReader.cpp | 618 ++++++++++++++-------- - content/media/gstreamer/GStreamerReader.h | 42 +- - content/media/gstreamer/moz.build | 11 +- - content/media/test/manifest.js | 6 +- - 12 files changed, 1046 insertions(+), 274 deletions(-) - -diff --git configure.in configure.in -index 9776b8d..0b1698d 100644 ---- configure.in -+++ configure.in -@@ -3988,6 +3988,7 @@ MOZ_SAMPLE_TYPE_FLOAT32= - MOZ_SAMPLE_TYPE_S16= - MOZ_OPUS=1 - MOZ_WEBM=1 -+MOZ_GSTREAMER= - MOZ_DIRECTSHOW= - MOZ_WMF= - MOZ_FMP4= -@@ -5634,44 +5635,61 @@ WINNT|Darwin|Android) - ;; - *) - MOZ_GSTREAMER=1 -+ GST_API_VERSION=0.10 - ;; - esac - --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 -+++ content/media/gstreamer/GStreamerAllocator.cpp -@@ -0,0 +1,197 @@ -+#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(); -+ mem->image = reinterpret_cast(container->CreateImage(ImageFormat::PLANAR_YCBCR).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 -+++ content/media/gstreamer/GStreamerAllocator.h -@@ -0,0 +1,25 @@ -+/* This Source Code Form is subject to the terms of the Mozilla Public -+ * License, v. 2.0. If a copy of the MPL was not distributed with this file, -+ * You can obtain one at http://mozilla.org/MPL/2.0/. */ -+ -+#if !defined(GStreamerAllocator_h_) -+#define GStreamerAllocator_h_ -+ -+#include "GStreamerReader.h" -+ -+#define GST_TYPE_MOZ_GFX_MEMORY_ALLOCATOR (moz_gfx_memory_allocator_get_type()) -+#define GST_IS_MOZ_GFX_MEMORY_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MOZ_GFX_MEMORY_ALLOCATOR)) -+#define GST_TYPE_MOZ_GFX_BUFFER_POOL (moz_gfx_buffer_pool_get_type()) -+#define GST_IS_MOZ_GFX_BUFFER_POOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MOZ_GFX_BUFFER_POOL)) -+ -+namespace mozilla { -+ -+GType moz_gfx_memory_allocator_get_type(); -+void moz_gfx_memory_allocator_set_reader(GstAllocator *aAllocator, GStreamerReader* aReader); -+nsRefPtr moz_gfx_memory_get_image(GstMemory *aMemory); -+ -+GType moz_gfx_buffer_pool_get_type(); -+ -+} // namespace mozilla -+ -+#endif -diff --git content/media/gstreamer/GStreamerFormatHelper.cpp content/media/gstreamer/GStreamerFormatHelper.cpp -index be71331..a5e5db8 100644 ---- content/media/gstreamer/GStreamerFormatHelper.cpp -+++ content/media/gstreamer/GStreamerFormatHelper.cpp -@@ -294,12 +294,23 @@ bool GStreamerFormatHelper::CanHandleCodecCaps(GstCaps* aCaps) - GList* GStreamerFormatHelper::GetFactories() { - NS_ASSERTION(sLoadOK, "GStreamer library not linked"); - -- uint32_t cookie = gst_default_registry_get_feature_list_cookie (); -+#if GST_VERSION_MAJOR >= 1 -+ uint32_t cookie = gst_registry_get_feature_list_cookie(gst_registry_get()); -+#else -+ uint32_t cookie = gst_default_registry_get_feature_list_cookie(); -+#endif - if (cookie != mCookie) { - g_list_free(mFactories); -+#if GST_VERSION_MAJOR >= 1 -+ mFactories = -+ gst_registry_feature_filter(gst_registry_get(), -+ (GstPluginFeatureFilter)FactoryFilter, -+ false, nullptr); -+#else - mFactories = - gst_default_registry_feature_filter((GstPluginFeatureFilter)FactoryFilter, - false, nullptr); -+#endif - mCookie = cookie; - } - -diff --git content/media/gstreamer/GStreamerFunctionList.h content/media/gstreamer/GStreamerFunctionList.h -index 56877c0..e169449 100644 ---- content/media/gstreamer/GStreamerFunctionList.h -+++ content/media/gstreamer/GStreamerFunctionList.h -@@ -9,7 +9,6 @@ - * List of symbol names we need to dlsym from the gstreamer library. - */ - GST_FUNC(LIBGSTAPP, gst_app_sink_get_type) --GST_FUNC(LIBGSTAPP, gst_app_sink_pull_buffer) - GST_FUNC(LIBGSTAPP, gst_app_sink_set_callbacks) - GST_FUNC(LIBGSTAPP, gst_app_src_end_of_stream) - GST_FUNC(LIBGSTAPP, gst_app_src_get_size) -@@ -22,10 +21,8 @@ GST_FUNC(LIBGSTAPP, gst_app_src_set_stream_type) - GST_FUNC(LIBGSTREAMER, gst_bin_get_by_name) - GST_FUNC(LIBGSTREAMER, gst_bin_get_type) - GST_FUNC(LIBGSTREAMER, gst_bin_iterate_recurse) --GST_FUNC(LIBGSTREAMER, gst_buffer_copy_metadata) - GST_FUNC(LIBGSTREAMER, gst_buffer_get_type) - GST_FUNC(LIBGSTREAMER, gst_buffer_new) --GST_FUNC(LIBGSTREAMER, gst_buffer_new_and_alloc) - GST_FUNC(LIBGSTREAMER, gst_bus_set_sync_handler) - GST_FUNC(LIBGSTREAMER, gst_bus_timed_pop_filtered) - GST_FUNC(LIBGSTREAMER, gst_caps_append) -@@ -37,47 +34,37 @@ 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_name) - 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) -@@ -86,11 +73,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 -@@ -100,6 +158,11 @@ GST_FUNC(LIBGSTVIDEO, gst_video_format_parse_caps) - REPLACE_FUNC(gst_buffer_ref); - REPLACE_FUNC(gst_buffer_unref); - REPLACE_FUNC(gst_message_unref); -+ -+#if GST_VERSION_MAJOR == 1 -+REPLACE_FUNC(gst_caps_unref); -+REPLACE_FUNC(gst_sample_unref); -+#endif - #endif - - #endif // !defined(__APPLE__) -diff --git content/media/gstreamer/GStreamerLoader.cpp content/media/gstreamer/GStreamerLoader.cpp -index 5961b23..e6457e0 100644 ---- content/media/gstreamer/GStreamerLoader.cpp -+++ content/media/gstreamer/GStreamerLoader.cpp -@@ -6,13 +6,21 @@ - #include - #include - --#include "GStreamerLoader.h" -+#include "nsDebug.h" - #include "mozilla/NullPtr.h" - -+#include "GStreamerLoader.h" -+ - #define LIBGSTREAMER 0 - #define LIBGSTAPP 1 - #define LIBGSTVIDEO 2 - -+#ifdef __OpenBSD__ -+#define LIB_GST_SUFFIX ".so" -+#else -+#define LIB_GST_SUFFIX ".so.0" -+#endif -+ - namespace mozilla { - - /* -@@ -32,6 +40,11 @@ namespace mozilla { - GstBuffer * gst_buffer_ref_impl(GstBuffer *buf); - void gst_buffer_unref_impl(GstBuffer *buf); - void gst_message_unref_impl(GstMessage *msg); -+void gst_caps_unref_impl(GstCaps *caps); -+ -+#if GST_VERSION_MAJOR == 1 -+void gst_sample_unref_impl(GstSample *sample); -+#endif - - bool - load_gstreamer() -@@ -58,32 +71,25 @@ load_gstreamer() - if (major == GST_VERSION_MAJOR && minor == GST_VERSION_MINOR) { - gstreamerLib = RTLD_DEFAULT; - } else { --#ifdef __OpenBSD__ -- gstreamerLib = dlopen("libgstreamer-0.10.so", RTLD_NOW | RTLD_LOCAL); --#else -- gstreamerLib = dlopen("libgstreamer-0.10.so.0", RTLD_NOW | RTLD_LOCAL); --#endif -+ gstreamerLib = dlopen("libgstreamer-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL); - } - -- void *handles[] = { -+ void *handles[3] = { - gstreamerLib, --#ifdef __OpenBSD__ -- dlopen("libgstapp-0.10.so", RTLD_NOW | RTLD_LOCAL), -- dlopen("libgstvideo-0.10.so", RTLD_NOW | RTLD_LOCAL) --#else -- dlopen("libgstapp-0.10.so.0", RTLD_NOW | RTLD_LOCAL), -- dlopen("libgstvideo-0.10.so.0", RTLD_NOW | RTLD_LOCAL) --#endif -+ dlopen("libgstapp-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL), -+ dlopen("libgstvideo-" GST_API_VERSION LIB_GST_SUFFIX, RTLD_NOW | RTLD_LOCAL) - }; - - for (size_t i = 0; i < sizeof(handles) / sizeof(handles[0]); i++) { - if (!handles[i]) { -+ NS_WARNING("Couldn't link gstreamer libraries"); - goto fail; - } - } - - #define GST_FUNC(lib, symbol) \ - if (!(symbol = (typeof(symbol))dlsym(handles[lib], #symbol))) { \ -+ NS_WARNING("Couldn't link symbol " #symbol); \ - goto fail; \ - } - #define REPLACE_FUNC(symbol) symbol = symbol##_impl; -@@ -123,4 +129,18 @@ gst_message_unref_impl(GstMessage *msg) - gst_mini_object_unref(GST_MINI_OBJECT_CAST(msg)); - } - -+#if GST_VERSION_MAJOR == 1 -+void -+gst_sample_unref_impl(GstSample *sample) -+{ -+ gst_mini_object_unref(GST_MINI_OBJECT_CAST(sample)); -+} -+#endif -+ -+void -+gst_caps_unref_impl(GstCaps *caps) -+{ -+ gst_mini_object_unref(GST_MINI_OBJECT_CAST(caps)); -+} -+ - } -diff --git content/media/gstreamer/GStreamerLoader.h content/media/gstreamer/GStreamerLoader.h -index 2d801722..cd7fe6d 100644 ---- content/media/gstreamer/GStreamerLoader.h -+++ content/media/gstreamer/GStreamerLoader.h -@@ -22,6 +22,11 @@ - #include - #pragma GCC diagnostic pop - -+#if GST_VERSION_MAJOR == 1 -+#include -+#include -+#endif -+ - namespace mozilla { - - /* -@@ -42,4 +47,7 @@ bool load_gstreamer(); - - } - -+#undef GST_CAPS_ANY -+#define GST_CAPS_ANY (*_gst_caps_any) -+ - #endif // GStreamerLoader_h_ -diff --git content/media/gstreamer/GStreamerReader-0.10.cpp content/media/gstreamer/GStreamerReader-0.10.cpp -new file mode 100644 -index 0000000..fb98bde ---- /dev/null -+++ content/media/gstreamer/GStreamerReader-0.10.cpp -@@ -0,0 +1,200 @@ -+#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(); -+ if (container == nullptr) { -+ return GST_FLOW_ERROR; -+ } -+ PlanarYCbCrImage* img = reinterpret_cast(container->CreateImage(ImageFormat::PLANAR_YCBCR).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 = gfx::IntSize(mPicture.width, mPicture.height); -+ data.mStereoMode = StereoMode::MONO; -+ -+ data.mYChannel = GST_BUFFER_DATA(aBuffer); -+ data.mYStride = gst_video_format_get_row_stride(mFormat, 0, mPicture.width); -+ data.mYSize = gfx::IntSize(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 = gfx::IntSize(data.mCbCrStride, -+ gst_video_format_get_component_height(mFormat, 1, mPicture.height)); -+ data.mCbChannel = data.mYChannel + gst_video_format_get_component_offset(mFormat, 1, -+ mPicture.width, mPicture.height); -+ data.mCrChannel = data.mYChannel + gst_video_format_get_component_offset(mFormat, 2, -+ mPicture.width, mPicture.height); -+ data.mCbSkip = 0; -+ data.mCrSkip = 0; -+ -+ image->SetDataNoCopy(data); -+ -+ return image; -+} -+ -+void GStreamerReader::CopyIntoImageBuffer(GstBuffer* aBuffer, -+ GstBuffer** aOutBuffer, -+ nsRefPtr &aImage) -+{ -+ AllocateVideoBufferFull(nullptr, GST_BUFFER_OFFSET(aBuffer), -+ GST_BUFFER_SIZE(aBuffer), nullptr, aOutBuffer, aImage); -+ -+ gst_buffer_copy_metadata(*aOutBuffer, aBuffer, (GstBufferCopyFlags)GST_BUFFER_COPY_ALL); -+ memcpy(GST_BUFFER_DATA(*aOutBuffer), GST_BUFFER_DATA(aBuffer), GST_BUFFER_SIZE(*aOutBuffer)); -+ -+ aImage = GetImageFromBuffer(*aOutBuffer); -+} -+ -+GstCaps* GStreamerReader::BuildAudioSinkCaps() -+{ -+ GstCaps* caps; -+#ifdef IS_LITTLE_ENDIAN -+ int endianness = 1234; -+#else -+ int endianness = 4321; -+#endif -+ gint width; -+#ifdef MOZ_SAMPLE_TYPE_FLOAT32 -+ caps = gst_caps_from_string("audio/x-raw-float, channels={1,2}"); -+ width = 32; -+#else /* !MOZ_SAMPLE_TYPE_FLOAT32 */ -+ caps = gst_caps_from_string("audio/x-raw-int, channels={1,2}"); -+ width = 16; -+#endif -+ gst_caps_set_simple(caps, -+ "width", G_TYPE_INT, width, -+ "endianness", G_TYPE_INT, endianness, -+ NULL); -+ -+ return caps; -+} -+ -+void GStreamerReader::InstallPadCallbacks() -+{ -+ GstPad* sinkpad = gst_element_get_static_pad(GST_ELEMENT(mVideoAppSink), "sink"); -+ gst_pad_add_event_probe(sinkpad, -+ G_CALLBACK(&GStreamerReader::EventProbeCb), this); -+ -+ gst_pad_set_bufferalloc_function(sinkpad, GStreamerReader::AllocateVideoBufferCb); -+ gst_pad_set_element_private(sinkpad, this); -+ gst_object_unref(sinkpad); -+ -+ sinkpad = gst_element_get_static_pad(GST_ELEMENT(mAudioAppSink), "sink"); -+ gst_pad_add_event_probe(sinkpad, -+ G_CALLBACK(&GStreamerReader::EventProbeCb), this); -+ gst_object_unref(sinkpad); -+} -diff --git content/media/gstreamer/GStreamerReader.cpp content/media/gstreamer/GStreamerReader.cpp -index 2be45dc..54509e3 100644 ---- content/media/gstreamer/GStreamerReader.cpp -+++ content/media/gstreamer/GStreamerReader.cpp -@@ -10,8 +10,10 @@ - #include "AbstractMediaDecoder.h" - #include "MediaResource.h" - #include "GStreamerReader.h" -+#if GST_VERSION_MAJOR >= 1 -+#include "GStreamerAllocator.h" -+#endif - #include "GStreamerFormatHelper.h" --#include "GStreamerMozVideoBuffer.h" - #include "VideoUtils.h" - #include "mozilla/dom/TimeRanges.h" - #include "mozilla/Preferences.h" -@@ -31,14 +33,16 @@ 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); -- -+#if DEBUG - 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; -+#endif -+// 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, -@@ -318,13 +325,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, -@@ -345,6 +352,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; -@@ -360,16 +368,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); -@@ -379,7 +391,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 -@@ -388,18 +399,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; -@@ -412,7 +430,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 */ -@@ -426,19 +448,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 */ -@@ -453,7 +491,11 @@ nsresult GStreamerReader::CheckSupportedFormats() - } - } - -+#if GST_VERSION_MAJOR >= 1 -+ g_value_unset (&value); -+#else - gst_object_unref(element); -+#endif - done = unsupported; - break; - } -@@ -477,6 +519,8 @@ nsresult GStreamerReader::ResetDecode() - { - nsresult res = NS_OK; - -+ LOG(PR_LOG_DEBUG, ("reset decode")); -+ - if (NS_FAILED(MediaDecoderReader::ResetDecode())) { - res = NS_ERROR_FAILURE; - } -@@ -487,6 +531,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; - } -@@ -510,11 +559,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. - */ -@@ -526,17 +575,34 @@ 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 offset = GST_BUFFER_OFFSET(buffer); -+ guint8* data; -+#if GST_VERSION_MAJOR >= 1 -+ GstMapInfo info; -+ gst_buffer_map(buffer, &info, GST_MAP_READ); -+ unsigned int size = info.size; -+ data = info.data; -+#else - unsigned int size = GST_BUFFER_SIZE(buffer); -+ data = GST_BUFFER_DATA(buffer); -+#endif - int32_t frames = (size / sizeof(AudioDataValue)) / mInfo.mAudio.mChannels; - - typedef AudioCompactor::NativeCopy GstCopy; -@@ -545,16 +611,20 @@ bool GStreamerReader::DecodeAudioData() - mInfo.mAudio.mRate, - frames, - mInfo.mAudio.mChannels, -- GstCopy(GST_BUFFER_DATA(buffer), -+ GstCopy(data, - size, - mInfo.mAudio.mChannels)); -+#if GST_VERSION_MAJOR >= 1 -+ gst_buffer_unmap(buffer, &info); -+#endif -+ - gst_buffer_unref(buffer); - - return true; - } - - bool GStreamerReader::DecodeVideoFrame(bool &aKeyFrameSkip, -- int64_t aTimeThreshold) -+ int64_t aTimeThreshold) - { - NS_ASSERTION(mDecoder->OnDecodeThread(), "Should be on decode thread."); - -@@ -573,11 +643,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 - */ -@@ -591,11 +661,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; -@@ -611,10 +687,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; - } -@@ -623,61 +707,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; -@@ -700,6 +759,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); - } -@@ -711,7 +774,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); -@@ -733,12 +798,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; -@@ -757,7 +831,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), -@@ -768,14 +848,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); - } -@@ -788,8 +873,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))); -@@ -868,109 +958,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(); -- if (!container) { -- // We don't have an ImageContainer. We probably belong to an